diff --git a/packages/core/client/src/__tests__/e2e/bugs/T-2165.test.ts b/packages/core/client/src/__tests__/e2e/bugs/T-2165.test.ts index 81e77da730..5a8f5b266f 100644 --- a/packages/core/client/src/__tests__/e2e/bugs/T-2165.test.ts +++ b/packages/core/client/src/__tests__/e2e/bugs/T-2165.test.ts @@ -279,7 +279,8 @@ const config = { }, }; -test('BUG: https://nocobase.height.app/T-2165', async ({ page, mockPage }) => { +// fix https://nocobase.height.app/T-2165 +test('BUG: variable labels should be displayed normally', async ({ page, mockPage }) => { await mockPage(config).goto(); await page.getByTestId('users-resource').hover(); diff --git a/packages/core/client/src/__tests__/e2e/faker.test.ts b/packages/core/client/src/__tests__/e2e/faker.test.ts index 37642b26d0..33df5957bc 100644 --- a/packages/core/client/src/__tests__/e2e/faker.test.ts +++ b/packages/core/client/src/__tests__/e2e/faker.test.ts @@ -317,8 +317,8 @@ test.describe('faker', () => { test('phone', async ({ page, mockPage }) => { await mockPage(phonePageConfig).goto(); - await expect(page.getByRole('cell', { name: '14979013912' })).toBeVisible(); - await expect(page.getByRole('cell', { name: '10313363958' })).toBeVisible(); - await expect(page.getByRole('cell', { name: '14365248205' })).toBeVisible(); + await expect(page.getByRole('cell', { name: '1-979-213-9120 x313' })).toBeVisible(); + await expect(page.getByRole('cell', { name: '(739) 684-3652 x482' })).toBeVisible(); + await expect(page.getByRole('cell', { name: '669-545-4191' })).toBeVisible(); }); }); diff --git a/packages/core/test/src/client/e2eUtils.ts b/packages/core/test/src/client/e2eUtils.ts index 8af061954f..d5665cd6e1 100644 --- a/packages/core/test/src/client/e2eUtils.ts +++ b/packages/core/test/src/client/e2eUtils.ts @@ -45,7 +45,7 @@ interface CollectionSetting { * Records can be sorted * @default true */ - sortable?: boolean; + sortable?: boolean | string; /** * @default false */ @@ -60,13 +60,13 @@ interface CollectionSetting { interface: string; name: string; unique?: boolean; - uiSchema: { + uiSchema?: { type?: string; title?: string; required?: boolean; 'x-component'?: string; 'x-read-pretty'?: boolean; - 'x-validator'?: string; + 'x-validator'?: any; 'x-component-props'?: Record; [key: string]: any; }; @@ -132,7 +132,7 @@ class NocoPage { const collections: any = deleteKeyOfCollection(this.options.collections); this.collectionsName = collections.map((item) => item.name); - await createCollections(this.page, collections); + await createCollections(collections); // 默认为每个 collection 生成 3 条数据 await createFakerData(collections); @@ -317,37 +317,6 @@ const deletePage = async (pageUid: string) => { } }; -const createCollection = async (collectionSetting: CollectionSetting) => { - const api = await request.newContext({ - storageState: require.resolve('../../../../../playwright/.auth/admin.json'), - }); - - const state = await api.storageState(); - const token = getStorageItem('NOCOBASE_TOKEN', state); - const defaultCollectionSetting: Partial = { - template: 'general', - logging: true, - autoGenId: true, - createdBy: true, - updatedBy: true, - createdAt: true, - updatedAt: true, - sortable: true, - view: false, - }; - - const result = await api.post(`/api/collections:create`, { - headers: { - Authorization: `Bearer ${token}`, - }, - data: Object.assign(defaultCollectionSetting, collectionSetting), - }); - - if (!result.ok()) { - throw new Error(await result.text()); - } -}; - const deleteCollections = async (collectionNames: string[]) => { const api = await request.newContext({ storageState: require.resolve('../../../../../playwright/.auth/admin.json'), @@ -388,13 +357,38 @@ const deleteKeyOfCollection = (collectionSettings: CollectionSetting[]) => { * @param collectionSettings * @returns */ -const createCollections = async (page: Page, collectionSettings: CollectionSetting[]) => { - // TODO: 这里如果改成并发创建的话性能会更好,但是会出现只创建一个 collection 的情况,暂时不知道原因 - for (const item of collectionSettings) { - await createCollection(item); +export const createCollections = async (collectionSettings: CollectionSetting | CollectionSetting[]) => { + const api = await request.newContext({ + storageState: require.resolve('../../../../../playwright/.auth/admin.json'), + }); + + const state = await api.storageState(); + const token = getStorageItem('NOCOBASE_TOKEN', state); + // const defaultCollectionSetting: Partial = { + // template: 'general', + // logging: true, + // autoGenId: true, + // createdBy: true, + // updatedBy: true, + // createdAt: true, + // updatedAt: true, + // sortable: true, + // view: false, + // }; + + collectionSettings = Array.isArray(collectionSettings) ? collectionSettings : [collectionSettings]; + + const result = await api.post(`/api/collections:create`, { + headers: { + Authorization: `Bearer ${token}`, + }, + // data: collectionSettings.map((item) => Object.assign(defaultCollectionSetting, item)), + data: collectionSettings.filter((item) => !['users', 'roles'].includes(item.name)), + }); + + if (!result.ok()) { + throw new Error(await result.text()); } - // @ts-ignore - page._collectionNames = collectionSettings.map((item) => item.name); }; /** @@ -409,12 +403,12 @@ const generateFakerData = (collectionSetting: CollectionSetting) => { input: () => faker.lorem.words(), textarea: () => faker.lorem.paragraph(), richText: () => faker.lorem.paragraph(), - phone: () => faker.phone.number('1##########'), + phone: () => faker.phone.number(), email: () => faker.internet.email(), url: () => faker.internet.url(), - integer: () => faker.datatype.number(), - number: () => faker.datatype.number(), - percent: () => faker.datatype.float(), + integer: () => faker.number.int(), + number: () => faker.number.int(), + percent: () => faker.number.float(), password: () => faker.internet.password(), color: () => faker.internet.color(), icon: () => 'checkcircleoutlined', diff --git a/playwright.config.ts b/playwright.config.ts index 49c57af550..35877af61f 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,7 +1,7 @@ import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ - timeout: 20 * 1000, + timeout: 30 * 1000, // Look for test files in the "tests" directory, relative to this configuration file. testDir: 'packages', diff --git a/scripts/runE2e.setup.ts b/scripts/runE2e.setup.ts index 2f5fabb549..a01bbaa30b 100644 --- a/scripts/runE2e.setup.ts +++ b/scripts/runE2e.setup.ts @@ -8,7 +8,7 @@ const run = async () => { await awaitForNocoBase(); console.log('Start running tests...'); - runCommand('npx', ['playwright', 'test', ...process.argv.slice(2)]); + await runCommand('npx', ['playwright', 'test', ...process.argv.slice(2)]); kill?.('SIGKILL'); }; diff --git a/scripts/utils.ts b/scripts/utils.ts index baaecf37aa..5b44d8373e 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -44,7 +44,7 @@ function checkPort(port) { /** * 检查服务是否启动成功 */ -const checkServer = async (duration = 1000, max = 30) => { +const checkServer = async (duration = 1000, max = 60) => { return new Promise((resolve, reject) => { let count = 0; const timer = setInterval(async () => { @@ -76,7 +76,7 @@ const checkServer = async (duration = 1000, max = 30) => { * 检查 UI 是否启动成功 * @param duration */ -const checkUI = async (duration = 1000, max = 30) => { +const checkUI = async (duration = 1000, max = 60) => { return new Promise((resolve, reject) => { let count = 0; const timer = setInterval(async () => {