diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6e7b10c10b205cca5712e6ef1542ba5c99b5c13a..39149f5870bd6f98d5644bedae5dbfe23038692a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,7 @@ Bugs are reported and tracked at [simcaq/SCRUM](https://gitlab.c3sl.ufpr.br/simc * **development**: default branch * **issue/??**: issue branch - a branch created to solve a issue * **feature_????**: feature branch - a branch created to add a feature +* **hotfix_????**: hotfix branch - a branch created to fix a problem or error * **release_vM.m.f**: release branch - a branch created to merge with master and set a release. The verion follows the [semantic versioning](http://semver.org) ## Styleguide diff --git a/src/libs/db/query_exec.js b/src/libs/db/query_exec.js index 70456d8ef73868108d3db58b044508700884ebe9..1a2f7387574bc2f886550ef39f86f221c6a98e49 100644 --- a/src/libs/db/query_exec.js +++ b/src/libs/db/query_exec.js @@ -28,12 +28,14 @@ function execSqlQuery(sqlQuery, sqlQueryParams = []) { resolve(dbResult.data); }).catch((queryError) => { log.error(`SQL query execution error: ${queryError.message}`); + log.error(`SQL query: ${sqlQuery} with params: ${sqlQueryParams}`); // release resources allocated for the prepared statement dbQuery.release(); reject(new Error(queryError.message)); }); }).catch((prepError) => { log.error(`SQL prepared statement error: ${prepError.message}`); + log.error(`SQL query: ${sqlQuery} with params: ${sqlQueryParams}`); reject(new Error(prepError.message)); }); }); diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js index 1ad57f27f6ee893d21bdf5d8bc9ffee5a10b3bf1..a20b24bc694cbd00d2e1f40cc8df38dc6100cc04 100644 --- a/src/libs/routes/enrollment.js +++ b/src/libs/routes/enrollment.js @@ -37,8 +37,7 @@ enrollmentApp.get('/location', (req, res, next) => { // Returns all educational levels avaible enrollmentApp.get('/education_level', (req, res, next) => { - req.sql = squel.select() - .from('etapa_ensino') + req.sql.from('etapa_ensino') .field('pk_etapa_ensino_id', 'id') .field('desc_etapa', 'name'); diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js index ec415a868b1cd4bac133813b7c3a3c2a9fa9ef5a..3af30fb1b5b3b7dde4f4559f0d4abf18974a2d88 100644 --- a/src/libs/routes/school.js +++ b/src/libs/routes/school.js @@ -17,12 +17,11 @@ const response = require(`${libs}/middlewares/response`); * Pense na cena do elevador de driver mas o elevador é uma bomba de fusão e demora mais que uma luta do DBz */ // schoolApp.get('/', (req, res, next) => { -// req.sql = squel.select().from('escolas') -// .field('pk_escola_id') -// .field('nome_entidade', 'name') +// req.sql = squel.select().from('escola') +// .field('cod_entidade') // .field('ano_censo', 'year') -// .field('fk_cod_estado') -// .field('fk_cod_municipio'); +// .field('fk_estado_id') +// .field('fk_municipio_id'); // next(); // }, query, response('school')); diff --git a/src/test/simulation.js b/src/test/simulation.js index a9349256b29bc20068eb74b0172e15d0dbe28937..8804b4359187953f1fd13584a36d7dc167139681 100644 --- a/src/test/simulation.js +++ b/src/test/simulation.js @@ -27,6 +27,393 @@ const Simulation = require('../libs/models/simulation'); const User = require('../libs/models/user'); chai.use(chaiHttp); + +describe('API is running', () => { + it('should respond it\'s running', (done) => { + chai.request(server) + .get('/api/v1') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('msg'); + done(); + }) + }); +}); + +describe('request enrollments', () => { + it('should list the year range', (done) => { + chai.request(server) + .get('/api/v1/enrollment/year_range') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('start_year'); + res.body.result[0].should.have.property('end_year'); + done(); + }); + }); + + it('should list the education level', (done) => { + chai.request(server) + .get('/api/v1/enrollment/education_level') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('id'); + res.body.result[0].should.have.property('name'); + done(); + }); + }); + + it('should list the administrative dependencies', (done) => { + chai.request(server) + .get('/api/v1/enrollment/adm_dependency ') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('id'); + res.body.result[0].should.have.property('name'); + done(); + }); + }); + + it('should list enrollments', (done) => { + chai.request(server) + .get('/api/v1/enrollment') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('name'); + res.body.result[0].should.have.property('total'); + done(); + }); + }); + + it('should list enrollments with valid filters', (done) => { + chai.request(server) + .get('/api/v1/enrollment?filter=min_year:2010,state:41') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('name'); + res.body.result[0].should.have.property('total'); + done(); + }); + }); + + it('should list enrollments with invalid filters', (done) => { + chai.request(server) + .get('/api/v1/enrollment?filter=foo:2010,bar:41') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('name'); + res.body.result[0].should.have.property('total'); + done(); + }); + }); + + it('should list enrollments with valid dimensions', (done) => { + chai.request(server) + .get('/api/v1/enrollment?dims=region,state,adm_dependency,location&filter=min_year:2014,region:4') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('region_name'); + res.body.result[0].should.have.property('state_name'); + res.body.result[0].should.have.property('adm_dependency_name'); + res.body.result[0].should.have.property('location_name'); + res.body.result[0].should.have.property('total'); + done(); + }); + }); + + it('should list enrollments with invalid dimensions', (done) => { + chai.request(server) + .get('/api/v1/enrollment?dims=foo,bar') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('name'); + res.body.result[0].should.have.property('total'); + done(); + }); + }); + + it('should list enrollments with valid dimensions and filters', (done) => { + chai.request(server) + .get('/api/v1/enrollment?dims=region,state,education_level,school&filter=min_year:2013,max_year:2014,city:4106902') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('region_name'); + res.body.result[0].should.have.property('state_name'); + res.body.result[0].should.have.property('school_name'); + res.body.result[0].should.have.property('education_level'); + res.body.result[0].should.have.property('total'); + res.body.result[0].should.have.property('year'); + done(); + }); + }); + + it('should list enrollments using all dimensions and filters', (done) => { + chai.request(server) + .get('/api/v1/enrollment?dims=region,state,city,education_level,school,adm_dependency,location&filter=min_year:2013,max_year:2014,city:4106902,adm_dependency:3,location:1,education_level:99') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('region_name'); + res.body.result[0].should.have.property('state_name'); + res.body.result[0].should.have.property('school_name'); + res.body.result[0].should.have.property('education_level'); + res.body.result[0].should.have.property('location_name'); + res.body.result[0].should.have.property('adm_dependency_name'); + res.body.result[0].should.have.property('total'); + res.body.result[0].should.have.property('year'); + done(); + }); + }); + + +}); + +describe('request regions', () => { + it('should list all regions', (done) => { + chai.request(server) + .get('/api/v1/region') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); + + it('should list region by id', (done) => { + chai.request(server) + .get('/api/v1/region/1') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result.should.have.length(1); + res.body.result[0].should.have.property('pk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); +}); + +describe('request states', () => { + it('should list all states', (done) => { + chai.request(server) + .get('/api/v1/state') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_estado_id'); + res.body.result[0].should.have.property('fk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); + + it('should list a state by id', (done) => { + chai.request(server) + .get('/api/v1/state/11') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result.should.have.length(1); + res.body.result[0].should.have.property('pk_estado_id'); + res.body.result[0].should.have.property('fk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); + + it('should list states by region id', (done) => { + chai.request(server) + .get('/api/v1/state/region/1') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_estado_id'); + res.body.result[0].should.have.property('fk_regiao_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); +}); + +describe('request cities', () => { + it('should list all cities', (done) => { + chai.request(server) + .get('/api/v1/city') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_cod_ibge'); + res.body.result[0].should.have.property('nome'); + res.body.result[0].should.have.property('fk_estado_id'); + done(); + }); + }); + + it('should list a city by id', (done) => { + chai.request(server) + .get('/api/v1/city/4106902') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_cod_ibge'); + res.body.result[0].should.have.property('fk_estado_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); + + it('should list a city by codigo_ibge', (done) => { + chai.request(server) + .get('/api/v1/city/ibge/4106902') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_cod_ibge'); + res.body.result[0].should.have.property('fk_estado_id'); + res.body.result[0].should.have.property('nome'); + done(); + }); + }); + + it('should list all cities from a state', (done) => { + chai.request(server) + .get('/api/v1/city/state/41') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('pk_cod_ibge'); + res.body.result[0].should.have.property('fk_estado_id'); + res.body.result[0].should.have.property('nome'); + done(); + }) + }) +}); + +describe('request schools', () => { + it('should list a school by id', (done) => { + chai.request(server) + .get('/api/v1/school/41000021') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('ano_censo'); + res.body.result[0].should.have.property('cod_entidade'); + done(); + }); + }); + + it('should list all schools from a state', (done) => { + chai.request(server) + .get('/api/v1/school/state/41') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('cod_entidade'); + res.body.result[0].should.have.property('ano_censo'); + done(); + }); + }); + + it('should list all schools from a city', (done) => { + chai.request(server) + .get('/api/v1/school/city/4106902') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('result'); + res.body.result.should.be.a('array'); + res.body.result[0].should.have.property('cod_entidade'); + res.body.result[0].should.have.property('ano_censo'); + done(); + }) + }) +}); + +describe('test response', () => { + it('should list all regions in json', (done) => { + chai.request(server) + .get('/api/v1/region') + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + done(); + }); + }); + + it('should list all regions in xml', (done) => { + chai.request(server) + .get('/api/v1/region?format=xml') + .end((err, res) => { + res.should.have.status(200); + res.should.be.xml; + done(); + }); + }); + + it('should list all regions in csv', (done) => { + chai.request(server) + .get('/api/v1/region?format=csv') + .end((err, res) => { + res.should.have.status(200); + done(); + }); + }); +}); + describe('Requires a simulation', () => { let newSimulation; @@ -410,6 +797,9 @@ describe('Saves a user', () => { beforeEach(() => { User.remove({}, (err) => { + if(err) { + console.log('Error while purging: ' + err); + } console.log('Test collection purged'); }); });