refactor(e2e): support batch creation of collections (#2778)
* chore: types * refactor: optimize create collections * chore: make throw error * chore: export createCollections
This commit is contained in:
parent
bebe1d15e5
commit
f85fb6d7ba
@ -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();
|
||||
|
@ -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();
|
||||
});
|
||||
});
|
||||
|
@ -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<string, any>;
|
||||
[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<CollectionSetting> = {
|
||||
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<CollectionSetting> = {
|
||||
// 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',
|
||||
|
@ -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',
|
||||
|
@ -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');
|
||||
};
|
||||
|
||||
|
@ -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 () => {
|
||||
|
Loading…
Reference in New Issue
Block a user