4
respostas

O node separa um banco para o ambiente de desenvolvimento, porém está apagando as informações dos dois bancos

Boa noite. Tenho uma dúvida com relação ao exercício de separar uma base de dados para produção e outra para testes. Bem, aparentemente o node está fazendo essa separação. Quando digito no terminal

NODE_ENV=test node_modules/mocha/bin/mocha

as informações são cadastradas no banco de dados casadocodigo_nodejs_test. E é inserida uma informação de cada vez e depois excluída. Correto. Porém, quando executo no meu cmd:

node_modules/mocha/bin/mocha

Ele cadastra no banco casadocodigo_nodejs. Porém, tem o mesmo comportamento do outro. Mas não é isso que quero. Porque teoricamente esse seria o banco do cliente, não de testes. Quero cadastrar, mas manter o que já tinha antes. O que está dando errado?

connectionFactory.js

var mysql = require('mysql');

var createDBConnection = function(){
    if(!process.env.NODE_ENV) {
        return mysql.createConnection({
            host:'localhost',
            user:'root',
            password:'',
            database:'casadocodigo_nodejs'
        });
    }

    if(process.env.NODE_ENV == 'test') {
        return mysql.createConnection({
                host:'localhost',
                user:'root',
                password:'',
                database:'casadocodigo_nodejs_test'
        });
    }
}

module.exports = function(){
    return createDBConnection;
}

produtos.js - test


var express = require('../config/express')();
var request = require('supertest')(express);

describe('#ProdutosController', function(){
    beforeEach(function(done){
        var conn = express.infra.connectionFactory();
            conn.query("delete from produtos", function(ex,result){
            if(!ex) {
                done();
            }
        });
    });

    it('listagem json', function(done){
        request.get('/produtos')
        .set('Accept','application/json')
        .expect('Content-Type',/json/)
        .expect(200,done);
    });

    it('#cadastro de novo produto com dados invalidos',function(done){
        request.post('/produtos')
        .send({titulo:"",descricao:"um livro"})
        .expect(400,done);
    });

    it('#cadastro de novo produto com dados validos',function(done){
        request.post('/produtos')
        .send({titulo:"titulo",descricao:"novo livro",preco:400})
        .expect(302,done);
    });
});

produtos.js - app/routes

module. exports = function(app) {
    app.get("/produtos", function(req, res, next) {

        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        produtosDAO.lista(function(erros,resultados){
            //res.render('produtos/lista', {lista:resultados});
            if(erros){
                return next(erros);
            }
            res.format({
                html: function(){
                    res.render('produtos/lista',{lista:resultados});
                },
                json: function(){
                    res.json(resultados)
                }
            });
        });
        connection.end();
    });

    app.get("/produtos/form", function(req, res){
        res.render('produtos/form', 
            {errosValidacao:{}, produto: {}});
    });

    app.post("/produtos", function(req, res) {

        var produto = req.body;
        console.log(produto);

        req.assert('titulo','Titulo é obrigatório').notEmpty();
        req.assert('descricao','Descrição é obrigatória').notEmpty();
        req.assert('preco','Formato inválido').isFloat()

        var erros = req.validationErrors();

        if(erros){
            //res.render('produtos/form', {errosValidacao:erros, produto:produto});
            res.format({
                html: function(){
                //res.status(400).render('produtos/form',{errosValidacao:erros,produto:produto});
                res.status(400).render('produtos/form', { errosValidacao: erros, produto: produto });
            },
                json: function(){
                    res.status(400).json(erros);
                }
            });
            return;
        }

        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);

        produtosDAO.salva(produto,function(erros,resultados){
            //res.render('produtos/lista');
            if(erros){
                console.error(erros);
            }
            res.redirect('/produtos');
        });
        connection.end();
    });
}
4 respostas

Opa, não sei se entendi direito, mas se você não define a variável de ambiente com o valor de test, de acordo com o código, ele não vai usar o banco de testes.

Mas eu não defino a variável com o valor de "test" na hora que digito no cmd: NODE_ENV=test node_modules/mocha/bin/mocha? Foi o que eu fiz.

então, mas quando vc roda

node_modules/mocha/bin/mocha

vc vai rodar os testes apontando para o banco oficial... e o comportamento do teste é sair apagando as coisas... o ideal é não usar o banco oficial para os testes.

Ah, sim, acho que consegui entender. A partir de agora, devo executar essa linha:

NODE_ENV=test node_modules/mocha/bin/mocha

quando eu for fazer testes, certo? Se eu vou rodar o outro comando sem setar a variável env, ele vai pegar do meu banco oficial. Quando o cliente for inserir através do form, as informações vão para o banco oficial.