From fe90fbc30e09ffaeeee8cd594d622e9de15b5a4e Mon Sep 17 00:00:00 2001 From: Victor Picussa <vp16@inf.ufpr.br> Date: Thu, 28 Jun 2018 10:06:40 -0300 Subject: [PATCH] [cub]Created CUB route --- src/libs/routes/api.js | 3 + src/libs/routes/cub.js | 152 +++++++++++++++++++++++++++++++++++++++++ src/test/cub.js | 109 +++++++++++++++++++++++++++++ 3 files changed, 264 insertions(+) create mode 100644 src/libs/routes/cub.js create mode 100644 src/test/cub.js diff --git a/src/libs/routes/api.js b/src/libs/routes/api.js index 2f9e7f4a..5513c074 100644 --- a/src/libs/routes/api.js +++ b/src/libs/routes/api.js @@ -66,6 +66,8 @@ const classroomCount = require(`${libs}/routes/classroomCount`); const dailyChargeAmount = require(`${libs}/routes/dailyChargeAmount`); +const cub = require(`${libs}/routes/cub`); + api.get('/', (req, res) => { res.json({ msg: 'SimCAQ API is running' }); }); @@ -101,5 +103,6 @@ api.use('/siope', siope); api.use('/out_of_school', outOfSchool); api.use('/classroom_count', classroomCount); api.use('/daily_charge_amount', dailyChargeAmount); +api.use('/cub', cub); module.exports = api; diff --git a/src/libs/routes/cub.js b/src/libs/routes/cub.js new file mode 100644 index 00000000..844f0803 --- /dev/null +++ b/src/libs/routes/cub.js @@ -0,0 +1,152 @@ +const express = require('express'); + +const cubApp = express.Router(); + +const libs = `${process.cwd()}/libs`; + +const log = require(`${libs}/log`)(module); + +const squel = require('squel'); + +const query = require(`${libs}/middlewares/query`).query; + +const response = require(`${libs}/middlewares/response`); + +const id2str = require(`${libs}/middlewares/id2str`); + +const ReqQueryFields = require(`${libs}/middlewares/reqQueryFields`); + +const request = require(`request`); + +const config = require(`${libs}/config`); + +const passport = require('passport'); + +const download = require(`${libs}/middlewares/downloadDatabase`); + +const addMissing = require(`${libs}/middlewares/addMissing`); + +const cache = require('apicache').options({ debug: config.debug, statusCodes: {include: [200]} }).middleware; + +let rqf = new ReqQueryFields(); +let rqfCount = new ReqQueryFields(); + +cubApp.get('/year_range', (req, res, next) => { + req.sql.from('cub') + .field('MIN(cub.ano_censo)', 'start_year') + .field('MAX(cub.ano_censo)', 'end_year'); + next(); +}, query, response('range')); + +cubApp.get('/years', (req, res, next) => { + req.sql.from('cub') + .field('DISTINCT cub.ano_censo', 'year'); + next(); +}, query, response('years')); + +cubApp.get('/months', (req, res, next) => { + req.sql.from('cub') + .field('DISTINCT cub.mes_censo', 'month'); + next(); +}, query, response('months')); + +cubApp.get('/years_months', (req, res, next) => { + req.sql.from('cub') + .field('DISTINCT cub.ano_censo AS "year", cub.mes_censo AS "month"'); + next(); +}, query, response('years_months')); + +cubApp.get('/price_type', (req, res, next) => { + req.sql.from('cub') + .field('DISTINCT cub.tipo_preco', 'price_type'); + next(); +}, query, response('price_type')); + +rqf.addField({ + name: 'filter', + field: false, + where: true +}).addField({ + name: 'dims', + field: true, + where: false +}).addValue({ + name: 'state', + table: 'estado', + tableField: ['sigla', 'id'], + resultField: ['sigla_uf', 'cod_uf'], + where: { + relation: '=', + type: 'integer', + field: 'estado_id', + table: 'cub' + }, + join: { + primary: 'id', + foreign: 'estado_id', + foreignTable: 'cub' + } +}).addValue({ + name: 'min_year', + table: 'cub', + tableField: 'ano_censo', + resultField: 'year', + where: { + relation: '>=', + type: 'integer', + table: 'cub', + field: 'ano_censo' + } +}).addValue({ + name: 'max_year', + table: 'cub', + tableField: 'ano_censo', + resultField: 'year', + where: { + relation: '<=', + type: 'integer', + table: 'cub', + field: 'ano_censo' + } +}).addValue({ + name: 'min_month', + table: 'cub', + tableField: 'mes_censo', + resultField: 'month', + where: { + relation: '>=', + type: 'integer', + table: 'cub', + field: 'mes_censo' + } +}).addValue({ + name: 'max_month', + table: 'cub', + tableField: 'mes_censo', + resultField: 'month', + where: { + relation: '<=', + type: 'integer', + table: 'cub', + field: 'mes_censo' + } +}); + +cubApp.get('/', rqf.parse(), rqf.build(), (req, res, next) => { + req.sql.from('cub') + .field('cub.estado_id', 'cod_uf') + .field('estado.sigla', 'sigla_uf') + .field('cub.tipo_preco', 'tipo_preco') + .field('cub.preco', 'preco') + .join('estado', null, 'cub.estado_id=estado.id') + .group('cub.ano_censo') + .group('cub.mes_censo') + .group('cub.estado_id') + .group('estado.sigla') + .group('cub.tipo_preco') + .group('cub.preco') + + next(); +}, query, addMissing(rqf), id2str.transform(), response('cub')); + +module.exports = cubApp; diff --git a/src/test/cub.js b/src/test/cub.js new file mode 100644 index 00000000..751ca40a --- /dev/null +++ b/src/test/cub.js @@ -0,0 +1,109 @@ +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; + +const expect = chai.expect; + +const should = chai.should(); // actually call the function + +const libs = `${process.cwd()}/libs`; + +const server = require(`${libs}/app`); + +chai.use(chaiHttp); +describe('request cub', () => { + it('should return default query cub', (done) => { + chai.request(server) + .get('/api/v1/cub') + .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_uf'); + res.body.result[0].should.have.property('sigla_uf'); + res.body.result[0].should.have.property('tipo_preco'); + res.body.result[0].should.have.property('preco'); + done(); + }); + }); + + it('should list the years', (done) => { + chai.request(server) + .get('/api/v1/cub/years') + .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('year'); + done(); + }); + }); + + it('should list the year range', (done) => { + chai.request(server) + .get('/api/v1/cub/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 months', (done) => { + chai.request(server) + .get('/api/v1/cub/months') + .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('month'); + done(); + }); + }); + + it('should list the years and months', (done) => { + chai.request(server) + .get('/api/v1/cub/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('year'); + res.body.result[0].should.have.property('month'); + done(); + }); + }); + + it('should list the price type', (done) => { + chai.request(server) + .get('/api/v1/cub/price_type') + .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('price_type'); + done(); + }); + }); +}); -- GitLab