From 3ac123d34b5ccfd5f88fc902fd6ee78ff6397a2e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Victor=20Frans=20Pondaco=20Winandy?=
 <jvfpw18@inf.ufpr.br>
Date: Tue, 12 Feb 2019 08:15:45 -0200
Subject: [PATCH] Add new tests

---
 src/libs/routes/transport.js      |  10 -
 src/test/class.js                 |   4 +-
 src/test/classCount.js            | 318 ++++++++++++++++++++++++++++++
 src/test/cub.js                   |  31 +++
 src/test/dailyChargeAmount.js     | 113 ++++++++++-
 src/test/employees.js             | 215 ++++++++++++++++++++
 src/test/enrollment.js            |  14 ++
 src/test/glossEnrollmentRatio.js  |  13 ++
 src/test/liquidEnrollmentRatio.js |  32 +++
 src/test/outOfSchool.js           | 232 ++++++++++++++++++++++
 src/test/schoolCount.js           |  56 +++---
 src/test/transport.js             |  18 +-
 12 files changed, 1013 insertions(+), 43 deletions(-)
 create mode 100644 src/test/classCount.js
 create mode 100644 src/test/employees.js
 create mode 100644 src/test/outOfSchool.js

diff --git a/src/libs/routes/transport.js b/src/libs/routes/transport.js
index b286c001..6435833b 100644
--- a/src/libs/routes/transport.js
+++ b/src/libs/routes/transport.js
@@ -287,16 +287,6 @@ rqf.addField({
         type: 'integer',
         field: 'tipo'
     }
-}).addValue({
-    name: 'service_type',
-    table: 'matricula',
-    tableField: 'tipo',
-    resultField: 'service_type_id',
-    where: {
-        relation: '=',
-        type: 'integer',
-        field: 'tipo'
-    }
 }).addValue({
     name: 'min_year',
     table: 'matricula',
diff --git a/src/test/class.js b/src/test/class.js
index a10ee1f1..dd283b55 100644
--- a/src/test/class.js
+++ b/src/test/class.js
@@ -127,7 +127,7 @@ describe('request class', () => {
             });
     });
 
-    it('should list the administrative dependencies', (done) => {
+    it('should list the administrative dependencies detailed', (done) => {
         chai.request(server)
             .get('/api/v1/class/adm_dependency_detailed')
             .end((err, res) => {
@@ -141,7 +141,7 @@ describe('request class', () => {
             });
     });
 
-    it('should list the administrative dependencies detailed', (done) => {
+    it('should list the administrative dependencies', (done) => {
         chai.request(server)
             .get('/api/v1/class/adm_dependency')
             .end((err, res) => {
diff --git a/src/test/classCount.js b/src/test/classCount.js
new file mode 100644
index 00000000..9880db28
--- /dev/null
+++ b/src/test/classCount.js
@@ -0,0 +1,318 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+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 classCount', () => {
+    it('should return 400 with no filters', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/')
+            .end((err, res) => {
+                res.should.have.status(400);
+                res.should.be.json;
+                res.body.should.have.property('error');
+                res.body.error.should.be.equal('Wrong/No filter specified');
+                done();
+            });
+    });
+
+    it('should list the rural locations', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/rural_location')
+            .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 education level mod', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/education_level_mod')
+            .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 education level short', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/education_level_short')
+            .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 year range', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/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 years', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/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 administrative dependencies', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/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 the administrative dependencies detailed', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/adm_dependency_detailed')
+            .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 locations', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/location')
+            .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 source', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/source')
+            .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('source');
+                done();
+            });
+    });
+
+    it('should list the simcaq class count', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/count')
+            .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('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                done();
+            });
+    });
+
+    it('should list the simcaq class count with valid filter', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/count?filter=state:14')
+            .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('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                done();
+            });
+    });
+
+    it('should list the simcaq class count with valid dim', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count/count?dims=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('year');
+                res.body.result[0].should.have.property('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                res.body.result[0].should.have.property('region_name');
+                done();
+            });
+    });
+
+    it('should list class count with education level filter', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count?filter=education_level_mod:["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('year');
+                res.body.result[0].should.have.property('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                done();
+            });
+    });
+
+    it('should list class count with education level dims', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count?dims=education_level_mod')
+            .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('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                res.body.result[0].should.have.property('education_level_mod_id');
+                res.body.result[0].should.have.property('education_level_mod_name');
+                done();
+            });
+    });
+
+    it('should list class count with valid dims', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count?dims=education_level_mod,location')
+            .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('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                res.body.result[0].should.have.property('education_level_mod_id');
+                res.body.result[0].should.have.property('education_level_mod_name');
+                res.body.result[0].should.have.property('location_id');
+                res.body.result[0].should.have.property('location_name');
+                done();
+            });
+    });
+
+    it('should list class count with education level year limiter', (done) => {
+        chai.request(server)
+            .get('/api/v1/class_count?dims=education_level_mod&filter=min_year:2014,max_year:2014')
+            .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('average');
+                res.body.result[0].should.have.property('median');
+                res.body.result[0].should.have.property('stddev');
+                res.body.result[0].should.have.property('first_qt');
+                res.body.result[0].should.have.property('third_qt');
+                res.body.result[0].should.have.property('education_level_mod_id');
+                res.body.result[0].should.have.property('education_level_mod_name');
+                done();
+            });
+    });
+
+});    
diff --git a/src/test/cub.js b/src/test/cub.js
index ea6c0d68..475e718f 100644
--- a/src/test/cub.js
+++ b/src/test/cub.js
@@ -112,4 +112,35 @@ describe('request cub', () => {
                 done();
             });
     });
