------------------------------------------------------------
//\AppNode\casadocodigo\test\produtos.js
var v_express = require('../config/express')();
var v_request = require('supertest')(v_express);
describe('#ProdutosController',function(){
console.log('passei aqui 1')
beforeEach(function(done){
console.log('passei aqui 2')
var v_conn = v_express.infra.connectionFactory();
console.log('passei aqui 3')
v_conn.query("delete from produtos", function(err,result){
if(!err) {
done();
}
});
});
it('#listagem json',function(done){
//v_request.get('http://localhost:3000/produtos')
v_request.get('/produtos')
.set('Accept','application/json')
.expect('Content-Type',/json/)
.expect(200,done);
});
it('#cadastro de novo produto com dados invalidos',function(done){
v_request.post('/produtos')
.send({titulo:"",descricao:"novo livro"})
.expect(400,done);
});
it('#cadastro de novo produto com dados validos',function(done){
v_request.post('/produtos')
.send({titulo:"Titulo novo",descricao:"novo livro",preco:20.50})
//deixadno o codigo de retorno 200 apresenta erro, porque
//no caso do redirect o retorno é 302
//.expect(200,done);
.expect(302,done);
});
});
------------------------------------------------------------
// ./app/routes/produtos.js
//var v_connectionFactory = require('../infra/connectionFactory');
//este carregamento não é mais necessário, pois a coneção foi carregada no arquivo /config/express
module.exports = function (v_app) {
//res.send("<html><body><h1>Listagem de produtos</h1></body></html>") //tranferido para o arquivo ./views/produtos/lista.ejs
console.log("atendendo a requisicao");
// var v_listaProdutos = function (req, res) {
v_app.get('/produtos', function (req, res,next) {
//var v_connection = v_connectionFactory();
var v_connection = v_app.infra.connectionFactory();
var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);
//este código foi para o arquivo app\infra\produtosBanco.js
//v_connection.query('select * from produtos', function (err, results) {
v_produtosDAO.lista(function (err, results) {
// res.send(results); neste formato não formata a tela
//neste formata formata a tela
//res.render('produtos/lista', {lista: results});
//agora alteramos o código para trabalhar com diferentes tipos de resposta
if(err){
return next(err);
}
res.format({
html: function () {
res.render('produtos/lista', {lista: results});
},
json: function () {
res.json(results);
}
});
});
v_connection.end();
});
//v_app.get('/produtos', v_listaProdutos);
////meu teste
v_app.get('/produtos/form_excluir', function (req, res) {
var v_connection = v_app.infra.connectionFactory();
var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);
v_produtosDAO.consulta(function (err, results) {
res.render('produtos/form_excluir', {consulta: results});
});
v_connection.end();
});
////
v_app.get('produtos/remove', function () {
var v_connection = v_app.infra.connectionFactory();
var v_produtosDAO = new app.infra.ProdutosDAO(v_connection);
var v_produto = v_produtosDAO.carrega(id, callback);
if (v_produto) {
v_produtosDao.remove(v_produto, callback);
}
});
v_app.get('/produtos/form', function (req, res) {
res.render('produtos/form', {errosValidacao: {}, produto : {}});
});
v_app.post('/produtos', function (req, res) {
var v_produto = req.body;
// obrigado a informação do titulo do livro
//atenção para isto funcionar:
//é necessario importar "var expressValidator = require('express-validator');" no arquivo express.js
//e informar "app.use(expressValidator());" no arquivo express.js
// a função "assert" foi implementa na instalação do "npm install express-validator"
//pode ser assim
// var v_validatorTitulo = req.assert('titulo','Titulo é obrigatório')
// v_validatorTitulo.notEmpty() // não aceita titulo vazio
// ou assim que é o mais comum
req.assert('titulo', 'Titulo é obrigatório').notEmpty();
req.assert('preco', 'Formato inválido').isFloat(); // validação do formato do preço deve ser um float
var v_erros = req.validationErrors();
if (v_erros) {
res.format({
html: function () {
res.status(400).render('produtos/form', { errosValidacao : v_erros, produto : v_produto});
},
json: function () {
res.status(400).json(v_erros)
}
});
return;
}
// fim da validação do titulo
console.log(v_produto);
var v_connection = v_app.infra.connectionFactory();
var v_produtosDAO = new v_app.infra.ProdutosDAO(v_connection);
v_produtosDAO.salva(v_produto, function (err, results) {
//v_listaProdutos(req, res);
//Exibindo a mensagem de erro no terminal!
//if (err){
// console.log(err);
//}
console.log(err);
res.redirect('/produtos');
});
v_connection.end();
});
};
------------------------------------------------------------
// ./app/infra/connectionFactory.js
var v_mysql = require('mysql');
//module.exports = function (v_app) {
// return v_mysql.createConnection({
// host : 'LocalHost',
// user : 'root',
// password : 'Mrlf0101',
// database : 'casadocodigo_nodejs'
// });
function createDBConnection() {
//if(process.env.NODE_ENV == 'development')
if(!process.env.NODE_ENV){
return v_mysql.createConnection({
host: 'localhost',
user: 'root',
password : 'Mrlf0101',
database: 'casadocodigo_nodejs'
});
}
if(process.env.NODE_ENV == 'test') {
return mysql.createConnection({
host:'localhost',
user:'root',
password:'Mrlf0101',
database:'casadocodigo_nodejs_test'
});
}
}
module.exports = function () {
return createDBConnection;
};
------------------------------------------------------------
Quando executo o "mocha" esta ocorrendo o seguinte erro o banco foi criado: mysql> select * from casadocodigo_nodejs_test.produtos; Empty set (0.00 sec)
a variavel de ambiente foi "setada" NODE_ENV=test
C:\Caca\Alura\Node\AppNode\casadocodigo>mocha modulo ta sendo carregado atendendo a requisicao atendendo a requisicao passei aqui 1
ProdutosController
passei aqui 2 1) "before each" hook for "#listagem json"
0 passing (11ms) 1 failing
1) #ProdutosController "before each" hook for "#listagem json": ReferenceError: mysql is not defined at Object.createDBConnection [as connectionFactory] (app\infra\connectionFactory.js:24:16) at Context. (test\produtos.js:33:38)