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

describe('ticket_recalcComponents()', () => {
    it('should recalculate the components in a ticket and check it', async() => {
        let stmts = [];
        let stmt;
        const ticketId = 11;

        stmts.push('START TRANSACTION');

        let sales = await app.models.Sale.find({where: {ticketFk: ticketId}});

        stmt = new ParameterizedSQL('UPDATE vn.sale SET price=100 WHERE id IN(?,?)', [
            sales[0].id,
            sales[1].id
        ]);
        stmts.push(stmt);

        stmt = new ParameterizedSQL('SELECT * FROM vn.sale WHERE ticketFk = ?', [
            ticketId
        ]);
        stmts.push(stmt);

        let modifiedSales = stmts.push(stmt) - 1;

        stmt = new ParameterizedSQL('CALL vn.ticket_recalcComponents(?, NULL)', [
            ticketId,
        ]);
        stmts.push(stmt);

        stmt = new ParameterizedSQL('SELECT * FROM vn.sale WHERE ticketFk = ?', [
            ticketId
        ]);
        stmts.push(stmt);

        let expectedSales = stmts.push(stmt) - 1;

        stmts.push('ROLLBACK');

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

        // original data
        const firstPrice = sales[0].price;
        const secondPrice = sales[1].price;

        // alteratons for test purposes
        const modifiedFirstPrice = result[modifiedSales][0].price;
        const modifiedSecondPrice = result[modifiedSales][1].price;

        // expected data after recalc
        const expectedSalesFirstPrice = result[expectedSales][0].price;
        const expectedSalesSecondPrice = result[expectedSales][1].price;

        expect(firstPrice).not.toEqual(modifiedFirstPrice);
        expect(secondPrice).not.toEqual(modifiedSecondPrice);

        expect(firstPrice).toEqual(expectedSalesFirstPrice);
        expect(secondPrice).toEqual(expectedSalesSecondPrice);
    });
});