From 645967a91efcbcec3ce24d23f8bdeca1752bee72 Mon Sep 17 00:00:00 2001 From: Katarzyna Date: Tue, 12 May 2026 11:58:30 +0200 Subject: [PATCH 1/3] add assistant user --- .env.example | 2 ++ .github/workflows/playwright.yml | 2 ++ src/config/AppConfig.ts | 30 ++++++++++++++++++++++++------ src/fixtures/fixtures.ts | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/.env.example b/.env.example index e2aed1a..47d1cd5 100644 --- a/.env.example +++ b/.env.example @@ -8,6 +8,8 @@ USER_MANAGER_USERNAME=manager USER_MANAGER_PASSWORD=password USER_IMPERSONATOR_USERNAME=impersonator USER_IMPERSONATOR_PASSWORD=password +USER_ASSISTANT_USERNAME=assistant +USER_ASSISTANT_PASSWORD=password LOCATION_MAIN=locationId LOCATION_NO_MANAGE_INVENOTRY_DEPOT=locationId LOCATION_SUPPLIER=locationId diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 3cefd78..9030f44 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -60,6 +60,8 @@ jobs: USER_MANAGER_PASSWORD: ${{ secrets.USER_MANAGER_PASSWORD }} USER_IMPERSONATOR_USERNAME: ${{ secrets.USER_IMPERSONATOR_USERNAME }} USER_IMPERSONATOR_PASSWORD: ${{ secrets.USER_IMPERSONATOR_PASSWORD }} + USER_ASSISTANT_USERNAME: ${{ secrets.USER_ASSISTANT_USERNAME }} + USER_ASSISTANT_PASSWORD: ${{ secrets.USER_ASSISTANT_PASSWORD }} LOCATION_MAIN: ${{ secrets.LOCATION_MAIN }} LOCATION_NO_MANAGE_INVENOTRY_DEPOT: ${{ secrets.LOCATION_NO_MANAGE_INVENOTRY_DEPOT }} LOCATION_SUPPLIER: ${{ secrets.LOCATION_SUPPLIER }} diff --git a/src/config/AppConfig.ts b/src/config/AppConfig.ts index 36ab404..f4ea955 100644 --- a/src/config/AppConfig.ts +++ b/src/config/AppConfig.ts @@ -16,6 +16,7 @@ export enum USER_KEY { ALTERNATIVE = 'alternative', MANAGER = 'manager', IMPERSONATOR = 'impersonator', + ASSISTANT = 'assistant', } export enum LOCATION_KEY { @@ -55,11 +56,20 @@ class AppConfig { public static TEST_DATA_FILE_PATH = path.join(process.cwd(), '.data.json'); - public static DATA_IMPORT_DIRECTORY_PATH = path.join(process.cwd(), 'src/setup/dataImport'); + public static DATA_IMPORT_DIRECTORY_PATH = path.join( + process.cwd(), + 'src/setup/dataImport' + ); - public static PRODUCTS_IMPORT_FILE_PATH = path.join(AppConfig.DATA_IMPORT_DIRECTORY_PATH, '/products.csv'); + public static PRODUCTS_IMPORT_FILE_PATH = path.join( + AppConfig.DATA_IMPORT_DIRECTORY_PATH, + '/products.csv' + ); - public static INVENTORY_IMPORT_FILE_PATH = path.join(AppConfig.DATA_IMPORT_DIRECTORY_PATH, '/inventory.csv'); + public static INVENTORY_IMPORT_FILE_PATH = path.join( + AppConfig.DATA_IMPORT_DIRECTORY_PATH, + '/inventory.csv' + ); // Base URL to use in actions like `await page.goto('./dashboard')`. public appURL!: string; @@ -132,7 +142,7 @@ class AppConfig { password: env.get('USER_ALT_PASSWORD').required().asString(), storageFileName: '.auth-storage-ALT-USER.json', requiredRoles: new Set([ - RoleType.ROLE_SUPERUSER, + RoleType.ROLE_ADMIN, RoleType.ROLE_FINANCE, RoleType.ROLE_PRODUCT_MANAGER, RoleType.ROLE_INVOICE, @@ -146,6 +156,14 @@ class AppConfig { storageFileName: '.auth-storage-MANAGER-USER.json', requiredRoles: new Set([RoleType.ROLE_MANAGER]), }), + + assistant: new TestUserConfig({ + key: USER_KEY.ASSISTANT, + username: env.get('USER_ASSISTANT_USERNAME').required().asString(), + password: env.get('USER_ASSISTANT_PASSWORD').required().asString(), + storageFileName: '.auth-storage-ASSISTANT-USER.json', + requiredRoles: new Set([RoleType.ROLE_ASSISTANT]), + }), }; this.locations = { @@ -301,8 +319,8 @@ class AppConfig { name: productData['Name'], quantity: parseInt(productData['Quantity']), required: false, - }) - }) + }); + }); this.receivingBinPrefix = env .get('RECEIVING_BIN_PREFIX') diff --git a/src/fixtures/fixtures.ts b/src/fixtures/fixtures.ts index ff883b5..3a04085 100644 --- a/src/fixtures/fixtures.ts +++ b/src/fixtures/fixtures.ts @@ -100,11 +100,13 @@ type Fixtures = { mainUserService: UserData; altUserService: UserData; managerUserService: UserData; + assistantUserService: UserData; // USER CONTEXT mainUserContext: BrowserContext; altUserContext: BrowserContext; emptyUserContext: BrowserContext; managerUserContext: BrowserContext; + assistantUserContext: BrowserContext; }; export const test = baseTest.extend({ @@ -191,6 +193,8 @@ export const test = baseTest.extend({ use(new UserData(USER_KEY.ALTERNATIVE, page.request)), managerUserService: async ({ page }, use) => use(new UserData(USER_KEY.MANAGER, page.request)), + assistantUserService: async ({ page }, use) => + use(new UserData(USER_KEY.ASSISTANT, page.request)), // NEW USER CONTEXTS mainUserContext: async ({ browser }, use) => { const newCtx = await browser.newContext({ @@ -229,6 +233,16 @@ export const test = baseTest.extend({ await newCtx.close(); }, + + assistantUserContext: async ({ browser }, use) => { + const newCtx = await browser.newContext({ + storageState: AppConfig.instance.users.assistant.storagePath, + }); + + await use(newCtx); + + await newCtx.close(); + }, }); export { expect } from '@playwright/test'; From bedf301bb2315467bf9ecf86e99b8f50db233438 Mon Sep 17 00:00:00 2001 From: Katarzyna Date: Tue, 12 May 2026 11:58:54 +0200 Subject: [PATCH 2/3] add page elements --- src/pages/putaway/putawayDetails/PutawayDetailsPage.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/pages/putaway/putawayDetails/PutawayDetailsPage.ts b/src/pages/putaway/putawayDetails/PutawayDetailsPage.ts index 68eaeaa..30c8730 100644 --- a/src/pages/putaway/putawayDetails/PutawayDetailsPage.ts +++ b/src/pages/putaway/putawayDetails/PutawayDetailsPage.ts @@ -116,6 +116,11 @@ class PutawayDetailsPage extends BasePageModel { }); await this.editButton.click(); } + + async clickDeleteOrderButton() { + this.page.once('dialog', (dialog) => dialog.accept()); + await this.actionsDeleteButton.click(); + } } export default PutawayDetailsPage; From d2c59bc12ca133acbbf6064d400ddfdc0102945c Mon Sep 17 00:00:00 2001 From: Katarzyna Date: Tue, 12 May 2026 11:59:25 +0200 Subject: [PATCH 3/3] add delete pending putaway test --- .../putaway/deletePendingPutaway.test.ts | 548 ++++++++++++++++++ 1 file changed, 548 insertions(+) create mode 100644 src/tests/putaway/deletePendingPutaway.test.ts diff --git a/src/tests/putaway/deletePendingPutaway.test.ts b/src/tests/putaway/deletePendingPutaway.test.ts new file mode 100644 index 0000000..d77382b --- /dev/null +++ b/src/tests/putaway/deletePendingPutaway.test.ts @@ -0,0 +1,548 @@ +import Navbar from '@/components/Navbar'; +import AppConfig from '@/config/AppConfig'; +import { ShipmentType } from '@/constants/ShipmentType'; +import { expect, test } from '@/fixtures/fixtures'; +import CreatePutawayPage from '@/pages/putaway/CreatePutawayPage'; +import PutawayListPage from '@/pages/putaway/list/PutawayListPage'; +import PutawayDetailsPage from '@/pages/putaway/putawayDetails/PutawayDetailsPage'; +import StockMovementShowPage from '@/pages/stockMovementShow/StockMovementShowPage'; +import { StockMovementResponse } from '@/types'; +import RefreshCachesUtils from '@/utils/RefreshCaches'; +import { + deleteReceivedShipment, + getShipmentId, + getShipmentItemId, +} from '@/utils/shipmentUtils'; + +test.describe('Delete pending putaways', () => { + let STOCK_MOVEMENT: StockMovementResponse; + + test.beforeEach( + async ({ + supplierLocationService, + stockMovementService, + productService, + receivingService, + }) => { + const supplierLocation = await supplierLocationService.getLocation(); + STOCK_MOVEMENT = await stockMovementService.createInbound({ + originId: supplierLocation.id, + }); + + productService.setProduct('5'); + const product = await productService.getProduct(); + + await stockMovementService.addItemsToInboundStockMovement( + STOCK_MOVEMENT.id, + [{ productId: product.id, quantity: 10 }] + ); + + await stockMovementService.sendInboundStockMovement(STOCK_MOVEMENT.id, { + shipmentType: ShipmentType.AIR, + }); + + const { data: stockMovement } = + await stockMovementService.getStockMovement(STOCK_MOVEMENT.id); + const shipmentId = getShipmentId(stockMovement); + const { data: receipt } = await receivingService.getReceipt(shipmentId); + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + + await receivingService.createReceivingBin(shipmentId, receipt); + + await receivingService.updateReceivingItems(shipmentId, [ + { + shipmentItemId: getShipmentItemId(receipt, 0, 0), + quantityReceiving: 10, + binLocationName: receivingBin, + }, + ]); + await receivingService.completeReceipt(shipmentId); + } + ); + + test.afterEach( + async ({ + stockMovementShowPage, + stockMovementService, + oldViewShipmentPage, + }) => { + await deleteReceivedShipment({ + stockMovementShowPage, + oldViewShipmentPage, + stockMovementService, + STOCK_MOVEMENT, + }); + } + ); + + test('Delete pending putaway as superuser from list page', async ({ + stockMovementShowPage, + navbar, + createPutawayPage, + productService, + putawayListPage, + page, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway list page and delete pending putaway', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ has: page.locator('td') }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await putawayListPage.table.clickDeleteOrderButton(1); + await putawayListPage.emptyPutawayList.isVisible(); + }); + }); + + test('Delete pending putaway as superuser from putaway details page', async ({ + stockMovementShowPage, + navbar, + createPutawayPage, + putawayDetailsPage, + productService, + putawayListPage, + page, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway details page', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ has: page.locator('td') }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await row.viewOrderDetails.click(); + }); + + await test.step('Delete putaway from details page and assert is deleted', async () => { + await putawayDetailsPage.isLoaded(); + await putawayDetailsPage.summaryActionsButton.click(); + await putawayDetailsPage.clickDeleteOrderButton(); + await putawayListPage.isLoaded(); + await putawayListPage.emptyPutawayList.isVisible(); + }); + }); + + test('Delete pending putaway as manager user from list page', async ({ + managerUserContext, + productService, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + const managerUserPage = await managerUserContext.newPage(); + const navbar = new Navbar(managerUserPage); + const stockMovementShowPage = new StockMovementShowPage(managerUserPage); + const createPutawayPage = new CreatePutawayPage(managerUserPage); + const putawayListPage = new PutawayListPage(managerUserPage); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway list page and delete pending putaway', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ + has: managerUserPage.locator('td'), + }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await putawayListPage.table.clickDeleteOrderButton(1); + await putawayListPage.emptyPutawayList.isVisible(); + await managerUserPage.close(); + }); + }); + + test('Delete pending putaway as manager user from details page', async ({ + managerUserContext, + productService, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + const managerUserPage = await managerUserContext.newPage(); + const navbar = new Navbar(managerUserPage); + const stockMovementShowPage = new StockMovementShowPage(managerUserPage); + const createPutawayPage = new CreatePutawayPage(managerUserPage); + const putawayListPage = new PutawayListPage(managerUserPage); + const putawayDetailsPage = new PutawayDetailsPage(managerUserPage); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway details page', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ + has: managerUserPage.locator('td'), + }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await row.viewOrderDetails.click(); + }); + + await test.step('Delete putaway from details page and assert is deleted', async () => { + await putawayDetailsPage.isLoaded(); + await putawayDetailsPage.summaryActionsButton.click(); + await putawayDetailsPage.clickDeleteOrderButton(); + await putawayListPage.isLoaded(); + await putawayListPage.emptyPutawayList.isVisible(); + await managerUserPage.close(); + }); + }); + + test('Delete pending putaway as admin user from list page', async ({ + altUserContext, + productService, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + const adminUserPage = await altUserContext.newPage(); + const navbar = new Navbar(adminUserPage); + const stockMovementShowPage = new StockMovementShowPage(adminUserPage); + const createPutawayPage = new CreatePutawayPage(adminUserPage); + const putawayListPage = new PutawayListPage(adminUserPage); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway list page and delete pending putaway', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ + has: adminUserPage.locator('td'), + }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await putawayListPage.table.clickDeleteOrderButton(1); + await putawayListPage.emptyPutawayList.isVisible(); + await adminUserPage.close(); + }); + }); + + test('Delete pending putaway as admin user from details page', async ({ + altUserContext, + productService, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + const adminUserPage = await altUserContext.newPage(); + const navbar = new Navbar(adminUserPage); + const stockMovementShowPage = new StockMovementShowPage(adminUserPage); + const createPutawayPage = new CreatePutawayPage(adminUserPage); + const putawayListPage = new PutawayListPage(adminUserPage); + const putawayDetailsPage = new PutawayDetailsPage(adminUserPage); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway details page', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ + has: adminUserPage.locator('td'), + }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await row.viewOrderDetails.click(); + }); + + await test.step('Delete putaway from details page and assert is deleted', async () => { + await putawayDetailsPage.isLoaded(); + await putawayDetailsPage.summaryActionsButton.click(); + await putawayDetailsPage.clickDeleteOrderButton(); + await putawayListPage.isLoaded(); + await putawayListPage.emptyPutawayList.isVisible(); + await adminUserPage.close(); + }); + }); + + test('Delete pending putaway as assistant user from list page', async ({ + assistantUserContext, + productService, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + const assistantUserPage = await assistantUserContext.newPage(); + const navbar = new Navbar(assistantUserPage); + const stockMovementShowPage = new StockMovementShowPage(assistantUserPage); + const createPutawayPage = new CreatePutawayPage(assistantUserPage); + const putawayListPage = new PutawayListPage(assistantUserPage); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway list page and delete pending putaway', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ + has: assistantUserPage.locator('td'), + }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await putawayListPage.table.clickDeleteOrderButton(1); + await putawayListPage.emptyPutawayList.isVisible(); + await assistantUserPage.close(); + }); + }); + + test('Delete pending putaway as assistant user from details page', async ({ + assistantUserContext, + productService, + }) => { + const receivingBin = + AppConfig.instance.receivingBinPrefix + STOCK_MOVEMENT.identifier; + productService.setProduct('5'); + const product = await productService.getProduct(); + + const assistantUserPage = await assistantUserContext.newPage(); + const navbar = new Navbar(assistantUserPage); + const stockMovementShowPage = new StockMovementShowPage(assistantUserPage); + const createPutawayPage = new CreatePutawayPage(assistantUserPage); + const putawayListPage = new PutawayListPage(assistantUserPage); + const putawayDetailsPage = new PutawayDetailsPage(assistantUserPage); + + await test.step('Go to create putaway page', async () => { + await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id); + await stockMovementShowPage.isLoaded(); + await RefreshCachesUtils.refreshCaches({ + navbar, + }); + await navbar.inbound.click(); + await navbar.createPutaway.click(); + await createPutawayPage.isLoaded(); + }); + + await test.step('Start putaway', async () => { + await createPutawayPage.table + .row(0) + .getExpandBinLocation(receivingBin) + .click(); + await expect( + createPutawayPage.table.row(1).getProductName(product.name) + ).toBeVisible(); + await createPutawayPage.table.row(1).checkbox.click(); + await createPutawayPage.startPutawayButton.click(); + await createPutawayPage.startStep.isLoaded(); + await createPutawayPage.startStep.saveButton.click(); + }); + + await test.step('Go to putaway details page', async () => { + await putawayListPage.goToPage(); + await putawayListPage.isLoaded(); + await expect( + putawayListPage.table.rows.filter({ + has: assistantUserPage.locator('td'), + }) + ).toHaveCount(1); + const row = putawayListPage.table.row(1); + await row.actionsButton.click(); + await row.viewOrderDetails.click(); + }); + + await test.step('Delete putaway from details page and assert is deleted', async () => { + await putawayDetailsPage.isLoaded(); + await putawayDetailsPage.summaryActionsButton.click(); + await putawayDetailsPage.clickDeleteOrderButton(); + await putawayListPage.isLoaded(); + await putawayListPage.emptyPutawayList.isVisible(); + await assistantUserPage.close(); + }); + }); +});