Skip to content

Commit 1dea58e

Browse files
authored
OBPIH-7036 use person in requested by field (#58)
* add person pages and elements * add fixtures * add test for select person in requestedby and recipient * update selector
1 parent 522fad4 commit 1dea58e

4 files changed

Lines changed: 233 additions & 0 deletions

File tree

src/fixtures/fixtures.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import LoginPage from '@/pages/LoginPage';
2525
import CreateOrganizationPage from '@/pages/oranization/CreateOrganizationPage';
2626
import EditOrganizationPage from '@/pages/oranization/EditOrganizationPage';
2727
import OrganizationListPage from '@/pages/oranization/OrganizationListPage';
28+
import CreatePersonPage from '@/pages/people/CreatePersonPage';
29+
import PersonsListPage from '@/pages/people/PersonsListPage';
2830
import CreateProductPage from '@/pages/product/CreateProductPage';
2931
import ProductShowPage from '@/pages/product/productShow/ProductShowPage';
3032
import ReceivingPage from '@/pages/receiving/ReceivingPage';
@@ -58,6 +60,8 @@ type Fixtures = {
5860
receivingPage: ReceivingPage;
5961
createInvoicePage: CreateInvoicePage;
6062
invoiceListPage: InvoiceListPage;
63+
personsListPage: PersonsListPage;
64+
createPersonPage: CreatePersonPage;
6165
// COMPONENTS
6266
navbar: Navbar;
6367
locationChooser: LocationChooser;
@@ -121,6 +125,8 @@ export const test = baseTest.extend<Fixtures>({
121125
productShowPage: async ({ page }, use) => use(new ProductShowPage(page)),
122126
createInvoicePage: async ({ page }, use) => use(new CreateInvoicePage(page)),
123127
invoiceListPage: async ({ page }, use) => use(new InvoiceListPage(page)),
128+
personsListPage: async ({ page }, use) => use(new PersonsListPage(page)),
129+
createPersonPage: async ({ page }, use) => use(new CreatePersonPage(page)),
124130
// COMPONENTS
125131
navbar: async ({ page }, use) => use(new Navbar(page)),
126132
locationChooser: async ({ page }, use) => use(new LocationChooser(page)),
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Page } from '@playwright/test';
2+
3+
import BasePageModel from '@/pages/BasePageModel';
4+
5+
class CreatePersonPage extends BasePageModel {
6+
constructor(page: Page) {
7+
super(page);
8+
}
9+
10+
get createPersonButton() {
11+
return this.page.getByRole('button', { name: 'Create' });
12+
}
13+
14+
get firstNameField() {
15+
return this.page.getByRole('textbox', { name: 'First Name' });
16+
}
17+
18+
get lastNameField() {
19+
return this.page.getByRole('textbox', { name: 'Last Name' });
20+
}
21+
22+
get deletePersonButton() {
23+
return this.page.getByRole('button', { name: 'Delete' });
24+
}
25+
}
26+
27+
export default CreatePersonPage;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { Locator, Page } from '@playwright/test';
2+
3+
import { expect } from '@/fixtures/fixtures';
4+
import BasePageModel from '@/pages/BasePageModel';
5+
6+
class PersonsListPage extends BasePageModel {
7+
constructor(page: Page) {
8+
super(page);
9+
}
10+
11+
async isLoaded() {
12+
await expect(
13+
this.page.getByRole('heading').getByText('List Persons')
14+
).toBeVisible();
15+
}
16+
17+
get addPersonButton() {
18+
return this.page.getByRole('link', { name: 'Add person' });
19+
}
20+
21+
get table() {
22+
return this.page.getByRole('table');
23+
}
24+
25+
get rows() {
26+
return this.table.getByRole('cell');
27+
}
28+
29+
row(index: number) {
30+
return new Row(this.page, this.rows.nth(index));
31+
}
32+
33+
get searchField() {
34+
return this.page.getByTestId('person-search-field');
35+
}
36+
37+
get findButton() {
38+
return this.page.getByRole('button', { name: 'Find' });
39+
}
40+
41+
getPersonToEdit(personFirstName: string) {
42+
return this.table.getByRole('link', {
43+
name: personFirstName,
44+
exact: true,
45+
});
46+
}
47+
}
48+
49+
class Row extends BasePageModel {
50+
row: Locator;
51+
constructor(page: Page, row: Locator) {
52+
super(page);
53+
this.row = row;
54+
}
55+
}
56+
57+
export default PersonsListPage;
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
import { expect, test } from '@/fixtures/fixtures';
2+
import { AddItemsTableRow, LocationResponse } from '@/types';
3+
import { formatDate, getDateByOffset, getToday } from '@/utils/DateUtils';
4+
import UniqueIdentifier from '@/utils/UniqueIdentifier';
5+
6+
test.describe('Select person in requested by', () => {
7+
const TODAY = getToday();
8+
let ROWS: AddItemsTableRow[];
9+
let INBOUND_ID: string;
10+
const DESCRIPTION = 'some description';
11+
let ORIGIN: LocationResponse;
12+
const EXPECTED_DELIVERY_DATE = getDateByOffset(TODAY, 1);
13+
const SHIPMENT_TYPE = 'Land';
14+
const uniqueIdentifier = new UniqueIdentifier();
15+
const personFirstName = uniqueIdentifier.generateUniqueString('person');
16+
const personLastName = uniqueIdentifier.generateUniqueString('lastname');
17+
const person = `${personFirstName} ${personLastName}`;
18+
19+
test.beforeEach(
20+
async ({
21+
mainProductService,
22+
supplierLocationService,
23+
page,
24+
personsListPage,
25+
createPersonPage,
26+
}) => {
27+
const PRODUCT_ONE = await mainProductService.getProduct();
28+
ORIGIN = await supplierLocationService.getLocation();
29+
30+
ROWS = [
31+
{
32+
packLevel1: 'test-pallet',
33+
packLevel2: 'test-box',
34+
productCode: PRODUCT_ONE.productCode,
35+
productName: PRODUCT_ONE.name,
36+
quantity: '12',
37+
lotNumber: 'E2E-lot-test',
38+
recipient: person,
39+
expirationDate: getDateByOffset(new Date(), 3),
40+
},
41+
];
42+
43+
await test.step('Create person', async () => {
44+
await page.goto('./person/list');
45+
await personsListPage.isLoaded();
46+
await personsListPage.addPersonButton.click();
47+
await createPersonPage.firstNameField.fill(personFirstName);
48+
await createPersonPage.lastNameField.fill(personLastName);
49+
await createPersonPage.createPersonButton.click();
50+
await personsListPage.isLoaded();
51+
});
52+
}
53+
);
54+
55+
test.afterEach(
56+
async ({
57+
stockMovementService,
58+
stockMovementShowPage,
59+
page,
60+
personsListPage,
61+
createPersonPage,
62+
}) => {
63+
await stockMovementShowPage.rollbackButton.click();
64+
await stockMovementService.deleteStockMovement(INBOUND_ID);
65+
await page.goto('./person/list');
66+
await personsListPage.isLoaded();
67+
await personsListPage.searchField.fill(personFirstName);
68+
await personsListPage.findButton.click();
69+
await personsListPage.getPersonToEdit(person).click();
70+
await createPersonPage.deletePersonButton.click();
71+
}
72+
);
73+
74+
test('Select person in requested by', async ({
75+
createInboundPage,
76+
stockMovementShowPage,
77+
}) => {
78+
await test.step('Go to create inbound page', async () => {
79+
await createInboundPage.goToPage();
80+
await createInboundPage.createStep.isLoaded();
81+
await createInboundPage.wizzardSteps.assertActiveStep('Create');
82+
});
83+
84+
await test.step('Create Stock Movement step', async () => {
85+
await createInboundPage.createStep.originSelect.findAndSelectOption(
86+
ORIGIN.name
87+
);
88+
await createInboundPage.createStep.requestedBySelect.findAndSelectOption(
89+
person
90+
);
91+
await createInboundPage.createStep.dateRequestedDatePicker.fill(TODAY);
92+
await createInboundPage.createStep.descriptionField.textbox.fill(
93+
DESCRIPTION
94+
);
95+
});
96+
97+
await test.step('Go next step (Add items)', async () => {
98+
await createInboundPage.nextButton.click();
99+
await createInboundPage.addItemsStep.isLoaded();
100+
});
101+
102+
INBOUND_ID = createInboundPage.getId();
103+
104+
await test.step('Add first line items (Add items), add person as recipient', async () => {
105+
const data = ROWS[0];
106+
const row = createInboundPage.addItemsStep.table.row(0);
107+
await row.productSelect.findAndSelectOption(data.productName);
108+
await row.quantityField.numberbox.fill(data.quantity);
109+
await row.lotField.textbox.fill(data.lotNumber);
110+
await row.recipientSelect.findAndSelectOption(person);
111+
});
112+
113+
await test.step('Go to next step (Send)', async () => {
114+
await createInboundPage.nextButton.click();
115+
await createInboundPage.wizzardSteps.assertActiveStep('Send');
116+
await createInboundPage.sendStep.isLoaded();
117+
});
118+
119+
await test.step('Fill shipment fields (Send)', async () => {
120+
await createInboundPage.sendStep.shipmentTypeSelect.findAndSelectOption(
121+
SHIPMENT_TYPE
122+
);
123+
await createInboundPage.sendStep.expectedDeliveryDatePicker.fill(
124+
EXPECTED_DELIVERY_DATE
125+
);
126+
});
127+
128+
await test.step('Send shipment', async () => {
129+
await createInboundPage.sendStep.sendShipmentButton.click();
130+
await stockMovementShowPage.waitForUrl();
131+
await stockMovementShowPage.isLoaded();
132+
});
133+
134+
await test.step('Assert requested by and recipient on sm show page', async () => {
135+
await expect(
136+
stockMovementShowPage.auditingTable.dateRequestedRow
137+
).toContainText(`${formatDate(new Date(), 'DD/MMM/YYYY')} by ${person}`);
138+
await expect(
139+
stockMovementShowPage.packingListTable.row(1).recipient
140+
).toContainText(`${person}`);
141+
});
142+
});
143+
});

0 commit comments

Comments
 (0)