Skip to content

Commit d0a07fd

Browse files
authored
OBPIH-6696 Add tests for edits when receiving (#37)
* OBPIH-6696 add elements to receiving table and edit modal * add tests for edits when receiving * OBPIH-6696 remove not needed selector * OBPIH-6696 improve qty shipped input in test * OBPIH-6696 remove unused import
1 parent 9434399 commit d0a07fd

3 files changed

Lines changed: 378 additions & 0 deletions

File tree

src/pages/receiving/components/EditModal.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ class EditModal extends BasePageModel {
2626
get cancelButton() {
2727
return this.modal.getByRole('button', { name: 'Cancel' });
2828
}
29+
30+
get addLineButton() {
31+
return this.modal.getByRole('button', { name: 'Add line' });
32+
}
33+
34+
get informationAboutEditedQtyNotMatchingShippedQty() {
35+
return this.modal
36+
.locator('.font-weight-bold font-red-ob')
37+
.getByText(
38+
'The total edited quantity does not match the original quantity shipped.'
39+
);
40+
}
2941
}
3042

3143
export default EditModal;

src/pages/receiving/components/ReceivingTable.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ class ReceivingTable extends BasePageModel {
2323
getColumnHeader(columnName: string) {
2424
return this.table.locator('.table-header').getByText(columnName);
2525
}
26+
27+
getCellValue(row: number, column: string) {
28+
return this.table
29+
.getByRole('row')
30+
.nth(row)
31+
.getByRole('cell', { name: column });
32+
}
2633
}
2734

2835
class Row extends BasePageModel {
Lines changed: 359 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,359 @@
1+
import { ShipmentType } from '@/constants/ShipmentType';
2+
import { expect, test } from '@/fixtures/fixtures';
3+
import { StockMovementResponse } from '@/types';
4+
import { formatDate, getDateByOffset, getToday } from '@/utils/DateUtils';
5+
import UniqueIdentifier from '@/utils/UniqueIdentifier';
6+
7+
test.describe('Edit items in the middle of receipt', () => {
8+
let STOCK_MOVEMENT: StockMovementResponse;
9+
const description = 'some description';
10+
const dateRequested = getToday();
11+
const uniqueIdentifier = new UniqueIdentifier();
12+
13+
test.beforeEach(
14+
async ({
15+
supplierLocationService,
16+
stockMovementService,
17+
mainProductService,
18+
otherProductService,
19+
}) => {
20+
const supplierLocation = await supplierLocationService.getLocation();
21+
const PRODUCT_ONE = await mainProductService.getProduct();
22+
const PRODUCT_TWO = await otherProductService.getProduct();
23+
24+
STOCK_MOVEMENT = await stockMovementService.createInbound({
25+
originId: supplierLocation.id,
26+
description,
27+
dateRequested,
28+
});
29+
30+
await stockMovementService.addItemsToInboundStockMovement(
31+
STOCK_MOVEMENT.id,
32+
[
33+
{
34+
productId: PRODUCT_ONE.id,
35+
quantity: 20,
36+
lotNumber: uniqueIdentifier.generateUniqueString('lot'),
37+
expirationDate: getDateByOffset(new Date(), 3),
38+
},
39+
{ productId: PRODUCT_TWO.id, quantity: 10 },
40+
]
41+
);
42+
43+
await stockMovementService.sendInboundStockMovement(STOCK_MOVEMENT.id, {
44+
shipmentType: ShipmentType.AIR,
45+
});
46+
}
47+
);
48+
49+
test.afterEach(async ({ stockMovementShowPage, stockMovementService }) => {
50+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
51+
const isRollbackLastReceiptButtonVisible =
52+
await stockMovementShowPage.rollbackLastReceiptButton.isVisible();
53+
const isRollbackButtonVisible =
54+
await stockMovementShowPage.rollbackButton.isVisible();
55+
56+
// due to failed test, shipment might not be received which will not show the button
57+
if (isRollbackLastReceiptButtonVisible) {
58+
await stockMovementShowPage.rollbackLastReceiptButton.click();
59+
}
60+
61+
if (isRollbackButtonVisible) {
62+
await stockMovementShowPage.rollbackButton.click();
63+
}
64+
65+
await stockMovementService.deleteStockMovement(STOCK_MOVEMENT.id);
66+
});
67+
68+
test('Edit item qty on receiving page', async ({
69+
stockMovementShowPage,
70+
receivingPage,
71+
}) => {
72+
await test.step('Go to stock movement show page', async () => {
73+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
74+
await stockMovementShowPage.isLoaded();
75+
});
76+
77+
await test.step('Go to shipment receiving page', async () => {
78+
await stockMovementShowPage.receiveButton.click();
79+
await receivingPage.receivingStep.isLoaded();
80+
});
81+
82+
await test.step('Open edit modal for 1st item and edit qty to higher value', async () => {
83+
await receivingPage.receivingStep.table.row(1).editButton.click();
84+
await receivingPage.receivingStep.editModal.isLoaded();
85+
await receivingPage.receivingStep.editModal.table
86+
.row(0)
87+
.quantityShippedField.numberbox.fill('50');
88+
await receivingPage.receivingStep.editModal.informationAboutEditedQtyNotMatchingShippedQty.isVisible();
89+
await receivingPage.receivingStep.editModal.saveButton.click();
90+
await receivingPage.receivingStep.isLoaded();
91+
});
92+
93+
await test.step('Open edit modal for 2nd item and edit qty to lower value', async () => {
94+
await receivingPage.receivingStep.table.row(2).editButton.click();
95+
await receivingPage.receivingStep.editModal.isLoaded();
96+
await receivingPage.receivingStep.editModal.table
97+
.row(0)
98+
.quantityShippedField.numberbox.fill('2');
99+
await receivingPage.receivingStep.editModal.informationAboutEditedQtyNotMatchingShippedQty.isVisible();
100+
await receivingPage.receivingStep.editModal.saveButton.click();
101+
await receivingPage.receivingStep.isLoaded();
102+
});
103+
104+
await test.step('Assert shipped qty after edits for both items', async () => {
105+
await expect(
106+
receivingPage.receivingStep.table.getCellValue(1, 'Shipped')
107+
).toContainText('50');
108+
await expect(
109+
receivingPage.receivingStep.table.getCellValue(2, 'Shipped')
110+
).toContainText('2');
111+
});
112+
113+
await test.step('Autofill receiving qty for both items', async () => {
114+
await receivingPage.receivingStep.isLoaded();
115+
await receivingPage.receivingStep.autofillQuantitiesButton.click();
116+
});
117+
118+
await test.step('Go to check page and receive shipment', async () => {
119+
await receivingPage.nextButton.click();
120+
await receivingPage.checkStep.isLoaded();
121+
await receivingPage.checkStep.receiveShipmentButton.click();
122+
await stockMovementShowPage.isLoaded();
123+
});
124+
});
125+
126+
test('Assert validation on using exp date without lot for item with lot', async ({
127+
stockMovementShowPage,
128+
receivingPage,
129+
}) => {
130+
await test.step('Go to stock movement show page', async () => {
131+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
132+
await stockMovementShowPage.isLoaded();
133+
});
134+
135+
await test.step('Go to shipment receiving page', async () => {
136+
await stockMovementShowPage.receiveButton.click();
137+
await receivingPage.receivingStep.isLoaded();
138+
});
139+
140+
await test.step('Open edit modal for 1st item and clear lot field', async () => {
141+
await receivingPage.receivingStep.table.row(1).editButton.click();
142+
await receivingPage.receivingStep.editModal.isLoaded();
143+
await receivingPage.receivingStep.editModal.table
144+
.row(0)
145+
.lotNumberField.textbox.clear();
146+
await receivingPage.receivingStep.editModal.saveButton.click();
147+
await receivingPage.receivingStep.editModal.table
148+
.row(0)
149+
.lotNumberField.assertHasError();
150+
await receivingPage.receivingStep.editModal.table
151+
.row(0)
152+
.lotNumberField.textbox.hover();
153+
await expect(
154+
receivingPage.receivingStep.editModal.table.row(0).lotNumberField
155+
.tooltip
156+
).toContainText('Items with an expiry date must also have a lot number.');
157+
});
158+
});
159+
160+
test('Assert validation on using exp date without lot for item without lot', async ({
161+
stockMovementShowPage,
162+
receivingPage,
163+
}) => {
164+
await test.step('Go to stock movement show page', async () => {
165+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
166+
await stockMovementShowPage.isLoaded();
167+
});
168+
169+
await test.step('Go to shipment receiving page', async () => {
170+
await stockMovementShowPage.receiveButton.click();
171+
await receivingPage.receivingStep.isLoaded();
172+
});
173+
174+
await test.step('Open edit modal for 2nd item and add exp date without lot', async () => {
175+
await receivingPage.receivingStep.table.row(2).editButton.click();
176+
await receivingPage.receivingStep.editModal.isLoaded();
177+
await receivingPage.receivingStep.editModal.table
178+
.row(0)
179+
.expiryDatePickerField.fill(getDateByOffset(new Date(), 5));
180+
await receivingPage.receivingStep.editModal.saveButton.click();
181+
await receivingPage.receivingStep.isLoaded();
182+
await receivingPage.receivingStep.editModal.table
183+
.row(0)
184+
.lotNumberField.assertHasError();
185+
await receivingPage.receivingStep.editModal.table
186+
.row(0)
187+
.lotNumberField.textbox.hover();
188+
await expect(
189+
receivingPage.receivingStep.editModal.table.row(0).lotNumberField
190+
.tooltip
191+
).toContainText('Items with an expiry date must also have a lot number.');
192+
});
193+
});
194+
195+
test('Assert validation on using exp date without lot for item with lot on splitted line', async ({
196+
stockMovementShowPage,
197+
receivingPage,
198+
}) => {
199+
await test.step('Go to stock movement show page', async () => {
200+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
201+
await stockMovementShowPage.isLoaded();
202+
});
203+
204+
await test.step('Go to shipment receiving page', async () => {
205+
await stockMovementShowPage.receiveButton.click();
206+
await receivingPage.receivingStep.isLoaded();
207+
});
208+
209+
await test.step('Open edit modal for 1st item and clear lot field', async () => {
210+
await receivingPage.receivingStep.table.row(1).editButton.click();
211+
await receivingPage.receivingStep.editModal.isLoaded();
212+
await receivingPage.receivingStep.editModal.addLineButton.click();
213+
await receivingPage.receivingStep.editModal.table
214+
.row(0)
215+
.quantityShippedField.numberbox.fill('10');
216+
await receivingPage.receivingStep.editModal.table
217+
.row(1)
218+
.quantityShippedField.numberbox.fill('10');
219+
await receivingPage.receivingStep.editModal.table
220+
.row(1)
221+
.expiryDatePickerField.fill(getDateByOffset(new Date(), 5));
222+
await receivingPage.receivingStep.editModal.saveButton.click();
223+
await receivingPage.receivingStep.editModal.table
224+
.row(1)
225+
.lotNumberField.assertHasError();
226+
await receivingPage.receivingStep.editModal.table
227+
.row(1)
228+
.lotNumberField.textbox.hover();
229+
await expect(
230+
receivingPage.receivingStep.editModal.table.row(1).lotNumberField
231+
.tooltip
232+
).toContainText('Items with an expiry date must also have a lot number.');
233+
});
234+
});
235+
236+
test('Add lot and exp date for item in the middle of receipt', async ({
237+
stockMovementShowPage,
238+
receivingPage,
239+
}) => {
240+
const lot = 'add-lot-test';
241+
const expDate = getDateByOffset(new Date(), 5);
242+
243+
await test.step('Go to stock movement show page', async () => {
244+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
245+
await stockMovementShowPage.isLoaded();
246+
});
247+
248+
await test.step('Go to shipment receiving page', async () => {
249+
await stockMovementShowPage.receiveButton.click();
250+
await receivingPage.receivingStep.isLoaded();
251+
});
252+
253+
await test.step('Open edit modal for item without lot and add lot and exp date', async () => {
254+
await receivingPage.receivingStep.table.row(2).editButton.click();
255+
await receivingPage.receivingStep.editModal.isLoaded();
256+
await receivingPage.receivingStep.editModal.table
257+
.row(0)
258+
.lotNumberField.textbox.fill(lot);
259+
await receivingPage.receivingStep.editModal.table
260+
.row(0)
261+
.expiryDatePickerField.fill(expDate);
262+
await receivingPage.receivingStep.editModal.saveButton.click();
263+
await receivingPage.receivingStep.isLoaded();
264+
});
265+
266+
await test.step('Assert added lot and exp date on receive page', async () => {
267+
await expect(
268+
receivingPage.receivingStep.table.getCellValue(2, 'Lot/Serial No.')
269+
).toContainText(lot);
270+
await expect(
271+
receivingPage.receivingStep.table.getCellValue(2, 'Expiration date')
272+
).toContainText(formatDate(expDate, 'MM/DD/YYYY'));
273+
});
274+
275+
await test.step('Select item to receive', async () => {
276+
await receivingPage.receivingStep.isLoaded();
277+
await receivingPage.receivingStep.table
278+
.row(2)
279+
.receivingNowField.textbox.fill('10');
280+
});
281+
282+
await test.step('Go to check page and receive shipment', async () => {
283+
await receivingPage.nextButton.click();
284+
await receivingPage.checkStep.isLoaded();
285+
await receivingPage.checkStep.receiveShipmentButton.click();
286+
await stockMovementShowPage.isLoaded();
287+
});
288+
});
289+
290+
test('Split line into 2 lots', async ({
291+
stockMovementShowPage,
292+
receivingPage,
293+
}) => {
294+
const lot = 'add-lot-test';
295+
const expDate = getDateByOffset(new Date(), 5);
296+
297+
await test.step('Go to stock movement show page', async () => {
298+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
299+
await stockMovementShowPage.isLoaded();
300+
});
301+
302+
await test.step('Go to shipment receiving page', async () => {
303+
await stockMovementShowPage.receiveButton.click();
304+
await receivingPage.receivingStep.isLoaded();
305+
});
306+
307+
await test.step('Open edit modal for item with lot and split into 2 lots', async () => {
308+
await receivingPage.receivingStep.table.row(1).editButton.click();
309+
await receivingPage.receivingStep.editModal.isLoaded();
310+
await receivingPage.receivingStep.editModal.addLineButton.click();
311+
await receivingPage.receivingStep.editModal.table
312+
.row(0)
313+
.quantityShippedField.numberbox.fill('15');
314+
await receivingPage.receivingStep.editModal.table
315+
.row(1)
316+
.lotNumberField.textbox.fill(lot);
317+
await receivingPage.receivingStep.editModal.table
318+
.row(1)
319+
.expiryDatePickerField.fill(expDate);
320+
await receivingPage.receivingStep.editModal.table
321+
.row(1)
322+
.quantityShippedField.numberbox.fill('5');
323+
await receivingPage.receivingStep.editModal.saveButton.click();
324+
await receivingPage.receivingStep.isLoaded();
325+
});
326+
327+
await test.step('Assert added lot and exp date and shipped qty on receive page', async () => {
328+
await expect(
329+
receivingPage.receivingStep.table.getCellValue(2, 'Lot/Serial No.')
330+
).toContainText(lot);
331+
await expect(
332+
receivingPage.receivingStep.table.getCellValue(2, 'Expiration date')
333+
).toContainText(formatDate(expDate, 'MM/DD/YYYY'));
334+
await expect(
335+
receivingPage.receivingStep.table.getCellValue(1, 'Shipped')
336+
).toContainText('15');
337+
await expect(
338+
receivingPage.receivingStep.table.getCellValue(2, 'Shipped')
339+
).toContainText('5');
340+
});
341+
342+
await test.step('Select splitted item to receive', async () => {
343+
await receivingPage.receivingStep.isLoaded();
344+
await receivingPage.receivingStep.table
345+
.row(1)
346+
.receivingNowField.textbox.fill('15');
347+
await receivingPage.receivingStep.table
348+
.row(2)
349+
.receivingNowField.textbox.fill('5');
350+
});
351+
352+
await test.step('Go to check page and receive shipment', async () => {
353+
await receivingPage.nextButton.click();
354+
await receivingPage.checkStep.isLoaded();
355+
await receivingPage.checkStep.receiveShipmentButton.click();
356+
await stockMovementShowPage.isLoaded();
357+
});
358+
});
359+
});

0 commit comments

Comments
 (0)