+
+    it('should return query cub wtih state dim', (done) => {
+        chai.request(server)
+            .get('/api/v1/cub?dims=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('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 return query cub wtih valid filter', (done) => {
+        chai.request(server)
+            .get('/api/v1/cub?filter=min_year:2017')
+            .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('sigla_uf');
+                res.body.result[0].should.have.property('tipo_preco');
+                res.body.result[0].should.have.property('preco');
+                done();
+            });
+    });
 });
diff --git a/src/test/dailyChargeAmount.js b/src/test/dailyChargeAmount.js
index 20fb9aea..2c37d274 100644
--- a/src/test/dailyChargeAmount.js
+++ b/src/test/dailyChargeAmount.js
@@ -58,7 +58,7 @@ describe('request daily charge amount', () => {
             });
     });
 
-    it('should list the year range', (done) => {
+    it('should list the years', (done) => {
         chai.request(server)
             .get('/api/v1/daily_charge_amount/years')
             .end((err, res) => {
@@ -71,6 +71,47 @@ describe('request daily charge amount', () => {
             });
     });
 
+    it('should list the source', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount/source')
+            .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('source');
+                done();
+            });
+    });
+
+    it('should list the adm dependency', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount/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 the adm dependency detailed', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount/adm_dependency_detailed')
+            .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 locations', (done) => {
         chai.request(server)
             .get('/api/v1/daily_charge_amount/location')
@@ -85,6 +126,21 @@ describe('request daily charge amount', () => {
             });
     });
 
+    it('should list the rural locations', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount/rural_location')
+            .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 education level short', (done) => {
         chai.request(server)
             .get('/api/v1/daily_charge_amount/education_level_short')
@@ -113,6 +169,20 @@ describe('request daily charge amount', () => {
             });
     });
 
+    it('should list the periods', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount/period')
+            .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 dimensions of education_level_short', (done) => {
         chai.request(server)
             .get('/api/v1/daily_charge_amount?dims=education_level_short&filter=min_year:"2015",max_year:"2015",integral_time:"0",period:["3"]')
@@ -172,4 +242,45 @@ describe('request daily charge amount', () => {
                 done();
             });
     });
+
+    it('should list the filter of integral time', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount?filter=integral_time:"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('year');
+                res.body.result[0].should.have.property('education_level_short_id');
+                res.body.result[0].should.have.property('average_class_duration');
+                res.body.result[0].should.have.property('median_class_duration');
+                res.body.result[0].should.have.property('std_class_duration');
+                res.body.result[0].should.have.property('fstqt_class_duration');
+                res.body.result[0].should.have.property('thdqt_class_duration');
+                res.body.result[0].should.have.property('education_level_short_name');
+                done();
+            });
+    });
+
+    it('should list daily charge amount for period 2', (done) => {
+        chai.request(server)
+            .get('/api/v1/daily_charge_amount?filter=integral_time:"0",period:["2"]')
+            .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('education_level_short_id');
+                res.body.result[0].should.have.property('average_class_duration');
+                res.body.result[0].should.have.property('median_class_duration');
+                res.body.result[0].should.have.property('std_class_duration');
+                res.body.result[0].should.have.property('fstqt_class_duration');
+                res.body.result[0].should.have.property('thdqt_class_duration');
+                res.body.result[0].should.have.property('education_level_short_name');
+                done();
+            });
+    });
+
 });
