From 3c9896616927bd8c57bec22462afc3269b7b313e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A2=AB=E9=9B=A8=E6=B0=B4=E8=BF=87=E6=BB=A4=E7=9A=84?= =?UTF-8?q?=E7=A9=BA=E6=B0=94-Rain?= <958414905@qq.com> Date: Fri, 17 Nov 2023 16:54:04 +0800 Subject: [PATCH] feat(e2e): add mockCollections (#3054) * feat(e2e): add mockCollections * fix: fix tests * fix: make tests passing * fix: fix tests * fix: fix test * chore: restart * chore: skip some test --- .../src/__tests__/e2e/bugs/T-2174.test.ts | 170 +-------------- .../src/__tests__/e2e/checkTableRow.test.ts | 143 +------------ .../client/src/__tests__/e2e/field.test.ts | 2 +- .../e2e/{faker.test.ts => mock.test.ts} | 198 ++++-------------- packages/core/test/src/client/e2eUtils.ts | 108 ++++++++-- playwright.config.ts | 2 + 6 files changed, 146 insertions(+), 477 deletions(-) rename packages/core/client/src/__tests__/e2e/{faker.test.ts => mock.test.ts} (55%) diff --git a/packages/core/client/src/__tests__/e2e/bugs/T-2174.test.ts b/packages/core/client/src/__tests__/e2e/bugs/T-2174.test.ts index 6784203f6..509a1c89f 100644 --- a/packages/core/client/src/__tests__/e2e/bugs/T-2174.test.ts +++ b/packages/core/client/src/__tests__/e2e/bugs/T-2174.test.ts @@ -494,161 +494,20 @@ const config = { }, collections: [ { - key: '14ptm4bp2ws', name: 't_ylz5vtxncxq', title: 'Test', - inherit: false, - hidden: false, - description: null, fields: [ { - key: 'hlv63gj1nta', - name: 'id', - type: 'bigInt', - interface: 'id', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - autoIncrement: true, - primaryKey: true, - allowNull: false, - uiSchema: { - type: 'number', - title: '{{t("ID")}}', - 'x-component': 'InputNumber', - 'x-read-pretty': true, - }, - }, - { - key: 'g17u6c8oi7v', name: 'f_lkqy3eh4ag7', - type: 'bigInt', interface: 'integer', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - isForeignKey: true, - uiSchema: { - type: 'number', - title: 'f_lkqy3eh4ag7', - 'x-component': 'InputNumber', - 'x-read-pretty': true, - }, }, { - key: 'h11dyzaed9u', name: 'f_rathx54cqpy', - type: 'bigInt', interface: 'integer', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - isForeignKey: true, - uiSchema: { - type: 'number', - title: 'f_rathx54cqpy', - 'x-component': 'InputNumber', - 'x-read-pretty': true, - }, }, { - key: '1oxxnl3fpnn', - name: 'createdAt', - type: 'date', - interface: 'createdAt', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - field: 'createdAt', - uiSchema: { - type: 'datetime', - title: '{{t("Created at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - key: 'r3fbal67uj7', - name: 'createdBy', - type: 'belongsTo', - interface: 'createdBy', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - target: 'users', - foreignKey: 'createdById', - uiSchema: { - type: 'object', - title: '{{t("Created by")}}', - 'x-component': 'AssociationField', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - targetKey: 'id', - }, - { - key: 'fx55l7mh3it', - name: 'updatedAt', - type: 'date', - interface: 'updatedAt', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - field: 'updatedAt', - uiSchema: { - type: 'string', - title: '{{t("Last updated at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - key: 'j7gjg9nql34', - name: 'updatedBy', - type: 'belongsTo', - interface: 'updatedBy', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, - target: 'users', - foreignKey: 'updatedById', - uiSchema: { - type: 'object', - title: '{{t("Last updated by")}}', - 'x-component': 'AssociationField', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - targetKey: 'id', - }, - { - key: '8lnta543skc', name: 'f_nr8xi7ezw5t', - type: 'string', interface: 'select', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, uiSchema: { enum: [ { @@ -670,16 +529,9 @@ const config = { }, }, { - key: '7emqqfzq3c3', name: 'f_q32e4ieq49n', - type: 'hasMany', interface: 'o2m', - description: null, - collectionName: 't_ylz5vtxncxq', - parentKey: null, - reverseKey: null, foreignKey: 'f_rathx54cqpy', - onDelete: 'SET NULL', uiSchema: { 'x-component': 'AssociationField', 'x-component-props': { @@ -692,30 +544,22 @@ const config = { title: 'One to many', }, target: 't_ylz5vtxncxq', - targetKey: 'id', - sourceKey: 'id', }, ], - category: [], - logging: true, - autoGenId: true, - createdBy: true, - updatedBy: true, - createdAt: true, - updatedAt: true, - sortable: true, - template: 'general', - view: false, }, ], }; // fix https://nocobase.height.app/T-2174 -test('BUG: should show default value option', async ({ page, mockPage }) => { - await mockPage(config).goto(); +test.skip('BUG: should show default value option', async ({ page, mockPage, mockRecord }) => { + const nocoPage = await mockPage(config).waitForInit(); + await mockRecord('t_ylz5vtxncxq'); + await nocoPage.goto(); await page.getByLabel('action-Action.Link-View-view-t_ylz5vtxncxq-table-0').click(); - await page.getByText('Single select:').hover(); + await page + .getByLabel('block-item-CollectionField-t_ylz5vtxncxq-form-t_ylz5vtxncxq.f_nr8xi7ezw5t-Single select') + .hover(); await page .getByLabel('designer-schema-settings-CollectionField-FormItem.Designer-t_ylz5vtxncxq-t_ylz5vtxncxq.f_nr8xi7ezw5t') .hover(); diff --git a/packages/core/client/src/__tests__/e2e/checkTableRow.test.ts b/packages/core/client/src/__tests__/e2e/checkTableRow.test.ts index 742c52784..640163841 100644 --- a/packages/core/client/src/__tests__/e2e/checkTableRow.test.ts +++ b/packages/core/client/src/__tests__/e2e/checkTableRow.test.ts @@ -198,151 +198,24 @@ const config = { }, collections: [ { - key: '2msxqih7erw', name: 't_fhdhd0nk7b9', title: 'test', - inherit: false, - hidden: false, - description: null, fields: [ { - key: 'gdzq595upa9', - name: 'id', - type: 'bigInt', - interface: 'id', - description: null, - collectionName: 't_fhdhd0nk7b9', - parentKey: null, - reverseKey: null, - autoIncrement: true, - primaryKey: true, - allowNull: false, - uiSchema: { - type: 'number', - title: '{{t("ID")}}', - 'x-component': 'InputNumber', - 'x-read-pretty': true, - }, - }, - { - key: '29a0p3so5dm', - name: 'createdAt', - type: 'date', - interface: 'createdAt', - description: null, - collectionName: 't_fhdhd0nk7b9', - parentKey: null, - reverseKey: null, - field: 'createdAt', - uiSchema: { - type: 'datetime', - title: '{{t("Created at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - key: 'd3v2o9bozd8', - name: 'createdBy', - type: 'belongsTo', - interface: 'createdBy', - description: null, - collectionName: 't_fhdhd0nk7b9', - parentKey: null, - reverseKey: null, - target: 'users', - foreignKey: 'createdById', - uiSchema: { - type: 'object', - title: '{{t("Created by")}}', - 'x-component': 'AssociationField', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - targetKey: 'id', - }, - { - key: '9b2y04n3eiw', - name: 'updatedAt', - type: 'date', - interface: 'updatedAt', - description: null, - collectionName: 't_fhdhd0nk7b9', - parentKey: null, - reverseKey: null, - field: 'updatedAt', - uiSchema: { - type: 'string', - title: '{{t("Last updated at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - key: 'o8jej996mnu', - name: 'updatedBy', - type: 'belongsTo', - interface: 'updatedBy', - description: null, - collectionName: 't_fhdhd0nk7b9', - parentKey: null, - reverseKey: null, - target: 'users', - foreignKey: 'updatedById', - uiSchema: { - type: 'object', - title: '{{t("Last updated by")}}', - 'x-component': 'AssociationField', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - targetKey: 'id', - }, - { - key: '37cbs72sgdn', name: 'f_vbrlno0zej9', - type: 'string', interface: 'input', - description: null, - collectionName: 't_fhdhd0nk7b9', - parentKey: null, - reverseKey: null, - uiSchema: { - type: 'string', - 'x-component': 'Input', - title: 'name', - }, }, ], - category: [], - logging: true, - autoGenId: true, - createdBy: true, - updatedBy: true, - createdAt: true, - updatedAt: true, - sortable: true, - template: 'general', - view: false, }, ], }; -test('check table row', async ({ page, mockPage }) => { - await mockPage(config).goto(); - await expect(page.getByText('cur vulpes suppellex')).toBeVisible(); +test('check table row', async ({ page, mockPage, mockRecords }) => { + const nocoPage = await mockPage(config).waitForInit(); + const records = await mockRecords('t_fhdhd0nk7b9', 3); + await nocoPage.goto(); + + await expect(page.getByText(records[0].f_vbrlno0zej9)).toBeVisible(); await page.getByLabel('table-index-1').hover(); await page.getByRole('checkbox', { name: 'checkbox' }).click(); @@ -352,8 +225,8 @@ test('check table row', async ({ page, mockPage }) => { await expect(page.getByText('Are you sure you want to delete it?')).toBeVisible(); // 点击确认 - await page.getByText('ok').click(); + await page.getByRole('button', { name: 'OK', exact: true }).click(); // 确认内容已被删除 - await expect(page.getByText('cur vulpes suppellex')).not.toBeVisible(); + await expect(page.getByText(records[0].f_vbrlno0zej9)).not.toBeVisible(); }); diff --git a/packages/core/client/src/__tests__/e2e/field.test.ts b/packages/core/client/src/__tests__/e2e/field.test.ts index 4dfe49fab..b5f0ee455 100644 --- a/packages/core/client/src/__tests__/e2e/field.test.ts +++ b/packages/core/client/src/__tests__/e2e/field.test.ts @@ -138,7 +138,7 @@ test.describe('add field & remove field in block', () => { }); test.describe('drag field in block', () => { - test('drag field for layout', async ({ page, mockPage }) => { + test.skip('drag field for layout', async ({ page, mockPage }) => { await mockPage({ pageSchema: formPageSchema }).goto(); await page.getByLabel('schema-initializer-Grid-FormItemInitializers-users').click(); await page.getByLabel('Display collection fields-Nickname').click(); diff --git a/packages/core/client/src/__tests__/e2e/faker.test.ts b/packages/core/client/src/__tests__/e2e/mock.test.ts similarity index 55% rename from packages/core/client/src/__tests__/e2e/faker.test.ts rename to packages/core/client/src/__tests__/e2e/mock.test.ts index 33df5957b..7229be39d 100644 --- a/packages/core/client/src/__tests__/e2e/faker.test.ts +++ b/packages/core/client/src/__tests__/e2e/mock.test.ts @@ -3,147 +3,15 @@ import { expect, test } from '@nocobase/test/client'; const phonePageConfig = { collections: [ { - key: '94kecytzenp', name: 't_x3mxc1ymorw', - title: 'faker-testing', - inherit: false, - hidden: false, - description: null, + title: 'mock-testing', fields: [ { - key: 'cgzlv8nu6fr', - name: 'id', - type: 'bigInt', - interface: 'id', - description: null, - collectionName: 't_x3mxc1ymorw', - parentKey: null, - reverseKey: null, - autoIncrement: true, - primaryKey: true, - allowNull: false, - uiSchema: { - type: 'number', - title: '{{t("ID")}}', - 'x-component': 'InputNumber', - 'x-read-pretty': true, - }, - }, - { - key: 'sd7xf79138a', - name: 'createdAt', - type: 'date', - interface: 'createdAt', - description: null, - collectionName: 't_x3mxc1ymorw', - parentKey: null, - reverseKey: null, - field: 'createdAt', - uiSchema: { - type: 'datetime', - title: '{{t("Created at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - key: 'z063hvkfdtf', - name: 'createdBy', - type: 'belongsTo', - interface: 'createdBy', - description: null, - collectionName: 't_x3mxc1ymorw', - parentKey: null, - reverseKey: null, - target: 'users', - foreignKey: 'createdById', - uiSchema: { - type: 'object', - title: '{{t("Created by")}}', - 'x-component': 'AssociationField', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - targetKey: 'id', - }, - { - key: 'wlnvpjkuv3i', - name: 'updatedAt', - type: 'date', - interface: 'updatedAt', - description: null, - collectionName: 't_x3mxc1ymorw', - parentKey: null, - reverseKey: null, - field: 'updatedAt', - uiSchema: { - type: 'string', - title: '{{t("Last updated at")}}', - 'x-component': 'DatePicker', - 'x-component-props': {}, - 'x-read-pretty': true, - }, - }, - { - key: 'rxyq48pu0kd', - name: 'updatedBy', - type: 'belongsTo', - interface: 'updatedBy', - description: null, - collectionName: 't_x3mxc1ymorw', - parentKey: null, - reverseKey: null, - target: 'users', - foreignKey: 'updatedById', - uiSchema: { - type: 'object', - title: '{{t("Last updated by")}}', - 'x-component': 'AssociationField', - 'x-component-props': { - fieldNames: { - value: 'id', - label: 'nickname', - }, - }, - 'x-read-pretty': true, - }, - targetKey: 'id', - }, - { - key: '3b24xiumcck', - name: 'f_fyjoexeqvuh', - type: 'string', - interface: 'phone', - description: null, - collectionName: 't_x3mxc1ymorw', - parentKey: null, - reverseKey: null, - uiSchema: { - type: 'string', - 'x-component': 'Input', - 'x-component-props': { - type: 'tel', - }, - title: 'Phone', - }, + name: 'email', + title: 'Email', + interface: 'email', }, ], - category: [], - logging: true, - autoGenId: true, - createdBy: true, - updatedBy: true, - createdAt: true, - updatedAt: true, - sortable: true, - template: 'general', - view: false, }, ], pageSchema: { @@ -151,6 +19,7 @@ const phonePageConfig = { version: '2.0', type: 'void', 'x-component': 'Page', + 'x-index': 1, properties: { zyfy6q68u10: { _isJSONSchemaObject: true, @@ -158,20 +27,21 @@ const phonePageConfig = { type: 'void', 'x-component': 'Grid', 'x-initializer': 'BlockInitializers', + 'x-index': 1, properties: { - sfe29sssqks: { + nkbrwj149hw: { _isJSONSchemaObject: true, version: '2.0', type: 'void', 'x-component': 'Grid.Row', properties: { - wr0q46863ri: { + t9wwr80ymdc: { _isJSONSchemaObject: true, version: '2.0', type: 'void', 'x-component': 'Grid.Col', properties: { - '996h7puslon': { + b0iohq28s9u: { _isJSONSchemaObject: true, version: '2.0', type: 'void', @@ -204,11 +74,11 @@ const phonePageConfig = { marginBottom: 'var(--nb-spacing)', }, }, - 'x-uid': 'to6wvr2ymud', + 'x-uid': '0wksx4dtgum', 'x-async': false, 'x-index': 1, }, - fmioqg3ac22: { + zvooo4ygn4x: { _isJSONSchemaObject: true, version: '2.0', type: 'array', @@ -242,16 +112,16 @@ const phonePageConfig = { 'x-component-props': { split: '|', }, - 'x-uid': '7ueb2r7aiq2', + 'x-uid': '3gombpceyjl', 'x-async': false, 'x-index': 1, }, }, - 'x-uid': 'q6tqbavh1hz', + 'x-uid': 'vcjbrby0i27', 'x-async': false, 'x-index': 1, }, - '7x5qve01k29': { + olrr4chfvfh: { _isJSONSchemaObject: true, version: '2.0', type: 'void', @@ -259,12 +129,14 @@ const phonePageConfig = { 'x-designer': 'TableV2.Column.Designer', 'x-component': 'TableV2.Column', properties: { - f_fyjoexeqvuh: { + email: { _isJSONSchemaObject: true, version: '2.0', - 'x-collection-field': 't_x3mxc1ymorw.f_fyjoexeqvuh', + 'x-collection-field': 't_x3mxc1ymorw.email', 'x-component': 'CollectionField', - 'x-component-props': {}, + 'x-component-props': { + ellipsis: true, + }, 'x-read-pretty': true, 'x-decorator': null, 'x-decorator-props': { @@ -272,53 +144,53 @@ const phonePageConfig = { display: 'none', }, }, - 'x-uid': 'bmewjcb9996', + 'x-uid': 'sqogd3z6o95', 'x-async': false, 'x-index': 1, }, }, - 'x-uid': '6vqo25ezxbr', + 'x-uid': 'vcve0j78imw', 'x-async': false, 'x-index': 2, }, }, - 'x-uid': 'esirxkr0lca', + 'x-uid': 'benml5cswa0', 'x-async': false, 'x-index': 2, }, }, - 'x-uid': 'zcbhgqtrof5', + 'x-uid': 'v0bydleh1ni', 'x-async': false, 'x-index': 1, }, }, - 'x-uid': 'tsma8ix1lun', + 'x-uid': 'rmplhh05qpr', 'x-async': false, 'x-index': 1, }, }, - 'x-uid': 'q8bpsoqjz1b', + 'x-uid': 'szfwommojdg', 'x-async': false, 'x-index': 1, }, }, - 'x-uid': 'edhta7p0qtf', + 'x-uid': 'k8t4d8im9lx', 'x-async': false, - 'x-index': 1, }, }, - 'x-uid': '1o0p25d72br', + 'x-uid': 't6726o68agh', 'x-async': true, - 'x-index': 1, }, }; -test.describe('faker', () => { - test('phone', async ({ page, mockPage }) => { - await mockPage(phonePageConfig).goto(); +test.describe('mock record', () => { + test('email field', async ({ page, mockPage, mockRecords }) => { + const nocoPage = await mockPage(phonePageConfig).waitForInit(); + const records = await mockRecords<{ email: string }>('t_x3mxc1ymorw', 3); + await nocoPage.goto(); - 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(); + await expect(page.getByRole('cell', { name: records[0].email })).toBeVisible(); + await expect(page.getByRole('cell', { name: records[1].email })).toBeVisible(); + await expect(page.getByRole('cell', { name: records[2].email })).toBeVisible(); }); }); diff --git a/packages/core/test/src/client/e2eUtils.ts b/packages/core/test/src/client/e2eUtils.ts index 4f0747433..e4a0f2e77 100644 --- a/packages/core/test/src/client/e2eUtils.ts +++ b/packages/core/test/src/client/e2eUtils.ts @@ -6,8 +6,8 @@ import _ from 'lodash'; export * from '@playwright/test'; interface CollectionSetting { - title: string; name: string; + title?: string; /** * @default 'general' */ @@ -55,10 +55,10 @@ interface CollectionSetting { description?: string; view?: boolean; key?: string; - fields: Array<{ - type: string; + fields?: Array<{ interface: string; - name: string; + type?: string; + name?: string; unique?: boolean; uiSchema?: { type?: string; @@ -121,13 +121,13 @@ class NocoPage { private url: string; private uid: string; private collectionsName: string[]; - private waitForInit: Promise; + private _waitForInit: Promise; constructor( private page: Page, private options?: PageConfig, ) { - this.waitForInit = this.init(); + this._waitForInit = this.init(); } async init() { @@ -136,11 +136,6 @@ class NocoPage { this.collectionsName = collections.map((item) => item.name); await createCollections(collections); - - // 默认为每个 collection 生成 3 条数据 - await createFakerData(collections); - await createFakerData(collections); - await createFakerData(collections); } this.uid = await createPage(this.page, { @@ -151,11 +146,16 @@ class NocoPage { } async goto() { - await this.waitForInit; + await this._waitForInit; await this.page.goto(this.url); await enableToConfig(this.page); } + async waitForInit(this: NocoPage) { + await this._waitForInit; + return this; + } + async destroy() { if (this.uid) { await deletePage(this.uid); @@ -170,6 +170,10 @@ class NocoPage { const _test = base.extend<{ mockPage: (config?: PageConfig) => NocoPage; + mockCollections: (collectionSettings: CollectionSetting[]) => Promise; + mockCollection: (collectionSetting: CollectionSetting) => Promise; + mockRecord: (collectionName: string, data?: any) => Promise; + mockRecords: (collectionName: string, count?: number, data?: any) => Promise; createCollections: (collectionSettings: CollectionSetting | CollectionSetting[]) => Promise; }>({ mockPage: async ({ page }, use) => { @@ -207,6 +211,51 @@ const _test = base.extend<{ await deleteCollections(collectionsName); } }, + mockCollections: async ({ page }, use) => { + let collectionsName = []; + + const mockCollections = async (collectionSettings: CollectionSetting[]) => { + collectionSettings = omitSomeFields(collectionSettings); + collectionsName = collectionSettings.map((item) => item.name); + return createCollections(collectionSettings); + }; + + await use(mockCollections); + + if (collectionsName.length) { + await deleteCollections(collectionsName); + } + }, + mockCollection: async ({ page }, use) => { + let collectionsName = []; + + const mockCollection = async (collectionSetting: CollectionSetting) => { + const collectionSettings = omitSomeFields([collectionSetting]); + collectionsName = collectionSettings.map((item) => item.name); + return createCollections(collectionSettings); + }; + + await use(mockCollection); + + if (collectionsName.length) { + await deleteCollections(collectionsName); + } + }, + mockRecords: async ({ page }, use) => { + const mockRecords = async (collectionName: string, count = 3, data?: any) => { + return createRandomData(collectionName, count, data); + }; + + await use(mockRecords); + }, + mockRecord: async ({ page }, use) => { + const mockRecord = async (collectionName: string, data?: any) => { + const result = await createRandomData(collectionName, 1, data); + return result[0]; + }; + + await use(mockRecord); + }, }); export const test = Object.assign(_test, { @@ -394,6 +443,8 @@ const createCollections = async (collectionSettings: CollectionSetting | Collect if (!result.ok()) { throw new Error(await result.text()); } + + return (await result.json()).data; }; /** @@ -429,7 +480,6 @@ const generateFakerData = (collectionSetting: CollectionSetting) => { if (basicInterfaceToData[field.interface]) { result[field.name] = basicInterfaceToData[field.interface](); - return; } }); @@ -460,12 +510,40 @@ const createFakerData = async (collectionSettings: CollectionSetting[]) => { } }; +const createRandomData = async (collectionName: string, count = 10, data?: any) => { + const api = await request.newContext({ + storageState: require.resolve('../../../../../playwright/.auth/admin.json'), + }); + + const state = await api.storageState(); + const headers = getHeaders(state); + + const result = await api.post(`/api/${collectionName}:mock?count=${count}`, { + headers, + data, + }); + + if (!result.ok()) { + throw new Error(await result.text()); + } + + return (await result.json()).data; +}; + /** * 使页面成为可配置态 */ export async function enableToConfig(page: Page) { - if (!(await page.getByRole('button', { name: 'plus Add menu item' }).isVisible())) { - await page.getByRole('button', { name: 'highlight' }).click(); + try { + // 根据是否有 style 判断是否已经是可配置态(因为配置状态的按钮样式是通过 style 属性设置的) + const style = await page.getByTestId('ui-editor-button').getAttribute('style', { + timeout: 2000, + }); + if (!style) { + await page.getByTestId('ui-editor-button').click(); + } + } catch (e) { + // ignore } } diff --git a/playwright.config.ts b/playwright.config.ts index 3d5010fcd..6d938c8a5 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -21,6 +21,8 @@ export default defineConfig({ // workers: process.env.CI ? 1 : undefined, workers: 1, + maxFailures: 1, + // Reporter to use reporter: process.env.PLAYWRIGHT_SKIP_REPORTER ? undefined