Skip to content

Commit 65b5d27

Browse files
authored
Merge pull request #50 from openboxes/OBPIH-6956
OBPIH-6956 Add tests for assert qty and split line with 0 qty
2 parents a0a5b0a + 4a0a994 commit 65b5d27

3 files changed

Lines changed: 652 additions & 0 deletions

File tree

src/pages/receiving/components/EditModalTable.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,22 @@ class Row extends BasePageModel {
3535
this.expiryDatePickerField = new DatePicker(page, 'Expiry', row);
3636
this.quantityShippedField = new TextField(page, 'Quantity shipped', row);
3737
}
38+
39+
get clearProductSelect() {
40+
return this.row.locator('.react-select__clear-indicator');
41+
}
42+
43+
async getProductSelect(name: string) {
44+
await this.row
45+
.getByTestId('custom-select-element')
46+
.getByRole('textbox')
47+
.fill(name);
48+
await this.page
49+
.getByTestId('custom-select-dropdown-menu')
50+
.locator('.react-select__option')
51+
.nth(0)
52+
.click();
53+
}
3854
}
3955

4056
export default EditModalTable;
Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
import { ShipmentType } from '@/constants/ShipmentType';
2+
import { expect, test } from '@/fixtures/fixtures';
3+
import { StockMovementResponse } from '@/types';
4+
import { formatDate, getDateByOffset } from '@/utils/DateUtils';
5+
6+
test.describe('Assert if quantity inputs remain when split lines', () => {
7+
let STOCK_MOVEMENT: StockMovementResponse;
8+
9+
test.beforeEach(
10+
async ({
11+
supplierLocationService,
12+
stockMovementService,
13+
mainProductService,
14+
otherProductService,
15+
thirdProductService,
16+
}) => {
17+
const supplierLocation = await supplierLocationService.getLocation();
18+
const PRODUCT_ONE = await mainProductService.getProduct();
19+
const PRODUCT_TWO = await otherProductService.getProduct();
20+
const PRODUCT_THREE = await thirdProductService.getProduct();
21+
22+
STOCK_MOVEMENT = await stockMovementService.createInbound({
23+
originId: supplierLocation.id,
24+
});
25+
26+
await stockMovementService.addItemsToInboundStockMovement(
27+
STOCK_MOVEMENT.id,
28+
[
29+
{
30+
productId: PRODUCT_ONE.id,
31+
quantity: 50,
32+
},
33+
{ productId: PRODUCT_TWO.id, quantity: 100 },
34+
{ productId: PRODUCT_THREE.id, quantity: 200 },
35+
]
36+
);
37+
38+
await stockMovementService.sendInboundStockMovement(STOCK_MOVEMENT.id, {
39+
shipmentType: ShipmentType.AIR,
40+
});
41+
}
42+
);
43+
44+
test.afterEach(async ({ stockMovementShowPage, stockMovementService }) => {
45+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
46+
const isRollbackLastReceiptButtonVisible =
47+
await stockMovementShowPage.rollbackLastReceiptButton.isVisible();
48+
const isRollbackButtonVisible =
49+
await stockMovementShowPage.rollbackButton.isVisible();
50+
51+
// due to failed test, shipment might not be received which will not show the button
52+
if (isRollbackLastReceiptButtonVisible) {
53+
await stockMovementShowPage.rollbackLastReceiptButton.click();
54+
}
55+
56+
if (isRollbackButtonVisible) {
57+
await stockMovementShowPage.rollbackButton.click();
58+
}
59+
60+
await stockMovementService.deleteStockMovement(STOCK_MOVEMENT.id);
61+
});
62+
63+
test('Assert quantity input after split line', async ({
64+
stockMovementShowPage,
65+
receivingPage,
66+
}) => {
67+
const lot = 'add-lot-test';
68+
const expDate = getDateByOffset(new Date(), 5);
69+
70+
await test.step('Go to stock movement show page', async () => {
71+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
72+
await stockMovementShowPage.isLoaded();
73+
});
74+
75+
await test.step('Go to shipment receiving page', async () => {
76+
await stockMovementShowPage.receiveButton.click();
77+
await receivingPage.receivingStep.isLoaded();
78+
});
79+
80+
await test.step('Autofill receiving quantity', async () => {
81+
await receivingPage.receivingStep.isLoaded();
82+
await receivingPage.receivingStep.autofillQuantitiesButton.click();
83+
});
84+
85+
await test.step('Open edit modal for item and split line', async () => {
86+
await receivingPage.receivingStep.table.row(2).editButton.click();
87+
await receivingPage.receivingStep.editModal.isLoaded();
88+
await receivingPage.receivingStep.editModal.addLineButton.click();
89+
await receivingPage.receivingStep.editModal.table
90+
.row(0)
91+
.quantityShippedField.numberbox.fill('100');
92+
await receivingPage.receivingStep.editModal.table
93+
.row(0)
94+
.lotNumberField.textbox.fill(lot);
95+
await receivingPage.receivingStep.editModal.table
96+
.row(0)
97+
.expiryDatePickerField.fill(expDate);
98+
await receivingPage.receivingStep.editModal.table
99+
.row(1)
100+
.quantityShippedField.numberbox.fill('50');
101+
await receivingPage.receivingStep.editModal.addLineButton.click();
102+
await receivingPage.receivingStep.editModal.table
103+
.row(2)
104+
.quantityShippedField.numberbox.fill('50');
105+
await receivingPage.receivingStep.editModal.saveButton.click();
106+
await receivingPage.receivingStep.isLoaded();
107+
});
108+
109+
await test.step('Assert quantity input before split line', async () => {
110+
await expect(
111+
receivingPage.receivingStep.table.row(1).receivingNowField.textbox
112+
).toHaveValue('50');
113+
await expect(
114+
receivingPage.receivingStep.table.row(2).receivingNowField.textbox
115+
).toBeEmpty();
116+
await expect(
117+
receivingPage.receivingStep.table.row(3).receivingNowField.textbox
118+
).toBeEmpty();
119+
await expect(
120+
receivingPage.receivingStep.table.row(4).receivingNowField.textbox
121+
).toBeEmpty();
122+
await expect(
123+
receivingPage.receivingStep.table.row(5).receivingNowField.textbox
124+
).toHaveValue('100');
125+
await expect(
126+
receivingPage.receivingStep.table.getCellValue(2, 'Lot/Serial No.')
127+
).toContainText(lot);
128+
await expect(
129+
receivingPage.receivingStep.table.getCellValue(2, 'Expiration date')
130+
).toContainText(formatDate(expDate, 'MM/DD/YYYY'));
131+
});
132+
133+
await test.step('Autofill quantity after split line', async () => {
134+
await receivingPage.receivingStep.isLoaded();
135+
await receivingPage.receivingStep.autofillQuantitiesButton.click();
136+
await expect(
137+
receivingPage.receivingStep.table.row(2).receivingNowField.textbox
138+
).toHaveValue('100');
139+
await expect(
140+
receivingPage.receivingStep.table.row(3).receivingNowField.textbox
141+
).toHaveValue('50');
142+
await expect(
143+
receivingPage.receivingStep.table.row(4).receivingNowField.textbox
144+
).toHaveValue('50');
145+
});
146+
147+
await test.step('Edit another line', async () => {
148+
await receivingPage.receivingStep.table.row(5).editButton.click();
149+
await receivingPage.receivingStep.editModal.isLoaded();
150+
await receivingPage.receivingStep.editModal.table
151+
.row(0)
152+
.lotNumberField.textbox.fill(lot);
153+
await receivingPage.receivingStep.editModal.table
154+
.row(0)
155+
.expiryDatePickerField.fill(expDate);
156+
await receivingPage.receivingStep.editModal.saveButton.click();
157+
await receivingPage.receivingStep.isLoaded();
158+
await expect(
159+
receivingPage.receivingStep.table.row(1).receivingNowField.textbox
160+
).toHaveValue('50');
161+
await expect(
162+
receivingPage.receivingStep.table.row(2).receivingNowField.textbox
163+
).toHaveValue('100');
164+
await expect(
165+
receivingPage.receivingStep.table.row(3).receivingNowField.textbox
166+
).toHaveValue('50');
167+
await expect(
168+
receivingPage.receivingStep.table.row(4).receivingNowField.textbox
169+
).toHaveValue('50');
170+
await expect(
171+
receivingPage.receivingStep.table.row(5).receivingNowField.textbox
172+
).toBeEmpty();
173+
await expect(
174+
receivingPage.receivingStep.table.getCellValue(5, 'Lot/Serial No.')
175+
).toContainText(lot);
176+
await expect(
177+
receivingPage.receivingStep.table.getCellValue(5, 'Expiration date')
178+
).toContainText(formatDate(expDate, 'MM/DD/YYYY'));
179+
});
180+
});
181+
182+
test('Assert quantity input after split line whe use save and exit', async ({
183+
stockMovementShowPage,
184+
receivingPage,
185+
}) => {
186+
const lot = 'add-lot-test';
187+
const expDate = getDateByOffset(new Date(), 5);
188+
189+
await test.step('Go to stock movement show page', async () => {
190+
await stockMovementShowPage.goToPage(STOCK_MOVEMENT.id);
191+
await stockMovementShowPage.isLoaded();
192+
});
193+
194+
await test.step('Go to shipment receiving page', async () => {
195+
await stockMovementShowPage.receiveButton.click();
196+
await receivingPage.receivingStep.isLoaded();
197+
});
198+
199+
await test.step('Autofill quantity for items', async () => {
200+
await receivingPage.receivingStep.isLoaded();
201+
await receivingPage.receivingStep.table
202+
.row(2)
203+
.receivingNowField.textbox.fill('200');
204+
await receivingPage.receivingStep.table
205+
.row(3)
206+
.receivingNowField.textbox.fill('100');
207+
await receivingPage.receivingStep.saveAndExitButton.click();
208+
});
209+
210+
await test.step('Return to receipt', async () => {
211+
await stockMovementShowPage.receiveButton.click();
212+
await receivingPage.receivingStep.isLoaded();
213+
await expect(
214+
receivingPage.receivingStep.table.row(1).receivingNowField.textbox
215+
).toBeEmpty();
216+
await expect(
217+
receivingPage.receivingStep.table.row(2).receivingNowField.textbox
218+
).toHaveValue('200');
219+
await expect(
220+
receivingPage.receivingStep.table.row(3).receivingNowField.textbox
221+
).toHaveValue('100');
222+
});
223+
224+
await test.step('Open edit modal for item without quantity input', async () => {
225+
await receivingPage.receivingStep.table.row(1).editButton.click();
226+
await receivingPage.receivingStep.editModal.isLoaded();
227+
await receivingPage.receivingStep.editModal.addLineButton.click();
228+
await receivingPage.receivingStep.editModal.table
229+
.row(0)
230+
.quantityShippedField.numberbox.fill('25');
231+
await receivingPage.receivingStep.editModal.table
232+
.row(0)
233+
.lotNumberField.textbox.fill(lot);
234+
await receivingPage.receivingStep.editModal.table
235+
.row(0)
236+
.expiryDatePickerField.fill(expDate);
237+
await receivingPage.receivingStep.editModal.table
238+
.row(1)
239+
.quantityShippedField.numberbox.fill('25');
240+
await receivingPage.receivingStep.editModal.saveButton.click();
241+
await receivingPage.receivingStep.isLoaded();
242+
});
243+
244+
await test.step('Assert quantity input after split line', async () => {
245+
await expect(
246+
receivingPage.receivingStep.table.row(1).receivingNowField.textbox
247+
).toBeEmpty();
248+
await expect(
249+
receivingPage.receivingStep.table.row(2).receivingNowField.textbox
250+
).toBeEmpty();
251+
await expect(
252+
receivingPage.receivingStep.table.row(3).receivingNowField.textbox
253+
).toHaveValue('200');
254+
await expect(
255+
receivingPage.receivingStep.table.row(4).receivingNowField.textbox
256+
).toHaveValue('100');
257+
await expect(
258+
receivingPage.receivingStep.table.getCellValue(1, 'Lot/Serial No.')
259+
).toContainText(lot);
260+
await expect(
261+
receivingPage.receivingStep.table.getCellValue(1, 'Expiration date')
262+
).toContainText(formatDate(expDate, 'MM/DD/YYYY'));
263+
});
264+
265+
await test.step('Autofill quantity after split line', async () => {
266+
await receivingPage.receivingStep.isLoaded();
267+
await receivingPage.receivingStep.autofillQuantitiesButton.click();
268+
await expect(
269+
receivingPage.receivingStep.table.row(1).receivingNowField.textbox
270+
).toHaveValue('25');
271+
await expect(
272+
receivingPage.receivingStep.table.row(2).receivingNowField.textbox
273+
).toHaveValue('25');
274+
});
275+
});
276+
});

0 commit comments

Comments
 (0)