diff --git a/src/test/employees.js b/src/test/employees.js
new file mode 100644
index 00000000..2eff61c4
--- /dev/null
+++ b/src/test/employees.js
@@ -0,0 +1,215 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+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 employees', () => {
+    it('should list the employees default query', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees')
+            .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('total');
+                res.body.result[0].should.have.property('name');
+                res.body.result[0].should.have.property('year');
+                res.body.result[0].should.have.property('total_employees');
+                res.body.result[0].should.have.property('total_teachers');
+                done();
+            });
+    });
+
+    it('should list the year range', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/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 years', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/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 source', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/source')
+            .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('source');
+                done();
+            });
+    });
+
+
+    it('should list the adm dependency', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/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 the adm dependency detailed', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/adm_dependency_detailed')
+            .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 location', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/location')
+            .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 rural location', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees/rural_location')
+            .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 employees with valid filter', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees?filter=min_year:2017')
+            .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('total');
+                res.body.result[0].should.have.property('name');
+                res.body.result[0].should.have.property('year');
+                res.body.result[0].should.have.property('total_employees');
+                res.body.result[0].should.have.property('total_teachers');
+                done();
+            });
+    });
+
+    it('should list employees with school dim', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees?dims=school&filter=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[0].should.have.property('total');
+                res.body.result[0].should.have.property('name');
+                res.body.result[0].should.have.property('year');
+                res.body.result[0].should.have.property('total_employees');
+                res.body.result[0].should.have.property('total_teachers');
+                res.body.result[0].should.have.property('school_name');
+                res.body.result[0].should.have.property('school_id');
+                done();
+            });
+    });
+
+
+    it('should list employees with school filter', (done) => {
+        chai.request(server)
+            .get('/api/v1/employees?filter=school:41126882')
+            .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('total');
+                res.body.result[0].should.have.property('name');
+                res.body.result[0].should.have.property('year');
+                res.body.result[0].should.have.property('total_employees');
+                res.body.result[0].should.have.property('total_teachers');
+                done();
+            });
+    });
+
+});
\ No newline at end of file
diff --git a/src/test/enrollment.js b/src/test/enrollment.js
index af5f50a1..066a23a2 100644
--- a/src/test/enrollment.js
+++ b/src/test/enrollment.js
@@ -495,4 +495,18 @@ describe('request enrollments', () => {
                 done();
             });
     });
+
+    it('should list the age range', (done) => {
+        chai.request(server)
+            .get('/api/v1/enrollment/age_range_all')
+            .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();
+            });
+    });
 });
diff --git a/src/test/glossEnrollmentRatio.js b/src/test/glossEnrollmentRatio.js
index 562244cb..39859b70 100644
--- a/src/test/glossEnrollmentRatio.js
+++ b/src/test/glossEnrollmentRatio.js
@@ -44,6 +44,19 @@ const server = require(`${libs}/app`);
 
 chai.use(chaiHttp);
 describe('request gloss enrollment ratio', () => {
+    it('should list the source', (done) => {
+        chai.request(server)
+            .get('/api/v1/gloss_enrollment_ratio/source')
+            .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('source');
+                done();
+            });
+    });
+
     it('should list the year range', (done) => {
         chai.request(server)
             .get('/api/v1/gloss_enrollment_ratio/year_range')
diff --git a/src/test/liquidEnrollmentRatio.js b/src/test/liquidEnrollmentRatio.js
index bbea4bb6..b61a8d8f 100644
--- a/src/test/liquidEnrollmentRatio.js
+++ b/src/test/liquidEnrollmentRatio.js
@@ -44,6 +44,19 @@ const server = require(`${libs}/app`);
 
 chai.use(chaiHttp);
 describe('request liquid enrollment ratio', () => {
+    it('should list the source', (done) => {
+        chai.request(server)
+            .get('/api/v1/liquid_enrollment_ratio/source')
+            .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('source');
+                done();
+            });
+    });
+
     it('should list the year range', (done) => {
         chai.request(server)
             .get('/api/v1/liquid_enrollment_ratio/year_range')
@@ -179,4 +192,23 @@ describe('request liquid enrollment ratio', () => {
             });
     });
 
+    it('should list liquid ratio with education level basic filter', (done) => {
+        chai.request(server)
+            .get('/api/v1/liquid_enrollment_ratio?dims=education_level_basic&filter=education_level_basic:["1","2","4","5","6"]')
+            .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('total');
+                res.body.result[0].should.have.property('year');
+                res.body.result[0].should.have.property('age_range');
+                res.body.result[0].should.have.property('education_level_basic_id');
+                res.body.result[0].should.have.property('education_level_basic_name');
+                res.body.result[0].should.have.property('partial');
+                res.body.result[0].should.have.property('denominator');
+                done();
+            });
+    });
+
 });
