mirror of
https://github.com/inventree/InvenTree.git
synced 2026-03-13 15:43:33 +00:00
* chore(deps): bump the dependencies group across 1 directory with 4 updates Bumps the dependencies group with 4 updates in the /src/frontend directory: [@codemirror/view](https://github.com/codemirror/view), [@uiw/codemirror-theme-vscode](https://github.com/uiwjs/react-codemirror), [@playwright/test](https://github.com/microsoft/playwright) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node). Updates `@codemirror/view` from 6.38.2 to 6.39.16 - [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md) - [Commits](https://github.com/codemirror/view/compare/6.38.2...6.39.16) Updates `@uiw/codemirror-theme-vscode` from 4.25.1 to 4.25.7 - [Release notes](https://github.com/uiwjs/react-codemirror/releases) - [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.1...v4.25.7) Updates `@playwright/test` from 1.56.0 to 1.58.2 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.56.0...v1.58.2) Updates `@types/node` from 24.11.0 to 25.3.3 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@codemirror/view" dependency-version: 6.39.16 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@uiw/codemirror-theme-vscode" dependency-version: 4.25.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dependencies - dependency-name: "@playwright/test" dependency-version: 1.58.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: dependencies - dependency-name: "@types/node" dependency-version: 25.3.3 dependency-type: direct:development update-type: version-update:semver-major dependency-group: dependencies ... Signed-off-by: dependabot[bot] <support@github.com> * fix test * fix test --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Matthias Mair <code@mjmair.com> Co-authored-by: Oliver <oliver.henry.walters@gmail.com>
222 lines
7.6 KiB
TypeScript
222 lines
7.6 KiB
TypeScript
import test from '@playwright/test';
|
|
import { doCachedLogin } from './login';
|
|
|
|
test('Importing - Admin Center', async ({ browser }) => {
|
|
const page = await doCachedLogin(browser, {
|
|
username: 'steven',
|
|
password: 'wizardstaff',
|
|
url: 'settings/admin/import'
|
|
});
|
|
|
|
await page
|
|
.getByRole('button', { name: 'action-button-create-import-' })
|
|
.click();
|
|
|
|
const fileInput = await page.locator('input[type="file"]');
|
|
await fileInput.setInputFiles('./tests/fixtures/bom_data.csv');
|
|
|
|
await page
|
|
.getByRole('switch', { name: 'boolean-field-update_records' })
|
|
.click();
|
|
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
|
|
// Submitting without selecting model type, should show error
|
|
await page.getByText('This field is required.').waitFor();
|
|
await page.getByText('Errors exist for one or more').waitFor();
|
|
|
|
await page
|
|
.getByRole('textbox', { name: 'choice-field-model_type' })
|
|
.fill('bom');
|
|
await page.getByRole('option', { name: 'BOM Item', exact: true }).click();
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
|
|
await page.getByText('Select the parent assembly').waitFor();
|
|
await page.getByText('Select the component part').waitFor();
|
|
await page.getByText('Existing database identifier for the record').waitFor();
|
|
|
|
await page
|
|
.getByRole('textbox', { name: 'import-column-map-reference' })
|
|
.click();
|
|
await page.getByRole('option', { name: 'Ignore this field' }).click();
|
|
|
|
await page.getByRole('button', { name: 'Accept Column Mapping' }).click();
|
|
|
|
// Check for expected ID values
|
|
for (const itemId of ['16', '17', '15', '23']) {
|
|
await page.getByRole('cell', { name: itemId, exact: true });
|
|
}
|
|
|
|
// Import all the records
|
|
await page
|
|
.getByRole('row', { name: 'Select all records Row Not' })
|
|
.getByLabel('Select all records')
|
|
.click();
|
|
await page
|
|
.getByRole('button', { name: 'action-button-import-selected' })
|
|
.click();
|
|
|
|
await page.getByText('Data has been imported successfully').waitFor();
|
|
await page.getByRole('button', { name: 'Close' }).click();
|
|
|
|
// Confirmation of full import success
|
|
await page.getByRole('cell', { name: '3 / 3' }).first().waitFor();
|
|
|
|
// Manually delete records
|
|
await page.getByRole('checkbox', { name: 'Select all records' }).check();
|
|
await page
|
|
.getByRole('button', { name: 'action-button-delete-selected' })
|
|
.click();
|
|
await page.getByRole('button', { name: 'Delete', exact: true }).click();
|
|
});
|
|
|
|
test('Importing - BOM', async ({ browser }) => {
|
|
const page = await doCachedLogin(browser, {
|
|
username: 'steven',
|
|
password: 'wizardstaff',
|
|
url: 'part/109/bom'
|
|
});
|
|
|
|
// Open the BOM importer wizard
|
|
await page.getByRole('button', { name: 'action-menu-add-bom-items' }).click();
|
|
|
|
await page
|
|
.getByRole('menuitem', {
|
|
name: 'action-menu-add-bom-items-import-from-file'
|
|
})
|
|
.click();
|
|
|
|
// Select BOM file fixture for import
|
|
const fileInput = await page.locator('input[type="file"]');
|
|
await fileInput.setInputFiles('./tests/fixtures/bom_data.csv');
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
|
|
await page.getByText('Mapping data columns to database fields').waitFor();
|
|
await page.getByRole('button', { name: 'Accept Column Mapping' }).click();
|
|
await page.waitForTimeout(500);
|
|
|
|
await page.getByText('Importing Data').waitFor();
|
|
await page.getByText('0 / 3').waitFor();
|
|
|
|
await page.getByText('Screw for fixing wood').first().waitFor();
|
|
await page.getByText('Leg for a chair or a table').first().waitFor();
|
|
|
|
// Select some rows
|
|
await page
|
|
.getByRole('row', { name: 'Select record 1 0 Thumbnail' })
|
|
.getByLabel('Select record')
|
|
.click();
|
|
await page
|
|
.getByRole('row', { name: 'Select record 2 1 Thumbnail' })
|
|
.getByLabel('Select record')
|
|
.click();
|
|
|
|
// Delete selected rows
|
|
await page
|
|
.getByRole('dialog', { name: 'Importing Data Upload File' })
|
|
.getByLabel('action-button-delete-selected')
|
|
.waitFor();
|
|
await page.waitForTimeout(200);
|
|
await page
|
|
.getByRole('dialog', { name: 'Importing Data Upload File' })
|
|
.getByLabel('action-button-delete-selected')
|
|
.click();
|
|
|
|
await page.getByRole('button', { name: 'Delete', exact: true }).click();
|
|
|
|
await page.getByText('Success', { exact: true }).waitFor();
|
|
await page.getByText('Items deleted', { exact: true }).waitFor();
|
|
|
|
// Edit a row
|
|
await page
|
|
.getByRole('row', { name: 'Select record 1 2 Thumbnail' })
|
|
.getByLabel('row-action-menu-')
|
|
.click();
|
|
await page.getByRole('menuitem', { name: 'Edit' }).click();
|
|
await page.getByRole('textbox', { name: 'number-field-quantity' }).fill('12');
|
|
|
|
await page.waitForTimeout(250);
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
await page.waitForTimeout(250);
|
|
|
|
await page.getByText('0 / 1', { exact: true }).waitFor();
|
|
|
|
// Submit a row
|
|
await page
|
|
.getByRole('row', { name: 'Select record 1 2 Thumbnail' })
|
|
.getByLabel('row-action-menu-')
|
|
.click();
|
|
|
|
await page.getByRole('menuitem', { name: 'Accept' }).click();
|
|
await page.getByText('0 / 1', { exact: true }).waitFor();
|
|
});
|
|
|
|
test('Importing - Purchase Order', async ({ browser }) => {
|
|
const page = await doCachedLogin(browser, {
|
|
username: 'steven',
|
|
password: 'wizardstaff',
|
|
url: 'purchasing/purchase-order/15/line-items'
|
|
});
|
|
|
|
await page
|
|
.getByRole('button', { name: 'action-button-import-line-' })
|
|
.click();
|
|
|
|
const fileInput = await page.locator('input[type="file"]');
|
|
await fileInput.setInputFiles('./tests/fixtures/po_data.csv');
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
|
|
await page.getByRole('columnheader', { name: 'Database Field' }).waitFor();
|
|
await page.getByRole('columnheader', { name: 'Field Description' }).waitFor();
|
|
});
|
|
|
|
test('Importing - Natural Keys', async ({ browser }) => {
|
|
const page = await doCachedLogin(browser, {
|
|
username: 'steven',
|
|
password: 'wizardstaff',
|
|
url: 'purchasing/purchase-order/15/line-items'
|
|
});
|
|
|
|
// Import line item data, but use natural keys as the import fields
|
|
await page
|
|
.getByRole('button', { name: 'action-button-import-line-' })
|
|
.click();
|
|
|
|
const fileInput = await page.locator('input[type="file"]');
|
|
await fileInput.setInputFiles('./tests/fixtures/po_data_natural_keys.csv');
|
|
await page.getByRole('button', { name: 'Submit' }).click();
|
|
|
|
// Attempt import with missing required fields
|
|
await page.getByRole('button', { name: 'Accept Column Mapping' }).click();
|
|
await page.getByText('Some required fields have not been mapped').waitFor();
|
|
|
|
// Select different columns for data import
|
|
// We will use the "SKU" field to map to the supplier part
|
|
await page.getByRole('textbox', { name: 'import-column-map-part' }).click();
|
|
await page.getByRole('option', { name: 'SKU' }).click();
|
|
|
|
// Other import fields will be left as default
|
|
await page.getByRole('button', { name: 'Accept Column Mapping' }).click();
|
|
|
|
// Check for expected values to be displayed
|
|
await page.getByText('PRO-ZEN').first().waitFor();
|
|
await page.getByText('Project Zenith').first().waitFor();
|
|
await page.getByText('my-custom-reference').first().waitFor();
|
|
await page.getByText('Factory/Mechanical Lab').first().waitFor();
|
|
await page.getByText('FUT-43861-DDU').first().waitFor();
|
|
await page.getByText('FUT-82092-CQB').first().waitFor();
|
|
await page.getByText('2026-01-30').first().waitFor();
|
|
|
|
// Let's import all the data
|
|
await page
|
|
.getByRole('row', { name: 'Select all records Row Not' })
|
|
.getByLabel('Select all records')
|
|
.click();
|
|
await page
|
|
.getByRole('button', { name: 'action-button-import-selected' })
|
|
.click();
|
|
|
|
await page.getByText('Data has been imported successfully').waitFor();
|
|
await page.getByRole('button', { name: 'Close' }).click();
|
|
});
|