import selectors from '../../helpers/selectors.js'; import createNightmare from '../../helpers/nightmare'; describe('Ticket Edit sale path', () => { const nightmare = createNightmare(); beforeAll(() => { nightmare .loginAndModule('salesPerson', 'ticket') .accessToSearchResult(16) .accessToSection('ticket.card.sale'); }); it(`should click on the first sale claim icon to navigate over there`, async() => { const url = await nightmare .waitToClick(selectors.ticketSales.firstSaleClaimIcon) .wait(selectors.claimBasicData.claimStateAutocomplete) .parsedUrl(); expect(url.hash).toEqual('#!/claim/2/basic-data'); }); it('should navigate to the tickets index', async() => { const url = await nightmare .waitToClick(selectors.globalItems.applicationsMenuButton) .wait(selectors.globalItems.applicationsMenuVisible) .waitToClick(selectors.globalItems.ticketsButton) .wait(selectors.ticketsIndex.searchTicketInput) .parsedUrl(); expect(url.hash).toEqual('#!/ticket/index'); }); it(`should search for a ticket and then navigate to it's sales`, async() => { const url = await nightmare .accessToSearchResult(16) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); it(`should check the zoomed image isn't present`, async() => { const result = await nightmare .countElement(selectors.ticketSales.firstSaleZoomedImage); expect(result).toEqual(0); }); it(`should click on the thumbnail image of the 1st sale and see the zoomed image`, async() => { const result = await nightmare .clickIfVisible(selectors.ticketSales.firstSaleThumbnailImage) .countElement(selectors.ticketSales.firstSaleZoomedImage); expect(result).toEqual(1); }); it(`should click on the zoomed image to close it`, async() => { const result = await nightmare .wait(100) .clickIfVisible(selectors.ticketSales.firstSaleZoomedImage) .countElement(selectors.ticketSales.firstSaleZoomedImage); expect(result).toEqual(0); }); it(`should confirm the item descriptor insnt visible yet`, async() => { const visible = await nightmare .isVisible(selectors.ticketSales.saleDescriptorPopover); expect(visible).toBeFalsy(); }); it(`should click on the first sale ID making the item descriptor visible`, async() => { const visible = await nightmare .waitToClick(selectors.ticketSales.firstSaleID) .waitImgLoad(selectors.ticketSales.firstSaleDescriptorImage) .isVisible(selectors.ticketSales.saleDescriptorPopover); expect(visible).toBeTruthy(); }); it(`should click on the descriptor image of the 1st sale and see the zoomed image`, async() => { const result = await nightmare .clickIfVisible('vn-item-descriptor img') .countElement(selectors.ticketSales.firstSaleZoomedImage); expect(result).toEqual(1); }); it(`should now click on the zoomed image to close it`, async() => { const result = await nightmare .clickIfVisible(selectors.ticketSales.firstSaleZoomedImage) .countElement(selectors.ticketSales.firstSaleZoomedImage); expect(result).toEqual(0); }); it(`should click on the summary icon of the item-descriptor to access to the item summary`, async() => { const url = await nightmare .waitToClick(selectors.ticketSales.saleDescriptorPopoverSummaryButton) .waitForURL('/summary') .parsedUrl(); expect(url.hash).toContain('/summary'); }); it('should return to ticket sales section', async() => { const url = await nightmare .waitToClick(selectors.globalItems.applicationsMenuButton) .wait(selectors.globalItems.applicationsMenuVisible) .waitToClick(selectors.globalItems.ticketsButton) .accessToSearchResult(16) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); it('should try to add a higher quantity value and then receive an error', async() => { const result = await nightmare .focusElement(selectors.ticketSales.firstSaleQuantityCell) .write(selectors.ticketSales.firstSaleQuantity, '11\u000d') .waitForLastSnackbar(); expect(result).toEqual('The new quantity should be smaller than the old one'); }); it('should remove 1 from the first sale quantity', async() => { const result = await nightmare .focusElement(selectors.ticketSales.firstSaleQuantityCell) .write(selectors.ticketSales.firstSaleQuantity, '9\u000d') .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); }); it('should update the price', async() => { const result = await nightmare .waitToClick(`${selectors.ticketSales.firstSalePrice} > span`) .write(selectors.ticketSales.firstSalePriceInput, '5\u000d') .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); }); it('should confirm the price have been updated', async() => { const result = await nightmare .wait(1999) .waitToGetProperty(`${selectors.ticketSales.firstSalePrice} span`, 'innerText'); expect(result).toContain('5.00'); }); it('should confirm the total price for that item have been updated', async() => { const result = await nightmare .waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText'); expect(result).toContain('45.00'); }); it('should update the discount', async() => { const result = await nightmare .waitToClick(`${selectors.ticketSales.firstSaleDiscount} > span`) .write(selectors.ticketSales.firstSaleDiscountInput, '50\u000d') .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); }); it('should confirm the discount have been updated', async() => { const result = await nightmare .waitForTextInElement(`${selectors.ticketSales.firstSaleDiscount} > span`, '50 %') .waitToGetProperty(`${selectors.ticketSales.firstSaleDiscount} > span`, 'innerText'); expect(result).toContain('50 %'); }); it('should confirm the total import for that item have been updated', async() => { const result = await nightmare .waitForTextInElement(selectors.ticketSales.firstSaleImport, '22.50') .waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText'); expect(result).toContain('22.50'); }); it('should select the third sale and create a claim of it', async() => { const url = await nightmare .waitToClick(selectors.ticketSales.thirdSaleCheckbox) .waitToClick(selectors.ticketSales.moreMenu) .waitToClick(selectors.ticketSales.moreMenuCreateClaim) .wait(selectors.claimBasicData.claimStateAutocomplete) .parsedUrl(); expect(url.hash).toContain('basic-data'); }); it('should click on the Claims button of the top bar menu', async() => { const url = await nightmare .waitToClick(selectors.globalItems.applicationsMenuButton) .wait(selectors.globalItems.applicationsMenuVisible) .waitToClick(selectors.globalItems.claimsButton) .wait(selectors.claimsIndex.searchClaimInput) .parsedUrl(); expect(url.hash).toEqual('#!/claim/index'); }); it('should search for the claim with id 4', async() => { const result = await nightmare .write(selectors.claimsIndex.searchClaimInput, 4) .waitToClick(selectors.claimsIndex.searchButton) .waitForNumberOfElements(selectors.claimsIndex.searchResult, 1) .countElement(selectors.claimsIndex.searchResult); expect(result).toEqual(1); }); it('should click the Tickets button of the top bar menu', async() => { const url = await nightmare .waitToClick(selectors.globalItems.applicationsMenuButton) .wait(selectors.globalItems.applicationsMenuVisible) .waitToClick(selectors.globalItems.ticketsButton) .wait(selectors.ticketsIndex.searchTicketInput) .parsedUrl(); expect(url.hash).toEqual('#!/ticket/index'); }); it('should search for a ticket then access to the sales section', async() => { const url = await nightmare .accessToSearchResult(16) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); it('should select the third sale and delete it', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.thirdSaleCheckbox) .waitToClick(selectors.ticketSales.deleteSaleButton) .waitToClick(selectors.ticketSales.acceptDeleteLineButton) .waitForSpinnerLoad() .waitForLastSnackbar(); expect(result).toEqual('Data saved!'); }); it(`should confirm the third sale was deleted`, async() => { const result = await nightmare .countElement(selectors.ticketSales.saleLine); expect(result).toEqual(3); }); it('should select the third sale and transfer it to a valid ticket', async() => { const targetTicketId = 12; const result = await nightmare .waitToClick(selectors.ticketSales.thirdSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) .write(selectors.ticketSales.moveToTicketInput, targetTicketId) .waitToClick(selectors.ticketSales.moveToTicketButton) .waitForURL(`ticket/${targetTicketId}/sale`) .parsedUrl(); expect(result.hash).toContain(`ticket/${targetTicketId}/sale`); }); it('should confirm the transfered line is the correct one', async() => { const result = await nightmare .wait(selectors.ticketSales.secondSaleText) .waitToGetProperty(selectors.ticketSales.secondSaleText, 'innerText'); expect(result).toContain(`Ranged weapon longbow 2m`); }); it('should go back to the original ticket sales section', async() => { const url = await nightmare .waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton) .accessToSearchResult(16) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); it(`should confirm the original ticket has only two lines now`, async() => { const result = await nightmare .wait(selectors.ticketSales.saleLine) .countElement(selectors.ticketSales.saleLine); expect(result).toEqual(2); }); it('should go back to the receiver ticket sales section', async() => { const url = await nightmare .waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton) .accessToSearchResult(12) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); it('should transfer the sale back to the original ticket', async() => { const targetTicketId = 16; const result = await nightmare .waitToClick(selectors.ticketSales.secondSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) .write(selectors.ticketSales.moveToTicketInput, targetTicketId) .waitToClick(selectors.ticketSales.moveToTicketButton) .waitForURL(`ticket/${targetTicketId}/sale`) .parsedUrl(); expect(result.hash).toContain(`ticket/${targetTicketId}/sale`); }); it('should confirm the original ticket received the line', async() => { const result = await nightmare .waitForNumberOfElements(selectors.ticketSales.saleLine, 3) .countElement(selectors.ticketSales.saleLine); expect(result).toEqual(3); }); it(`should throw an error when attempting to create a ticket for an inactive client`, async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) .waitToClick(selectors.ticketSales.moveToNewTicketButton) .waitToClick(selectors.ticketSales.acceptDeleteTicketButton) .waitForLastSnackbar(); expect(result).toEqual(`You can't create a ticket for a inactive client`); }); it('should go now to the ticket sales section of an active, not frozen client', async() => { const url = await nightmare .waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton) .accessToSearchResult(13) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); it(`should select all sales, tranfer them to a new ticket and delete the sender ticket as it would've been left empty`, async() => { const senderTicketId = 13; const url = await nightmare .waitToClick(selectors.ticketSales.firstSaleCheckbox) .waitToClick(selectors.ticketSales.transferSaleButton) .waitToClick(selectors.ticketSales.moveToNewTicketButton) .waitToClick(selectors.ticketSales.acceptDeleteTicketButton) .wait((selector, ticketId) => { return document.querySelector(selector).innerText.toLowerCase().indexOf(`${ticketId}`) == -1; }, selectors.ticketDescriptor.idLabelValue, senderTicketId) .parsedUrl(); expect(url.hash).toContain('/sale'); }); it('should confirm the new ticket received the line', async() => { const result = await nightmare .countElement(selectors.ticketSales.saleLine); expect(result).toEqual(1); }); it('should check the first sale reserved icon isnt visible', async() => { const result = await nightmare .isVisible(selectors.ticketSales.firstSaleReservedIcon); expect(result).toBeFalsy(); }); it('should mark the first sale as reserved', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleCheckbox) .waitToClick(selectors.ticketSales.moreMenu) .waitToClick(selectors.ticketSales.moreMenuReserve) .waitForClassNotPresent(selectors.ticketSales.firstSaleReservedIcon, 'ng-hide') .isVisible(selectors.ticketSales.firstSaleReservedIcon); expect(result).toBeTruthy(); }); it('should unmark the first sale as reserved', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.moreMenu) .waitToClick(selectors.ticketSales.moreMenuUnmarkReseved) .waitForClassPresent(selectors.ticketSales.firstSaleReservedIcon, 'ng-hide') .isVisible(selectors.ticketSales.firstSaleReservedIcon); expect(result).toBeFalsy(); }); it('should update all sales discount', async() => { const result = await nightmare .waitToClick(selectors.ticketSales.moreMenu) .waitToClick(selectors.ticketSales.moreMenuUpdateDiscount) .write(selectors.ticketSales.moreMenuUpdateDiscountInput, 100) .write('body', '\u000d') .waitForTextInElement(selectors.ticketSales.totalImport, '0.00') .waitToGetProperty(selectors.ticketSales.totalImport, 'innerText'); expect(result).toContain('0.00'); }); it('should log in as Production role and go to a target ticket summary', async() => { const url = await nightmare .loginAndModule('production', 'ticket') .accessToSearchResult(13) .waitForURL('/summary') .parsedUrl(); expect(url.hash).toContain('/summary'); }); it(`should check it's state is deleted`, async() => { const result = await nightmare .waitToGetProperty(selectors.ticketDescriptor.stateLabelValue, 'innerText'); expect(result).toEqual('State Eliminado'); }); describe('when state is preparation and loged as Production', () => { it(`should not be able to edit the sale price`, async() => { const result = await nightmare .waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton) .accessToSearchResult(8) .accessToSection('ticket.card.sale') .waitToClick(selectors.ticketSales.firstSalePrice) .exists(selectors.ticketSales.firstSalePriceInput); expect(result).toBeFalsy(); }); it(`should not be able to edit the sale discount`, async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleDiscount) .exists(selectors.ticketSales.firstSaleDiscountInput); expect(result).toBeFalsy(); }); it(`should not be able to edit the sale state`, async() => { const result = await nightmare .waitToClick(selectors.ticketSales.stateMenuButton) .exists(selectors.ticketSales.stateMenuOptions); expect(result).toBeFalsy(); }); it('should log in as salesPerson then go to the sales of a target ticket', async() => { const url = await nightmare .loginAndModule('salesPerson', 'ticket') .accessToSearchResult(8) .accessToSection('ticket.card.sale') .waitForURL('/sale') .parsedUrl(); expect(url.hash).toContain('/sale'); }); }); describe('when state is preparation and loged as salesPerson', () => { it(`shouldn't be able to edit the sale price`, async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSalePrice) .exists(selectors.ticketSales.firstSalePriceInput); expect(result).toBeFalsy(); }); it(`should be able to edit the sale discount`, async() => { const result = await nightmare .waitToClick(selectors.ticketSales.firstSaleDiscount) .exists(selectors.ticketSales.firstSaleDiscountInput); expect(result).toBeFalsy(); }); it(`should not be able to edit the sale state`, async() => { const result = await nightmare .waitToClick(selectors.ticketSales.stateMenuButton) .exists(selectors.ticketSales.stateMenuOptions); expect(result).toBeFalsy(); }); }); });