test(e2e): add tests for collection manager (#3253)
* refactor: optimize file structure * test: add tests for collection templates * test: fix errors * fix: fix errors * test: schemaInitializer of fields * fix: test erros * fix: test error * test: make tests more stable * test: fix tree template
This commit is contained in:
parent
e7c2c9ff83
commit
4121075a98
@ -258,8 +258,6 @@ export const AddCollectionAction = (props) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
result.push({
|
result.push({
|
||||||
role: 'button',
|
|
||||||
'aria-label': `create-collection-${item.name}`,
|
|
||||||
label: compile(item.title),
|
label: compile(item.title),
|
||||||
key: item.name,
|
key: item.name,
|
||||||
});
|
});
|
||||||
@ -289,7 +287,7 @@ export const AddCollectionAction = (props) => {
|
|||||||
<ActionContextProvider value={{ visible, setVisible }}>
|
<ActionContextProvider value={{ visible, setVisible }}>
|
||||||
<Dropdown getPopupContainer={getContainer} trigger={trigger} align={align} menu={menu}>
|
<Dropdown getPopupContainer={getContainer} trigger={trigger} align={align} menu={menu}>
|
||||||
{children || (
|
{children || (
|
||||||
<Button aria-label="Create collection" icon={<PlusOutlined />} type={'primary'}>
|
<Button icon={<PlusOutlined />} type={'primary'}>
|
||||||
{t('Create collection')} <DownOutlined />
|
{t('Create collection')} <DownOutlined />
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
|
@ -258,8 +258,6 @@ export const AddFieldAction = (props) => {
|
|||||||
.filter((child) => ['m2o'].includes(child.name))
|
.filter((child) => ['m2o'].includes(child.name))
|
||||||
.map((child) => {
|
.map((child) => {
|
||||||
return {
|
return {
|
||||||
role: 'button',
|
|
||||||
'aria-label': `${compile(option.label)}-${child.name}`,
|
|
||||||
label: compile(child.title),
|
label: compile(child.title),
|
||||||
title: compile(child.title),
|
title: compile(child.title),
|
||||||
key: child.name,
|
key: child.name,
|
||||||
@ -277,8 +275,6 @@ export const AddFieldAction = (props) => {
|
|||||||
.filter((child) => !['o2o', 'subTable', 'linkTo'].includes(child.name))
|
.filter((child) => !['o2o', 'subTable', 'linkTo'].includes(child.name))
|
||||||
.map((child) => {
|
.map((child) => {
|
||||||
return {
|
return {
|
||||||
role: 'button',
|
|
||||||
'aria-label': `${compile(option.label)}-${child.name}`,
|
|
||||||
label: compile(child.title),
|
label: compile(child.title),
|
||||||
title: compile(child.title),
|
title: compile(child.title),
|
||||||
key: child.name,
|
key: child.name,
|
||||||
@ -314,7 +310,7 @@ export const AddFieldAction = (props) => {
|
|||||||
<ActionContextProvider value={{ visible, setVisible }}>
|
<ActionContextProvider value={{ visible, setVisible }}>
|
||||||
<Dropdown getPopupContainer={getContainer} trigger={trigger} align={align} menu={menu}>
|
<Dropdown getPopupContainer={getContainer} trigger={trigger} align={align} menu={menu}>
|
||||||
{children || (
|
{children || (
|
||||||
<Button aria-label="Add field" icon={<PlusOutlined />} type={'primary'}>
|
<Button icon={<PlusOutlined />} type={'primary'}>
|
||||||
{t('Add field')}
|
{t('Add field')}
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
|
@ -191,8 +191,6 @@ export const ConfigurationTabs = () => {
|
|||||||
return {
|
return {
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
role: 'button',
|
|
||||||
'aria-label': 'edit-category',
|
|
||||||
key: 'edit',
|
key: 'edit',
|
||||||
label: (
|
label: (
|
||||||
<SchemaComponent
|
<SchemaComponent
|
||||||
@ -211,8 +209,6 @@ export const ConfigurationTabs = () => {
|
|||||||
),
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
role: 'button',
|
|
||||||
'aria-label': 'delete-category',
|
|
||||||
key: 'delete',
|
key: 'delete',
|
||||||
label: compile("{{t('Delete category')}}"),
|
label: compile("{{t('Delete category')}}"),
|
||||||
onClick: () => remove(item.id),
|
onClick: () => remove(item.id),
|
||||||
|
@ -195,8 +195,8 @@ const APP_BASE_URL = process.env.APP_BASE_URL || `http://localhost:${PORT}`;
|
|||||||
|
|
||||||
export class NocoPage {
|
export class NocoPage {
|
||||||
private url: string;
|
private url: string;
|
||||||
private uid: string;
|
private uid: string | undefined;
|
||||||
private collectionsName: string[];
|
private collectionsName: string[] | undefined;
|
||||||
private _waitForInit: Promise<void>;
|
private _waitForInit: Promise<void>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@ -278,7 +278,7 @@ const _test = base.extend<ExtendUtils>({
|
|||||||
await use(mockManualDestroyPage);
|
await use(mockManualDestroyPage);
|
||||||
},
|
},
|
||||||
createCollections: async ({ page }, use) => {
|
createCollections: async ({ page }, use) => {
|
||||||
let collectionsName = [];
|
let collectionsName: string[] = [];
|
||||||
|
|
||||||
const _createCollections = async (collectionSettings: CollectionSetting | CollectionSetting[]) => {
|
const _createCollections = async (collectionSettings: CollectionSetting | CollectionSetting[]) => {
|
||||||
collectionSettings = omitSomeFields(
|
collectionSettings = omitSomeFields(
|
||||||
@ -295,7 +295,7 @@ const _test = base.extend<ExtendUtils>({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
mockCollections: async ({ page }, use) => {
|
mockCollections: async ({ page }, use) => {
|
||||||
let collectionsName = [];
|
let collectionsName: string[] = [];
|
||||||
const destroy = async () => {
|
const destroy = async () => {
|
||||||
if (collectionsName.length) {
|
if (collectionsName.length) {
|
||||||
await deleteCollections(_.uniq(collectionsName));
|
await deleteCollections(_.uniq(collectionsName));
|
||||||
@ -312,7 +312,7 @@ const _test = base.extend<ExtendUtils>({
|
|||||||
await destroy();
|
await destroy();
|
||||||
},
|
},
|
||||||
mockCollection: async ({ page }, use) => {
|
mockCollection: async ({ page }, use) => {
|
||||||
let collectionsName = [];
|
let collectionsName: string[] = [];
|
||||||
const destroy = async () => {
|
const destroy = async () => {
|
||||||
if (collectionsName.length) {
|
if (collectionsName.length) {
|
||||||
await deleteCollections(_.uniq(collectionsName));
|
await deleteCollections(_.uniq(collectionsName));
|
||||||
@ -618,12 +618,12 @@ const generateFakerData = (collectionSetting: CollectionSetting) => {
|
|||||||
};
|
};
|
||||||
const result = {};
|
const result = {};
|
||||||
|
|
||||||
collectionSetting.fields.forEach((field) => {
|
collectionSetting.fields?.forEach((field) => {
|
||||||
if (excludeField.includes(field.name)) {
|
if (field.name && excludeField.includes(field.name)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (basicInterfaceToData[field.interface]) {
|
if (basicInterfaceToData[field.interface] && field.name) {
|
||||||
result[field.name] = basicInterfaceToData[field.interface]();
|
result[field.name] = basicInterfaceToData[field.interface]();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -631,30 +631,6 @@ const generateFakerData = (collectionSetting: CollectionSetting) => {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* 使用 Faker 为 collection 创建数据
|
|
||||||
*/
|
|
||||||
const createFakerData = async (collectionSettings: CollectionSetting[]) => {
|
|
||||||
const api = await request.newContext({
|
|
||||||
storageState: process.env.PLAYWRIGHT_AUTH_FILE,
|
|
||||||
});
|
|
||||||
|
|
||||||
const state = await api.storageState();
|
|
||||||
const headers = getHeaders(state);
|
|
||||||
|
|
||||||
for (const item of collectionSettings) {
|
|
||||||
const data = generateFakerData(item);
|
|
||||||
const result = await api.post(`/api/${item.name}:create`, {
|
|
||||||
headers,
|
|
||||||
form: data,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!result.ok()) {
|
|
||||||
throw new Error(await result.text());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const createRandomData = async (collectionName: string, count = 10, data?: any) => {
|
const createRandomData = async (collectionName: string, count = 10, data?: any) => {
|
||||||
const api = await request.newContext({
|
const api = await request.newContext({
|
||||||
storageState: process.env.PLAYWRIGHT_AUTH_FILE,
|
storageState: process.env.PLAYWRIGHT_AUTH_FILE,
|
||||||
@ -714,15 +690,32 @@ function getHeaders(storageState: any) {
|
|||||||
return headers;
|
return headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ExpectSettingsMenuParams {
|
||||||
|
showMenu: () => Promise<void>;
|
||||||
|
supportedOptions: string[];
|
||||||
|
page: Page;
|
||||||
|
unsupportedOptions?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 辅助断言 SchemaSettings 的菜单项是否存在
|
* 辅助断言 SchemaSettings 的菜单项是否存在
|
||||||
* @param param0
|
* @param param0
|
||||||
*/
|
*/
|
||||||
export async function expectSettingsMenu({ showMenu, supportedOptions, page }) {
|
export async function expectSettingsMenu({
|
||||||
|
showMenu,
|
||||||
|
supportedOptions,
|
||||||
|
page,
|
||||||
|
unsupportedOptions,
|
||||||
|
}: ExpectSettingsMenuParams) {
|
||||||
await showMenu();
|
await showMenu();
|
||||||
for (const option of supportedOptions) {
|
for (const option of supportedOptions) {
|
||||||
await expect(page.getByRole('menuitem', { name: option })).toBeVisible();
|
await expect(page.getByRole('menuitem', { name: option })).toBeVisible();
|
||||||
}
|
}
|
||||||
|
if (unsupportedOptions) {
|
||||||
|
for (const option of unsupportedOptions) {
|
||||||
|
await expect(page.getByRole('menuitem', { name: option })).not.toBeVisible();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -732,7 +725,8 @@ export async function expectSettingsMenu({ showMenu, supportedOptions, page }) {
|
|||||||
export async function expectInitializerMenu({ showMenu, supportedOptions, page }) {
|
export async function expectInitializerMenu({ showMenu, supportedOptions, page }) {
|
||||||
await showMenu();
|
await showMenu();
|
||||||
for (const option of supportedOptions) {
|
for (const option of supportedOptions) {
|
||||||
await expect(page.getByRole('menuitem', { name: option })).toBeVisible();
|
// 使用 first 方法避免有重名的导致报错
|
||||||
|
await expect(page.getByRole('menuitem', { name: option }).first()).toBeVisible();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,80 @@
|
|||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { uid } from '@nocobase/utils';
|
||||||
|
import { CollectionManagerPage } from '../utils';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {
|
||||||
|
test('basic', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Calendar collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// Delete --------------------------------------------------------------------------------
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeHidden();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('inherits', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Calendar collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Inherits', ['Users']);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('categories', async ({ page }) => {
|
||||||
|
const categoriesName = uid();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
await collectionManagerPage.addCategory(categoriesName, 'Red');
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Calendar collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Categories', [categoriesName]);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: categoriesName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteCategory(categoriesName);
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {});
|
||||||
|
|
||||||
|
test.describe('edit', () => {});
|
@ -0,0 +1,7 @@
|
|||||||
|
import { test } from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {});
|
||||||
|
|
||||||
|
test.describe('edit', () => {});
|
@ -0,0 +1,80 @@
|
|||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { uid } from '@nocobase/utils';
|
||||||
|
import { CollectionManagerPage } from '../utils';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {
|
||||||
|
test('basic', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Expression collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// Delete --------------------------------------------------------------------------------
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeHidden();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('inherits', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Expression collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Inherits', ['Users']);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('categories', async ({ page }) => {
|
||||||
|
const categoriesName = uid();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
await collectionManagerPage.addCategory(categoriesName, 'Red');
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Expression collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Categories', [categoriesName]);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: categoriesName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteCategory(categoriesName);
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {});
|
||||||
|
|
||||||
|
test.describe('edit', () => {});
|
@ -0,0 +1,83 @@
|
|||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { uid } from '@nocobase/utils';
|
||||||
|
import { CollectionManagerPage } from '../utils';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {
|
||||||
|
test('basic', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('File collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('File storage', 'Local storage');
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// Delete --------------------------------------------------------------------------------
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeHidden();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('inherits', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('File collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Inherits', ['Users']);
|
||||||
|
await collectionSettings.change('File storage', 'Local storage');
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('categories', async ({ page }) => {
|
||||||
|
const categoriesName = uid();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
await collectionManagerPage.addCategory(categoriesName, 'Red');
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('File collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Categories', [categoriesName]);
|
||||||
|
await collectionSettings.change('File storage', 'Local storage');
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: categoriesName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteCategory(categoriesName);
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {});
|
||||||
|
|
||||||
|
test.describe('edit', () => {});
|
@ -0,0 +1,263 @@
|
|||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { uid } from '@nocobase/utils';
|
||||||
|
import { CollectionManagerPage, FieldInterface } from '../utils';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {
|
||||||
|
test('basic', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('General collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// Delete --------------------------------------------------------------------------------
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeHidden();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('inherits', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('General collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Inherits', ['Users']);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('categories', async ({ page }) => {
|
||||||
|
const categoriesName = uid();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
await collectionManagerPage.addCategory(categoriesName, 'Red');
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('General collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Categories', [categoriesName]);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: categoriesName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteCategory(categoriesName);
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('uncheck more options', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('General collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Generate ID field automatically', false);
|
||||||
|
await collectionSettings.change('Store the creation user of each record', false);
|
||||||
|
await collectionSettings.change('Store the last update user of each record', false);
|
||||||
|
await collectionSettings.change('Store the creation time of each record', false);
|
||||||
|
await collectionSettings.change('Store the last update time of each record', false);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {
|
||||||
|
test('basic', async ({ page, mockCollections }) => {
|
||||||
|
test.slow();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
const targetCollectionName = `t_${uid()}`;
|
||||||
|
await mockCollections([
|
||||||
|
{
|
||||||
|
name: targetCollectionName,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: collectionName,
|
||||||
|
title: collectionDisplayName,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const fieldsSettings = await collectionManagerPage.configureFields(collectionName);
|
||||||
|
// 应该有这些字段显示出来
|
||||||
|
await expect(page.getByRole('cell', { name: 'id', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'createdAt', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'createdBy', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'updatedAt', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: 'updatedBy', exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// 添加 table oid 字段
|
||||||
|
const tableOIDDisplayName = uid();
|
||||||
|
const tableOIDSettings = await fieldsSettings.addField('Table OID');
|
||||||
|
await tableOIDSettings.change('Field display name', tableOIDDisplayName);
|
||||||
|
await tableOIDSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: tableOIDDisplayName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// 添加 basic 类型的字段
|
||||||
|
// 注意:有一些必填项之所以缺失,是因为其会被自动填充一个值
|
||||||
|
await addField('Single line text');
|
||||||
|
await addField('Long text');
|
||||||
|
await addField('Phone');
|
||||||
|
await addField('Email');
|
||||||
|
await addField('URL');
|
||||||
|
await addField('Integer');
|
||||||
|
await addField('Number');
|
||||||
|
await addField('Percent');
|
||||||
|
await addField('Password');
|
||||||
|
await addField('Color');
|
||||||
|
await addField('Icon');
|
||||||
|
|
||||||
|
// 添加 choices 字段
|
||||||
|
await addField('Checkbox');
|
||||||
|
await addField('Single select');
|
||||||
|
await addField('Multiple select');
|
||||||
|
await addField('Radio group');
|
||||||
|
await addField('Checkbox group');
|
||||||
|
await addField('China region');
|
||||||
|
|
||||||
|
// 添加 media 字段
|
||||||
|
await addField('Markdown');
|
||||||
|
await addField('Rich Text');
|
||||||
|
await addField('Attachment');
|
||||||
|
|
||||||
|
// 添加 date & time 字段
|
||||||
|
await addField('Datetime');
|
||||||
|
await addField('Time');
|
||||||
|
|
||||||
|
// 添加 relation 字段
|
||||||
|
// One to one (belongs to)
|
||||||
|
const belongsToDisplayName = uid();
|
||||||
|
const belongsToSettings = await fieldsSettings.addField('One to one (belongs to)');
|
||||||
|
await belongsToSettings.change('Field display name', belongsToDisplayName);
|
||||||
|
await belongsToSettings.change('Target collection', targetCollectionName);
|
||||||
|
await belongsToSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: belongsToDisplayName, exact: true })).toBeVisible();
|
||||||
|
// One to one (has one)
|
||||||
|
const hasOneDisplayName = uid();
|
||||||
|
const hasOneSettings = await fieldsSettings.addField('One to one (has one)');
|
||||||
|
await hasOneSettings.change('Field display name', hasOneDisplayName);
|
||||||
|
await hasOneSettings.change('Target collection', targetCollectionName);
|
||||||
|
await hasOneSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: hasOneDisplayName, exact: true })).toBeVisible();
|
||||||
|
// One to many
|
||||||
|
const oneToManyDisplayName = uid();
|
||||||
|
const oneToManySettings = await fieldsSettings.addField('One to many');
|
||||||
|
await oneToManySettings.change('Field display name', oneToManyDisplayName);
|
||||||
|
await oneToManySettings.change('Target collection', targetCollectionName);
|
||||||
|
await oneToManySettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: oneToManyDisplayName, exact: true })).toBeVisible();
|
||||||
|
// Many to one
|
||||||
|
const manyToOneDisplayName = uid();
|
||||||
|
const manyToOneSettings = await fieldsSettings.addField('Many to one');
|
||||||
|
await manyToOneSettings.change('Field display name', manyToOneDisplayName);
|
||||||
|
await manyToOneSettings.change('Target collection', targetCollectionName);
|
||||||
|
await manyToOneSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: manyToOneDisplayName, exact: true })).toBeVisible();
|
||||||
|
// Many to many
|
||||||
|
const manyToManyDisplayName = uid();
|
||||||
|
const manyToManyName = `f_${uid()}`;
|
||||||
|
const manyToManySettings = await fieldsSettings.addField('Many to many');
|
||||||
|
await manyToManySettings.change('Field display name', manyToManyDisplayName);
|
||||||
|
await manyToManySettings.change('Field name', manyToManyName);
|
||||||
|
await manyToManySettings.change('Target collection', targetCollectionName);
|
||||||
|
await manyToManySettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: manyToManyDisplayName, exact: true })).toBeVisible();
|
||||||
|
// 在这里测一下 many to many 字段的编辑和删除,其它字段先不测了
|
||||||
|
const newManyToManyDisplayName = uid();
|
||||||
|
const manyToManyEditing = await fieldsSettings.edit(manyToManyName, 'Many to many');
|
||||||
|
await manyToManyEditing.change('Field display name', newManyToManyDisplayName);
|
||||||
|
await manyToManyEditing.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: newManyToManyDisplayName, exact: true })).toBeVisible();
|
||||||
|
await fieldsSettings.deleteItem(manyToManyName);
|
||||||
|
await expect(page.getByRole('cell', { name: newManyToManyDisplayName, exact: true })).toBeHidden();
|
||||||
|
|
||||||
|
// 添加 advanced 字段
|
||||||
|
// Formula
|
||||||
|
const formulaDisplayName = uid();
|
||||||
|
const formulaSettings = await fieldsSettings.addField('Formula');
|
||||||
|
await formulaSettings.change('Field display name', formulaDisplayName);
|
||||||
|
await formulaSettings.change('Expression', '1+1');
|
||||||
|
await formulaSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: formulaDisplayName, exact: true })).toBeVisible();
|
||||||
|
// Sequence
|
||||||
|
const sequenceDisplayName = uid();
|
||||||
|
const sequenceSettings = await fieldsSettings.addField('Sequence');
|
||||||
|
await sequenceSettings.change('Field display name', sequenceDisplayName);
|
||||||
|
await page.getByRole('button', { name: 'plus Add rule' }).click();
|
||||||
|
await sequenceSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: sequenceDisplayName, exact: true })).toBeVisible();
|
||||||
|
// JSON
|
||||||
|
await addField('JSON');
|
||||||
|
// Collection
|
||||||
|
await addField('Collection');
|
||||||
|
|
||||||
|
async function addField(fieldType: FieldInterface) {
|
||||||
|
const value = uid();
|
||||||
|
const fieldSettings = await fieldsSettings.addField(fieldType);
|
||||||
|
await fieldSettings.change('Field display name', value);
|
||||||
|
await fieldSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: value, exact: true })).toBeVisible();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('edit', () => {
|
||||||
|
test('basic', async ({ page, mockCollection }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await mockCollection({
|
||||||
|
name: collectionName,
|
||||||
|
title: collectionDisplayName,
|
||||||
|
});
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const newCollectionDisplayName = uid();
|
||||||
|
const newDescription = uid();
|
||||||
|
const newCollectionSettings = await collectionManagerPage.edit(collectionName);
|
||||||
|
await newCollectionSettings.change('Collection display name', newCollectionDisplayName);
|
||||||
|
await newCollectionSettings.change('Description', newDescription);
|
||||||
|
await newCollectionSettings.submit();
|
||||||
|
await expect(page.getByRole('cell', { name: newCollectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: newDescription, exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,54 @@
|
|||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { uid } from '@nocobase/utils';
|
||||||
|
import { CollectionManagerPage } from '../utils';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {
|
||||||
|
test('basic', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('SQL collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('SQL', 'SELECT * FROM users;');
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// Delete --------------------------------------------------------------------------------
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeHidden();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('categories', async ({ page }) => {
|
||||||
|
const categoriesName = uid();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
await collectionManagerPage.addCategory(categoriesName, 'Red');
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('SQL collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('SQL', 'SELECT * FROM users;');
|
||||||
|
await collectionSettings.change('Categories', [categoriesName]);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: categoriesName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteCategory(categoriesName);
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {});
|
||||||
|
|
||||||
|
test.describe('edit', () => {});
|
@ -0,0 +1,101 @@
|
|||||||
|
import { expect, test } from '@nocobase/test/e2e';
|
||||||
|
import { uid } from '@nocobase/utils';
|
||||||
|
import { CollectionManagerPage } from '../utils';
|
||||||
|
|
||||||
|
test.describe('create collection', () => {
|
||||||
|
test('basic', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Tree collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// Delete --------------------------------------------------------------------------------
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeHidden();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('inherits', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Tree collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Inherits', ['Users']);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('categories', async ({ page }) => {
|
||||||
|
const categoriesName = uid();
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const description = uid();
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
await collectionManagerPage.addCategory(categoriesName, 'Red');
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Tree collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Description', description);
|
||||||
|
await collectionSettings.change('Categories', [categoriesName]);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: collectionName, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: description, exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('cell', { name: categoriesName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteCategory(categoriesName);
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('uncheck more options', async ({ page }) => {
|
||||||
|
const collectionDisplayName = uid();
|
||||||
|
// 避免以数字开头,会报错
|
||||||
|
const collectionName = `t_${uid()}`;
|
||||||
|
const collectionManagerPage = new CollectionManagerPage(page);
|
||||||
|
await collectionManagerPage.goto();
|
||||||
|
|
||||||
|
const collectionSettings = await collectionManagerPage.createCollection('Tree collection');
|
||||||
|
await collectionSettings.change('Collection display name', collectionDisplayName);
|
||||||
|
await collectionSettings.change('Collection name', collectionName);
|
||||||
|
await collectionSettings.change('Store the creation user of each record', false);
|
||||||
|
await collectionSettings.change('Store the last update user of each record', false);
|
||||||
|
await collectionSettings.change('Store the creation time of each record', false);
|
||||||
|
await collectionSettings.change('Store the last update time of each record', false);
|
||||||
|
await collectionSettings.submit();
|
||||||
|
|
||||||
|
await expect(page.getByRole('cell', { name: collectionDisplayName, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
await collectionManagerPage.deleteItem(collectionName);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('configure fields', () => {});
|
||||||
|
|
||||||
|
test.describe('edit', () => {});
|
@ -0,0 +1,67 @@
|
|||||||
|
import { expectInitializerMenu, oneTableBlockWithAddNewAndViewAndEditAndMediaFields, test } from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['markdown', 'richtext', 'attachment'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['markdown', 'richtext', 'attachment'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['markdown', 'richtext', 'attachment'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['markdown', 'richtext', 'attachment'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,285 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndMediaFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.attachment-attachment`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.attachment`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.attachment-attachment`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.attachment`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(page.getByRole('button', { name: 'plus Upload' })).toBeVisible();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(page.getByRole('button', { name: 'plus Upload' })).not.toBeVisible();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByRole('button', { name: 'plus Upload' })).not.toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.attachment-attachment`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.attachment`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'attachment'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('link', { name: record.attachment.title })
|
||||||
|
.first(),
|
||||||
|
).toBeVisible();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('link', { name: record.attachment.title })
|
||||||
|
.first()
|
||||||
|
.hover();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('button', { name: 'delete' }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('link', { name: record.attachment.title })
|
||||||
|
.first()
|
||||||
|
.hover();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('button', { name: 'delete' }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
// 这里是为了等弹窗中的内容渲染稳定后,再去 hover,防止错位导致测试报错
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.attachment-attachment`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.attachment`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip', 'Size'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('size', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
|
||||||
|
// 默认尺寸
|
||||||
|
// 这里的尺寸不稳定,所以用 try catch 来处理
|
||||||
|
const testDefault = async (value) => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('link', { name: record.attachment.title })
|
||||||
|
.first(),
|
||||||
|
).toHaveJSProperty('offsetWidth', value, { timeout: 1000 });
|
||||||
|
};
|
||||||
|
try {
|
||||||
|
await testDefault(94);
|
||||||
|
} catch (error) {
|
||||||
|
try {
|
||||||
|
await testDefault(95);
|
||||||
|
} catch (err) {
|
||||||
|
await testDefault(96);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 改为大尺寸
|
||||||
|
const testLarge = async (value) => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('link', { name: record.attachment.title })
|
||||||
|
.first(),
|
||||||
|
).toHaveJSProperty('offsetWidth', value, { timeout: 1000 });
|
||||||
|
};
|
||||||
|
// 这里是为了等弹窗中的内容渲染稳定后,再去 hover,防止错位导致测试报错
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.attachment-attachment`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.attachment`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
await page.getByRole('menuitem', { name: 'Size' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Large' }).click();
|
||||||
|
try {
|
||||||
|
await testLarge(153);
|
||||||
|
} catch (err) {
|
||||||
|
try {
|
||||||
|
await testLarge(154);
|
||||||
|
} catch (err) {
|
||||||
|
await testLarge(152);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 改为小尺寸
|
||||||
|
const testSmall = async (value) => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
||||||
|
.getByRole('link', { name: record.attachment.title })
|
||||||
|
.first(),
|
||||||
|
).toHaveJSProperty('offsetWidth', value, { timeout: 1000 });
|
||||||
|
};
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
// 这里是为了等弹窗中的内容渲染稳定后,再去 hover,防止错位导致测试报错
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'attachment');
|
||||||
|
await page.getByRole('menuitem', { name: 'Size' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Small' }).click();
|
||||||
|
try {
|
||||||
|
await testSmall(25);
|
||||||
|
} catch (err) {
|
||||||
|
try {
|
||||||
|
await testSmall(26);
|
||||||
|
} catch (err) {
|
||||||
|
await testSmall(24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'attachment');
|
||||||
|
await showSettingsMenu(page, 'attachment');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,73 @@
|
|||||||
|
import {
|
||||||
|
expectInitializerMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['oneToMany', 'manyToOne', 'manyToMany', 'oneToOneBelongsTo', 'oneToOneHasOne'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['oneToMany', 'manyToOne', 'manyToMany', 'oneToOneBelongsTo', 'oneToOneHasOne'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['oneToMany', 'manyToOne', 'manyToMany', 'oneToOneBelongsTo', 'oneToOneHasOne'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['oneToMany', 'manyToOne', 'manyToMany', 'oneToOneBelongsTo', 'oneToOneHasOne'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,548 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo`)
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToOneBelongsTo`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let records;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo'),
|
||||||
|
).toHaveText(`oneToOneBelongsTo:${String(records[0].id)}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
||||||
|
.getByTestId('select-object-single')
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockRecords, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo`)
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToOneBelongsTo`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let record;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = (
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords)
|
||||||
|
).record;
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveText(`${record.oneToOneBelongsTo.id}`);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo'),
|
||||||
|
).toHaveText(`oneToOneBelongsTo:${record.oneToOneBelongsTo.id}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const { recordsOfUser } = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(recordsOfUser[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(recordsOfUser[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option', { name: String(recordsOfUser[0].id), exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo`)
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToOneBelongsTo`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Field component',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneBelongsTo');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'oneToOneBelongsTo');
|
||||||
|
await showSettingsMenu(page, 'oneToOneBelongsTo');
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Custom column title',
|
||||||
|
'Column width',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Field component',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,67 @@
|
|||||||
|
import { expectInitializerMenu, oneTableBlockWithAddNewAndViewAndEditAndChoicesFields, test } from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['checkbox', 'chinaRegion', 'multipleSelect', 'radioGroup', 'singleSelect', 'checkboxGroup'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['checkbox', 'chinaRegion', 'multipleSelect', 'radioGroup', 'singleSelect', 'checkboxGroup'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['checkbox', 'chinaRegion', 'multipleSelect', 'radioGroup', 'singleSelect', 'checkboxGroup'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['checkbox', 'chinaRegion', 'multipleSelect', 'radioGroup', 'singleSelect', 'checkboxGroup'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,241 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndChoicesFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.checkbox-checkbox`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.checkbox`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'checkbox'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
// 默认应该是没有被选中的,点击后应该被选中
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('checkbox').click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
||||||
|
).toBeChecked();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'checkbox'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认是未选中的状态,所以先选中
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox')
|
||||||
|
.getByRole('checkbox')
|
||||||
|
.click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// checkbox 应该被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// checkbox 应该被隐藏,然后只显示一个图标
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox')
|
||||||
|
.getByRole('img', { name: 'check' }),
|
||||||
|
).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.checkbox-checkbox`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.checkbox`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'checkbox'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
||||||
|
).toBeChecked({ checked: record.checkbox });
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// checkbox 应该被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// checkbox 应该被隐藏,然后只显示一个图标
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox')
|
||||||
|
.getByRole('img', { name: 'check' }),
|
||||||
|
).toBeVisible({ visible: record.checkbox });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.checkbox-checkbox`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.checkbox`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'checkbox');
|
||||||
|
await showSettingsMenu(page, 'checkbox');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,248 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndChoicesFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.checkboxGroup`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'checkboxGroup'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByLabel('Option1').click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: 'Option1' }),
|
||||||
|
).toBeChecked();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'checkboxGroup'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认是未选中的状态,所以先选中
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: 'Option1' })
|
||||||
|
.click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// checkbox 应该被禁用
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: 'Option1' }),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// checkbox 应该被隐藏,然后只显示一个标签
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: 'Option1' }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByText('Option1'),
|
||||||
|
).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.checkboxGroup`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'checkboxGroup'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
for (const option of record.checkboxGroup) {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: option }),
|
||||||
|
).toBeChecked();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// checkbox 应该被禁用
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: 'Option1' }),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// checkbox 应该被隐藏,然后只显示标签
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
||||||
|
.getByRole('checkbox', { name: 'Option1' }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup'),
|
||||||
|
).toHaveText(`checkboxGroup:${record.checkboxGroup.join('')}`, { ignoreCase: true });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.checkboxGroup`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'checkboxGroup');
|
||||||
|
await showSettingsMenu(page, 'checkboxGroup');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,249 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndChoicesFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.chinaRegion-chinaRegion`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.chinaRegion`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'chinaRegion'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '东城区' }).click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
|
||||||
|
).toHaveText('chinaRegion:北京市/市辖区/东城区');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'chinaRegion'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
||||||
|
.locator('.ant-select')
|
||||||
|
.click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '东城区' }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
||||||
|
.locator('.ant-select')
|
||||||
|
.getByRole('combobox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
||||||
|
.locator('.ant-select')
|
||||||
|
.getByRole('combobox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
|
||||||
|
).toHaveText('chinaRegion:北京市 / 市辖区 / 东城区');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.chinaRegion-chinaRegion`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.chinaRegion`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'chinaRegion'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
||||||
|
.locator('.ant-select')
|
||||||
|
.click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: '东城区' }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
||||||
|
.locator('.ant-select')
|
||||||
|
.getByRole('combobox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
||||||
|
.locator('.ant-select')
|
||||||
|
.getByRole('combobox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
|
||||||
|
).toHaveText('chinaRegion:北京市 / 市辖区 / 东城区');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.chinaRegion-chinaRegion`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.chinaRegion`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'chinaRegion');
|
||||||
|
await showSettingsMenu(page, 'chinaRegion');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,71 @@
|
|||||||
|
import {
|
||||||
|
expectInitializerMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['formula', 'sequence', 'JSON', 'collection'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['formula', 'sequence', 'JSON', 'collection'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['formula', 'sequence', 'JSON', 'collection'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['formula', 'sequence', 'JSON', 'collection'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,91 @@
|
|||||||
|
import { expectSettingsMenu, oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields, test } from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.collection-collection`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.collection`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.collection-collection`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.collection`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.collection-collection`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.collection`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'collection');
|
||||||
|
await showSettingsMenu(page, 'collection');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table & record picker', () => {
|
||||||
|
test('supported options', async ({ page }) => {});
|
||||||
|
});
|
@ -0,0 +1,115 @@
|
|||||||
|
import { expectInitializerMenu, oneTableBlockWithAddNewAndViewAndEditAndBasicFields, test } from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'color',
|
||||||
|
'email',
|
||||||
|
'icon',
|
||||||
|
'singleLineText',
|
||||||
|
'integer',
|
||||||
|
'number',
|
||||||
|
'password',
|
||||||
|
'percent',
|
||||||
|
'phone',
|
||||||
|
'longText',
|
||||||
|
'url',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'color',
|
||||||
|
'email',
|
||||||
|
'icon',
|
||||||
|
'singleLineText',
|
||||||
|
'integer',
|
||||||
|
'number',
|
||||||
|
'password',
|
||||||
|
'percent',
|
||||||
|
'phone',
|
||||||
|
'longText',
|
||||||
|
'url',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'color',
|
||||||
|
'email',
|
||||||
|
'icon',
|
||||||
|
'singleLineText',
|
||||||
|
'integer',
|
||||||
|
'number',
|
||||||
|
'password',
|
||||||
|
'percent',
|
||||||
|
'phone',
|
||||||
|
'longText',
|
||||||
|
'url',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'color',
|
||||||
|
'email',
|
||||||
|
'icon',
|
||||||
|
'singleLineText',
|
||||||
|
'integer',
|
||||||
|
'number',
|
||||||
|
'password',
|
||||||
|
'percent',
|
||||||
|
'phone',
|
||||||
|
'longText',
|
||||||
|
'url',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,239 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import {
|
||||||
|
clickDeleteAndOk,
|
||||||
|
createColumnItem,
|
||||||
|
showSettingsMenu,
|
||||||
|
testDisplayTitle,
|
||||||
|
testEditDescription,
|
||||||
|
testEditFieldTitle,
|
||||||
|
testPattern,
|
||||||
|
testRequired,
|
||||||
|
} from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
// 简单测试下是否有选项,值的话无法选中,暂时测不了
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Set default value' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下显示颜色选择框
|
||||||
|
await page.getByLabel('color-picker-normal').hover();
|
||||||
|
await expect(page.getByRole('button', { name: 'right Recommended', exact: true })).toBeVisible();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,不会显示颜色弹窗
|
||||||
|
await page.getByLabel('color-picker-normal').hover();
|
||||||
|
await expect(page.getByRole('button', { name: 'right Recommended', exact: true })).not.toBeVisible();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('color-picker-read-pretty')).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('edit field title', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
|
||||||
|
await testEditFieldTitle(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('display title', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
|
||||||
|
await testDisplayTitle(page, 'color');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('delete', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
|
||||||
|
await clickDeleteAndOk(page);
|
||||||
|
await expect(page.getByText(`color:`)).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('edit description', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
|
||||||
|
await testEditDescription(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('required', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
|
||||||
|
await testRequired(page);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'color'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下显示颜色选择框
|
||||||
|
await page.getByLabel('color-picker-normal').hover();
|
||||||
|
await expect(page.getByRole('button', { name: 'right Recommended', exact: true })).toBeVisible();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,不会显示颜色弹窗
|
||||||
|
await page.getByLabel('color-picker-normal').hover();
|
||||||
|
await expect(page.getByRole('button', { name: 'right Recommended', exact: true })).not.toBeVisible();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('color-picker-read-pretty')).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('edit field title', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
await testEditFieldTitle(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('display title', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
await testDisplayTitle(page, 'color');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('delete', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
await clickDeleteAndOk(page);
|
||||||
|
await expect(page.getByText(`color:`)).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('edit tooltip', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.color-color`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.color`).hover();
|
||||||
|
|
||||||
|
await page.getByRole('menuitem', { name: 'Edit tooltip' }).click();
|
||||||
|
await page.getByRole('dialog').getByRole('textbox').click();
|
||||||
|
await page.getByRole('dialog').getByRole('textbox').fill('testing edit tooltip');
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
await page.getByRole('img', { name: 'question-circle' }).hover();
|
||||||
|
await expect(page.getByText('testing edit tooltip')).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'color');
|
||||||
|
await showSettingsMenu(page, 'color');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,71 @@
|
|||||||
|
import {
|
||||||
|
expectInitializerMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Created at', 'Last updated at', 'Created by', 'Last updated by', 'ID', 'Table OID'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Created at', 'Last updated at', 'Created by', 'Last updated by', 'ID', 'Table OID'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Created at', 'Last updated at', 'Created by', 'Last updated by', 'ID', 'Table OID'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Created at', 'Last updated at', 'Created by', 'Last updated by', 'ID', 'Table OID'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,152 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdAt`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Pattern',
|
||||||
|
'Date display format',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdAt`)
|
||||||
|
.hover();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Date display format' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdAt`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Pattern',
|
||||||
|
'Date display format',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'createdAt');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Date display format' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdAt`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip', 'Date display format'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'createdAt');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Date display format' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'Created at');
|
||||||
|
await showSettingsMenu(page, 'Created at');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Date display format', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,138 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdBy`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Enable link', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdBy`)
|
||||||
|
.hover();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdBy`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Enable link', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'createdBy');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.createdBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.createdBy`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip', 'Enable link'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'createdBy');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'Created by');
|
||||||
|
await showSettingsMenu(page, 'Created by');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Enable link', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,71 @@
|
|||||||
|
import {
|
||||||
|
expectInitializerMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['datetime', 'time'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-FormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['datetime', 'time'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('configure fields', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel('schema-initializer-Grid-ReadPrettyFormItemInitializers-general').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['datetime', 'time'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('configure columns', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectInitializerMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('schema-initializer-TableV2-').hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['datetime', 'time'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,327 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.datetime-datetime`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.datetime`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Pattern',
|
||||||
|
'Date display format',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'datetime'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByPlaceholder('Select date').click();
|
||||||
|
await page.getByText('Today').click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date'),
|
||||||
|
).toHaveValue(dayjs().format('YYYY-MM-DD'));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'datetime'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date')
|
||||||
|
.click();
|
||||||
|
await page.getByText('Today').click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')).toHaveText(
|
||||||
|
`datetime:${dayjs().format('YYYY-MM-DD')}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('date display format', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'datetime');
|
||||||
|
await page.getByRole('menuitem', { name: 'Date display format' }).click();
|
||||||
|
await page.getByLabel('YYYY/MM/DD').click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 输入一个值,然后验证格式是否正确
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date')
|
||||||
|
.click();
|
||||||
|
await page.getByText('Today').click();
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date'),
|
||||||
|
).toHaveValue(dayjs().format('YYYY/MM/DD'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.datetime-datetime`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.datetime`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Pattern',
|
||||||
|
'Date display format',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'datetime'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date'),
|
||||||
|
).toHaveValue(dayjs(record.datetime).format('YYYY-MM-DD'));
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')).toHaveText(
|
||||||
|
`datetime:${dayjs(record.datetime).format('YYYY-MM-DD')}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('date display format', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'datetime');
|
||||||
|
await page.getByRole('menuitem', { name: 'Date display format' }).click();
|
||||||
|
await page.getByLabel('YYYY/MM/DD').click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
||||||
|
.getByPlaceholder('Select date'),
|
||||||
|
).toHaveValue(dayjs(record.datetime).format('YYYY/MM/DD'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.datetime-datetime`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.datetime`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip', 'Date display format'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('date display format', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'datetime');
|
||||||
|
await page.getByRole('menuitem', { name: 'Date display format' }).click();
|
||||||
|
await page.getByLabel('YYYY/MM/DD').click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')).toHaveText(
|
||||||
|
`datetime:${dayjs(record.datetime).format('YYYY/MM/DD')}`,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'datetime');
|
||||||
|
await showSettingsMenu(page, 'datetime');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Date display format', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('date display format', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
const records = await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'datetime');
|
||||||
|
await showSettingsMenu(page, 'datetime');
|
||||||
|
await page.getByRole('menuitem', { name: 'Date display format' }).click();
|
||||||
|
await page.getByLabel('MM/DD/YY').click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
await expect(
|
||||||
|
page.getByRole('cell', { name: dayjs(records[0].datetime).format('MM/DD/YY'), exact: true }),
|
||||||
|
).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,223 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.email-email`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.email`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'email'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: 'test@nocobase.com',
|
||||||
|
variableValue: ['Current user', 'Email'],
|
||||||
|
expectConstantValue: () =>
|
||||||
|
expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).toHaveValue('test@nocobase.com'),
|
||||||
|
expectVariableValue: () =>
|
||||||
|
expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).toHaveValue('admin@nocobase.com'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'email'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 填充一个值,方便后面断言
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.email-email')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.email-email')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('admin@nocobase.com');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 输入框应该被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框应该消失,直接显示值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.email-email')).toHaveText(
|
||||||
|
'email:admin@nocobase.com',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.email-email`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.email`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'email'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 应该显示 record 中的值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).toHaveValue(record.email);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 输入框应该被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框应该消失,直接显示值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.email-email')).toHaveText(
|
||||||
|
`email:${record.email}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.email-email`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.email`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'email');
|
||||||
|
await showSettingsMenu(page, 'email');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,79 @@
|
|||||||
|
import { expectSettingsMenu, oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields, test } from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.formula-formula`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.formula`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.formula-formula`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.formula`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.formula-formula`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.formula`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'formula');
|
||||||
|
await showSettingsMenu(page, 'formula');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,543 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToOneHasOne`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let records;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
|
||||||
|
// 目前的情况下,在 one to one (has one) 的字段中,只有 ID 为 1 的数据可以被选中,mock 的数据无法被选中
|
||||||
|
await page.getByRole('option', { name: '1', exact: true }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne'),
|
||||||
|
).toHaveText(`oneToOneHasOne:1`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
||||||
|
.getByTestId('select-object-single')
|
||||||
|
.click();
|
||||||
|
// 默认只显示 id 为 1 的数据,因为设置了只过滤 id 为 3 的数据,所以这里的下拉列表应该为空
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockRecords, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToOneHasOne`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let record;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = (
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords)
|
||||||
|
).record;
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveText(`${record.oneToOneHasOne.id}`);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne'),
|
||||||
|
).toHaveText(`oneToOneHasOne:${record.oneToOneHasOne.id}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill('1');
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue('1');
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToOneHasOne`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Field component',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToOneHasOne');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'oneToOneHasOne');
|
||||||
|
await showSettingsMenu(page, 'oneToOneHasOne');
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Custom column title',
|
||||||
|
'Column width',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Field component',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,201 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.icon-icon`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.icon`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'icon'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('button', { name: 'Select icon' }).click();
|
||||||
|
await page.getByLabel('account-book').locator('svg').click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.icon-icon')
|
||||||
|
.getByRole('button', { name: 'account-book' }),
|
||||||
|
).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'icon'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑图标
|
||||||
|
await page.getByRole('button', { name: 'Select icon' }).click();
|
||||||
|
await page.getByLabel('account-book').locator('svg').click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,选择图标按钮会被禁用
|
||||||
|
await expect(page.getByRole('button', { name: 'account-book' })).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 按钮会消失,只剩下图标
|
||||||
|
await expect(page.getByRole('button', { name: 'account-book' })).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.icon-icon').getByLabel('account-book'),
|
||||||
|
).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.icon-icon`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.icon`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.icon-icon`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.icon`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑图标
|
||||||
|
await page.getByRole('button', { name: 'Select icon' }).click();
|
||||||
|
await page.getByLabel('account-book').locator('svg').click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(page.getByRole('button', { name: 'account-book' })).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByRole('button', { name: 'account-book' })).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.icon-icon').getByLabel('account-book'),
|
||||||
|
).toBeVisible();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.icon-icon`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.icon`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'icon');
|
||||||
|
await showSettingsMenu(page, 'icon');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,108 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.id-`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.id`).hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.id-`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.id`).hover();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.id-`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.id`).hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'id');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.id-`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.id`).hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'ID');
|
||||||
|
await showSettingsMenu(page, 'ID');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,284 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.integer-integer`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.integer`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'integer'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
variableValue: ['Current user', 'ID'], // 值为 1
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').click();
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').fill('112233');
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).toHaveValue('112233');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).toHaveValue('1');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'integer'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.integer-integer')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.integer-integer')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.fill('112233');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.integer-integer')).toHaveText(
|
||||||
|
'integer:112233',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'integer'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.integer-integer`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.integer`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'integer'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 应该显示 record 中的值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).toHaveValue(String(record.integer));
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.integer-integer')).toHaveText(
|
||||||
|
`integer:${record.integer}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'integer'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.integer-integer`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.integer`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'integer');
|
||||||
|
await showSettingsMenu(page, 'integer');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,87 @@
|
|||||||
|
import { expectSettingsMenu, oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields, test } from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.JSON-JSON`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.JSON`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.JSON-JSON`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.JSON`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.JSON-JSON`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.JSON`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'JSON');
|
||||||
|
await showSettingsMenu(page, 'JSON');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,93 @@
|
|||||||
|
import { expectSettingsMenu, oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields, test } from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedAt`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Pattern',
|
||||||
|
'Date display format',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedAt`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Pattern',
|
||||||
|
'Date display format',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedAt-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedAt`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip', 'Date display format'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'Last updated at');
|
||||||
|
await showSettingsMenu(page, 'Last updated at');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Date display format', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,138 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedBy`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Enable link', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedBy`)
|
||||||
|
.hover();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedBy`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Enable link', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'updatedBy');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.updatedBy-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.updatedBy`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip', 'Enable link'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'updatedBy');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'Last updated by');
|
||||||
|
await showSettingsMenu(page, 'Last updated by');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Enable link', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,286 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.longText-longText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.longText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: async () => {
|
||||||
|
await page.getByLabel('drawer-Action.Container-general-Add record-mask').click();
|
||||||
|
},
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'longText'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: 'test long text',
|
||||||
|
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).toHaveValue('test long text');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).toHaveValue('admin@nocobase.com');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'longText'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.longText-longText')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.longText-longText')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('test long text');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.longText-longText')).toHaveText(
|
||||||
|
'longText:test long text',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'longText'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.longText-longText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.longText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.longText-longText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.longText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 应该显示 record 中的值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).toHaveValue(record.longText);
|
||||||
|
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.longText-longText')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.longText-longText')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('test long text');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.longText-longText')).toHaveText(
|
||||||
|
`longText:test long text`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'longText'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.longText-longText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.longText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'longText');
|
||||||
|
await showSettingsMenu(page, 'longText');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,769 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.manyToMany-manyToMany`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.manyToMany`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Allow multiple',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let recordsOfUser;
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
recordsOfUser = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByTestId('select-object-multiple').click();
|
||||||
|
await page.getByRole('option', { name: String(recordsOfUser[0].id), exact: true }).click();
|
||||||
|
await page.getByRole('option', { name: String(recordsOfUser[1].id), exact: true }).click();
|
||||||
|
await page.getByRole('option', { name: String(recordsOfUser[2].id), exact: true }).click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany'),
|
||||||
|
).toHaveText(`manyToMany:${recordsOfUser.map((record) => record.id).join('')}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let records;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-object-multiple')
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
||||||
|
await page.getByRole('option', { name: String(records[1].id), exact: true }).click();
|
||||||
|
await page.getByRole('option', { name: String(records[2].id), exact: true }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-object-multiple'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany'),
|
||||||
|
).toHaveText(`manyToMany:${records.map((record) => record.id).join(',')}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-object-multiple')
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default sorting rules', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set default sorting rules' }).click();
|
||||||
|
|
||||||
|
// 配置
|
||||||
|
await page.getByRole('button', { name: 'Add sort field' }).click();
|
||||||
|
await page.getByTestId('select-single').click();
|
||||||
|
await page.getByRole('option', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByText('DESC', { exact: true }).click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set default sorting rules' }).click();
|
||||||
|
await expect(page.getByRole('dialog').getByTestId('select-single')).toHaveText('ID');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// 选择 Record picker
|
||||||
|
await page.getByRole('option', { name: 'Record picker', exact: true }).click();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-data-picker'),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
// 选择 Sub-table
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Sub-table', exact: true }).click();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByLabel('schema-initializer-AssociationField.SubTable-TableColumnInitializers-users'),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
// 选择 Sub-form
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Sub-form', exact: true }).click();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByLabel('schema-initializer-Grid-FormItemInitializers-users'),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
// 选择 Sub-form(Popover)
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Sub-form(Popover)', exact: true }).click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByRole('img', { name: 'edit' })
|
||||||
|
.click();
|
||||||
|
await expect(page.getByTestId('popover-CollectionField-general')).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('allow multiple', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Allow multiple' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockRecords, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.manyToMany-manyToMany`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.manyToMany`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Allow multiple',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let record;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = (
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords)
|
||||||
|
).record;
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-object-multiple'),
|
||||||
|
).toHaveText(`${record.manyToMany.map((item) => item.id).join('')}`);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-object-multiple'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany'),
|
||||||
|
).toHaveText(`manyToMany:${record.manyToMany.map((item) => item.id).join(',')}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const { recordsOfUser } = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(recordsOfUser[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(recordsOfUser[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.getByTestId('select-object-multiple')
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option', { name: String(recordsOfUser[0].id), exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default sorting rules', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set default sorting rules' }).click();
|
||||||
|
|
||||||
|
// 配置
|
||||||
|
await page.getByRole('button', { name: 'Add sort field' }).click();
|
||||||
|
await page.getByTestId('select-single').click();
|
||||||
|
await page.getByRole('option', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByText('DESC', { exact: true }).click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set default sorting rules' }).click();
|
||||||
|
await expect(page.getByRole('dialog').getByTestId('select-single')).toHaveText('ID');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('allow multiple', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Allow multiple' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.manyToMany-manyToMany`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.manyToMany`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Field component',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
// test.fail();
|
||||||
|
const record = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
|
||||||
|
// 初始状态是一个可点击的链接
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.locator('a')
|
||||||
|
.filter({ hasText: record.manyToMany[0].id }),
|
||||||
|
).toBeVisible();
|
||||||
|
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToMany');
|
||||||
|
|
||||||
|
// 默认情况下是开启状态
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
await page.getByRole('menuitem', { name: 'Enable link' }).click();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).not.toBeChecked();
|
||||||
|
|
||||||
|
// 应变为非链接状态
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.locator('a')
|
||||||
|
.filter({ hasText: record.manyToMany[0].id }),
|
||||||
|
).not.toBeVisible();
|
||||||
|
|
||||||
|
// 再次开启链接状态
|
||||||
|
await page.getByRole('menuitem', { name: 'Enable link' }).click();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
||||||
|
.locator('a')
|
||||||
|
.filter({ hasText: record.manyToMany[0].id }),
|
||||||
|
).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'manyToMany');
|
||||||
|
await showSettingsMenu(page, 'manyToMany');
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Custom column title',
|
||||||
|
'Column width',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Field component',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,639 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.manyToOne-manyToOne`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.manyToOne`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let records;
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-VariableInput-')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-VariableInput-')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: String(records[1].id), exact: true }).click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-VariableInput-')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: String(records[2].id), exact: true }).click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveText(String(records[2].id));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let records;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')).toHaveText(
|
||||||
|
`manyToOne:${String(records[0].id)}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId('select-object-single')
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockRecords, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.manyToOne-manyToOne`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.manyToOne`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let record;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = (
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords)
|
||||||
|
).record;
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveText(`${record.manyToOne.id}`);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId(/select-object/),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')).toHaveText(
|
||||||
|
`manyToOne:${record.manyToOne.id}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const { recordsOfUser } = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(recordsOfUser[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(recordsOfUser[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
||||||
|
.getByTestId(/select-object/)
|
||||||
|
.click();
|
||||||
|
await expect(page.getByRole('option', { name: String(recordsOfUser[0].id), exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.manyToOne-manyToOne`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.manyToOne`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Field component',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'manyToOne');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'manyToOne');
|
||||||
|
await showSettingsMenu(page, 'manyToOne');
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Custom column title',
|
||||||
|
'Column width',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Field component',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('enable link', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'manyToOne');
|
||||||
|
await showSettingsMenu(page, 'manyToOne');
|
||||||
|
|
||||||
|
// 默认开启 enable link
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
await expect(page.locator('a').filter({ has: page.getByText(record.manyToOne.id, { exact: true }) })).toBeVisible();
|
||||||
|
|
||||||
|
// 关闭 enable link
|
||||||
|
await page.getByRole('menuitem', { name: 'Enable link' }).click();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).not.toBeChecked();
|
||||||
|
await expect(page.locator('a').filter({ has: page.getByText(record.manyToOne.id, { exact: true }) })).toBeHidden();
|
||||||
|
|
||||||
|
// 再次开启
|
||||||
|
await page.getByRole('menuitem', { name: 'Enable link' }).click();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
await expect(page.locator('a').filter({ has: page.getByText(record.manyToOne.id, { exact: true }) })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'manyToOne');
|
||||||
|
await showSettingsMenu(page, 'manyToOne');
|
||||||
|
|
||||||
|
// 默认是 ID
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toHaveText('Title fieldID');
|
||||||
|
await expect(page.getByRole('cell', { name: record.manyToOne.id, exact: true })).toBeVisible();
|
||||||
|
|
||||||
|
// 修改为 nickname
|
||||||
|
await page.getByRole('menuitem', { name: 'Title field' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Nickname' }).click();
|
||||||
|
await page.mouse.move(300, 0);
|
||||||
|
await expect(page.getByRole('cell', { name: record.manyToOne.nickname, exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'manyToOne');
|
||||||
|
await showSettingsMenu(page, 'manyToOne');
|
||||||
|
|
||||||
|
// 默认是 Title
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Field component' })).toHaveText('Field componentTitle');
|
||||||
|
|
||||||
|
// 修改为 Tag
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Tag' }).click();
|
||||||
|
// 修改成功之后会显示 Tag color field 选项
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Tag color field' })).toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByRole('cell', { name: record.manyToOne.id, exact: true }).filter({ has: page.locator('.ant-tag') }),
|
||||||
|
).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,280 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndMediaFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: 'test markdown',
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
||||||
|
).toHaveValue('test markdown');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('test markdown pattern');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')).toHaveText(
|
||||||
|
`markdown:test markdown pattern`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`, { exact: true }).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'markdown'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
||||||
|
).toHaveValue(record.markdown);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')).toHaveText(
|
||||||
|
`markdown:${record.markdown}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'markdown'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'markdown');
|
||||||
|
await showSettingsMenu(page, 'markdown');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,243 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndChoicesFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.multipleSelect-multipleSelect`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.multipleSelect`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'multipleSelect'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByTestId('select-multiple').click();
|
||||||
|
await page.getByRole('option', { name: 'Option1' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Option2' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Option3' }).click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect'),
|
||||||
|
).toHaveText('multipleSelect:Option1Option2Option3');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'multipleSelect'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
||||||
|
.getByTestId('select-multiple')
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: 'Option1' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Option2' }).click();
|
||||||
|
await page.getByRole('option', { name: 'Option3' }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
||||||
|
.getByTestId('select-multiple'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
||||||
|
.getByTestId('select-multiple'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect'),
|
||||||
|
).toHaveText('multipleSelect:Option1Option2Option3');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.multipleSelect-multipleSelect`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.multipleSelect`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'multipleSelect'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
||||||
|
.getByTestId('select-multiple'),
|
||||||
|
).toHaveText(`${record.multipleSelect.join('')}`, { ignoreCase: true });
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
||||||
|
.getByTestId('select-multiple'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
||||||
|
.getByTestId('select-multiple'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect'),
|
||||||
|
).toHaveText(`multipleSelect:${record.multipleSelect.join('')}`, { ignoreCase: true });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.multipleSelect-multipleSelect`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.multipleSelect`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'multipleSelect');
|
||||||
|
await showSettingsMenu(page, 'multipleSelect');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,298 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.number-number`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.number`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'number'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').click();
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').fill('11.22');
|
||||||
|
},
|
||||||
|
variableValue: ['Current user', 'ID'], // 值为 1
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).toHaveValue('11.22');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).toHaveValue('1');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
// TODO: number 类型的字段,当输入了小数,然后把 Pattern 切换成 Easy-reading 模式,小数不应该被去掉;
|
||||||
|
test.fail();
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'number'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.number-number')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.number-number')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.fill('11.22');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.number-number')).toHaveText(
|
||||||
|
'number:11.22',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'number'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.number-number`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.number`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
// TODO: number 类型的字段,当输入了小数,然后把 Pattern 切换成 Easy-reading 模式,小数不应该被去掉;
|
||||||
|
test.fail();
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'number'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 应该显示 record 中的值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).toHaveValue(String(record.number));
|
||||||
|
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.number-number')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.number-number')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.fill('11.22');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.number-number')).toHaveText(
|
||||||
|
'number:11.22',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'number'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.number-number`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.number`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'number');
|
||||||
|
await showSettingsMenu(page, 'number');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,588 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndAssociationFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.oneToMany-oneToMany`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToMany`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Allow multiple',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
||||||
|
.getByTestId('select-object-multiple')
|
||||||
|
.click();
|
||||||
|
// 目前的情况下,在 one to many 的字段中,只有 ID 为 1 的数据可以被选中
|
||||||
|
await page.getByRole('option', { name: '1', exact: true }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
||||||
|
.getByTestId('select-object-multiple'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')).toHaveText(
|
||||||
|
`oneToMany:1`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const records = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
||||||
|
.getByTestId('select-object-multiple')
|
||||||
|
.click();
|
||||||
|
// 默认只显示 id 为 1 的数据,因为设置了只过滤 id 为 3 的数据,所以这里的下拉列表应该为空,mock 的数据无法被选中
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('allow multiple', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Allow multiple' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return recordsOfUser;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockRecords, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('users', 3);
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.oneToMany-oneToMany`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToMany`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set the data scope',
|
||||||
|
'Set default sorting rules',
|
||||||
|
'Field component',
|
||||||
|
'Quick create',
|
||||||
|
'Allow multiple',
|
||||||
|
'Pattern',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
let record;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = (
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords)
|
||||||
|
).record;
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
||||||
|
.getByTestId('select-object-multiple'),
|
||||||
|
).toHaveText(`${record.oneToMany.map((item) => item.id).join('')}`);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
||||||
|
.getByTestId('select-object-multiple'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
||||||
|
await page.waitForTimeout(100);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')).toHaveText(
|
||||||
|
`oneToMany:${record.oneToMany.map((item) => item.id).join(',')}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const { record } = await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await page.getByText('Add condition', { exact: true }).click();
|
||||||
|
await page.getByTestId('select-filter-field').click();
|
||||||
|
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
||||||
|
await page.getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('spinbutton').fill('1');
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 再次打开弹窗,设置的值应该还在
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
||||||
|
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
||||||
|
await expect(page.getByRole('spinbutton')).toHaveValue('1');
|
||||||
|
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
||||||
|
|
||||||
|
// 数据应该被过滤了
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
||||||
|
.getByTestId('select-object-multiple')
|
||||||
|
.click();
|
||||||
|
// 但是在编辑模式下,本身已经有数据,所以需要加上已有数据的个数
|
||||||
|
await expect(page.getByRole('option')).toHaveCount(1 + record.oneToMany.length);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('allow multiple', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Allow multiple' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const recordsOfUser = await mockRecords('users', 3);
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return { record, recordsOfUser };
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecords('general', 1);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.oneToMany-oneToMany`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.oneToMany`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit tooltip',
|
||||||
|
'Field component',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('field component', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
||||||
|
|
||||||
|
// 断言支持的选项
|
||||||
|
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('title field', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
await (async (mockPage, mockRecords) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
const record = (await mockRecords('general', 1))[0];
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecords);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'oneToMany');
|
||||||
|
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'oneToMany');
|
||||||
|
await showSettingsMenu(page, 'oneToMany');
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Custom column title',
|
||||||
|
'Column width',
|
||||||
|
'Enable link',
|
||||||
|
'Title field',
|
||||||
|
'Field component',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,280 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.password-password`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.password`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'password'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: 'test112233password',
|
||||||
|
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
||||||
|
).toHaveValue('test112233password');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
||||||
|
).toHaveValue('admin@nocobase.com');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'password'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.password-password')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.password-password')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('test112233password');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.password-password')).toHaveText(
|
||||||
|
'password:********',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'password'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.password-password`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.password`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.password-password`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.password`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.password-password')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.password-password')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('test112233password');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.password-password')).toHaveText(
|
||||||
|
'password:********',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'password'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.password-password`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.password`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'password');
|
||||||
|
await showSettingsMenu(page, 'password');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,299 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.percent-percent`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.percent`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'percent'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').click();
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').fill('11.22');
|
||||||
|
},
|
||||||
|
variableValue: ['Current user', 'ID'], // 值为 1
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).toHaveValue('11.22');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
// 数字 1 转换为百分比后为 100%
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).toHaveValue('100');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
// TODO: percent 类型的字段,当输入了小数,然后把 Pattern 切换成 Easy-reading 模式,小数点不应该被去掉;
|
||||||
|
test.fail();
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'percent'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.percent-percent')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.percent-percent')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.fill('11.22');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.percent-percent')).toHaveText(
|
||||||
|
'percent:11.22%',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'percent'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.percent-percent`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.percent`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
// TODO: percent 类型的字段,当输入了小数,然后把 Pattern 切换成 Easy-reading 模式,小数点不应该被去掉;
|
||||||
|
test.fail();
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'percent'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 应该显示 record 中的值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).toHaveValue(String(record.percent));
|
||||||
|
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.percent-percent')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.percent-percent')
|
||||||
|
.getByRole('spinbutton')
|
||||||
|
.fill('11.22');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.percent-percent')).toHaveText(
|
||||||
|
'percent:11.22%',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'percent'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.percent-percent`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.percent`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'percent');
|
||||||
|
await showSettingsMenu(page, 'percent');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,224 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.phone-phone`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.phone`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'phone'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: '17777777777',
|
||||||
|
variableValue: ['Current user', 'ID'], // 值为 1
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
||||||
|
).toHaveValue('17777777777');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
||||||
|
).toHaveValue('1');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'phone'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.phone-phone')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.phone-phone')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('17777777777');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.phone-phone')).toHaveText(
|
||||||
|
'phone:17777777777',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.phone-phone`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.phone`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.phone-phone`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.phone`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.phone-phone')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.phone-phone')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('17777777777');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.phone-phone')).toHaveText(
|
||||||
|
'phone:17777777777',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.phone-phone`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.phone`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'phone');
|
||||||
|
await showSettingsMenu(page, 'phone');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,241 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndChoicesFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.radioGroup-radioGroup`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.radioGroup`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'radioGroup'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByLabel('Option2').click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel('Option2'),
|
||||||
|
).toBeChecked();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'radioGroup'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel('Option2')
|
||||||
|
.click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel('Option2'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel('Option2'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup'),
|
||||||
|
).toHaveText('radioGroup:Option2');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.radioGroup-radioGroup`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.radioGroup`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'radioGroup'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
if (record.radioGroup) {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel(record.radioGroup),
|
||||||
|
).toBeChecked();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel('Option2'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
||||||
|
.getByLabel('Option2'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup'),
|
||||||
|
).toHaveText(`radioGroup:${record.radioGroup}`, { ignoreCase: true });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.radioGroup-radioGroup`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.radioGroup`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'radioGroup');
|
||||||
|
await showSettingsMenu(page, 'radioGroup');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,281 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndMediaFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.richText-richText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.richText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.richText-richText`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.richText`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-CollectionField-general-general.richText').locator('.ql-editor').click();
|
||||||
|
await page.keyboard.type('test rich text');
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.richText-richText')).toHaveText(
|
||||||
|
/test rich text/,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.richText-richText`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.richText`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.richText-richText')
|
||||||
|
.locator('.ql-editor')
|
||||||
|
.click();
|
||||||
|
await page.keyboard.type('test rich text pattern');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-container'),
|
||||||
|
).toHaveClass(/ql-disabled/);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-container'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.richText-richText')).toHaveText(
|
||||||
|
/test rich text pattern/,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.markdown-markdown`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.markdown`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.richText-richText`, { exact: true }).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.richText`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'richText'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-editor'),
|
||||||
|
).toHaveText(record.richText);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-container'),
|
||||||
|
).toHaveClass(/ql-disabled/);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-container'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.richText-richText')).toHaveText(
|
||||||
|
`richText:${record.richText}`,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'markdown'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
// 等待页面稳定
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.richText-richText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.richText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'richText');
|
||||||
|
await showSettingsMenu(page, 'richText');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,79 @@
|
|||||||
|
import { expectSettingsMenu, oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields, test } from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.sequence-sequence`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.sequence`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Pattern', 'Delete', 'required'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.sequence-sequence`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.sequence`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.sequence-sequence`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.sequence`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'sequence');
|
||||||
|
await showSettingsMenu(page, 'sequence');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,376 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern, testSetValidationRules } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.singleLineText-singleLineText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.singleLineText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
'Set validation rules',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleLineText'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: 'test single line text',
|
||||||
|
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).toHaveValue('test single line text');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).toHaveValue('admin@nocobase.com');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleLineText'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('test single line text');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText'),
|
||||||
|
).toHaveText('singleLineText:test single line text');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set validation rules', async ({ page, mockPage }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleLineText'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.singleLineText-singleLineText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.singleLineText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set validation rules',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleLineText'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 应该显示 record 中的值
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).toHaveValue(record.singleLineText);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
||||||
|
.getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText'),
|
||||||
|
).toHaveText(`singleLineText:${record.singleLineText}`);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Set validation rules', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testSetValidationRules({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleLineText'),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.singleLineText-singleLineText`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.singleLineText`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'singleLineText');
|
||||||
|
await showSettingsMenu(page, 'singleLineText');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('custom column title', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecords('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'singleLineText');
|
||||||
|
await showSettingsMenu(page, 'singleLineText');
|
||||||
|
await page.getByRole('menuitem', { name: 'Custom column title' }).click();
|
||||||
|
|
||||||
|
// 显示出原字段名称
|
||||||
|
await expect(page.getByRole('dialog').getByText('Original field title: singleLineText')).toBeVisible();
|
||||||
|
// 输入新字段名称
|
||||||
|
await page.getByLabel('block-item-Input-general-column title').getByRole('textbox').click();
|
||||||
|
await page.getByLabel('block-item-Input-general-column title').getByRole('textbox').fill('new column title');
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
// 新名称应该显示出来
|
||||||
|
await expect(page.getByRole('button', { name: 'new column title', exact: true })).toBeVisible();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('column width', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecords('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'singleLineText');
|
||||||
|
await showSettingsMenu(page, 'singleLineText');
|
||||||
|
await page.getByRole('menuitem', { name: 'Column width' }).click();
|
||||||
|
await page.getByRole('dialog').getByRole('spinbutton').click();
|
||||||
|
await page.getByRole('dialog').getByRole('spinbutton').fill('600');
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
|
||||||
|
const columnHeadSize = await page.getByRole('columnheader', { name: 'singleLineText' }).boundingBox();
|
||||||
|
expect(Math.floor(columnHeadSize.width)).toBe(600);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('sortable', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecords('general', [{ singleLineText: 'a' }, { singleLineText: 'b' }]);
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'singleLineText');
|
||||||
|
await showSettingsMenu(page, 'singleLineText');
|
||||||
|
|
||||||
|
// 默认不可排序
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Sortable' }).getByRole('switch')).not.toBeChecked();
|
||||||
|
|
||||||
|
// 开启排序
|
||||||
|
await page.getByRole('menuitem', { name: 'Sortable' }).click();
|
||||||
|
// TODO: 此处菜单在点击后不应该消失
|
||||||
|
// await expect(page.getByRole('menuitem', { name: 'Sortable' }).getByRole('switch')).toBeChecked();
|
||||||
|
|
||||||
|
// 鼠标 hover 时,有提示
|
||||||
|
await page.getByRole('columnheader', { name: 'singleLineText' }).hover();
|
||||||
|
await expect(page.getByRole('tooltip', { name: 'Click to sort ascending' })).toBeVisible();
|
||||||
|
|
||||||
|
// 点击第一下,升序
|
||||||
|
await page.getByRole('columnheader', { name: 'singleLineText' }).click();
|
||||||
|
let sizeA = await page.getByRole('cell', { name: 'a', exact: true }).boundingBox();
|
||||||
|
let sizeB = await page.getByRole('cell', { name: 'b', exact: true }).boundingBox();
|
||||||
|
expect(sizeA.y).toBeLessThan(sizeB.y);
|
||||||
|
|
||||||
|
// 点击第二下,降序
|
||||||
|
await page.getByRole('columnheader', { name: 'singleLineText' }).click();
|
||||||
|
sizeA = await page.getByRole('cell', { name: 'a', exact: true }).boundingBox();
|
||||||
|
sizeB = await page.getByRole('cell', { name: 'b', exact: true }).boundingBox();
|
||||||
|
expect(sizeA.y).toBeGreaterThan(sizeB.y);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('delete', async ({ page, mockPage, mockRecords }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecords('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await createColumnItem(page, 'singleLineText');
|
||||||
|
await showSettingsMenu(page, 'singleLineText');
|
||||||
|
await page.getByRole('menuitem', { name: 'Delete' }).click();
|
||||||
|
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
||||||
|
await expect(page.getByRole('columnheader', { name: 'singleLineText' })).toBeHidden();
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,239 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndChoicesFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.singleSelect-singleSelect`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.singleSelect`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleSelect'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').click();
|
||||||
|
await page.getByRole('option', { name: 'Option1' }).click();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect'),
|
||||||
|
).toHaveText('singleSelect:Option1');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleSelect'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
||||||
|
.getByTestId('select-single')
|
||||||
|
.click();
|
||||||
|
await page.getByRole('option', { name: 'Option1' }).click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
||||||
|
.getByTestId('select-single'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
||||||
|
.getByTestId('select-single'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect'),
|
||||||
|
).toHaveText('singleSelect:Option1');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.singleSelect-singleSelect`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.singleSelect`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page
|
||||||
|
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
||||||
|
.hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
||||||
|
exact: true,
|
||||||
|
})
|
||||||
|
.hover();
|
||||||
|
})(page, 'singleSelect'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
||||||
|
.getByTestId('select-single'),
|
||||||
|
).toHaveText(record.singleSelect, { ignoreCase: true });
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
||||||
|
.getByTestId('select-single'),
|
||||||
|
).toHaveClass(/ant-select-disabled/);
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(
|
||||||
|
page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
||||||
|
.getByTestId('select-single'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect'),
|
||||||
|
).toHaveText(`singleSelect:${record.singleSelect}`, { ignoreCase: true });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.singleSelect-singleSelect`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.singleSelect`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'singleSelect');
|
||||||
|
await showSettingsMenu(page, 'singleSelect');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,136 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.tableoid-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.tableoid`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.tableoid-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.tableoid`)
|
||||||
|
.hover();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.tableoid-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.tableoid`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit tooltip', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'tableoid');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.tableoid-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.tableoid`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
await (async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
})(page);
|
||||||
|
await (async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'tableoid');
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'Table OID');
|
||||||
|
await showSettingsMenu(page, 'Table OID');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,21 @@
|
|||||||
|
import { test } from '@nocobase/test/e2e';
|
||||||
|
|
||||||
|
test('form item & create form', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('form item & edit form', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('form item & view form', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('form item & filter form', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('table column & table', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('table column & table & record picker', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('table column & table & Relationship block', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('table column & sub table & create from', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('table column & sub table & edit from', async ({ page, mockPage }) => {});
|
||||||
|
|
||||||
|
test('table column & sub table & view from', async ({ page, mockPage }) => {});
|
@ -0,0 +1,208 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import dayjs from 'dayjs';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.time-time`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.time`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Required',
|
||||||
|
'Set default value',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let nowTime;
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
},
|
||||||
|
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.time-time`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.time`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
inputConstantValue: async () => {
|
||||||
|
await page.getByLabel('block-item-VariableInput-').getByPlaceholder('Select time').click();
|
||||||
|
await page.getByText('Now').click();
|
||||||
|
nowTime = dayjs();
|
||||||
|
},
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.time-time').getByPlaceholder('Select time'),
|
||||||
|
).toHaveValue(new RegExp(nowTime.format('HH:mm:ss')));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'time'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.time-time')
|
||||||
|
.getByPlaceholder('Select time')
|
||||||
|
.click();
|
||||||
|
await page.getByText('Now').click();
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.time-time').getByPlaceholder('Select time'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.time-time')).toHaveText(
|
||||||
|
new RegExp(`time:${dayjs().format('HH:mm:')}`),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.time-time`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.time`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
record = await (async (mockPage, mockRecord) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
const record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
return record;
|
||||||
|
})(mockPage, mockRecord);
|
||||||
|
},
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'time'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.time-time').getByPlaceholder('Select time'),
|
||||||
|
).toHaveValue(record.time);
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.time-time').getByPlaceholder('Select time'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.time-time')).toHaveText(
|
||||||
|
new RegExp(`time:${record.time}`),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.time-time`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.time`)
|
||||||
|
.hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'time');
|
||||||
|
await showSettingsMenu(page, 'time');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Sortable', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,212 @@
|
|||||||
|
import {
|
||||||
|
Page,
|
||||||
|
expect,
|
||||||
|
expectSettingsMenu,
|
||||||
|
oneTableBlockWithAddNewAndViewAndEditAndBasicFields,
|
||||||
|
test,
|
||||||
|
} from '@nocobase/test/e2e';
|
||||||
|
import { createColumnItem, showSettingsMenu, testDefaultValue, testPattern } from '../../utils';
|
||||||
|
|
||||||
|
test.describe('form item & create form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.url-url`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.url`).hover();
|
||||||
|
},
|
||||||
|
supportedOptions: [
|
||||||
|
'Edit field title',
|
||||||
|
'Display title',
|
||||||
|
'Edit description',
|
||||||
|
'Pattern',
|
||||||
|
'Delete',
|
||||||
|
'required',
|
||||||
|
'Set default value',
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('set default value', async ({ page, mockPage }) => {
|
||||||
|
await testDefaultValue({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
closeDialog: async () => {
|
||||||
|
await page.getByLabel('drawer-Action.Container-general-Add record-mask').click();
|
||||||
|
},
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'url'),
|
||||||
|
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
||||||
|
constantValue: 'https://nocobase.com',
|
||||||
|
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
||||||
|
expectConstantValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
||||||
|
).toHaveValue('https://nocobase.com');
|
||||||
|
},
|
||||||
|
expectVariableValue: async () => {
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
||||||
|
).toHaveValue('admin@nocobase.com');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage }) => {
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: () =>
|
||||||
|
(async (mockPage) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await nocoPage.goto();
|
||||||
|
})(mockPage),
|
||||||
|
openDialog: () =>
|
||||||
|
(async (page: Page) => {
|
||||||
|
await page.getByRole('button', { name: 'Add new' }).click();
|
||||||
|
})(page),
|
||||||
|
showMenu: () =>
|
||||||
|
(async (page: Page, fieldName: string) => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
||||||
|
await page
|
||||||
|
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
||||||
|
.hover();
|
||||||
|
})(page, 'url'),
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox').click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.url-url')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('https://nocobase.com');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// 输入框会消失,只剩下值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.url-url')).toHaveText(
|
||||||
|
'url:https://nocobase.com',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & edit form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.url-url`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.url`).hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Edit description', 'Required', 'Pattern', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
let record: any = null;
|
||||||
|
await testPattern({
|
||||||
|
page,
|
||||||
|
gotoPage: async () => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
record = await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
},
|
||||||
|
openDialog: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-Edit record-update-general-table-0').click();
|
||||||
|
},
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.url-url`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.url`).hover();
|
||||||
|
},
|
||||||
|
expectEditable: async () => {
|
||||||
|
// 默认情况下可以编辑
|
||||||
|
await page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox').click();
|
||||||
|
await page
|
||||||
|
.getByLabel('block-item-CollectionField-general-form-general.url-url')
|
||||||
|
.getByRole('textbox')
|
||||||
|
.fill('https://nocobase.com');
|
||||||
|
},
|
||||||
|
expectReadonly: async () => {
|
||||||
|
// 只读模式下,输入框会被禁用
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
||||||
|
).toBeDisabled();
|
||||||
|
},
|
||||||
|
expectEasyReading: async () => {
|
||||||
|
// url 类型数据不会被 mock,所以这里不会显示值
|
||||||
|
await expect(
|
||||||
|
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
||||||
|
).not.toBeVisible();
|
||||||
|
await expect(page.getByLabel('block-item-CollectionField-general-form-general.url-url')).toHaveText(
|
||||||
|
'url:https://nocobase.com',
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('form item & view form', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
||||||
|
await page.getByLabel(`block-item-CollectionField-general-form-general.url-url`).hover();
|
||||||
|
await page.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.url`).hover();
|
||||||
|
},
|
||||||
|
supportedOptions: ['Edit field title', 'Display title', 'Delete', 'Edit tooltip'],
|
||||||
|
unsupportedOptions: ['Set default value'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test.describe('table column & table', () => {
|
||||||
|
test('supported options', async ({ page, mockPage, mockRecord }) => {
|
||||||
|
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
||||||
|
await mockRecord('general');
|
||||||
|
await nocoPage.goto();
|
||||||
|
|
||||||
|
await expectSettingsMenu({
|
||||||
|
page,
|
||||||
|
showMenu: async () => {
|
||||||
|
await createColumnItem(page, 'url');
|
||||||
|
await showSettingsMenu(page, 'url');
|
||||||
|
},
|
||||||
|
supportedOptions: ['Custom column title', 'Column width', 'Delete'],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -1,278 +0,0 @@
|
|||||||
import { Page, expect, test } from '@nocobase/test/e2e';
|
|
||||||
|
|
||||||
export async function testEditFieldTitle(page: Page) {
|
|
||||||
await page.getByRole('menuitem', { name: 'Edit field title' }).click();
|
|
||||||
await page.getByLabel('block-item-Input-general-').getByRole('textbox').click();
|
|
||||||
await page.getByLabel('block-item-Input-general-').getByRole('textbox').fill('testing edit field title');
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
await expect(page.getByText('testing edit field title')).toBeVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function testDisplayTitle(page: Page, title: string) {
|
|
||||||
// 默认情况下是开启状态
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Display title' }).getByRole('switch')).toBeChecked();
|
|
||||||
await page.getByRole('menuitem', { name: 'Display title' }).click();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Display title' }).getByRole('switch')).not.toBeChecked();
|
|
||||||
await expect(page.getByText(`${title}:`, { exact: true })).not.toBeVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function testEditDescription(page: Page) {
|
|
||||||
await page.getByRole('menuitem', { name: 'Edit description' }).click();
|
|
||||||
await page.getByLabel('block-item-Input.TextArea-').getByRole('textbox').click();
|
|
||||||
await page.getByLabel('block-item-Input.TextArea-').getByRole('textbox').fill('testing edit description');
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
await expect(page.getByText('testing edit description')).toBeVisible();
|
|
||||||
}
|
|
||||||
export async function testRequired(page: Page) {
|
|
||||||
// 默认情况下是关闭状态
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Required' }).getByRole('switch')).not.toBeChecked();
|
|
||||||
await page.getByRole('menuitem', { name: 'Required' }).click();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Required' }).getByRole('switch')).toBeChecked();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function clickDeleteAndOk(page: Page) {
|
|
||||||
await page.getByRole('menuitem', { name: 'Delete' }).click();
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
}
|
|
||||||
|
|
||||||
export const commonTesting = ({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName,
|
|
||||||
blockType = 'creating',
|
|
||||||
fieldType,
|
|
||||||
mode = 'details',
|
|
||||||
}: {
|
|
||||||
openDialogAndShowMenu: ({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
mockRecords,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage: any;
|
|
||||||
mockRecord: any;
|
|
||||||
mockRecords: any;
|
|
||||||
fieldName: string;
|
|
||||||
}) => Promise<void>;
|
|
||||||
fieldName: string;
|
|
||||||
blockType?: 'creating' | 'viewing' | 'editing';
|
|
||||||
fieldType?: 'relation' | 'system';
|
|
||||||
/**
|
|
||||||
* options 模式下,只会测试选项是否正确显示;
|
|
||||||
* details 模式下,会测试每个选项的功能是否正常;
|
|
||||||
*/
|
|
||||||
mode?: 'options' | 'details';
|
|
||||||
}) => {
|
|
||||||
if (mode === 'details') {
|
|
||||||
test('edit field title', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await testEditFieldTitle(page);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('display title', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await testDisplayTitle(page, fieldName);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('delete', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await clickDeleteAndOk(page);
|
|
||||||
await expect(page.getByText(`${fieldName}:`)).not.toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (['creating', 'editing'].includes(blockType)) {
|
|
||||||
test('edit description', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await testEditDescription(page);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('required', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await testRequired(page);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blockType === 'viewing') {
|
|
||||||
test('edit tooltip', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await page.getByRole('menuitem', { name: 'Edit tooltip' }).click();
|
|
||||||
await page.getByRole('dialog').getByRole('textbox').click();
|
|
||||||
await page.getByRole('dialog').getByRole('textbox').fill('testing edit tooltip');
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
await page.getByRole('img', { name: 'question-circle' }).hover();
|
|
||||||
await expect(page.getByText('testing edit tooltip')).toBeVisible();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode === 'options') {
|
|
||||||
test('should display correct options', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit field title' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Display title' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Delete' })).toBeVisible();
|
|
||||||
if (['creating', 'editing'].includes(blockType) && fieldType !== 'system') {
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit description' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Required' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Pattern' })).toBeVisible();
|
|
||||||
}
|
|
||||||
if (blockType === 'viewing') {
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Pattern' })).not.toBeVisible();
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
blockType === 'creating' &&
|
|
||||||
!fieldName.startsWith('oneTo') &&
|
|
||||||
!['attachment'].includes(fieldName) &&
|
|
||||||
!['system'].includes(fieldType)
|
|
||||||
) {
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default value' })).toBeVisible();
|
|
||||||
}
|
|
||||||
if (['editing', 'viewing'].includes(blockType)) {
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
|
||||||
}
|
|
||||||
if (fieldType === 'relation' && ['creating', 'editing'].includes(blockType)) {
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default sorting rules' })).toBeVisible();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export async function testDefaultValue({
|
|
||||||
page,
|
|
||||||
openDialog,
|
|
||||||
closeDialog,
|
|
||||||
gotoPage,
|
|
||||||
showMenu,
|
|
||||||
supportVariables,
|
|
||||||
constantValue,
|
|
||||||
variableValue,
|
|
||||||
inputConstantValue,
|
|
||||||
expectConstantValue,
|
|
||||||
expectVariableValue,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
openDialog: () => Promise<void>;
|
|
||||||
closeDialog: () => Promise<void>;
|
|
||||||
gotoPage: () => Promise<void>;
|
|
||||||
showMenu: () => Promise<void>;
|
|
||||||
/** 支持的变量列表,如:['Current user', 'Date variables', 'Current form'] */
|
|
||||||
supportVariables: string[];
|
|
||||||
/** 常量默认值 */
|
|
||||||
constantValue?: string | number;
|
|
||||||
/** 变量默认值 */
|
|
||||||
variableValue?: string[];
|
|
||||||
/** 输入常量默认值 */
|
|
||||||
inputConstantValue?: () => Promise<void>;
|
|
||||||
/** 对常量默认值进行断言 */
|
|
||||||
expectConstantValue?: () => Promise<void>;
|
|
||||||
/** 对变量默认值进行断言 */
|
|
||||||
expectVariableValue?: () => Promise<void>;
|
|
||||||
}) {
|
|
||||||
await gotoPage();
|
|
||||||
await openDialog();
|
|
||||||
await showMenu();
|
|
||||||
|
|
||||||
if (constantValue || inputConstantValue) {
|
|
||||||
// 设置一个常量作为默认值
|
|
||||||
await page.getByRole('menuitem', { name: 'Set default value' }).click();
|
|
||||||
if (inputConstantValue) {
|
|
||||||
await inputConstantValue();
|
|
||||||
} else {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('textbox').click();
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('textbox').fill(String(constantValue));
|
|
||||||
}
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 关闭弹窗,然后再次打开后,应该显示刚才设置的默认值
|
|
||||||
await closeDialog();
|
|
||||||
await openDialog();
|
|
||||||
await expectConstantValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (variableValue) {
|
|
||||||
// 设置一个变量作为默认值
|
|
||||||
await showMenu();
|
|
||||||
await page.getByRole('menuitem', { name: 'Set default value' }).click();
|
|
||||||
await page.getByLabel('variable-button').click();
|
|
||||||
for (const value of supportVariables) {
|
|
||||||
await expect(page.getByRole('menuitemcheckbox', { name: value })).toBeVisible();
|
|
||||||
}
|
|
||||||
for (const value of variableValue) {
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: value }).click();
|
|
||||||
}
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
await closeDialog();
|
|
||||||
await openDialog();
|
|
||||||
await expectVariableValue();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage,
|
|
||||||
openDialog,
|
|
||||||
showMenu,
|
|
||||||
expectEditable,
|
|
||||||
expectReadonly,
|
|
||||||
expectEasyReading,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
gotoPage: () => Promise<void>;
|
|
||||||
openDialog: () => Promise<void>;
|
|
||||||
showMenu: () => Promise<void>;
|
|
||||||
/** 断言选项为 Editable 的情况 */
|
|
||||||
expectEditable: () => Promise<void>;
|
|
||||||
/** 断言选项为 Readonly 的情况 */
|
|
||||||
expectReadonly: () => Promise<void>;
|
|
||||||
/** 断言选项为 Easy-reading 的情况 */
|
|
||||||
expectEasyReading: () => Promise<void>;
|
|
||||||
}) {
|
|
||||||
await gotoPage();
|
|
||||||
await openDialog();
|
|
||||||
|
|
||||||
// 默认情况下,显示的是 Editable
|
|
||||||
await expectEditable();
|
|
||||||
await showMenu();
|
|
||||||
await expect(page.getByText('PatternEditable')).toBeVisible();
|
|
||||||
|
|
||||||
// 更改为 Readonly
|
|
||||||
await page.getByRole('menuitem', { name: 'Pattern' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Readonly' }).click();
|
|
||||||
await expectReadonly();
|
|
||||||
|
|
||||||
// 更改为 Easy-reading
|
|
||||||
await showMenu();
|
|
||||||
await expect(page.getByText('PatternReadonly')).toBeVisible();
|
|
||||||
await page.getByRole('menuitem', { name: 'Pattern' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Easy-reading' }).click();
|
|
||||||
await expectEasyReading();
|
|
||||||
|
|
||||||
await showMenu();
|
|
||||||
await expect(page.getByText('PatternEasy-reading')).toBeVisible();
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage,
|
|
||||||
openDialog,
|
|
||||||
showMenu,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
gotoPage: () => Promise<void>;
|
|
||||||
openDialog: () => Promise<void>;
|
|
||||||
showMenu: () => Promise<void>;
|
|
||||||
}) {
|
|
||||||
await gotoPage();
|
|
||||||
await openDialog();
|
|
||||||
await showMenu();
|
|
||||||
|
|
||||||
await page.getByRole('menuitem', { name: 'Set validation rules' }).click();
|
|
||||||
await expect(page.getByRole('dialog').getByText('Set validation rules')).toBeVisible();
|
|
||||||
|
|
||||||
// TODO: 更详细的测试
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
import { Page, oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('collection', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'collection', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('JSON', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'JSON', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('formula', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'formula', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('sequence', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'sequence', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecord) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
|
||||||
await mockRecord('general');
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,81 +0,0 @@
|
|||||||
import { Page, oneTableBlockWithAddNewAndViewAndEditAndBasicFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('color', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'color', blockType: 'viewing' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('email', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'email', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('icon', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'icon', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('single line text', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'singleLineText', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('integer', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'integer', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('number', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'number', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('password', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'password', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('percent', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'percent', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('phone', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'phone', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('long text', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'longText', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('URL', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'url', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecord) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
|
||||||
const record = await mockRecord('general');
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return record;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
import { Page, oneTableBlockWithAddNewAndViewAndEditAndChoicesFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('checkbox', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'checkbox', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('checkbox group', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'checkboxGroup', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('china region', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'chinaRegion', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('multiple select', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'multipleSelect', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('radio group', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'radioGroup', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('single select', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'singleSelect', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecord) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
|
||||||
const record = await mockRecord('general');
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return record;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page
|
|
||||||
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
|
||||||
.hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
|
||||||
exact: true,
|
|
||||||
})
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields, test } from '@nocobase/test/e2e';
|
|
||||||
import dayjs from 'dayjs';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('datetime', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'datetime', blockType: 'viewing', mode: 'options' });
|
|
||||||
|
|
||||||
test('date display format', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
const record = await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'datetime' });
|
|
||||||
await page.getByRole('menuitem', { name: 'Date display format' }).click();
|
|
||||||
await page.getByLabel('YYYY/MM/DD').click();
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')).toHaveText(
|
|
||||||
`datetime:${dayjs(record.datetime).format('YYYY/MM/DD')}`,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('time', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'time', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecord) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
|
||||||
const record = await mockRecord('general');
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return record;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
const record = await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
|
|
||||||
return record;
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndMediaFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('markdown', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'markdown', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('rich text', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'richText', blockType: 'viewing', mode: 'options' });
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('attachment', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'attachment', blockType: 'viewing', mode: 'options' });
|
|
||||||
|
|
||||||
test('size', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
const record = await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
|
|
||||||
// 默认尺寸
|
|
||||||
// 这里的尺寸不稳定,所以用 try catch 来处理
|
|
||||||
const testDefault = async (value) => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
|
||||||
.getByRole('link', { name: record.attachment.title })
|
|
||||||
.first(),
|
|
||||||
).toHaveJSProperty('offsetWidth', value, { timeout: 1000 });
|
|
||||||
};
|
|
||||||
try {
|
|
||||||
await testDefault(94);
|
|
||||||
} catch (error) {
|
|
||||||
try {
|
|
||||||
await testDefault(95);
|
|
||||||
} catch (err) {
|
|
||||||
await testDefault(96);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 改为大尺寸
|
|
||||||
const testLarge = async (value) => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
|
||||||
.getByRole('link', { name: record.attachment.title })
|
|
||||||
.first(),
|
|
||||||
).toHaveJSProperty('offsetWidth', value, { timeout: 1000 });
|
|
||||||
};
|
|
||||||
await showMenu(page, 'attachment');
|
|
||||||
await page.getByRole('menuitem', { name: 'Size' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Large' }).click();
|
|
||||||
try {
|
|
||||||
await testLarge(153);
|
|
||||||
} catch (err) {
|
|
||||||
try {
|
|
||||||
await testLarge(154);
|
|
||||||
} catch (err) {
|
|
||||||
await testLarge(152);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 改为小尺寸
|
|
||||||
const testSmall = async (value) => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.attachment-attachment')
|
|
||||||
.getByRole('link', { name: record.attachment.title })
|
|
||||||
.first(),
|
|
||||||
).toHaveJSProperty('offsetWidth', value, { timeout: 1000 });
|
|
||||||
};
|
|
||||||
await showMenu(page, 'attachment');
|
|
||||||
await page.getByRole('menuitem', { name: 'Size' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Small' }).click();
|
|
||||||
try {
|
|
||||||
await testSmall(25);
|
|
||||||
} catch (err) {
|
|
||||||
try {
|
|
||||||
await testSmall(26);
|
|
||||||
} catch (err) {
|
|
||||||
await testSmall(24);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecord) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
|
||||||
const record = await mockRecord('general');
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return record;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
// 这里是为了等弹窗中的内容渲染稳定后,再去 hover,防止错位导致测试报错
|
|
||||||
await page.waitForTimeout(1000);
|
|
||||||
await page
|
|
||||||
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
|
||||||
.hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
|
||||||
exact: true,
|
|
||||||
})
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,256 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndAssociationFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('many to many', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'manyToMany',
|
|
||||||
fieldType: 'relation',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
// test.fail();
|
|
||||||
const record = await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
|
|
||||||
// 初始状态是一个可点击的链接
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.locator('a')
|
|
||||||
.filter({ hasText: record.manyToMany[0].id }),
|
|
||||||
).toBeVisible();
|
|
||||||
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
|
|
||||||
// 默认情况下是开启状态
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
|
||||||
await page.getByRole('menuitem', { name: 'Enable link' }).click();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).not.toBeChecked();
|
|
||||||
|
|
||||||
// 应变为非链接状态
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.locator('a')
|
|
||||||
.filter({ hasText: record.manyToMany[0].id }),
|
|
||||||
).not.toBeVisible();
|
|
||||||
|
|
||||||
// 再次开启链接状态
|
|
||||||
await page.getByRole('menuitem', { name: 'Enable link' }).click();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.locator('a')
|
|
||||||
.filter({ hasText: record.manyToMany[0].id }),
|
|
||||||
).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('many to one', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'manyToOne',
|
|
||||||
fieldType: 'relation',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('one to many', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'oneToMany',
|
|
||||||
fieldType: 'relation',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('one to one (belongs to)', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'oneToOneBelongsTo',
|
|
||||||
fieldType: 'relation',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('one to one (has one)', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'oneToOneHasOne',
|
|
||||||
fieldType: 'relation',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Title', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Tag', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-details', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('enable link', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' }).getByRole('switch')).toBeChecked();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecords) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
|
||||||
const record = (await mockRecords('general', 1))[0];
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return record;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecords,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
mockRecords;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,106 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('created at', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'createdAt',
|
|
||||||
fieldType: 'system',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'createdAt' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Date display format' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('created by', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'createdBy',
|
|
||||||
fieldType: 'system',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'createdBy' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('id', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'id', fieldType: 'system', mode: 'options', blockType: 'viewing' });
|
|
||||||
});
|
|
||||||
test.describe('table oid', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'tableoid',
|
|
||||||
fieldType: 'system',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'tableoid' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('last updated at', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'updatedAt',
|
|
||||||
fieldType: 'system',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('last updated by', () => {
|
|
||||||
commonTesting({
|
|
||||||
openDialogAndShowMenu,
|
|
||||||
fieldName: 'updatedBy',
|
|
||||||
fieldType: 'system',
|
|
||||||
mode: 'options',
|
|
||||||
blockType: 'viewing',
|
|
||||||
});
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'updatedBy' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecord) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
|
||||||
const record = await mockRecord('general');
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return record;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByLabel('action-Action.Link-View record-view-general-table-0').click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecord);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('collection', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'collection', mode: 'options' });
|
|
||||||
});
|
|
||||||
test.describe('JSON', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'JSON', mode: 'options' });
|
|
||||||
});
|
|
||||||
test.describe('formula', () => {
|
|
||||||
test('should display correct options', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'formula' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit field title' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Display title' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Delete' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Pattern' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('sequence', () => {
|
|
||||||
test('should display correct options', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'sequence' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit field title' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Display title' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Delete' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Pattern' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit description' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'required' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAdvancedFields).waitForInit();
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,750 +0,0 @@
|
|||||||
import { expect, oneTableBlockWithAddNewAndViewAndEditAndBasicFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting, testDefaultValue, testPattern, testSetValidationRules } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('color', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'color' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'color' });
|
|
||||||
// 简单测试下是否有选项,值的话无法选中,暂时测不了
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default value' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'color'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下显示颜色选择框
|
|
||||||
await page.getByLabel('color-picker-normal').hover();
|
|
||||||
await expect(page.getByRole('button', { name: 'right Recommended', exact: true })).toBeVisible();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,不会显示颜色弹窗
|
|
||||||
await page.getByLabel('color-picker-normal').hover();
|
|
||||||
await expect(page.getByRole('button', { name: 'right Recommended', exact: true })).not.toBeVisible();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(page.getByLabel('color-picker-read-pretty')).toBeVisible();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('email', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'email', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'email'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: 'test@nocobase.com',
|
|
||||||
variableValue: ['Current user', 'Email'],
|
|
||||||
expectConstantValue: () =>
|
|
||||||
expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
|
||||||
).toHaveValue('test@nocobase.com'),
|
|
||||||
expectVariableValue: () =>
|
|
||||||
expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
|
||||||
).toHaveValue('admin@nocobase.com'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'email'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 填充一个值,方便后面断言
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.email-email')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.email-email')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('admin@nocobase.com');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 输入框应该被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框应该消失,直接显示值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.email-email').getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.email-email')).toHaveText(
|
|
||||||
'email:admin@nocobase.com',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('icon', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'icon', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'icon'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('button', { name: 'Select icon' }).click();
|
|
||||||
await page.getByLabel('account-book').locator('svg').click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.icon-icon')
|
|
||||||
.getByRole('button', { name: 'account-book' }),
|
|
||||||
).toBeVisible();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'icon'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑图标
|
|
||||||
await page.getByRole('button', { name: 'Select icon' }).click();
|
|
||||||
await page.getByLabel('account-book').locator('svg').click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,选择图标按钮会被禁用
|
|
||||||
await expect(page.getByRole('button', { name: 'account-book' })).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 按钮会消失,只剩下图标
|
|
||||||
await expect(page.getByRole('button', { name: 'account-book' })).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.icon-icon').getByLabel('account-book'),
|
|
||||||
).toBeVisible();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('single line text', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'singleLineText', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'singleLineText'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: 'test single line text',
|
|
||||||
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
|
||||||
.getByRole('textbox'),
|
|
||||||
).toHaveValue('test single line text');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
|
||||||
.getByRole('textbox'),
|
|
||||||
).toHaveValue('admin@nocobase.com');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'singleLineText'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('test single line text');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
|
||||||
.getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText')
|
|
||||||
.getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.singleLineText-singleLineText'),
|
|
||||||
).toHaveText('singleLineText:test single line text');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'singleLineText'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('integer', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'integer', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'integer'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
variableValue: ['Current user', 'ID'], // 值为 1
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').click();
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').fill('112233');
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
|
||||||
).toHaveValue('112233');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
|
||||||
).toHaveValue('1');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'integer'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.integer-integer')
|
|
||||||
.getByRole('spinbutton')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.integer-integer')
|
|
||||||
.getByRole('spinbutton')
|
|
||||||
.fill('112233');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.integer-integer').getByRole('spinbutton'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.integer-integer')).toHaveText(
|
|
||||||
'integer:112233',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'integer'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('number', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'number', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'number'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').click();
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').fill('11.22');
|
|
||||||
},
|
|
||||||
variableValue: ['Current user', 'ID'], // 值为 1
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
|
||||||
).toHaveValue('11.22');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
|
||||||
).toHaveValue('1');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
// TODO: number 类型的字段,当输入了小数,然后把 Pattern 切换成 Easy-reading 模式,小数不应该被去掉;
|
|
||||||
test.fail();
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'number'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.number-number')
|
|
||||||
.getByRole('spinbutton')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.number-number')
|
|
||||||
.getByRole('spinbutton')
|
|
||||||
.fill('11.22');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.number-number').getByRole('spinbutton'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.number-number')).toHaveText(
|
|
||||||
'number:11.22',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'number'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('password', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'password', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'password'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: 'test112233password',
|
|
||||||
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
|
||||||
).toHaveValue('test112233password');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
|
||||||
).toHaveValue('admin@nocobase.com');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'password'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.password-password')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.password-password')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('test112233password');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.password-password').getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.password-password')).toHaveText(
|
|
||||||
'password:********',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'password'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('percent', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'percent', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'percent'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').click();
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('spinbutton').fill('11.22');
|
|
||||||
},
|
|
||||||
variableValue: ['Current user', 'ID'], // 值为 1
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
|
||||||
).toHaveValue('11.22');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
// 数字 1 转换为百分比后为 100%
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
|
||||||
).toHaveValue('100');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
// TODO: percent 类型的字段,当输入了小数,然后把 Pattern 切换成 Easy-reading 模式,小数点不应该被去掉;
|
|
||||||
test.fail();
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'percent'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.percent-percent')
|
|
||||||
.getByRole('spinbutton')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.percent-percent')
|
|
||||||
.getByRole('spinbutton')
|
|
||||||
.fill('11.22');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.percent-percent').getByRole('spinbutton'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.percent-percent')).toHaveText(
|
|
||||||
'percent:11.22%',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'percent'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('phone', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'phone', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'phone'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: '17777777777',
|
|
||||||
variableValue: ['Current user', 'ID'], // 值为 1
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
|
||||||
).toHaveValue('17777777777');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
|
||||||
).toHaveValue('1');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'phone'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.phone-phone')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.phone-phone')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('17777777777');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.phone-phone').getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.phone-phone')).toHaveText(
|
|
||||||
'phone:17777777777',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('long text', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'longText', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: async () => {
|
|
||||||
await page.getByLabel('drawer-Action.Container-general-Add record-mask').click();
|
|
||||||
},
|
|
||||||
showMenu: () => showMenu(page, 'longText'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: 'test long text',
|
|
||||||
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
|
||||||
).toHaveValue('test long text');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
|
||||||
).toHaveValue('admin@nocobase.com');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'longText'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.longText-longText')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.longText-longText')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('test long text');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.longText-longText').getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.longText-longText')).toHaveText(
|
|
||||||
'longText:test long text',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'longText'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('URL', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'url', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: async () => {
|
|
||||||
await page.getByLabel('drawer-Action.Container-general-Add record-mask').click();
|
|
||||||
},
|
|
||||||
showMenu: () => showMenu(page, 'url'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: 'https://nocobase.com',
|
|
||||||
variableValue: ['Current user', 'Email'], // 值为 admin@nocobase.com
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
|
||||||
).toHaveValue('https://nocobase.com');
|
|
||||||
},
|
|
||||||
expectVariableValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
|
||||||
).toHaveValue('admin@nocobase.com');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'url'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认情况下可以编辑
|
|
||||||
await page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox').click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.url-url')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('https://nocobase.com');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// 只读模式下,输入框会被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// 输入框会消失,只剩下值
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.url-url').getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.url-url')).toHaveText(
|
|
||||||
'url:https://nocobase.com',
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndBasicFields).waitForInit();
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,395 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndChoicesFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting, testDefaultValue, testPattern } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('checkbox', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'checkbox', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'checkbox'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
// 默认应该是没有被选中的,点击后应该被选中
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByRole('checkbox').click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
|
||||||
).toBeChecked();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'checkbox'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认是未选中的状态,所以先选中
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox')
|
|
||||||
.getByRole('checkbox')
|
|
||||||
.click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// checkbox 应该被禁用
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// checkbox 应该被隐藏,然后只显示一个图标
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox').getByRole('checkbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkbox-checkbox')
|
|
||||||
.getByRole('img', { name: 'check' }),
|
|
||||||
).toBeVisible();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('checkbox group', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'checkboxGroup', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'checkboxGroup'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByLabel('Option1').click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
|
||||||
.getByRole('checkbox', { name: 'Option1' }),
|
|
||||||
).toBeChecked();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'checkboxGroup'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
// 默认是未选中的状态,所以先选中
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
|
||||||
.getByRole('checkbox', { name: 'Option1' })
|
|
||||||
.click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
// checkbox 应该被禁用
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
|
||||||
.getByRole('checkbox', { name: 'Option1' }),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
// checkbox 应该被隐藏,然后只显示一个标签
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
|
||||||
.getByRole('checkbox', { name: 'Option1' }),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.checkboxGroup-checkboxGroup')
|
|
||||||
.getByText('Option1'),
|
|
||||||
).toBeVisible();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('china region', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'chinaRegion', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'chinaRegion'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: '东城区' }).click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
|
|
||||||
).toHaveText('chinaRegion:北京市/市辖区/东城区');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'chinaRegion'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
|
||||||
.locator('.ant-select')
|
|
||||||
.click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: '北京市' }).click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: '市辖区' }).click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: '东城区' }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
|
||||||
.locator('.ant-select')
|
|
||||||
.getByRole('combobox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion')
|
|
||||||
.locator('.ant-select')
|
|
||||||
.getByRole('combobox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.chinaRegion-chinaRegion'),
|
|
||||||
).toHaveText('chinaRegion:北京市 / 市辖区 / 东城区');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('multiple select', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'multipleSelect', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'multipleSelect'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByTestId('select-multiple').click();
|
|
||||||
await page.getByRole('option', { name: 'Option1' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Option2' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Option3' }).click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect'),
|
|
||||||
).toHaveText('multipleSelect:Option1Option2Option3');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'multipleSelect'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
|
||||||
.getByTestId('select-multiple')
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: 'Option1' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Option2' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Option3' }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
|
||||||
.getByTestId('select-multiple'),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect')
|
|
||||||
.getByTestId('select-multiple'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.multipleSelect-multipleSelect'),
|
|
||||||
).toHaveText('multipleSelect:Option1Option2Option3');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('radio group', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'radioGroup', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'radioGroup'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByLabel('Option2').click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
|
||||||
.getByLabel('Option2'),
|
|
||||||
).toBeChecked();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'radioGroup'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
|
||||||
.getByLabel('Option2')
|
|
||||||
.click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
|
||||||
.getByLabel('Option2'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup')
|
|
||||||
.getByLabel('Option2'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.radioGroup-radioGroup'),
|
|
||||||
).toHaveText('radioGroup:Option2');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('single select', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'singleSelect', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'singleSelect'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').click();
|
|
||||||
await page.getByRole('option', { name: 'Option1' }).click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect'),
|
|
||||||
).toHaveText('singleSelect:Option1');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'singleSelect'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
|
||||||
.getByTestId('select-single')
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: 'Option1' }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
|
||||||
.getByTestId('select-single'),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect')
|
|
||||||
.getByTestId('select-single'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.singleSelect-singleSelect'),
|
|
||||||
).toHaveText('singleSelect:Option1');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndChoicesFields).waitForInit();
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page
|
|
||||||
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
|
||||||
.hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
|
||||||
exact: true,
|
|
||||||
})
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,158 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields, test } from '@nocobase/test/e2e';
|
|
||||||
import dayjs from 'dayjs';
|
|
||||||
import { commonTesting, testDefaultValue, testPattern } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('datetime', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'datetime', blockType: 'creating', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'datetime'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByPlaceholder('Select date').click();
|
|
||||||
await page.getByText('Today').click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
|
||||||
.getByPlaceholder('Select date'),
|
|
||||||
).toHaveValue(dayjs().format('YYYY-MM-DD'));
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'datetime'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
|
||||||
.getByPlaceholder('Select date')
|
|
||||||
.click();
|
|
||||||
await page.getByText('Today').click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
|
||||||
.getByPlaceholder('Select date'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')).toHaveText(
|
|
||||||
`datetime:${dayjs().format('YYYY-MM-DD')}`,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('date display format', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'datetime' });
|
|
||||||
await page.getByRole('menuitem', { name: 'Date display format' }).click();
|
|
||||||
await page.getByLabel('YYYY/MM/DD').click();
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 输入一个值,然后验证格式是否正确
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
|
||||||
.getByPlaceholder('Select date')
|
|
||||||
.click();
|
|
||||||
await page.getByText('Today').click();
|
|
||||||
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.datetime-datetime')
|
|
||||||
.getByPlaceholder('Select date'),
|
|
||||||
).toHaveValue(dayjs().format('YYYY/MM/DD'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('time', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'time', blockType: 'creating', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'time'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByPlaceholder('Select time').click();
|
|
||||||
await page.getByText('Now').click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.time-time').getByPlaceholder('Select time'),
|
|
||||||
).toHaveValue(new RegExp(dayjs().format('HH:mm:'))); // 去掉后面的秒,是因为可能因为延迟导致秒数不一致
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'time'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.time-time')
|
|
||||||
.getByPlaceholder('Select time')
|
|
||||||
.click();
|
|
||||||
await page.getByText('Now').click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.time-time').getByPlaceholder('Select time'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.time-time')).toHaveText(
|
|
||||||
new RegExp(`time:${dayjs().format('HH:mm:')}`),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndDatetimeFields).waitForInit();
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,184 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndMediaFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting, testDefaultValue, testPattern, testSetValidationRules } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('markdown', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'markdown', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'markdown'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
constantValue: 'test markdown',
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
|
||||||
).toHaveValue('test markdown');
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'markdown'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')
|
|
||||||
.getByRole('textbox')
|
|
||||||
.fill('test markdown pattern');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
|
||||||
).toBeDisabled();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown').getByRole('textbox'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.markdown-markdown')).toHaveText(
|
|
||||||
`markdown:test markdown pattern`,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'markdown'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('rich text', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'richText', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'richText'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-CollectionField-general-general.richText').locator('.ql-editor').click();
|
|
||||||
await page.keyboard.type('test rich text');
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.richText-richText')).toHaveText(
|
|
||||||
/test rich text/,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'richText'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.richText-richText')
|
|
||||||
.locator('.ql-editor')
|
|
||||||
.click();
|
|
||||||
await page.keyboard.type('test rich text pattern');
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-container'),
|
|
||||||
).toHaveClass(/ql-disabled/);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.richText-richText').locator('.ql-container'),
|
|
||||||
).not.toBeVisible();
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.richText-richText')).toHaveText(
|
|
||||||
/test rich text pattern/,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set validation rules', async ({ page, mockPage }) => {
|
|
||||||
await testSetValidationRules({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'markdown'),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('attachment', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'attachment', mode: 'options' });
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: () => gotoPage(mockPage),
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'attachment'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await expect(page.getByRole('button', { name: 'plus Upload' })).toBeVisible();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(page.getByRole('button', { name: 'plus Upload' })).not.toBeVisible();
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(page.getByRole('button', { name: 'plus Upload' })).not.toBeVisible();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndMediaFields).waitForInit();
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page
|
|
||||||
.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`, { exact: true })
|
|
||||||
.hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`, {
|
|
||||||
exact: true,
|
|
||||||
})
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,658 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndAssociationFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting, testDefaultValue, testPattern } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('many to many', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'manyToMany', fieldType: 'relation', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
let recordsOfUser;
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
recordsOfUser = await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'manyToMany'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page.getByLabel('block-item-VariableInput-').getByTestId('select-object-multiple').click();
|
|
||||||
await page.getByRole('option', { name: String(recordsOfUser[0].id), exact: true }).click();
|
|
||||||
await page.getByRole('option', { name: String(recordsOfUser[1].id), exact: true }).click();
|
|
||||||
await page.getByRole('option', { name: String(recordsOfUser[2].id), exact: true }).click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany'),
|
|
||||||
).toHaveText(`manyToMany:${recordsOfUser.map((record) => record.id).join('')}`);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
let records;
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
records = await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'manyToMany'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByTestId('select-object-multiple')
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
|
||||||
await page.getByRole('option', { name: String(records[1].id), exact: true }).click();
|
|
||||||
await page.getByRole('option', { name: String(records[2].id), exact: true }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByTestId('select-object-multiple'),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
|
||||||
await page.waitForTimeout(100);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany'),
|
|
||||||
).toHaveText(`manyToMany:${records.map((record) => record.id).join(',')}`);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
const records = await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await page.getByText('Add condition', { exact: true }).click();
|
|
||||||
await page.getByTestId('select-filter-field').click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
||||||
await page.getByRole('spinbutton').click();
|
|
||||||
await page.getByRole('spinbutton').fill(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 再次打开弹窗,设置的值应该还在
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
|
||||||
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
|
||||||
|
|
||||||
// 数据应该被过滤了
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByTestId('select-object-multiple')
|
|
||||||
.click();
|
|
||||||
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option')).toHaveCount(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('set default sorting rules', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set default sorting rules' }).click();
|
|
||||||
|
|
||||||
// 配置
|
|
||||||
await page.getByRole('button', { name: 'Add sort field' }).click();
|
|
||||||
await page.getByTestId('select-single').click();
|
|
||||||
await page.getByRole('option', { name: 'ID', exact: true }).click();
|
|
||||||
await page.getByText('DESC', { exact: true }).click();
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 再次打开弹窗,设置的值应该还在
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set default sorting rules' }).click();
|
|
||||||
await expect(page.getByRole('dialog').getByTestId('select-single')).toHaveText('ID');
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
|
||||||
|
|
||||||
// 选择 Record picker
|
|
||||||
await page.getByRole('option', { name: 'Record picker', exact: true }).click();
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByTestId('select-data-picker'),
|
|
||||||
).toBeVisible();
|
|
||||||
|
|
||||||
// 选择 Sub-table
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Sub-table', exact: true }).click();
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByLabel('schema-initializer-AssociationField.SubTable-TableColumnInitializers-users'),
|
|
||||||
).toBeVisible();
|
|
||||||
|
|
||||||
// 选择 Sub-form
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Sub-form', exact: true }).click();
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByLabel('schema-initializer-Grid-FormItemInitializers-users'),
|
|
||||||
).toBeVisible();
|
|
||||||
|
|
||||||
// 选择 Sub-form(Popover)
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
await page.getByRole('option', { name: 'Sub-form(Popover)', exact: true }).click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToMany-manyToMany')
|
|
||||||
.getByRole('img', { name: 'edit' })
|
|
||||||
.click();
|
|
||||||
await expect(page.getByTestId('popover-CollectionField-general')).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('allow multiple', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Allow multiple' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToMany');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('many to one', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'manyToOne', fieldType: 'relation', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
let records;
|
|
||||||
await testDefaultValue({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
records = await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
closeDialog: () => page.getByLabel('drawer-Action.Container-general-Add record-mask').click(),
|
|
||||||
showMenu: () => showMenu(page, 'manyToOne'),
|
|
||||||
supportVariables: ['Constant', 'Current user', 'Date variables', 'Current form'],
|
|
||||||
inputConstantValue: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-VariableInput-')
|
|
||||||
.getByTestId(/select-object/)
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-VariableInput-')
|
|
||||||
.getByTestId(/select-object/)
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: String(records[1].id), exact: true }).click();
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-VariableInput-')
|
|
||||||
.getByTestId(/select-object/)
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: String(records[2].id), exact: true }).click();
|
|
||||||
},
|
|
||||||
expectConstantValue: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
|
||||||
.getByTestId(/select-object/),
|
|
||||||
).toHaveText(String(records[2].id));
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
let records;
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
records = await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'manyToOne'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
|
||||||
.getByTestId(/select-object/)
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
|
||||||
.getByTestId(/select-object/),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
|
||||||
await page.waitForTimeout(100);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')).toHaveText(
|
|
||||||
`manyToOne:${String(records[0].id)}`,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
const records = await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await page.getByText('Add condition', { exact: true }).click();
|
|
||||||
await page.getByTestId('select-filter-field').click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
||||||
await page.getByRole('spinbutton').click();
|
|
||||||
await page.getByRole('spinbutton').fill(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 再次打开弹窗,设置的值应该还在
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
|
||||||
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
|
||||||
|
|
||||||
// 数据应该被过滤了
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.manyToOne-manyToOne')
|
|
||||||
.getByTestId('select-object-single')
|
|
||||||
.click();
|
|
||||||
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option')).toHaveCount(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'manyToOne');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('one to many', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'oneToMany', fieldType: 'relation', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName: 'oneToMany' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'oneToMany'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
|
||||||
.getByTestId('select-object-multiple')
|
|
||||||
.click();
|
|
||||||
// 目前的情况下,在 one to many 的字段中,只有 ID 为 1 的数据可以被选中
|
|
||||||
await page.getByRole('option', { name: '1', exact: true }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
|
||||||
.getByTestId('select-object-multiple'),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
|
||||||
await page.waitForTimeout(100);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(page.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')).toHaveText(
|
|
||||||
`oneToMany:1`,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
const records = await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await page.getByText('Add condition', { exact: true }).click();
|
|
||||||
await page.getByTestId('select-filter-field').click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
||||||
await page.getByRole('spinbutton').click();
|
|
||||||
await page.getByRole('spinbutton').fill(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 再次打开弹窗,设置的值应该还在
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
|
||||||
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
|
||||||
|
|
||||||
// 数据应该被过滤了
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToMany-oneToMany')
|
|
||||||
.getByTestId('select-object-multiple')
|
|
||||||
.click();
|
|
||||||
// 默认只显示 id 为 1 的数据,因为设置了只过滤 id 为 3 的数据,所以这里的下拉列表应该为空,mock 的数据无法被选中
|
|
||||||
await expect(page.getByRole('option')).toHaveCount(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-table', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('allow multiple', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Allow multiple' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToMany');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('one to one (belongs to)', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'oneToOneBelongsTo', fieldType: 'relation', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName: 'oneToOneBelongsTo' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
let records;
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
records = await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'oneToOneBelongsTo'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
|
||||||
.getByTestId(/select-object/)
|
|
||||||
.click();
|
|
||||||
await page.getByRole('option', { name: String(records[0].id), exact: true }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
|
||||||
.getByTestId(/select-object/),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
|
||||||
await page.waitForTimeout(100);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo'),
|
|
||||||
).toHaveText(`oneToOneBelongsTo:${String(records[0].id)}`);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
const records = await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await page.getByText('Add condition', { exact: true }).click();
|
|
||||||
await page.getByTestId('select-filter-field').click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
||||||
await page.getByRole('spinbutton').click();
|
|
||||||
await page.getByRole('spinbutton').fill(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 再次打开弹窗,设置的值应该还在
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
|
||||||
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
|
||||||
|
|
||||||
// 数据应该被过滤了
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToOneBelongsTo-oneToOneBelongsTo')
|
|
||||||
.getByTestId('select-object-single')
|
|
||||||
.click();
|
|
||||||
await expect(page.getByRole('option', { name: String(records[0].id), exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option')).toHaveCount(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneBelongsTo');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test.describe('one to one (has one)', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'oneToOneHasOne', fieldType: 'relation', mode: 'options' });
|
|
||||||
|
|
||||||
test('set default value', async ({ page, mockPage, mockRecord, mockRecords }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, mockRecords, fieldName: 'oneToOneHasOne' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Set default value' })).not.toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('pattern', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
let records;
|
|
||||||
await testPattern({
|
|
||||||
page,
|
|
||||||
gotoPage: async () => {
|
|
||||||
records = await gotoPage(mockPage, mockRecords);
|
|
||||||
},
|
|
||||||
openDialog: () => openDialog(page),
|
|
||||||
showMenu: () => showMenu(page, 'oneToOneHasOne'),
|
|
||||||
expectEditable: async () => {
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
|
||||||
.getByTestId(/select-object/)
|
|
||||||
.click();
|
|
||||||
|
|
||||||
// 目前的情况下,在 one to one (has one) 的字段中,只有 ID 为 1 的数据可以被选中,mock 的数据无法被选中
|
|
||||||
await page.getByRole('option', { name: '1', exact: true }).click();
|
|
||||||
},
|
|
||||||
expectReadonly: async () => {
|
|
||||||
await expect(
|
|
||||||
page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
|
||||||
.getByTestId(/select-object/),
|
|
||||||
).toHaveClass(/ant-select-disabled/);
|
|
||||||
// 在这里等待一下,防止因闪烁导致下面的断言失败
|
|
||||||
await page.waitForTimeout(100);
|
|
||||||
},
|
|
||||||
expectEasyReading: async () => {
|
|
||||||
await expect(
|
|
||||||
page.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne'),
|
|
||||||
).toHaveText(`oneToOneHasOne:1`);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
test('Set the data scope', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
const records = await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await page.getByText('Add condition', { exact: true }).click();
|
|
||||||
await page.getByTestId('select-filter-field').click();
|
|
||||||
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
||||||
await page.getByRole('spinbutton').click();
|
|
||||||
await page.getByRole('spinbutton').fill(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
||||||
|
|
||||||
// 再次打开弹窗,设置的值应该还在
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Set the data scope' }).click();
|
|
||||||
await expect(page.getByTestId('select-filter-field')).toHaveText('ID');
|
|
||||||
await expect(page.getByRole('spinbutton')).toHaveValue(String(records[0].id));
|
|
||||||
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
|
||||||
|
|
||||||
// 数据应该被过滤了
|
|
||||||
await page
|
|
||||||
.getByLabel('block-item-CollectionField-general-form-general.oneToOneHasOne-oneToOneHasOne')
|
|
||||||
.getByTestId('select-object-single')
|
|
||||||
.click();
|
|
||||||
// 默认只显示 id 为 1 的数据,因为设置了只过滤 id 为 3 的数据,所以这里的下拉列表应该为空
|
|
||||||
await expect(page.getByRole('option')).toHaveCount(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('field component', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
await page.getByRole('menuitem', { name: 'Field component' }).click();
|
|
||||||
|
|
||||||
// 断言支持的选项
|
|
||||||
await expect(page.getByRole('option', { name: 'Select', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Record picker', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form', exact: true })).toBeVisible();
|
|
||||||
await expect(page.getByRole('option', { name: 'Sub-form(Popover)', exact: true })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('quick create', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Quick create' })).toBeVisible();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('title field', async ({ page, mockPage, mockRecords }) => {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, 'oneToOneHasOne');
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Title field' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage, mockRecords) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndAssociationFields).waitForInit();
|
|
||||||
const recordsOfUser = await mockRecords('users', 3);
|
|
||||||
await nocoPage.goto();
|
|
||||||
|
|
||||||
return recordsOfUser;
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-${fieldName}`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecords,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
mockRecords;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage, mockRecords);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
@ -1,81 +0,0 @@
|
|||||||
import { Page, expect, oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields, test } from '@nocobase/test/e2e';
|
|
||||||
import { commonTesting } from '../commonTesting';
|
|
||||||
|
|
||||||
test.describe('created at', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'createdAt', fieldType: 'system', mode: 'options' });
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'createdAt' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Date display format' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('created by', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'createdBy', fieldType: 'system', mode: 'options' });
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'createdBy' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('id', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'id', fieldType: 'system', mode: 'options' });
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'id' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('table oid', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'tableoid', fieldType: 'system', mode: 'options' });
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'tableoid' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
test.describe('last updated at', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'updatedAt', fieldType: 'system', mode: 'options' });
|
|
||||||
});
|
|
||||||
test.describe('last updated by', () => {
|
|
||||||
commonTesting({ openDialogAndShowMenu, fieldName: 'updatedBy', fieldType: 'system', mode: 'options' });
|
|
||||||
|
|
||||||
test('options', async ({ page, mockPage, mockRecord }) => {
|
|
||||||
await openDialogAndShowMenu({ page, mockPage, mockRecord, fieldName: 'updatedBy' });
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Edit tooltip' })).toBeVisible();
|
|
||||||
await expect(page.getByRole('menuitem', { name: 'Enable link' })).toBeVisible();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const gotoPage = async (mockPage) => {
|
|
||||||
const nocoPage = await mockPage(oneTableBlockWithAddNewAndViewAndEditAndSystemInfoFields).waitForInit();
|
|
||||||
await nocoPage.goto();
|
|
||||||
};
|
|
||||||
|
|
||||||
const openDialog = async (page: Page) => {
|
|
||||||
await page.getByRole('button', { name: 'Add new' }).click();
|
|
||||||
};
|
|
||||||
|
|
||||||
const showMenu = async (page: Page, fieldName: string) => {
|
|
||||||
await page.getByLabel(`block-item-CollectionField-general-form-general.${fieldName}-`).hover();
|
|
||||||
await page
|
|
||||||
.getByLabel(`designer-schema-settings-CollectionField-FormItem.Designer-general-general.${fieldName}`)
|
|
||||||
.hover();
|
|
||||||
};
|
|
||||||
|
|
||||||
async function openDialogAndShowMenu({
|
|
||||||
page,
|
|
||||||
mockPage,
|
|
||||||
mockRecord,
|
|
||||||
fieldName,
|
|
||||||
}: {
|
|
||||||
page: Page;
|
|
||||||
mockPage;
|
|
||||||
mockRecord;
|
|
||||||
fieldName: string;
|
|
||||||
}) {
|
|
||||||
await gotoPage(mockPage);
|
|
||||||
await openDialog(page);
|
|
||||||
await showMenu(page, fieldName);
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user