const models = require('vn-loopback/server/server').models; describe('Ticket cloning - clone function', () => { const ctx = beforeAll.getCtx(); beforeAll.mockLoopBackContext(); let options; let tx; beforeEach(async() => { options = {transaction: tx}; tx = await models.Sale.beginTransaction({}); options.transaction = tx; }); afterEach(async() => { await tx.rollback(); }); it('should create new tickets with cloned sales with warehouse', async() => { const salesIds = [1, 2, 3]; const servicesIds = []; const withWarehouse = true; const negative = false; const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, withWarehouse, negative, options); expect(newTickets).toBeDefined(); expect(newTickets.length).toBeGreaterThan(0); }); it('should handle negative quantities correctly', async() => { const negative = true; const salesIds = [7, 8]; const servicesIds = []; const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, false, negative, options); for (const ticket of newTickets) { const sales = await models.Sale.find({where: {ticketFk: ticket.id}}, options); sales.forEach(sale => { expect(sale.quantity).toBeLessThan(0); }); } }); it('should create new components and services for cloned tickets', async() => { const servicesIds = [2]; const salesIds = [5]; const newTickets = await models.Sale.clone(ctx, salesIds, servicesIds, null, false, false, options); for (const ticket of newTickets) { const sale = await models.Sale.findOne({where: {ticketFk: ticket.id}}, options); const components = await models.SaleComponent.find({where: {saleFk: sale.id}}, options); const services = await models.TicketService.find({where: {ticketFk: ticket.id}}, options); expect(components.length).toBeGreaterThan(0); expect(services.length).toBeGreaterThan(0); } }); it('should create a ticket without sales', async() => { const servicesIds = [4]; const tickets = await models.Sale.clone(ctx, null, servicesIds, null, false, false, options); const refundedTicket = await getTicketRefund(tickets[0].id, options); expect(refundedTicket).toBeDefined(); }); }); async function getTicketRefund(id, options) { return models.Ticket.findOne({ where: { id }, include: [ { relation: 'ticketSales', scope: { include: { relation: 'components' } } }, { relation: 'ticketServices', } ] }, options); }