From 3c7b3f3caff5563d0f13b0076294a64e8e330f41 Mon Sep 17 00:00:00 2001 From: Rain <958414905@qq.com> Date: Sat, 29 Jul 2023 18:07:00 +0800 Subject: [PATCH] refactor: make testing more stable --- .../__tests__/date-picker.test.tsx | 29 ++++++++++++++++++- .../form-item/__tests__/form-item.test.tsx | 8 +++-- .../antd/form-item/demos/demo1.tsx | 25 +++++++++++++--- .../antd/form-v2/__tests__/form-v2.test.tsx | 15 +++++----- .../antd/form-v2/demos/demo1.tsx | 16 ++++++---- .../antd/form-v2/demos/demo2.tsx | 24 +++++++++------ .../antd/form-v2/demos/demo3.tsx | 25 ++++++++++------ .../antd/grid/__tests__/grid.test.tsx | 11 +++---- .../antd/grid/demos/demo2.tsx | 28 +++++++++++++++--- .../antd/kanban/demos/demo1.tsx | 24 +++++++++------ .../__tests__/record-picker.test.tsx | 15 ++++++---- .../antd/record-picker/demos/demo1.tsx | 16 ++++++---- .../schema-component/common/utils/uitls.tsx | 6 ++-- .../src/client/hooks/useThemeSettings.tsx | 5 ---- 14 files changed, 172 insertions(+), 75 deletions(-) diff --git a/packages/core/client/src/schema-component/antd/date-picker/__tests__/date-picker.test.tsx b/packages/core/client/src/schema-component/antd/date-picker/__tests__/date-picker.test.tsx index 920d9b85f3..95ab97a60e 100644 --- a/packages/core/client/src/schema-component/antd/date-picker/__tests__/date-picker.test.tsx +++ b/packages/core/client/src/schema-component/antd/date-picker/__tests__/date-picker.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen, userEvent, waitFor } from 'testUtils'; +import { render, screen, sleep, userEvent, waitFor } from 'testUtils'; import App1 from '../demos/demo1'; import App2 from '../demos/demo2'; import App3 from '../demos/demo3'; @@ -13,6 +13,9 @@ import App9 from '../demos/demo9'; describe('DatePicker', () => { it('basic', async () => { const { container, getByText } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const input = container.querySelector('input') as HTMLElement; @@ -35,6 +38,9 @@ describe('DatePicker', () => { it('GMT', async () => { const { container, getByText } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const input = container.querySelector('input') as HTMLElement; @@ -53,6 +59,9 @@ describe('DatePicker', () => { it('non-UTC', async () => { const { container } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const input = container.querySelector('input') as HTMLElement; @@ -74,6 +83,9 @@ describe('DatePicker', () => { describe('RangePicker', () => { it('GMT', async () => { const { container, getByPlaceholderText } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const startInput = getByPlaceholderText('Start date'); const endInput = getByPlaceholderText('End date'); @@ -92,6 +104,9 @@ describe('RangePicker', () => { it('non-GMT', async () => { const { container, getByPlaceholderText } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const startInput = getByPlaceholderText('Start date'); const endInput = getByPlaceholderText('End date'); @@ -115,6 +130,9 @@ describe('RangePicker', () => { it('non-UTC', async () => { const { container, getByPlaceholderText } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const startInput = getByPlaceholderText('Start date'); const endInput = getByPlaceholderText('End date'); @@ -133,6 +151,9 @@ describe('RangePicker', () => { it('showTime=false,gmt=true,utc=true', async () => { const { container } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const input = container.querySelector('input') as HTMLElement; @@ -152,6 +173,9 @@ describe('RangePicker', () => { it('showTime=false,gmt=false,utc=true', async () => { const { container } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; const input = container.querySelector('input') as HTMLElement; @@ -175,6 +199,9 @@ describe('RangePicker', () => { it('showTime=false,gmt=true,utc=true & not input', async () => { const currentDateString = new Date().toISOString().split('T')[0]; const { container } = render(); + + await sleep(); + const picker = container.querySelector('.ant-picker') as HTMLElement; await userEvent.click(picker); diff --git a/packages/core/client/src/schema-component/antd/form-item/__tests__/form-item.test.tsx b/packages/core/client/src/schema-component/antd/form-item/__tests__/form-item.test.tsx index 8c82583398..00f093a188 100644 --- a/packages/core/client/src/schema-component/antd/form-item/__tests__/form-item.test.tsx +++ b/packages/core/client/src/schema-component/antd/form-item/__tests__/form-item.test.tsx @@ -1,11 +1,13 @@ import React from 'react'; -import { render, screen } from 'testUtils'; +import { render, screen, waitFor } from 'testUtils'; import App1 from '../demos/demo1'; describe('FormItem', () => { - it('should render correctly', () => { + it('should render correctly', async () => { render(); - expect(screen.getByText('title')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByText('title')).toBeInTheDocument(); + }); }); }); diff --git a/packages/core/client/src/schema-component/antd/form-item/demos/demo1.tsx b/packages/core/client/src/schema-component/antd/form-item/demos/demo1.tsx index 0504a3ad87..8c970f3e30 100644 --- a/packages/core/client/src/schema-component/antd/form-item/demos/demo1.tsx +++ b/packages/core/client/src/schema-component/antd/form-item/demos/demo1.tsx @@ -1,5 +1,18 @@ -import { FormItem, FormProvider, Input, SchemaComponent } from '@nocobase/client'; +import { + APIClientProvider, + CurrentUserProvider, + FormItem, + FormProvider, + Input, + SchemaComponent, +} from '@nocobase/client'; import React from 'react'; +import { mockAPIClient } from '../../../../test'; + +const { apiClient, mockRequest } = mockAPIClient(); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); const schema = { type: 'object', @@ -15,8 +28,12 @@ const schema = { export default () => { return ( - - - + + + + + + + ); }; diff --git a/packages/core/client/src/schema-component/antd/form-v2/__tests__/form-v2.test.tsx b/packages/core/client/src/schema-component/antd/form-v2/__tests__/form-v2.test.tsx index 6f863d02f3..69822a2dd1 100644 --- a/packages/core/client/src/schema-component/antd/form-v2/__tests__/form-v2.test.tsx +++ b/packages/core/client/src/schema-component/antd/form-v2/__tests__/form-v2.test.tsx @@ -8,11 +8,13 @@ describe('FormV2', () => { it('basic', async () => { render(); - const input = document.querySelector('.ant-input') as HTMLInputElement; - const submit = screen.getByText('Submit'); - - expect(input).toBeInTheDocument(); - expect(screen.getByText('Nickname')).toBeInTheDocument(); + let input, submit; + await waitFor(() => { + input = document.querySelector('.ant-input') as HTMLInputElement; + submit = screen.getByText('Submit'); + expect(input).toBeInTheDocument(); + expect(screen.queryByText('Nickname')).toBeInTheDocument(); + }); await userEvent.type(input, '李四'); await userEvent.click(submit); @@ -41,8 +43,7 @@ describe('FormV2', () => { }); }); - // TODO: 等 @Testing-Library 升级到 14.x - it.skip('read pretty', async () => { + it('read pretty', async () => { render(); await waitFor(() => { diff --git a/packages/core/client/src/schema-component/antd/form-v2/demos/demo1.tsx b/packages/core/client/src/schema-component/antd/form-v2/demos/demo1.tsx index e44e8217de..ce56edbffb 100644 --- a/packages/core/client/src/schema-component/antd/form-v2/demos/demo1.tsx +++ b/packages/core/client/src/schema-component/antd/form-v2/demos/demo1.tsx @@ -4,6 +4,7 @@ import { Action, CollectionField, CollectionManagerProvider, + CurrentUserProvider, FormBlockProvider, FormItem, FormV2, @@ -26,6 +27,9 @@ mockRequest.onPost('/users:update').reply((params) => { }); return [200, JSON.parse(params.data)]; }); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); function useAction() { const ctx = useFormBlockContext(); @@ -82,11 +86,13 @@ const schema: ISchema = { export default () => { return ( - - - - - + + + + + + + ); }; diff --git a/packages/core/client/src/schema-component/antd/form-v2/demos/demo2.tsx b/packages/core/client/src/schema-component/antd/form-v2/demos/demo2.tsx index 42d7cb4714..a1179c8772 100644 --- a/packages/core/client/src/schema-component/antd/form-v2/demos/demo2.tsx +++ b/packages/core/client/src/schema-component/antd/form-v2/demos/demo2.tsx @@ -5,6 +5,7 @@ import { BlockSchemaComponentProvider, CollectionField, CollectionManagerProvider, + CurrentUserProvider, FormBlockProvider, FormItem, FormV2, @@ -36,6 +37,9 @@ mockRequest.onPost('/users:update').reply((params) => { }); return [200, JSON.parse(params.data)]; }); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); const useAction = () => { const ctx = useFormBlockContext(); @@ -107,15 +111,17 @@ const schema: ISchema = { export default () => { return ( - - - - - - - + + + + + + + + + ); }; diff --git a/packages/core/client/src/schema-component/antd/form-v2/demos/demo3.tsx b/packages/core/client/src/schema-component/antd/form-v2/demos/demo3.tsx index 20dca36078..38a9c352e2 100644 --- a/packages/core/client/src/schema-component/antd/form-v2/demos/demo3.tsx +++ b/packages/core/client/src/schema-component/antd/form-v2/demos/demo3.tsx @@ -5,9 +5,11 @@ import { BlockSchemaComponentProvider, CollectionField, CollectionManagerProvider, + CurrentUserProvider, FormBlockProvider, FormItem, FormV2, + Grid, Input, Password, SchemaComponent, @@ -26,6 +28,9 @@ mockRequest.onGet('/users:get').reply(200, { password: '123456', }, }); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); const schema: ISchema = { type: 'object', @@ -93,15 +98,17 @@ const schema: ISchema = { export default () => { return ( - - - - - - - + + + + + + + + + ); }; diff --git a/packages/core/client/src/schema-component/antd/grid/__tests__/grid.test.tsx b/packages/core/client/src/schema-component/antd/grid/__tests__/grid.test.tsx index bb0ace2a66..efab591226 100644 --- a/packages/core/client/src/schema-component/antd/grid/__tests__/grid.test.tsx +++ b/packages/core/client/src/schema-component/antd/grid/__tests__/grid.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render, screen } from 'testUtils'; +import { render, screen, waitFor } from 'testUtils'; import App1 from '../demos/demo1'; import App2 from '../demos/demo2'; import App3 from '../demos/demo3'; @@ -14,12 +14,13 @@ describe('Grid', () => { expect(screen.getByText('Block 1')).toBeInTheDocument(); }); - it('input', () => { + it('input', async () => { render(); - const inputs = document.querySelectorAll('.ant-input'); - - expect(inputs.length).toBe(3); + await waitFor(() => { + const inputs = document.querySelectorAll('.ant-input'); + expect(inputs.length).toBe(3); + }); }); it('initializer', () => { diff --git a/packages/core/client/src/schema-component/antd/grid/demos/demo2.tsx b/packages/core/client/src/schema-component/antd/grid/demos/demo2.tsx index 4f6055acda..52b01236fc 100644 --- a/packages/core/client/src/schema-component/antd/grid/demos/demo2.tsx +++ b/packages/core/client/src/schema-component/antd/grid/demos/demo2.tsx @@ -1,8 +1,24 @@ import { ISchema } from '@formily/react'; import { uid } from '@formily/shared'; -import { Form, FormItem, Grid, Input, SchemaComponent, SchemaComponentProvider } from '@nocobase/client'; +import { + APIClientProvider, + CurrentUserProvider, + Form, + FormItem, + Grid, + Input, + SchemaComponent, + SchemaComponentProvider, +} from '@nocobase/client'; import React from 'react'; +import { mockAPIClient } from '../../../../test'; + +const { apiClient, mockRequest } = mockAPIClient(); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); + const schema: ISchema = { type: 'void', name: 'grid1', @@ -54,8 +70,12 @@ const schema: ISchema = { export default function App() { return ( - - - + + + + + + + ); } diff --git a/packages/core/client/src/schema-component/antd/kanban/demos/demo1.tsx b/packages/core/client/src/schema-component/antd/kanban/demos/demo1.tsx index 9535c96c7d..89ca547e6e 100644 --- a/packages/core/client/src/schema-component/antd/kanban/demos/demo1.tsx +++ b/packages/core/client/src/schema-component/antd/kanban/demos/demo1.tsx @@ -4,6 +4,7 @@ import { APIClientProvider, BlockSchemaComponentProvider, CollectionManagerProvider, + CurrentUserProvider, SchemaComponent, SchemaComponentProvider, } from '@nocobase/client'; @@ -19,6 +20,9 @@ mockRequest.onGet('/t_j6omof6tza8:list').reply(async (config) => { await sleep(200); return [200, data]; }); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); const schema: ISchema = { type: 'object', @@ -69,15 +73,17 @@ const schema: ISchema = { export default () => { return ( - - - - - - - - - + + + + + + + + + + + ); }; diff --git a/packages/core/client/src/schema-component/antd/record-picker/__tests__/record-picker.test.tsx b/packages/core/client/src/schema-component/antd/record-picker/__tests__/record-picker.test.tsx index a73b04ec4d..04deedeb66 100644 --- a/packages/core/client/src/schema-component/antd/record-picker/__tests__/record-picker.test.tsx +++ b/packages/core/client/src/schema-component/antd/record-picker/__tests__/record-picker.test.tsx @@ -6,15 +6,18 @@ describe('RecordPicker', () => { it('should show selected options', async () => { render(); - const selector = document.querySelector('.ant-select-selector') as HTMLElement; - expect(selector).toBeInTheDocument(); + let selector; + await waitFor(() => { + selector = document.querySelector('.ant-select-selector') as HTMLElement; + expect(selector).toBeInTheDocument(); + }); await userEvent.click(selector); - await waitFor(() => { // 弹窗标题 - expect(screen.getByText(/select record/i)).toBeInTheDocument(); + expect(screen.queryByText(/select record/i)).toBeInTheDocument(); }); + const checkboxes = document.querySelectorAll('.ant-checkbox'); // 第 3 个选项的内容是: “软件开发” @@ -22,8 +25,8 @@ describe('RecordPicker', () => { await userEvent.click(screen.getByText(/submit/i)); await waitFor(() => { - expect(within(selector).getByText(/软件开发/i)).toBeInTheDocument(); - expect(screen.getByText(/软件开发/i, { selector: '.test-record-picker-read-pretty-item' })).toBeInTheDocument(); + expect(within(selector).queryByText(/软件开发/i)).toBeInTheDocument(); + expect(screen.queryByText(/软件开发/i, { selector: '.test-record-picker-read-pretty-item' })).toBeInTheDocument(); }); }); }); diff --git a/packages/core/client/src/schema-component/antd/record-picker/demos/demo1.tsx b/packages/core/client/src/schema-component/antd/record-picker/demos/demo1.tsx index 19421043de..54978e8beb 100644 --- a/packages/core/client/src/schema-component/antd/record-picker/demos/demo1.tsx +++ b/packages/core/client/src/schema-component/antd/record-picker/demos/demo1.tsx @@ -9,6 +9,7 @@ import { BlockItem, CollectionField, CollectionManagerProvider, + CurrentUserProvider, FormItem, Input, RecordPicker, @@ -23,6 +24,9 @@ import data from './mockData'; const { apiClient, mockRequest } = mockAPIClient(); +mockRequest.onGet('/auth:check').reply(() => { + return [200, { data: {} }]; +}); mockRequest.onGet('/tt_bd_range:list').reply(({ params }) => { // 已选中的 id const ids = JSON.parse(params.filter).$and?.[0]?.['id.$ne'] || []; @@ -172,11 +176,13 @@ export default () => { return ( - - - - - + + + + + + + ); }; diff --git a/packages/core/client/src/schema-component/common/utils/uitls.tsx b/packages/core/client/src/schema-component/common/utils/uitls.tsx index fcf584efd7..1512549a36 100644 --- a/packages/core/client/src/schema-component/common/utils/uitls.tsx +++ b/packages/core/client/src/schema-component/common/utils/uitls.tsx @@ -14,18 +14,18 @@ type VariablesCtx = { }; export const useVariablesCtx = (): VariablesCtx => { - const { data } = useCurrentUserContext() || {}; + const currentUser = useCurrentUserContext(); const { field, service, rowKey } = useTableBlockContext(); const contextData = service?.data?.data?.filter((v) => (field?.data?.selectedRowKeys || [])?.includes(v[rowKey])); return useMemo(() => { return { - $user: data?.data || {}, + $user: currentUser?.data?.data || {}, $date: { now: () => dayjs().toISOString(), }, $context: contextData, }; - }, [data]); + }, [contextData, currentUser?.data?.data]); }; export const isVariable = (str: unknown) => { diff --git a/packages/plugins/theme-editor/src/client/hooks/useThemeSettings.tsx b/packages/plugins/theme-editor/src/client/hooks/useThemeSettings.tsx index 4322b1357a..914d8864b3 100644 --- a/packages/plugins/theme-editor/src/client/hooks/useThemeSettings.tsx +++ b/packages/plugins/theme-editor/src/client/hooks/useThemeSettings.tsx @@ -68,11 +68,6 @@ function Label() { return null; } - if (!currentUser) { - error('Please check if provide `CurrentUserProvider` in your app.'); - throw new Error('Please check if provide `CurrentUserProvider` in your app.'); - } - if (!systemSettings) { error('Please check if provide `SystemSettingsProvider` in your app.'); throw new Error('Please check if provide `SystemSettingsProvider` in your app.');