diff --git a/src/test/outOfSchool.js b/src/test/outOfSchool.js
new file mode 100644
index 00000000..bd265f39
--- /dev/null
+++ b/src/test/outOfSchool.js
@@ -0,0 +1,232 @@
+/*
+Copyright (C) 2016 Centro de Computacao Cientifica e Software Livre
+Departamento de Informatica - Universidade Federal do Parana - C3SL/UFPR
+
+This file is part of simcaq-node.
+
+simcaq-node is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+simcaq-node is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with simcaq-node.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+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 out of school', () => {
+    it('should list the year range', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/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 years', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/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 full age range', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/full_age_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('id');
+                res.body.result[0].should.have.property('name');
+                done();
+            });
+    });
+
+    it('should list the ethnic_group', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/ethnic_group')
+            .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 location', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/location')
+            .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 gender', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/gender')
+            .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 fifth household income', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/fifth_household_income')
+            .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 extremes household income', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/extremes_household_income')
+            .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 default query out of school', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school')
+            .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('total');
+                res.body.result[0].should.have.property('year');
+                done();
+            });
+    });
+
+    it('should list out of school with valid filters', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school?filter=max_year:2010')
+            .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('total');
+                done();
+            });
+    });
+
+    it('should list the simcaq default query for out of school', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/simcaq')
+            .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('total');
+                res.body.result[0].should.have.property('ano_censo');
+                done();
+            });
+    });
+
+    it('should list simcaq out of school with valid filters', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/simcaq?filter=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('ano_censo');
+                res.body.result[0].should.have.property('total');
+                done();
+            });
+    });
+
+    it('should list simcaq out of school with valid dimensions', (done) => {
+        chai.request(server)
+            .get('/api/v1/out_of_school/simcaq?dims=state,pfe')
+            .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('pfe_id');
+                res.body.result[0].should.have.property('pfe_name');
+                res.body.result[0].should.have.property('ano_censo');
+                res.body.result[0].should.have.property('total');
+                res.body.result[0].should.have.property('state_id');
+                done();
+            });
+    });
+
+});
\ No newline at end of file
diff --git a/src/test/schoolCount.js b/src/test/schoolCount.js
index 839415ab..ebdcd8ef 100644
--- a/src/test/schoolCount.js
+++ b/src/test/schoolCount.js
@@ -199,22 +199,22 @@ describe('request schools count', () => {
             });
     });
 
-    it('should list school with valid dimensions and filters', (done) => {
-        chai.request(server)
-            .get('/api/v1/school/count?dims=location,adm_dependency,government_agreement')
-            .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('location_name');
-                res.body.result[0].should.have.property('adm_dependency_name');
-                res.body.result[0].should.have.property('government_agreement_name');
-                res.body.result[0].should.have.property('total');
-                res.body.result[0].should.have.property('year');
-                done();
-            });
-    });
+    // it('should list school with valid dimensions and filters', (done) => {
+    //     chai.request(server)
+    //         .get('/api/v1/school/count?dims=location,adm_dependency,government_agreement')
+    //         .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('location_name');
+    //             res.body.result[0].should.have.property('adm_dependency_name');
+    //             res.body.result[0].should.have.property('government_agreement_name');
+    //             res.body.result[0].should.have.property('total');
+    //             res.body.result[0].should.have.property('year');
+    //             done();
+    //         });
+    // });
 
     it('should list school with valid dimensions and filters', (done) => {
         chai.request(server)
@@ -309,18 +309,18 @@ describe('request schools count', () => {
             });
     });
 
-    it('should list school with dimension rural_location', (done) => {
-        chai.request(server)
-            .get('/api/v1/school/count?dims=location')
-            .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('location_name');
-                done();
-            });
-    });
+    // it('should list school with dimension rural_location', (done) => {
+    //     chai.request(server)
+    //         .get('/api/v1/school/count?dims=location')
+    //         .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('location_name');
+    //             done();
+    //         });
+    // });
 
     it('should list school with dimension agreement', (done) => {
         chai.request(server)
diff --git a/src/test/transport.js b/src/test/transport.js
index 39374999..217d688f 100644
--- a/src/test/transport.js
+++ b/src/test/transport.js
@@ -57,7 +57,7 @@ describe('request transport', () => {
             });
     });
 
-    it('should list the year range', (done) => {
+    it('should list the years', (done) => {
         chai.request(server)
             .get('/api/v1/transport/years')
             .end((err, res) => {
@@ -70,7 +70,7 @@ describe('request transport', () => {
             });
     });
 
-    it('should list the years', (done) => {
+    it('should list the year range', (done) => {
         chai.request(server)
             .get('/api/v1/transport/year_range')
             .end((err, res) => {
@@ -181,4 +181,18 @@ describe('request transport', () => {
             });
     });
 
+    it('should list the service type', (done) => {
+        chai.request(server)
+            .get('/api/v1/transport/service_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('id');
+                res.body.result[0].should.have.property('name');
+                done();
+            });
+    });
+
 });
-- 
GitLab