mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 11:36:44 +00:00
* use ref pattern on PO duplicate * use ref patterns on duplicate for other types of orders * revert unintentional change to pre-commit * add playwright tests --------- Co-authored-by: Oliver <oliver.henry.walters@gmail.com> (cherry picked from commit 2cabd02c6b447bed7ec8bccbdcd6115f427a451e) Co-authored-by: Jacob Felknor <jacobfelknor073@gmail.com>
209 lines
7.9 KiB
TypeScript
209 lines
7.9 KiB
TypeScript
import { expect } from '@playwright/test';
|
|
import { test } from '../baseFixtures.ts';
|
|
import { baseUrl } from '../defaults.ts';
|
|
import { clickButtonIfVisible, openFilterDrawer } from '../helpers.ts';
|
|
import { doQuickLogin } from '../login.ts';
|
|
|
|
test('Purchase Orders - General', async ({ page }) => {
|
|
await doQuickLogin(page);
|
|
|
|
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
|
await page.getByRole('cell', { name: 'PO0012' }).click();
|
|
await page.waitForTimeout(200);
|
|
|
|
await page.getByRole('tab', { name: 'Line Items' }).click();
|
|
await page.getByRole('tab', { name: 'Received Stock' }).click();
|
|
await page.getByRole('tab', { name: 'Attachments' }).click();
|
|
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
|
await page.getByRole('tab', { name: 'Suppliers' }).click();
|
|
await page.getByText('Arrow', { exact: true }).click();
|
|
await page.waitForTimeout(200);
|
|
|
|
await page.getByRole('tab', { name: 'Supplied Parts' }).click();
|
|
await page.getByRole('tab', { name: 'Purchase Orders' }).click();
|
|
await page.getByRole('tab', { name: 'Stock Items' }).click();
|
|
await page.getByRole('tab', { name: 'Contacts' }).click();
|
|
await page.getByRole('tab', { name: 'Addresses' }).click();
|
|
await page.getByRole('tab', { name: 'Attachments' }).click();
|
|
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
|
await page.getByRole('tab', { name: 'Manufacturers' }).click();
|
|
await page.getByText('AVX Corporation').click();
|
|
await page.waitForTimeout(200);
|
|
|
|
await page.getByRole('tab', { name: 'Addresses' }).click();
|
|
await page.getByRole('cell', { name: 'West Branch' }).click();
|
|
await page.locator('.mantine-ScrollArea-root').click();
|
|
await page
|
|
.getByRole('row', { name: 'West Branch Yes Surf Avenue 9' })
|
|
.getByRole('button')
|
|
.click();
|
|
await page.getByRole('menuitem', { name: 'Edit' }).click();
|
|
|
|
await page.getByLabel('text-field-title').waitFor();
|
|
await page.getByLabel('text-field-line2').waitFor();
|
|
|
|
// Read the current value of the cell, to ensure we always *change* it!
|
|
const value = await page.getByLabel('text-field-line2').inputValue();
|
|
await page
|
|
.getByLabel('text-field-line2')
|
|
.fill(value == 'old' ? 'new' : 'old');
|
|
|
|
await page.getByRole('button', { name: 'Submit' }).isEnabled();
|
|
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
await page.getByRole('tab', { name: 'Details' }).waitFor();
|
|
});
|
|
|
|
test('Purchase Orders - Filters', async ({ page }) => {
|
|
await doQuickLogin(page, 'reader', 'readonly');
|
|
|
|
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
|
await page.getByRole('tab', { name: 'Purchase Orders' }).click();
|
|
|
|
// Open filters drawer
|
|
await openFilterDrawer(page);
|
|
await clickButtonIfVisible(page, 'Clear Filters');
|
|
|
|
await page.getByRole('button', { name: 'Add Filter' }).click();
|
|
|
|
// Check for expected filter options
|
|
await page.getByPlaceholder('Select filter').fill('before');
|
|
await page.getByRole('option', { name: 'Created Before' }).waitFor();
|
|
await page.getByRole('option', { name: 'Completed Before' }).waitFor();
|
|
await page.getByRole('option', { name: 'Target Date Before' }).waitFor();
|
|
|
|
await page.getByPlaceholder('Select filter').fill('after');
|
|
await page.getByRole('option', { name: 'Created After' }).waitFor();
|
|
await page.getByRole('option', { name: 'Completed After' }).waitFor();
|
|
await page.getByRole('option', { name: 'Target Date After' }).waitFor();
|
|
});
|
|
|
|
test('Purchase Orders - Order Parts', async ({ page }) => {
|
|
await doQuickLogin(page);
|
|
|
|
// Open "Order Parts" wizard from the "parts" table
|
|
await page.getByRole('tab', { name: 'Parts' }).click();
|
|
await page
|
|
.getByLabel('panel-tabs-partcategory')
|
|
.getByRole('tab', { name: 'Parts' })
|
|
.click();
|
|
|
|
// Select multiple parts
|
|
for (let ii = 1; ii < 5; ii++) {
|
|
await page.getByLabel(`Select record ${ii}`, { exact: true }).click();
|
|
}
|
|
|
|
await page.getByLabel('action-menu-part-actions').click();
|
|
await page.getByLabel('action-menu-part-actions-order-parts').click();
|
|
await page
|
|
.getByRole('heading', { name: 'Order Parts' })
|
|
.locator('div')
|
|
.first()
|
|
.waitFor();
|
|
await page.getByRole('banner').getByRole('button').click();
|
|
|
|
// Open "Order Parts" wizard from the "Stock Items" table
|
|
await page.getByRole('tab', { name: 'Stock' }).click();
|
|
await page.getByRole('tab', { name: 'Stock Items' }).click();
|
|
|
|
// Select multiple stock items
|
|
for (let ii = 2; ii < 7; ii += 2) {
|
|
await page.getByLabel(`Select record ${ii}`, { exact: true }).click();
|
|
}
|
|
|
|
await page
|
|
.getByLabel('Stock Items')
|
|
.getByLabel('action-menu-stock-actions')
|
|
.click();
|
|
await page.getByLabel('action-menu-stock-actions-order-stock').click();
|
|
await page.getByRole('banner').getByRole('button').click();
|
|
|
|
// Order from the part detail page
|
|
await page.goto(`${baseUrl}/part/69/`);
|
|
await page.waitForURL('**/part/69/**');
|
|
|
|
await page.getByLabel('action-menu-stock-actions').click();
|
|
await page.getByLabel('action-menu-stock-actions-order').click();
|
|
|
|
// Select supplier part
|
|
await page.getByLabel('related-field-supplier_part').click();
|
|
await page.getByText('WM1731-ND').click();
|
|
|
|
// Option to create a new supplier part
|
|
await page.getByLabel('action-button-new-supplier-part').click();
|
|
await page.getByLabel('related-field-supplier', { exact: true }).click();
|
|
await page.getByText('Future').click();
|
|
await page.getByRole('button', { name: 'Cancel' }).click();
|
|
|
|
// Select purchase order
|
|
await page.getByLabel('related-field-purchase_order').click();
|
|
await page.getByText('PO0001').click();
|
|
|
|
// Option to create a new purchase order
|
|
await page.getByLabel('action-button-new-purchase-order').click();
|
|
await page.getByLabel('related-field-project_code').click();
|
|
await page.getByText('PRJ-PHO').click();
|
|
await page.getByRole('button', { name: 'Cancel' }).click();
|
|
|
|
// Add the part to the purchase order
|
|
await page.getByLabel('action-button-add-to-selected').click();
|
|
await page.getByLabel('number-field-quantity').fill('100');
|
|
await page.waitForTimeout(250);
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
await page
|
|
.getByText('All selected parts added to a purchase order')
|
|
.waitFor();
|
|
});
|
|
|
|
/**
|
|
* Tests for receiving items against a purchase order
|
|
*/
|
|
test('Purchase Orders - Receive Items', async ({ page }) => {
|
|
await doQuickLogin(page);
|
|
|
|
await page.getByRole('tab', { name: 'Purchasing' }).click();
|
|
await page.getByRole('cell', { name: 'PO0014' }).click();
|
|
|
|
await page.getByRole('tab', { name: 'Order Details' }).click();
|
|
await page.getByText('0 / 3').waitFor();
|
|
|
|
// Select all line items to receive
|
|
await page.getByRole('tab', { name: 'Line Items' }).click();
|
|
|
|
await page.getByLabel('Select all records').click();
|
|
await page.waitForTimeout(200);
|
|
await page.getByLabel('action-button-receive-items').click();
|
|
|
|
// Check for display of individual locations
|
|
await page
|
|
.getByRole('cell', { name: /Choose Location/ })
|
|
.getByText('Parts Bins')
|
|
.waitFor();
|
|
await page
|
|
.getByRole('cell', { name: /Choose Location/ })
|
|
.getByText('Room 101')
|
|
.waitFor();
|
|
await page.getByText('Mechanical Lab').waitFor();
|
|
|
|
await page.getByRole('button', { name: 'Cancel' }).click();
|
|
});
|
|
|
|
test('Purchase Orders - Duplicate', async ({ page }) => {
|
|
await doQuickLogin(page);
|
|
|
|
await navigate(page, 'purchasing/purchase-order/13/detail');
|
|
await page.getByLabel('action-menu-order-actions').click();
|
|
await page.getByLabel('action-menu-order-actions-duplicate').click();
|
|
|
|
// Ensure a new reference is suggested
|
|
await expect(page.getByLabel('text-field-reference')).not.toBeEmpty();
|
|
|
|
// Submit the duplicate request and ensure it completes
|
|
await page.getByRole('button', { name: 'Submit' }).isEnabled();
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
await page.getByRole('tab', { name: 'Order Details' }).waitFor();
|
|
await page.getByRole('tab', { name: 'Order Details' }).click();
|
|
|
|
await page.getByText('Pending').first().waitFor();
|
|
});
|