const app = require('vn-loopback/server/server');
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;

describe('buyUltimateFromInterval()', () => {
    let today;
    let future;
    beforeAll(() => {
        let now = new Date();
        now.setHours(0, 0, 0, 0);
        today = now;

        let futureDate = new Date(now);
        let futureMonth = now.getMonth() + 1;
        futureDate.setMonth(futureMonth);
        future = futureDate;
    });

    it(`should create a temporal table with it's data`, async() => {
        let stmts = [];
        let stmt;

        stmts.push('START TRANSACTION');

        let params = {
            warehouseFk: 1,
            started: today,
            ended: today
        };

        stmt = new ParameterizedSQL('CALL vn.buyUltimateFromInterval(?, ?, ?)', [
            params.warehouseFk,
            params.started,
            params.ended
        ]);
        stmts.push(stmt);

        let buyUltimateFromIntervalTableIndex = stmts.push(`SELECT * FROM tmp.buyUltimateFromInterval`) - 1;

        stmts.push('ROLLBACK');

        let sql = ParameterizedSQL.join(stmts, ';');
        let result = await app.models.Ticket.rawStmt(sql);

        let buyUltimateFromIntervalTable = result[buyUltimateFromIntervalTableIndex];

        expect(buyUltimateFromIntervalTable.length).toEqual(2);

        expect(buyUltimateFromIntervalTable[0].itemFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].itemFk).toEqual(3);

        expect(buyUltimateFromIntervalTable[0].warehouseFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].warehouseFk).toEqual(1);

        expect(buyUltimateFromIntervalTable[0].buyFk).toEqual(3);
        expect(buyUltimateFromIntervalTable[1].buyFk).toEqual(5);

        expect(buyUltimateFromIntervalTable[0].landed).toEqual(today);
        expect(buyUltimateFromIntervalTable[1].landed).toEqual(today);
    });

    it(`should create a temporal table with it's data in which started value is assigned to ended`, async() => {
        let params = {
            warehouseFk: 1,
            started: today,
            ended: null
        };

        let query = `
        START TRANSACTION;
        CALL vn.buyUltimateFromInterval(?, ?, ?);
        SELECT * FROM tmp.buyUltimateFromInterval;
        ROLLBACK;`;

        let result = await app.models.Ticket.rawSql(query, [
            params.warehouseFk,
            params.started,
            params.ended
        ]);

        let buyUltimateFromIntervalTable = result[2];

        expect(buyUltimateFromIntervalTable.length).toEqual(2);

        expect(buyUltimateFromIntervalTable[0].itemFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].itemFk).toEqual(3);

        expect(buyUltimateFromIntervalTable[0].warehouseFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].warehouseFk).toEqual(1);

        expect(buyUltimateFromIntervalTable[0].buyFk).toEqual(3);
        expect(buyUltimateFromIntervalTable[1].buyFk).toEqual(5);

        expect(buyUltimateFromIntervalTable[0].landed).toEqual(today);
        expect(buyUltimateFromIntervalTable[1].landed).toEqual(today);
    });

    it(`should create a temporal table with it's data in which ended value is a date in the future`, async() => {
        let params = {
            warehouseFk: 1,
            started: today,
            ended: future
        };

        let query = `
        START TRANSACTION;
        CALL vn.buyUltimateFromInterval(?, ?, ?);
        SELECT * FROM tmp.buyUltimateFromInterval;
        ROLLBACK;`;

        let result = await app.models.Ticket.rawSql(query, [
            params.warehouseFk,
            params.started,
            params.ended
        ]);

        let buyUltimateFromIntervalTable = result[2];

        expect(buyUltimateFromIntervalTable.length).toEqual(2);

        expect(buyUltimateFromIntervalTable[0].itemFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].itemFk).toEqual(3);

        expect(buyUltimateFromIntervalTable[0].warehouseFk).toEqual(1);
        expect(buyUltimateFromIntervalTable[1].warehouseFk).toEqual(1);

        expect(buyUltimateFromIntervalTable[0].buyFk).toEqual(3);
        expect(buyUltimateFromIntervalTable[1].buyFk).toEqual(5);

        expect(buyUltimateFromIntervalTable[0].landed).toEqual(today);
        expect(buyUltimateFromIntervalTable[1].landed).toEqual(today);
    });
});