From 65f23e0ebb9cb0825f3a259b3f2f658a7b582dbf Mon Sep 17 00:00:00 2001 From: User Date: Tue, 28 Jan 2025 12:43:27 +0100 Subject: [PATCH 01/10] OBPIH-6683 add selectors to receiving pages --- src/pages/receiving/steps/CheckStep.ts | 11 +++++++++++ src/pages/receiving/steps/ReceivingStep.ts | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/src/pages/receiving/steps/CheckStep.ts b/src/pages/receiving/steps/CheckStep.ts index 8dcc014..9e3fddf 100644 --- a/src/pages/receiving/steps/CheckStep.ts +++ b/src/pages/receiving/steps/CheckStep.ts @@ -2,13 +2,24 @@ import { expect, Page } from '@playwright/test'; import BasePageModel from '@/pages/BasePageModel'; import CheckTable from '@/pages/receiving/components/CheckTable'; +import DatePicker from '@/components/DatePicker'; +import AlertPopup from '@/components/AlertPopup'; class CheckStep extends BasePageModel { table: CheckTable; + deliveredOnDateField: DatePicker; + validationOnDeliveredOnPastDatePopup: AlertPopup; + constructor(page: Page) { super(page); this.table = new CheckTable(page); + this.deliveredOnDateField = new DatePicker(page, 'Delivered on'); + this.validationOnDeliveredOnPastDatePopup = new AlertPopup( + page, + 'Bad request', + 'Must occur on or after Actual Shipping Date' + ); } async isLoaded() { diff --git a/src/pages/receiving/steps/ReceivingStep.ts b/src/pages/receiving/steps/ReceivingStep.ts index caea6e8..f8d5f40 100644 --- a/src/pages/receiving/steps/ReceivingStep.ts +++ b/src/pages/receiving/steps/ReceivingStep.ts @@ -42,6 +42,14 @@ class ReceivingStep extends BasePageModel { get acceptConfirmReceivingDialog() { return this.confirmReceivingDialog.getByRole('button', { name: 'Yes' }); } + + get saveButton() { + return this.page.getByRole('button', { name: 'Save', exact: true }); + } + + get saveAndExitButton() { + return this.page.getByRole('button').getByText('Save and Exit'); + } } export default ReceivingStep; From 994a7d6bc6d37de7ed848b675049524f5ce5cfbe Mon Sep 17 00:00:00 2001 From: User Date: Tue, 28 Jan 2025 12:44:16 +0100 Subject: [PATCH 02/10] OBPIH-6683 add new alert --- src/components/AlertPopup.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/components/AlertPopup.ts b/src/components/AlertPopup.ts index 5c6da52..e540a29 100644 --- a/src/components/AlertPopup.ts +++ b/src/components/AlertPopup.ts @@ -31,6 +31,14 @@ class AlertPopup extends BasePageModel { async assertPopupHiddent() { await expect(this.dialog).toBeHidden(); } + + get validationDialog() { + return this.page.locator('.s-alert-box-inner'); + } + + async assertvalidationDialogVisible() { + await expect(this.validationDialog).toBeVisible(); + } } export default AlertPopup; From 8897569439f78e05e90c8fa5adf8d557579ab4b2 Mon Sep 17 00:00:00 2001 From: User Date: Tue, 28 Jan 2025 12:44:54 +0100 Subject: [PATCH 03/10] OBPIH-6683 add tests for validation on delivered on date --- .../validationsOnDeliverOnDate.test.ts | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/tests/receiving/validationsOnDeliverOnDate.test.ts diff --git a/src/tests/receiving/validationsOnDeliverOnDate.test.ts b/src/tests/receiving/validationsOnDeliverOnDate.test.ts new file mode 100644 index 0000000..79d8e6c --- /dev/null +++ b/src/tests/receiving/validationsOnDeliverOnDate.test.ts @@ -0,0 +1,102 @@ +import { ShipmentType } from '@/constants/ShipmentType'; +import { expect, test } from '@/fixtures/fixtures'; +import { StockMovementResponse } from '@/types'; +import { getDateByOffset } from '@/utils/DateUtils'; + +test.describe('Validations on edit Deliver On Date when receiving shipment', () => { + let STOCK_MOVEMENT: StockMovementResponse; + + test.beforeEach( + async ({ + supplierLocationService, + stockMovementService, + mainProductService, + }) => { + const supplierLocation = await supplierLocationService.getLocation(); + STOCK_MOVEMENT = await stockMovementService.createInbound({ + originId: supplierLocation.id, + }); + + const product = await mainProductService.getProduct(); + + await stockMovementService.addItemsToInboundStockMovement( + STOCK_MOVEMENT.id, + [{ productId: product.id, quantity: 50 }] + ); + + await stockMovementService.sendInboundStockMovement(STOCK_MOVEMENT.id, { + shipmentType: ShipmentType.AIR, + }); + } + ); + + test.afterEach(async ({ stockMovementShowPage, stockMovementService }) => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.rollbackButton.click(); + await stockMovementService.deleteStockMovement(STOCK_MOVEMENT.id); + }); + + test('Assert validation on try to edit Delivered on Date to future date', async ({ + stockMovementShowPage, + receivingPage, + }) => { + await test.step('Go to stock movement show page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + }); + + await test.step('Go to shipment receiving page', async () => { + await stockMovementShowPage.receiveButton.click(); + await receivingPage.receivingStep.isLoaded(); + }); + + await test.step('Autofill qty and go to check page', async () => { + await receivingPage.receivingStep.autofillQuantitiesButton.click(); + await receivingPage.nextButton.click(); + }); + + await test.step('Edit Delivered on Date on check page to future date', async () => { + await receivingPage.checkStep.isLoaded(); + await receivingPage.checkStep.deliveredOnDateField.fill( + getDateByOffset(new Date(), 5) + ); + await receivingPage.checkStep.deliveredOnDateField.assertHasError(); + await expect( + receivingPage.checkStep.deliveredOnDateField.errorMessage + ).toContainText('The date cannot be in the future'); + }); + }); + + test('Assert validation on try to edit Delivered on Date to past date', async ({ + stockMovementShowPage, + receivingPage, + }) => { + await test.step('Go to stock movement show page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + }); + + await test.step('Go to shipment receiving page', async () => { + await stockMovementShowPage.receiveButton.click(); + await receivingPage.receivingStep.isLoaded(); + }); + + await test.step('Autofill qty and go to check page', async () => { + await receivingPage.receivingStep.autofillQuantitiesButton.click(); + await receivingPage.nextButton.click(); + }); + + await test.step('Edit Delivered on Date on check page to past date', async () => { + await receivingPage.checkStep.isLoaded(); + await receivingPage.checkStep.deliveredOnField.click(); + await receivingPage.checkStep.previousMonthOnDatePicker.click(); + await receivingPage.checkStep.getDayOnDatePicker('1').nth(0).click(); + await receivingPage.checkStep.deliveredOnField.click(); + await receivingPage.checkStep.previousMonthOnDatePicker.click(); + await receivingPage.checkStep.getDayOnDatePicker('1').nth(0).click(); + await receivingPage.checkStep.isLoaded(); + await receivingPage.checkStep.receiveShipmentButton.click(); + await receivingPage.checkStep.validationOnDeliveredOnPastDatePopup.assertvalidationDialogVisible(); + }); + }); +}); From 0efb88b427760e7a0e6feb76adc7dd7ee28382a8 Mon Sep 17 00:00:00 2001 From: User Date: Tue, 28 Jan 2025 12:45:32 +0100 Subject: [PATCH 04/10] OBPIH-6683 add test for using save and save and exit buttons in receive --- src/tests/receiving/receiveInbound.test.ts | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/tests/receiving/receiveInbound.test.ts b/src/tests/receiving/receiveInbound.test.ts index ee36f79..a28fede 100644 --- a/src/tests/receiving/receiveInbound.test.ts +++ b/src/tests/receiving/receiveInbound.test.ts @@ -239,6 +239,75 @@ test.describe('Receive inbound stock movement', () => { }); }); + test('Use Save button in receiving and assert saved qty', async ({ + stockMovementShowPage, + receivingPage, + }) => { + await test.step('Go to stock movement show page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + }); + + await test.step('Go to shipment receiving page', async () => { + await stockMovementShowPage.receiveButton.click(); + await receivingPage.receivingStep.isLoaded(); + }); + + await test.step('Check first item to be received', async () => { + await receivingPage.receivingStep.table + .row(1) + .receivingNowField.textbox.fill('8'); + }); + + await test.step('Click on Save button', async () => { + await receivingPage.receivingStep.saveButton.click(); + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + }); + + await test.step('Return to receive page and assert qty input', async () => { + await stockMovementShowPage.receiveButton.click(); + await receivingPage.receivingStep.isLoaded(); + await expect( + receivingPage.receivingStep.table.row(1).receivingNowField.textbox + ).toHaveValue('8'); + }); + }); + + test('Use Save and Exit button in receiving and assert saved qty', async ({ + stockMovementShowPage, + receivingPage, + }) => { + await test.step('Go to stock movement show page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + }); + + await test.step('Go to shipment receiving page', async () => { + await stockMovementShowPage.receiveButton.click(); + await receivingPage.receivingStep.isLoaded(); + }); + + await test.step('Check first item to be received', async () => { + await receivingPage.receivingStep.table + .row(1) + .receivingNowField.textbox.fill('2'); + }); + + await test.step('Click on Save and Exit button', async () => { + await receivingPage.receivingStep.saveAndExitButton.click(); + await stockMovementShowPage.isLoaded(); + }); + + await test.step('Return to receive page and assert qty input', async () => { + await stockMovementShowPage.receiveButton.click(); + await receivingPage.receivingStep.isLoaded(); + await expect( + receivingPage.receivingStep.table.row(1).receivingNowField.textbox + ).toHaveValue('2'); + }); + }); + test.describe('Receive from different locations', () => { test.afterEach(async ({ authService }) => { await authService.changeLocation(AppConfig.instance.locations.main.id); From e1fa7b61348d925343bd062b935bf408b7ce953c Mon Sep 17 00:00:00 2001 From: User Date: Wed, 29 Jan 2025 15:08:11 +0100 Subject: [PATCH 05/10] OBPIH-6683 improve locators and assertion --- src/components/AlertPopup.ts | 8 -------- src/pages/receiving/steps/CheckStep.ts | 12 ++++++------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/components/AlertPopup.ts b/src/components/AlertPopup.ts index e540a29..5c6da52 100644 --- a/src/components/AlertPopup.ts +++ b/src/components/AlertPopup.ts @@ -31,14 +31,6 @@ class AlertPopup extends BasePageModel { async assertPopupHiddent() { await expect(this.dialog).toBeHidden(); } - - get validationDialog() { - return this.page.locator('.s-alert-box-inner'); - } - - async assertvalidationDialogVisible() { - await expect(this.validationDialog).toBeVisible(); - } } export default AlertPopup; diff --git a/src/pages/receiving/steps/CheckStep.ts b/src/pages/receiving/steps/CheckStep.ts index 9e3fddf..9976204 100644 --- a/src/pages/receiving/steps/CheckStep.ts +++ b/src/pages/receiving/steps/CheckStep.ts @@ -9,17 +9,11 @@ class CheckStep extends BasePageModel { table: CheckTable; deliveredOnDateField: DatePicker; - validationOnDeliveredOnPastDatePopup: AlertPopup; constructor(page: Page) { super(page); this.table = new CheckTable(page); this.deliveredOnDateField = new DatePicker(page, 'Delivered on'); - this.validationOnDeliveredOnPastDatePopup = new AlertPopup( - page, - 'Bad request', - 'Must occur on or after Actual Shipping Date' - ); } async isLoaded() { @@ -53,6 +47,12 @@ class CheckStep extends BasePageModel { get cancelAllRemainingButton() { return this.page.getByRole('button', { name: 'Cancel all remaining' }); } + + get validationOnDeliveredOnPastDatePopup() { + return this.page + .locator('.s-alert-box-inner') + .getByText('Must occur on or after Actual Shipping Date'); + } } export default CheckStep; From 70e47d76774083d3d348aeac3b63f7e981ca0196 Mon Sep 17 00:00:00 2001 From: User Date: Wed, 29 Jan 2025 15:08:56 +0100 Subject: [PATCH 06/10] OBPIH-6683 add suggested method --- src/components/DatePicker.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/DatePicker.ts b/src/components/DatePicker.ts index 2a6028c..06cdb81 100644 --- a/src/components/DatePicker.ts +++ b/src/components/DatePicker.ts @@ -14,6 +14,13 @@ class DatePicker extends FormField { await this.textbox.fill(formatDate(date)); await this.page.keyboard.press('Enter'); } + + async fillWithFormat(date: Date, format: string) { + await this.page.waitForTimeout(1000); + await this.textbox.fill(formatDate(date, format)); + await this.page.keyboard.press('Enter'); + await this.page.waitForTimeout(1000); + } } export default DatePicker; From 172d5b70177f9f37b516eafe64b453c6e68a8818 Mon Sep 17 00:00:00 2001 From: User Date: Wed, 29 Jan 2025 15:09:58 +0100 Subject: [PATCH 07/10] OBPIH-6683 improve assertion and use new filling method --- .../receiving/validationsOnDeliverOnDate.test.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/tests/receiving/validationsOnDeliverOnDate.test.ts b/src/tests/receiving/validationsOnDeliverOnDate.test.ts index 79d8e6c..650048b 100644 --- a/src/tests/receiving/validationsOnDeliverOnDate.test.ts +++ b/src/tests/receiving/validationsOnDeliverOnDate.test.ts @@ -89,14 +89,15 @@ test.describe('Validations on edit Deliver On Date when receiving shipment', () await test.step('Edit Delivered on Date on check page to past date', async () => { await receivingPage.checkStep.isLoaded(); await receivingPage.checkStep.deliveredOnField.click(); - await receivingPage.checkStep.previousMonthOnDatePicker.click(); - await receivingPage.checkStep.getDayOnDatePicker('1').nth(0).click(); - await receivingPage.checkStep.deliveredOnField.click(); - await receivingPage.checkStep.previousMonthOnDatePicker.click(); - await receivingPage.checkStep.getDayOnDatePicker('1').nth(0).click(); + await receivingPage.checkStep.deliveredOnDateField.fillWithFormat( + getDateByOffset(new Date(), -5), + 'MM/DD/YYYY HH:mm:ss Z' + ); await receivingPage.checkStep.isLoaded(); await receivingPage.checkStep.receiveShipmentButton.click(); - await receivingPage.checkStep.validationOnDeliveredOnPastDatePopup.assertvalidationDialogVisible(); + await expect( + receivingPage.checkStep.validationOnDeliveredOnPastDatePopup + ).toBeVisible(); }); }); }); From 9b259c0c504b3ee5e7641fca65f8b9cd75295284 Mon Sep 17 00:00:00 2001 From: User Date: Thu, 30 Jan 2025 09:36:01 +0100 Subject: [PATCH 08/10] OBPIH-6683 fix conflicts and remove unused selectors --- src/pages/receiving/steps/CheckStep.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/pages/receiving/steps/CheckStep.ts b/src/pages/receiving/steps/CheckStep.ts index 9976204..a5f0721 100644 --- a/src/pages/receiving/steps/CheckStep.ts +++ b/src/pages/receiving/steps/CheckStep.ts @@ -3,8 +3,6 @@ import { expect, Page } from '@playwright/test'; import BasePageModel from '@/pages/BasePageModel'; import CheckTable from '@/pages/receiving/components/CheckTable'; import DatePicker from '@/components/DatePicker'; -import AlertPopup from '@/components/AlertPopup'; - class CheckStep extends BasePageModel { table: CheckTable; @@ -40,10 +38,6 @@ class CheckStep extends BasePageModel { return this.page.getByRole('textbox', { name: 'Shipped on' }); } - get deliveredOnField() { - return this.page.getByRole('textbox', { name: 'Delivered on' }); - } - get cancelAllRemainingButton() { return this.page.getByRole('button', { name: 'Cancel all remaining' }); } From a06fa28281ec6190b56c84cae1936595e031ffec Mon Sep 17 00:00:00 2001 From: User Date: Thu, 30 Jan 2025 10:18:46 +0100 Subject: [PATCH 09/10] OBPIH-6683 fix failing test --- src/tests/receiving/validationsOnDeliverOnDate.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/receiving/validationsOnDeliverOnDate.test.ts b/src/tests/receiving/validationsOnDeliverOnDate.test.ts index 650048b..1f31e21 100644 --- a/src/tests/receiving/validationsOnDeliverOnDate.test.ts +++ b/src/tests/receiving/validationsOnDeliverOnDate.test.ts @@ -57,8 +57,9 @@ test.describe('Validations on edit Deliver On Date when receiving shipment', () await test.step('Edit Delivered on Date on check page to future date', async () => { await receivingPage.checkStep.isLoaded(); - await receivingPage.checkStep.deliveredOnDateField.fill( - getDateByOffset(new Date(), 5) + await receivingPage.checkStep.deliveredOnDateField.fillWithFormat( + getDateByOffset(new Date(), 1), + 'MM/DD/YYYY HH:mm:ss Z' ); await receivingPage.checkStep.deliveredOnDateField.assertHasError(); await expect( @@ -88,9 +89,8 @@ test.describe('Validations on edit Deliver On Date when receiving shipment', () await test.step('Edit Delivered on Date on check page to past date', async () => { await receivingPage.checkStep.isLoaded(); - await receivingPage.checkStep.deliveredOnField.click(); await receivingPage.checkStep.deliveredOnDateField.fillWithFormat( - getDateByOffset(new Date(), -5), + getDateByOffset(new Date(), -1), 'MM/DD/YYYY HH:mm:ss Z' ); await receivingPage.checkStep.isLoaded(); From f0a9cb4ca0b2e5ee6f1a41ce73b62d948e10712b Mon Sep 17 00:00:00 2001 From: Artur Walkowiak Date: Tue, 4 Feb 2025 17:30:18 +0100 Subject: [PATCH 10/10] Add a todo in the DatePicker component --- src/components/DatePicker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/DatePicker.ts b/src/components/DatePicker.ts index 06cdb81..b20b126 100644 --- a/src/components/DatePicker.ts +++ b/src/components/DatePicker.ts @@ -16,6 +16,7 @@ class DatePicker extends FormField { } async fillWithFormat(date: Date, format: string) { + // TODO: This is temporary solution until we figure out the sluggishness of the date picker await this.page.waitForTimeout(1000); await this.textbox.fill(formatDate(date, format)); await this.page.keyboard.press('Enter');