2
0
mirror of https://github.com/inventree/InvenTree.git synced 2026-03-21 11:44:42 +00:00

refactor(frontend): use central user creds (#11520)

This commit is contained in:
Matthias Mair
2026-03-14 03:29:46 +01:00
committed by GitHub
parent fda3204e33
commit d7af345e20
22 changed files with 118 additions and 105 deletions

View File

@@ -2,7 +2,13 @@ import { type FullConfig, chromium, request } from '@playwright/test';
import fs from 'node:fs';
import path from 'node:path';
import { apiUrl } from '../tests/defaults';
import {
adminuser,
allaccessuser,
apiUrl,
readeruser,
stevenuser
} from '../tests/defaults';
import { doCachedLogin } from '../tests/login';
async function globalSetup(config: FullConfig) {
@@ -45,26 +51,22 @@ async function globalSetup(config: FullConfig) {
// Perform login for each user (each in a separate browser instance)
await doCachedLogin(await chromium.launch(), {
username: 'admin',
password: 'inventree',
user: adminuser,
baseUrl: baseUrl
});
await doCachedLogin(await chromium.launch(), {
username: 'allaccess',
password: 'nolimits',
user: allaccessuser,
baseUrl: baseUrl
});
await doCachedLogin(await chromium.launch(), {
username: 'reader',
password: 'readonly',
user: readeruser,
baseUrl: baseUrl
});
await doCachedLogin(await chromium.launch(), {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
baseUrl: baseUrl
});
}

View File

@@ -11,6 +11,6 @@ export const createApi = ({
request.newContext({
baseURL: apiUrl,
extraHTTPHeaders: {
Authorization: `Basic ${btoa(`${username || adminuser.username}:${password || adminuser.password}`)}`
Authorization: `Basic ${btoa(`${username || adminuser.username}:${password || adminuser.testcred}`)}`
}
});

View File

@@ -1,4 +1,5 @@
import test, { expect } from '@playwright/test';
import { noaccessuser } from '../defaults';
import { navigate } from '../helpers';
import { doLogin } from '../login';
@@ -22,8 +23,7 @@ test('Customization - Splash', async ({ page }) => {
test('Customization - Logo', async ({ page }) => {
await doLogin(page, {
username: 'noaccess',
password: 'youshallnotpass'
user: noaccessuser
});
await page.waitForLoadState('networkidle');

View File

@@ -7,13 +7,34 @@ export const homeUrl = `${webUrl}/home`;
export const loginUrl = `${webUrl}/login`;
export const logoutUrl = `${webUrl}/logout`;
export const user = {
name: 'Ally Access',
username: 'allaccess',
password: 'nolimits'
export type UserType = {
name?: string;
username: string;
testcred: string;
};
export const adminuser = {
username: 'admin',
password: 'inventree'
export const allaccessuser: UserType = {
name: 'Ally Access',
username: 'allaccess',
testcred: 'nolimits'
};
export const adminuser: UserType = {
username: 'admin',
testcred: 'inventree'
};
export const stevenuser: UserType = {
username: 'steven',
testcred: 'wizardstaff'
};
export const readeruser: UserType = {
username: 'reader',
testcred: 'readonly'
};
export const noaccessuser: UserType = {
username: 'noaccess',
testcred: 'youshallnotpass'
};

View File

@@ -1,5 +1,11 @@
import type { Browser, Page } from '@playwright/test';
import { loginUrl, logoutUrl, user, webUrl } from './defaults';
import {
type UserType,
allaccessuser,
loginUrl,
logoutUrl,
webUrl
} from './defaults';
import fs from 'node:fs';
import path from 'node:path';
@@ -8,6 +14,7 @@ import { navigate } from './helpers.js';
interface LoginOptions {
username?: string;
password?: string;
user?: UserType;
baseUrl?: string;
}
@@ -15,8 +22,10 @@ interface LoginOptions {
* Perform form based login operation from the "login" URL
*/
export const doLogin = async (page: Page, options?: LoginOptions) => {
const username: string = options?.username ?? user.username;
const password: string = options?.password ?? user.password;
const username: string =
options?.username ?? options?.user?.username ?? allaccessuser.username;
const password: string =
options?.password ?? options?.user?.testcred ?? allaccessuser.testcred;
console.log('- Logging in with username:', username);
@@ -44,8 +53,7 @@ export const doLogin = async (page: Page, options?: LoginOptions) => {
};
export interface CachedLoginOptions {
username?: string;
password?: string;
user?: UserType;
url?: string;
baseUrl?: string;
}
@@ -61,8 +69,8 @@ export const doCachedLogin = async (
browser: Browser,
options?: CachedLoginOptions
): Promise<Page> => {
const username = options?.username ?? user.username;
const password = options?.password ?? user.password;
const username = options?.user?.username ?? allaccessuser.username;
const password = options?.user?.testcred ?? allaccessuser.testcred;
const url = options?.url ?? '';
// FAIL if an unsupported username is provided

View File

@@ -1,4 +1,5 @@
import { test } from '../baseFixtures.js';
import { stevenuser } from '../defaults.js';
import {
clearTableFilters,
clickOnParamFilter,
@@ -57,8 +58,7 @@ test('Company', async ({ browser }) => {
test('Company - Parameters', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'purchasing/index/suppliers'
});
@@ -75,8 +75,7 @@ test('Company - Parameters', async ({ browser }) => {
test('Company - Supplier Parts', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'purchasing/index/suppliers'
});

View File

@@ -417,6 +417,7 @@ test('Parts - Pricing (Supplier)', async ({ browser }) => {
test('Parts - Pricing (Variant)', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'part/106/pricing' });
await page.getByText('A chair - available in multiple colors').waitFor();
await loadTab(page, 'Part Pricing');
await page.getByLabel('Part Pricing').getByText('Part Pricing').waitFor();
@@ -438,6 +439,7 @@ test('Parts - Pricing (Variant)', async ({ browser }) => {
test('Parts - Pricing (Internal)', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'part/65/pricing' });
await page.getByText('Socket head cap screw, M2').waitFor();
await loadTab(page, 'Part Pricing');
await page.getByLabel('Part Pricing').getByText('Part Pricing').waitFor();

View File

@@ -1,5 +1,6 @@
import { expect } from '@playwright/test';
import { test } from '../baseFixtures.ts';
import { readeruser } from '../defaults.ts';
import {
activateCalendarView,
activateTableView,
@@ -259,8 +260,7 @@ test('Purchase Orders - Barcodes', async ({ browser }) => {
test('Purchase Orders - Filters', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'reader',
password: 'readonly'
user: readeruser
});
await page.getByRole('tab', { name: 'Purchasing' }).click();

View File

@@ -1,6 +1,7 @@
import type { Page } from '@playwright/test';
import { createApi } from '../api';
import { test } from '../baseFixtures';
import { adminuser } from '../defaults';
import { doCachedLogin } from '../login';
const scan = async (page: Page, barcode: string) => {
@@ -65,6 +66,7 @@ test('Barcode Scanning - Part', async ({ browser }) => {
test('Barcode Scanning - Stockitem', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'scan/' });
await scan(page, '{"stockitem": 408}');
await page.getByText('1551ABK').waitFor();
@@ -87,6 +89,7 @@ test('Barcode Scanning - StockLocation', async ({ browser }) => {
test('Barcode Scanning - SupplierPart', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'scan/' });
await scan(page, '{"supplierpart": 204}');
await page.waitForLoadState('networkidle');
@@ -96,6 +99,7 @@ test('Barcode Scanning - SupplierPart', async ({ browser }) => {
test('Barcode Scanning - PurchaseOrder', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'scan/' });
await scan(page, '{"purchaseorder": 12}');
// purchaseorder: 12
@@ -119,6 +123,7 @@ test('Barcode Scanning - SalesOrder', async ({ browser }) => {
test('Barcode Scanning - Build', async ({ browser }) => {
const page = await doCachedLogin(browser, { url: 'scan/' });
await scan(page, '{"build": 8}');
// build: 8
@@ -129,8 +134,7 @@ test('Barcode Scanning - Build', async ({ browser }) => {
test('Barcode Scanning - Forms', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree',
user: adminuser,
url: '/stock/location/index/stock-items'
});

View File

@@ -1,4 +1,5 @@
import { expect, test } from '../baseFixtures.js';
import { stevenuser } from '../defaults.js';
import {
clearTableFilters,
clickButtonIfVisible,
@@ -117,8 +118,7 @@ test('Stock - Location Delete', async ({ browser }) => {
test('Stock - Filters', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: '/stock/location/index/'
});

View File

@@ -1,4 +1,5 @@
import test from '@playwright/test';
import { stevenuser } from './defaults';
import { globalSearch, loadTab, navigate } from './helpers';
import { doCachedLogin } from './login';
@@ -13,8 +14,7 @@ const openExportDialog = async (page) => {
// Test data export for various order types
test('Exporting - Orders', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'purchasing/index/purchase-orders'
});
@@ -72,8 +72,7 @@ test('Exporting - Orders', async ({ browser }) => {
// Test for custom BOM exporter
test('Exporting - BOM', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff'
user: stevenuser
});
await globalSearch(page, 'MAST');

View File

@@ -1,12 +1,12 @@
/** Unit tests for form validation, rendering, etc */
import test from 'playwright/test';
import { stevenuser } from './defaults';
import { navigate } from './helpers';
import { doCachedLogin } from './login';
test('Forms - Stock Item Validation', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'stock/location/index/stock-items'
});
@@ -82,8 +82,7 @@ test('Forms - Stock Item Validation', async ({ browser }) => {
test('Forms - Supplier Validation', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'purchasing/index/suppliers'
});
await page.waitForURL('**/purchasing/index/**');

View File

@@ -1,4 +1,5 @@
import { test } from './baseFixtures.js';
import { adminuser, stevenuser } from './defaults.js';
import { globalSearch } from './helpers.js';
import { doCachedLogin } from './login.js';
@@ -7,8 +8,7 @@ import { doCachedLogin } from './login.js';
*/
test('General - Admin Button', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree',
user: adminuser,
url: 'company/1/details'
});
@@ -23,8 +23,7 @@ test('General - Admin Button', async ({ browser }) => {
// Tests for the global search functionality
test('General - Search', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff'
user: stevenuser
});
// Open the search drawer with a shortcut

View File

@@ -1,10 +1,10 @@
import test from '@playwright/test';
import { stevenuser } from './defaults';
import { doCachedLogin } from './login';
test('Importing - Admin Center', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'settings/admin/import'
});
@@ -72,8 +72,7 @@ test('Importing - Admin Center', async ({ browser }) => {
test('Importing - BOM', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'part/109/bom'
});
@@ -153,8 +152,7 @@ test('Importing - BOM', async ({ browser }) => {
test('Importing - Purchase Order', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'purchasing/purchase-order/15/line-items'
});
@@ -172,8 +170,7 @@ test('Importing - Purchase Order', async ({ browser }) => {
test('Importing - Natural Keys', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'purchasing/purchase-order/15/line-items'
});

View File

@@ -1,5 +1,5 @@
import { expect, test } from './baseFixtures.js';
import { logoutUrl } from './defaults.js';
import { logoutUrl, noaccessuser } from './defaults.js';
import { navigate } from './helpers.js';
import { doLogin } from './login.js';
@@ -48,8 +48,7 @@ test('Login - Failures', async ({ page }) => {
test('Login - Change Password', async ({ page }) => {
await doLogin(page, {
username: 'noaccess',
password: 'youshallnotpass'
user: noaccessuser
});
// Navigate to the 'change password' page
@@ -90,8 +89,7 @@ test('Login - Change Password', async ({ page }) => {
// Tests for assigning MFA tokens to users
test('Login - MFA - TOTP', async ({ page }) => {
await doLogin(page, {
username: 'noaccess',
password: 'youshallnotpass'
user: noaccessuser
});
await navigate(page, 'settings/user/security', { waitUntil: 'networkidle' });

View File

@@ -1,12 +1,12 @@
import test from 'playwright/test';
import { adminuser } from './defaults';
import { clickOnRowMenu, navigate } from './helpers';
import { doCachedLogin } from './login';
import { setPluginState } from './settings';
test('Machines - Admin Panel', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree',
user: adminuser,
url: 'settings/admin/machine'
});
@@ -20,8 +20,7 @@ test('Machines - Admin Panel', async ({ browser }) => {
test('Machines - Activation', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree',
user: adminuser,
url: 'settings/admin/machine'
});

View File

@@ -1,11 +1,11 @@
import { systemKey, test } from './baseFixtures.js';
import { adminuser } from './defaults.js';
import { doCachedLogin } from './login.js';
import { setPluginState } from './settings.js';
test('Modals - Admin', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// use server info

View File

@@ -3,6 +3,7 @@
*/
import test from '@playwright/test';
import { adminuser, readeruser } from './defaults';
import { clickOnRowMenu, loadTab } from './helpers';
import { doCachedLogin } from './login';
@@ -13,8 +14,7 @@ import { doCachedLogin } from './login';
test('Permissions - Admin', async ({ browser }) => {
// Login, and start on the "admin" page
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree',
user: adminuser,
url: '/settings/admin/'
});
@@ -57,8 +57,7 @@ test('Permissions - Admin', async ({ browser }) => {
test('Permissions - Reader', async ({ browser }) => {
// Login, and start on the "admin" page
const page = await doCachedLogin(browser, {
username: 'reader',
password: 'readonly',
user: readeruser,
url: '/part/category/index/'
});

View File

@@ -1,5 +1,6 @@
import test from 'playwright/test';
import { adminuser } from './defaults.js';
import {
clearTableFilters,
clickOnRowMenu,
@@ -13,8 +14,7 @@ import { setPluginState, setSettingState } from './settings.js';
// Unit test for plugin settings
test('Plugins - Settings', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// Ensure that the SampleIntegration plugin is enabled
@@ -106,8 +106,7 @@ test('Plugins - User Settings', async ({ browser }) => {
test('Plugins - Functionality', async ({ browser }) => {
// Navigate and select the plugin
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree',
user: adminuser,
url: 'settings/admin/plugin/'
});
@@ -149,8 +148,7 @@ test('Plugins - Functionality', async ({ browser }) => {
test('Plugins - Panels', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// Ensure that UI plugins are enabled
@@ -198,8 +196,7 @@ test('Plugins - Panels', async ({ browser }) => {
*/
test('Plugins - Custom Admin', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// Ensure that the SampleUI plugin is enabled
@@ -231,8 +228,7 @@ test('Plugins - Custom Admin', async ({ browser }) => {
test('Plugins - Locate Item', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// Ensure that the sample location plugin is enabled

View File

@@ -1,4 +1,5 @@
import { expect, test } from './baseFixtures.js';
import { adminuser } from './defaults.js';
import { activateTableView, loadTab } from './helpers.js';
import { doCachedLogin } from './login.js';
import { setPluginState } from './settings.js';
@@ -79,8 +80,7 @@ test('Printing - Report Printing', async ({ browser }) => {
test('Printing - Report Editing', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// activate the sample plugin for this test

View File

@@ -1,5 +1,6 @@
import { createApi } from './api.js';
import { expect, test } from './baseFixtures.js';
import { adminuser, allaccessuser, stevenuser } from './defaults.js';
import { getRowFromCell, loadTab, navigate } from './helpers.js';
import { doCachedLogin } from './login.js';
import { setPluginState, setSettingState } from './settings.js';
@@ -34,8 +35,7 @@ import { setPluginState, setSettingState } from './settings.js';
test('Settings - User theme', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'allaccess',
password: 'nolimits'
user: allaccessuser
});
await page.waitForLoadState('networkidle');
@@ -82,8 +82,7 @@ test('Settings - User theme', async ({ browser }) => {
test('Settings - User', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'allaccess',
password: 'nolimits',
user: allaccessuser,
url: 'settings/user/'
});
@@ -136,8 +135,7 @@ test('Settings - User', async ({ browser }) => {
test('Settings - Global', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'steven',
password: 'wizardstaff',
user: stevenuser,
url: 'settings/system/'
});
@@ -214,8 +212,7 @@ test('Settings - Global', async ({ browser }) => {
test('Settings - Admin', async ({ browser }) => {
// Note here we login with admin access
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// User settings
@@ -320,8 +317,7 @@ test('Settings - Admin', async ({ browser }) => {
test('Settings - Admin - Barcode History', async ({ browser }) => {
// Login with admin credentials
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
// Ensure that the "save scans" setting is enabled
@@ -375,8 +371,7 @@ test('Settings - Admin - Barcode History', async ({ browser }) => {
test('Settings - Admin - Parameter', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'admin',
password: 'inventree'
user: adminuser
});
await page.getByRole('button', { name: 'admin' }).click();
await page.getByRole('menuitem', { name: 'Admin Center' }).click();
@@ -483,8 +478,7 @@ test('Settings - Admin - Parameter', async ({ browser }) => {
test('Settings - Admin - Unauthorized', async ({ browser }) => {
// Try to access "admin" page with a non-staff user
const page = await doCachedLogin(browser, {
username: 'allaccess',
password: 'nolimits',
user: allaccessuser,
url: 'settings/admin/'
});
@@ -516,8 +510,7 @@ test('Settings - Admin - Unauthorized', async ({ browser }) => {
// Test for user auth configuration
test('Settings - Auth - Email', async ({ browser }) => {
const page = await doCachedLogin(browser, {
username: 'allaccess',
password: 'nolimits',
user: allaccessuser,
url: 'settings/user/'
});

View File

@@ -1,4 +1,5 @@
import { test } from './baseFixtures.js';
import { stevenuser } from './defaults.js';
import {
clearTableFilters,
navigate,
@@ -43,8 +44,7 @@ test('Tables - Filters', async ({ browser }) => {
test('Tables - Pagination', async ({ browser }) => {
const page = await doCachedLogin(browser, {
url: 'manufacturing/index/buildorders',
username: 'steven',
password: 'wizardstaff'
user: stevenuser
});
await clearTableFilters(page);
@@ -76,8 +76,7 @@ test('Tables - Columns', async ({ browser }) => {
// Go to the "stock list" page
const page = await doCachedLogin(browser, {
url: 'stock/location/index/stock-items',
username: 'steven',
password: 'wizardstaff'
user: stevenuser
});
// Open column selector
@@ -104,8 +103,7 @@ test('Tables - Sorting', async ({ browser }) => {
// Go to the "stock list" page
const page = await doCachedLogin(browser, {
url: 'stock/location/index/stock-items',
username: 'steven',
password: 'wizardstaff'
user: stevenuser
});
// Stock table sorting