Skip to content

Instantly share code, notes, and snippets.

@roger-dev-br
Last active May 11, 2021 23:42
Show Gist options
  • Save roger-dev-br/59ef8956f495dc4161d7aea2591a77da to your computer and use it in GitHub Desktop.
Save roger-dev-br/59ef8956f495dc4161d7aea2591a77da to your computer and use it in GitHub Desktop.
Projeto NodeJS com testes Jest

Projeto

1. Dependências

yarn add express dotenv sequelize sqlite3 cors

2. Dependências de Desenvolvimento

yarn add -D nodemon sequelize-cli sucrase cross-env

3. Dependências de Teste

yarn add -D jest supertest @sucrase/jest-plugin @types/jest

4. Confirgurar o nodemon criando o nodemon.json

{
    "execMap": {
      "js": "node -r sucrase/register -r dotenv/config"
    }
}

5. Configurar o sequelize criando o .sequelizerc

const { resolve } = require('path');

module.exports = {
  'config': resolve(__dirname, 'src', 'config', 'database.js'),
  'models-path': resolve(__dirname, 'src', 'app', 'models'),
  'migrations-path': resolve(__dirname, 'src', 'database', 'migrations'),
  'seeders-path': resolve(__dirname, 'src', 'database', 'seeds')
};

6. Configurar o Jest

yarn jest --init
  • Would you like to use Jest when running "test" script in "package.json"? - YES
  • Would you like to use Typescript for the configuration file? › (y/N) No
  • Choose the test environment that will be used for testing: NODE
  • Do you want Jest to add coverage reports? › (y/N) NO
  • Which provider should be used to instrument code for coverage? › V8
  • Automatically clear mock calls and instances between every test? YES

7. Ajustar configurações no jest.config.js

bail: 1,
collectCoverage: true,
transform: { '.(js|jsx|ts|tsx)': '@sucrase/jest-plugin' },
collectCoverageFrom: ["src/app/**"],
coverageDirectory: "__tests__/coverage",
testMatch: [
"**/__tests__/**/*.test.js?(x)",
],

8. Criar o arquivo .env.test

DB_DIALECT=sqlite
DB_URL="./__tests__/database.sqlite"

9. Criar a pasta src/config criar a configuração do database

database.js

require("dotenv").config({
    path: process.env.NODE_ENV === 'test' ? '.env.test' : '.env',
});

module.exports = {
    dialect: process.env.DB_DIALECT || 'postgres',
    host: process.env.DB_HOST,
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
    storage: process.env.DB_URL,
    define: {
        timestamps: true,
        underscored: true,
        underscoredAll: true,
    },
    dialectOptions: {
        ssl: {
            require: true,
            rejectUnauthorized: false,
        },
    },
};

10. Criar o arquivo do DATABASE em src/database/index.js

index.js

import Sequelize from 'sequelize';
import config from '../config/database';

const models = [];

class Database {
    constructor() {
        this.init();
    }

    init() {
        this.connection = new Sequelize(config);

        models
            .map(model => model.init(this.connection))
            .map(model => model.associate && model.associate(this.connection.models));
    }
}

export default new Database();

11. Criar a pasta src e criar a estrutura do servidor

app.js

import express from 'express';
import dotenv from 'dotenv';

import './database/index';

class App {
    constructor() {
        this.server = express();
        this.config();
        this.middlewares();
        this.routers();
    }

    config() {
        this.server.use(express.json());

        dotenv.config({
            path: process.env.NODE_ENV === 'test' ? '.env.test' : '.env',
        });

    }

    middlewares() {
    }

    routers() {
    }
}

export default new App().server;

server.js

import app from './app';

app.listen(process.env.PORT, () => {
    console.info(`Server is up and running. Port ${process.env.PORT}.`);
});

12. Script de dev

{
    "dev": "nodemon ./src/server.js",
}

13. Script de teste

{
    "test": "jest -i"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment