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`);

const query = require(`${libs}/middlewares/query`);

const squel = require('squel');

chai.use(chaiHttp);

describe('Query middleware', () => {
    let req, res;
    it('should return a function', (done) => {
        expect(query).to.be.a.Function;
        done();
    });

    it('should accept three arguments', function(done) {
      expect(query.length).to.equal(3);
      done();
    });

    it('should do a valid query', (done) => {
        let req = {
            sql: squel.select().field('1+2')
        };
        let res = {};
        query(req, {},  (error)=>{
            if (error) { throw new Error('Expected not to receive an error'); }
            req.should.have.property('result');
            req.result.should.not.be.undefined;
            req.result[0].should.have.property('sql_add_single_value');
            req.result[0].sql_add_single_value.should.be.equal(3);
            done();
        });
    });

    it('should return an error with an invalid query (prepared statement error)', (done) => {
        let req = {
            sql: squel.select()
        };
        let res = {};
        query(req, {},  (error)=>{
            if (error) { done();}
        });
    });

    it('should return an error with an invalid query (execution error)', (done) => {
        let req = {
            sql: squel.select().from('ibge_pnad').from('ibge_censo')
        };
        let res = {};
        query(req, {},  (error)=>{
            if (error) { done();}
        });
    });

    it('should return 404 with an empty query result', (done) => {
        let req = {
            sql: squel.select().field('*').from('regiao').where('pk_regiao_id>6')
        };
        let res = {};
        query(req, {},  (error)=>{
            error.should.have.property('status');
            error.status.should.be.equal(404);
            error.should.have.property('message');
            error.message.should.be.equal('No results found in database');
            done();
        });
    });
});