From c4420e988a79bce7d847982be7c05f2524e32004 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Tue, 4 Oct 2016 10:09:29 -0300 Subject: [PATCH 1/5] Add istanbul to gulp task test Closes simcaq/SCRUM#20 --- README.md | 4 ++-- gulpfile.babel.js | 12 +++++++++++- package.json | 1 + 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 38e66ae5..23841cd6 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ Previous versions of Node.js do not support ECMAScript6, it is recommended to us > nvm use v4.5.0 -4) Install babel and gulp globally +4) Install the global dependencies -> npm install --global gulp gulp-cli babel babel-cli babel-core babel-register mocha gulp-mocha gulp-eslint +> npm install --global gulp gulp-cli babel babel-cli babel-core babel-register mocha gulp-mocha gulp-eslint istanbul 5) Install project dependencies diff --git a/gulpfile.babel.js b/gulpfile.babel.js index 10fd314a..0ad22595 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -8,6 +8,8 @@ const eslint = require('gulp-eslint'); const mocha = require('gulp-mocha'); +const istanbul = require('gulp-istanbul'); + const nodemon = require('gulp-nodemon'); const Cache = require('gulp-file-cache'); @@ -61,10 +63,18 @@ gulp.task('docco', () => { gulp.task('doc', ['docco']); -gulp.task('test', () => { +gulp.task('pre-test', () => { + return gulp.src(['build/**/*.js', '!build/{test,test/**}']) + .pipe(istanbul()) + .pipe(istanbul.hookRequire()); +}); + +gulp.task('test', ['pre-test'], () => { process.chdir('build'); gulp.src('test/test.js', {read: false}) .pipe(mocha()) + .pipe(istanbul.writeReports()) + .pipe(istanbul.enforceThresholds({ thresholds: { global: 90 } })) .once('error', () => { process.exit(1); }) diff --git a/package.json b/package.json index ed17027d..d477028f 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "gulp-eslint": "^3.0.1", "gulp-file-cache": "0.0.1", "gulp-function": "^1.3.6", + "gulp-istanbul": "^1.1.1", "gulp-jsdoc3": "^0.3.0", "gulp-mocha": "^3.0.1", "gulp-nodemon": "^2.1.0", -- GitLab From 608e0c1a308d15c61e8b1ac921e19d166db7790a Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Tue, 4 Oct 2016 10:11:46 -0300 Subject: [PATCH 2/5] Add build status and coverage status badge Related: simcaq/SCRUM#20 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 23841cd6..74ecd623 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # SIMCAQ +[](https://gitlab.c3sl.ufpr.br/simcaq/simcaq-node/commits/development) +[](https://gitlab.c3sl.ufpr.br/simcaq/simcaq-node/commits/development) # Dependencies -- GitLab From 49c7842bc4ceed5ce44e8e5224aabe072285319d Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Tue, 4 Oct 2016 10:15:02 -0300 Subject: [PATCH 3/5] Change gitlab_ci file to use gulp test task --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 23c45f10..04cdb1f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -19,8 +19,7 @@ run_tests: - mv config.json.example config.json - sed -i -e 's/false/true/g' config.json - gulp build - - cd build/ - - mocha + - gulp test tags: - node cache: -- GitLab From e6c24d6573af1492aa31228804fc231dbab105eb Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Tue, 4 Oct 2016 10:34:20 -0300 Subject: [PATCH 4/5] Add more test cases --- gulpfile.babel.js | 2 +- src/libs/routes/school.js | 8 ++-- src/test/test.js | 77 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/gulpfile.babel.js b/gulpfile.babel.js index 0ad22595..b04d93d4 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -74,7 +74,7 @@ gulp.task('test', ['pre-test'], () => { gulp.src('test/test.js', {read: false}) .pipe(mocha()) .pipe(istanbul.writeReports()) - .pipe(istanbul.enforceThresholds({ thresholds: { global: 90 } })) + .pipe(istanbul.enforceThresholds({ thresholds: { global: 75 } })) .once('error', () => { process.exit(1); }) diff --git a/src/libs/routes/school.js b/src/libs/routes/school.js index 8662d945..6c92430b 100644 --- a/src/libs/routes/school.js +++ b/src/libs/routes/school.js @@ -37,8 +37,8 @@ schoolApp.get('/:id', (req, res, next) => { schoolApp.get('/state/:id', (req, res, next) => { req.sql.from('escolas') .field('pk_escola_id') - .field('nome_entidade', 'name') - .field('ano_censo', 'year') + .field('nome_entidade') + .field('ano_censo') .field('fk_cod_estado') .field('fk_cod_municipio') .where('fk_cod_estado = ?', parseInt(req.params.id, 10)); @@ -49,8 +49,8 @@ schoolApp.get('/state/:id', (req, res, next) => { schoolApp.get('/city/:id', (req, res, next) => { req.sql.from('escolas') .field('pk_escola_id') - .field('nome_entidade', 'name') - .field('ano_censo', 'year') + .field('nome_entidade') + .field('ano_censo') .field('fk_cod_estado') .field('fk_cod_municipio') .where('fk_cod_municipio = ?', parseInt(req.params.id, 10)); diff --git a/src/test/test.js b/src/test/test.js index f06f837e..a7e17eda 100644 --- a/src/test/test.js +++ b/src/test/test.js @@ -18,6 +18,19 @@ const server = require(`${libs}/app`); 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 enrollments', (done) => { chai.request(server) @@ -161,4 +174,68 @@ describe('request cities', () => { 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_municipio_id'); + res.body.result[0].should.have.property('fk_estado_id'); + res.body.result[0].should.have.property('nome'); + res.body.result[0].should.have.property('codigo_ibge'); + done(); + }) + }) +}); + +describe('request schools', () => { + it('should list a school by id', (done) => { + chai.request(server) + .get('/api/v1/school/185588') + .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_escola_id'); + res.body.result[0].should.have.property('ano_censo'); + res.body.result[0].should.have.property('cod_entidade'); + res.body.result[0].should.have.property('nome_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('pk_escola_id'); + res.body.result[0].should.have.property('ano_censo'); + res.body.result[0].should.have.property('nome_entidade'); + done(); + }); + }); + + it('should list all schools from a city', (done) => { + chai.request(server) + .get('/api/v1/school/city/3287') + .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_escola_id'); + res.body.result[0].should.have.property('ano_censo'); + res.body.result[0].should.have.property('nome_entidade'); + done(); + }) + }) }); -- GitLab From 7250b7920cdcfee6b52ac43b722499edd920a2a5 Mon Sep 17 00:00:00 2001 From: Vytor Calixto <vytorcalixto@gmail.com> Date: Tue, 4 Oct 2016 11:31:28 -0300 Subject: [PATCH 5/5] Set test coverage threshold at 80% --- gulpfile.babel.js | 12 ++- package.json | 1 + src/libs/routes/enrollment.js | 5 -- src/server.js | 3 + src/test/test.js | 157 ++++++++++++++++++++++++++++++++++ 5 files changed, 170 insertions(+), 8 deletions(-) diff --git a/gulpfile.babel.js b/gulpfile.babel.js index b04d93d4..b2758b0a 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -1,3 +1,5 @@ +require('babel-core/register'); + const fs = require('fs'); const gulp = require('gulp'); @@ -74,11 +76,15 @@ gulp.task('test', ['pre-test'], () => { gulp.src('test/test.js', {read: false}) .pipe(mocha()) .pipe(istanbul.writeReports()) - .pipe(istanbul.enforceThresholds({ thresholds: { global: 75 } })) - .once('error', () => { + .pipe(istanbul.enforceThresholds({ + thresholds: { + global: 80 + } + })) + .on('error', () => { process.exit(1); }) - .once('end', () => { + .on('end', () => { process.exit(); }); }); diff --git a/package.json b/package.json index d477028f..acc29cd2 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "babel-register": "^6.14.0", "babelify": "^7.3.0", "browserify": "^13.1.0", + "chai-xml": "^0.3.1", "docdash": "^0.4.0", "eslint": "^3.3.1", "eslint-config-airbnb": "^10.0.1", diff --git a/src/libs/routes/enrollment.js b/src/libs/routes/enrollment.js index b6f434ce..9fe6e903 100644 --- a/src/libs/routes/enrollment.js +++ b/src/libs/routes/enrollment.js @@ -48,11 +48,6 @@ enrollmentApp.get('/adm_dependency', (req, res, next) => { next(); }, query, response('adm_dependency')); -enrollmentApp.get('/data', (req, res, next) => { - req.sql = squel.select().from('turmas'); - next(); -}, query, response('data')); - // Parse the filters and dimensions parameter in the query enrollmentApp.use('/', parseParams('filter', [ 'min_year', diff --git a/src/server.js b/src/server.js index f18adf49..0eef8dfa 100644 --- a/src/server.js +++ b/src/server.js @@ -18,3 +18,6 @@ app.set('ip', process.env.IP || config.get('ip') || '127.0.0.1'); const server = app.listen(app.get('port'), () => { log.info(`Express server listening on port ${server.address().port}`); }); + +// For testing +module.exports = server; diff --git a/src/test/test.js b/src/test/test.js index a7e17eda..066b7b77 100644 --- a/src/test/test.js +++ b/src/test/test.js @@ -1,9 +1,15 @@ +process.env.NODE_ENV = 'test'; + const chai = require('chai'); const dirtyChai = require('dirty-chai'); chai.use(dirtyChai); +const chaiXml = require('chai-xml'); + +chai.use(chaiXml); + const chaiHttp = require('chai-http'); const assert = chai.assert; @@ -32,6 +38,48 @@ describe('API is running', () => { }); 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') @@ -45,6 +93,84 @@ describe('request enrollments', () => { 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_id,location_id&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('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_id,school&filter=min_year:2013,max_year:2014,city:3287') + .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(); + }); + }); + + }); describe('request regions', () => { @@ -239,3 +365,34 @@ describe('request schools', () => { }) }) }); + +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(); + }); + }); +}); -- GitLab