From 587f160a234dd434a46608b99076dc79218f30b5 Mon Sep 17 00:00:00 2001 From: lizhensheng Date: Tue, 27 Feb 2024 14:06:47 +0800 Subject: [PATCH 1/2] [test]:(useOpPermission, SideMenu) Supplementary testing coverage --- jest.config.js | 3 +- .../__snapshots__/index.test.tsx.snap | 201 + .../src/hooks/useOpPermission/index.data.tsx | 6 +- .../src/hooks/useOpPermission/index.test.tsx | 30 +- .../MockSelectItemOptions.test.tsx | 0 .../MockSelectItemOptions.test.tsx.snap | 0 .../__snapshots__/index.test.tsx.snap | 0 .../{test => __tests__}/index.test.tsx | 0 .../__snapshots__/index.ce.test.tsx.snap | 704 ++++ .../__snapshots__/index.test.tsx.snap | 3388 +++++++++++++++++ .../Nav/SideMenu/__tests__/index.ce.test.tsx | 28 + .../Nav/SideMenu/__tests__/index.test.tsx | 123 + .../useRecentlyOpenedProjects.test.ts | 311 ++ .../Nav/SideMenu/useRecentlyOpenedProjects.ts | 2 +- 14 files changed, 4791 insertions(+), 5 deletions(-) create mode 100644 packages/base/src/hooks/useOpPermission/__snapshots__/index.test.tsx.snap rename packages/base/src/page/Nav/SideMenu/ProjectSelector/{test => __tests__}/MockSelectItemOptions.test.tsx (100%) rename packages/base/src/page/Nav/SideMenu/ProjectSelector/{test => __tests__}/__snapshots__/MockSelectItemOptions.test.tsx.snap (100%) rename packages/base/src/page/Nav/SideMenu/ProjectSelector/{test => __tests__}/__snapshots__/index.test.tsx.snap (100%) rename packages/base/src/page/Nav/SideMenu/ProjectSelector/{test => __tests__}/index.test.tsx (100%) create mode 100644 packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.ce.test.tsx.snap create mode 100644 packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap create mode 100644 packages/base/src/page/Nav/SideMenu/__tests__/index.ce.test.tsx create mode 100644 packages/base/src/page/Nav/SideMenu/__tests__/index.test.tsx create mode 100644 packages/base/src/page/Nav/SideMenu/__tests__/useRecentlyOpenedProjects.test.ts diff --git a/jest.config.js b/jest.config.js index d432f1676..bae6934ce 100644 --- a/jest.config.js +++ b/jest.config.js @@ -39,7 +39,8 @@ module.exports = { 'packages/shared/api/common/**', '!packages/**/index.type.ts', '!packages/**/index.enum.ts', - '!packages/sqle/src/page/AuditPlan/**' + '!packages/sqle/src/page/AuditPlan/**', + '!packages/shared/lib/hooks/usePrompt/index.tsx' ], setupFilesAfterEnv: ['/jest-setup.ts'], reporters: [ diff --git a/packages/base/src/hooks/useOpPermission/__snapshots__/index.test.tsx.snap b/packages/base/src/hooks/useOpPermission/__snapshots__/index.test.tsx.snap new file mode 100644 index 000000000..bcf05a26b --- /dev/null +++ b/packages/base/src/hooks/useOpPermission/__snapshots__/index.test.tsx.snap @@ -0,0 +1,201 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test useManagerPermission should render options when use generateOpPermissionSelectOptions 1`] = ` + +
+
+
+
+ + + + + test opPermission 1 + +
+ +
+
+ +`; + +exports[`test useManagerPermission should render options when use generateOpPermissionSelectOptions 2`] = ` + +
+
+
+
+ + + + + test opPermission 1 + +
+ +
+
+
+
+
+
+
+
+ + + + + + + + + +
+
+ No data +
+
+
+
+
+
+ +`; diff --git a/packages/base/src/hooks/useOpPermission/index.data.tsx b/packages/base/src/hooks/useOpPermission/index.data.tsx index 4d15bd7df..1c332323e 100644 --- a/packages/base/src/hooks/useOpPermission/index.data.tsx +++ b/packages/base/src/hooks/useOpPermission/index.data.tsx @@ -1,8 +1,10 @@ -import { StringDictionary } from '@actiontech/shared/lib/types/common.type'; import { t } from '../../locale'; import { ListMemberRoleWithOpRangeOpRangeTypeEnum } from '@actiontech/shared/lib/api/base/service/common.enum'; -const rangeTypeDictionary: StringDictionary = { +const rangeTypeDictionary: Record< + keyof typeof ListMemberRoleWithOpRangeOpRangeTypeEnum, + string +> = { [ListMemberRoleWithOpRangeOpRangeTypeEnum.global]: t( 'dmsUserCenter.role.opPermissionList.rangeTypeDictionary.global' ), diff --git a/packages/base/src/hooks/useOpPermission/index.test.tsx b/packages/base/src/hooks/useOpPermission/index.test.tsx index d116615bc..b432594b9 100644 --- a/packages/base/src/hooks/useOpPermission/index.test.tsx +++ b/packages/base/src/hooks/useOpPermission/index.test.tsx @@ -1,4 +1,11 @@ -import { cleanup, act, renderHook } from '@testing-library/react'; +import { + cleanup, + act, + renderHook, + render, + fireEvent, + screen +} from '@testing-library/react'; import useOpPermission from '.'; import userCenter from '../../testUtils/mockApi/userCenter'; import { opPermissionList } from '../../testUtils/mockApi/userCenter/data'; @@ -6,6 +13,7 @@ import { createSpyErrorResponse, createSpyFailResponse } from '@actiontech/shared/lib/testUtil/mockApi'; +import { Select } from 'antd'; describe('test useManagerPermission', () => { let listOpPermissionSpy: jest.SpyInstance; @@ -58,4 +66,24 @@ describe('test useManagerPermission', () => { await act(async () => jest.advanceTimersByTime(3000)); expect(result.current.opPermissionList).toEqual([]); }); + + it('should render options when use generateOpPermissionSelectOptions', async () => { + const { result } = renderHook(() => useOpPermission()); + const { baseElement: baseElementWithOptions } = render( + + ); + + await act(async () => jest.advanceTimersByTime(3000)); + expect(baseElementWithOptions).toMatchSnapshot(); + + await act(() => { + fireEvent.mouseDown(screen.getByText('test opPermission 1')); + jest.runAllTimers(); + }); + + await screen.findAllByText('test opPermission 1'); + expect(baseElementWithOptions).toMatchSnapshot(); + }); }); diff --git a/packages/base/src/page/Nav/SideMenu/ProjectSelector/test/MockSelectItemOptions.test.tsx b/packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/MockSelectItemOptions.test.tsx similarity index 100% rename from packages/base/src/page/Nav/SideMenu/ProjectSelector/test/MockSelectItemOptions.test.tsx rename to packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/MockSelectItemOptions.test.tsx diff --git a/packages/base/src/page/Nav/SideMenu/ProjectSelector/test/__snapshots__/MockSelectItemOptions.test.tsx.snap b/packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/__snapshots__/MockSelectItemOptions.test.tsx.snap similarity index 100% rename from packages/base/src/page/Nav/SideMenu/ProjectSelector/test/__snapshots__/MockSelectItemOptions.test.tsx.snap rename to packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/__snapshots__/MockSelectItemOptions.test.tsx.snap diff --git a/packages/base/src/page/Nav/SideMenu/ProjectSelector/test/__snapshots__/index.test.tsx.snap b/packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/__snapshots__/index.test.tsx.snap similarity index 100% rename from packages/base/src/page/Nav/SideMenu/ProjectSelector/test/__snapshots__/index.test.tsx.snap rename to packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/__snapshots__/index.test.tsx.snap diff --git a/packages/base/src/page/Nav/SideMenu/ProjectSelector/test/index.test.tsx b/packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/index.test.tsx similarity index 100% rename from packages/base/src/page/Nav/SideMenu/ProjectSelector/test/index.test.tsx rename to packages/base/src/page/Nav/SideMenu/ProjectSelector/__tests__/index.test.tsx diff --git a/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.ce.test.tsx.snap b/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.ce.test.tsx.snap new file mode 100644 index 000000000..23521fa51 --- /dev/null +++ b/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.ce.test.tsx.snap @@ -0,0 +1,704 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test base/Nav/SideMenu/index.ce should match snapshot 1`] = ` +
+
+
+
+
+ + Action + + + SQLE + +
+
+
+ + + + + + + default + +
+ + +
+
+
+ + + A + + +
+
+
+ + + + + + +
+
+
+
+`; diff --git a/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap b/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap new file mode 100644 index 000000000..14b0f5e5f --- /dev/null +++ b/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap @@ -0,0 +1,3388 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test Base/Nav/SideMenu/index mount and unmount component 1`] = ` + +
+
+
+
+
+ + Action + + + SQLE + +
+
+
+
+
+ + + + + + +
+
+
+
+
+ + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+ + + A + + +
+
+
+ + + + + + +
+
+
+
+ +`; + +exports[`test Base/Nav/SideMenu/index mount and unmount component 2`] = ` + +
+
+
+
+
+ + Action + + + SQLE + +
+
+
+
+
+
+ + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+ + + A + + +
+
+
+ + + + + + +
+
+
+
+ +`; + +exports[`test Base/Nav/SideMenu/index mount and unmount component 3`] = ` + +
+
+
+
+
+ + Action + + + SQLE + +
+
+
+
+
+
+ + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+ + + A + + +
+
+
+ + + + + + +
+
+
+
+ +`; + +exports[`test Base/Nav/SideMenu/index mount and unmount component 4`] = ` + +
+
+
+
+
+ + Action + + + SQLE + +
+
+
+
+
+
+ + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+
+ + + A + + +
+
+
+ + + + + + +
+
+
+
+
+
+
+
+ + + + + + + + + + + + +
+ 最近打开的项目 +
+
+
+
+ 100121 +
+
+
+
+
+
+
+
+
+ + + + + test_project_1 + +
+
+
+
+
+
+ +
+
+ 您所属的项目 +
+
+
+
+
+ + + + + test_project_1 + +
+
+
+
+
+
+ + + + + + + test_project_2 + +
+
+
+
+
+
+ + + + + test_project_3 + +
+
+
+
+ +
+
+
+
+ +`; diff --git a/packages/base/src/page/Nav/SideMenu/__tests__/index.ce.test.tsx b/packages/base/src/page/Nav/SideMenu/__tests__/index.ce.test.tsx new file mode 100644 index 000000000..117737fe1 --- /dev/null +++ b/packages/base/src/page/Nav/SideMenu/__tests__/index.ce.test.tsx @@ -0,0 +1,28 @@ +/** + * @test_version ce + */ + +import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser'; +import { superRender } from '../../../../testUtils/customRender'; +import { mockSystemConfig } from '../../../../testUtils/mockHooks/mockSystemConfig'; +import CESideMenu from '../index.ce'; +import { act } from '@testing-library/react'; + +describe('test base/Nav/SideMenu/index.ce', () => { + beforeEach(() => { + mockSystemConfig(); + mockUseCurrentUser(); + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.useRealTimers(); + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + it('should match snapshot', async () => { + const { container } = superRender(); + await act(async () => jest.advanceTimersByTime(0)); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/packages/base/src/page/Nav/SideMenu/__tests__/index.test.tsx b/packages/base/src/page/Nav/SideMenu/__tests__/index.test.tsx new file mode 100644 index 000000000..6744c697c --- /dev/null +++ b/packages/base/src/page/Nav/SideMenu/__tests__/index.test.tsx @@ -0,0 +1,123 @@ +import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser'; +import { mockUseRecentlyOpenedProjects } from '../testUtils/mockUseRecentlyOpenedProjects'; +import project from '../../../../testUtils/mockApi/project'; +import { superRender } from '../../../../testUtils/customRender'; +import SideMenu from '..'; +import eventEmitter from '../../../../utils/EventEmitter'; +import { act, fireEvent, screen } from '@testing-library/react'; +import EmitterKey from '../../../../data/EmitterKey'; +import { ignoreComponentCustomAttr } from '@actiontech/shared/lib/testUtil/common'; +import { useDispatch } from 'react-redux'; +import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery'; +import { useNavigate } from 'react-router-dom'; +import { mockProjectList } from '../../../../testUtils/mockApi/project/data'; +import { ModalName } from '../../../../data/ModalName'; + +jest.mock('react-redux', () => { + return { + ...jest.requireActual('react-redux'), + useDispatch: jest.fn() + }; +}); + +jest.mock('react-router-dom', () => { + return { + ...jest.requireActual('react-router-dom'), + useNavigate: jest.fn() + }; +}); + +describe('test Base/Nav/SideMenu/index', () => { + let getProjectsSpy: jest.SpyInstance; + let subscribeSpy: jest.SpyInstance; + + const dispatchSpy = jest.fn(); + const navigateSpy = jest.fn(); + const unsubscribeSpy = jest.fn(); + + const mockBindProjects = mockProjectList.map((v) => ({ + project_id: v.uid ?? '', + project_name: v.name ?? '', + archived: !!v.archived, + is_manager: false + })); + + ignoreComponentCustomAttr(); + beforeEach(() => { + subscribeSpy = jest + .spyOn(eventEmitter, 'subscribe') + .mockImplementation(() => ({ unsubscribe: unsubscribeSpy })); + jest.useFakeTimers(); + mockUseCurrentUser({ + bindProjects: mockBindProjects + }); + mockUseRecentlyOpenedProjects({ + currentProjectID: mockBindProjects[0].project_id, + recentlyProjects: [ + { + project_id: mockBindProjects[0].project_id, + project_name: mockBindProjects[0].project_name + } + ] + }); + + getProjectsSpy = project.getProjectList(); + (useDispatch as jest.Mock).mockImplementation(() => dispatchSpy); + (useNavigate as jest.Mock).mockImplementation(() => navigateSpy); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + jest.useRealTimers(); + }); + it('mount and unmount component', async () => { + const { baseElement, unmount } = superRender(); + expect(baseElement).toMatchSnapshot(); + expect(getProjectsSpy).toBeCalledTimes(1); + expect(getProjectsSpy).toBeCalledWith({ page_size: 9999 }); + expect(subscribeSpy).toBeCalledTimes(1); + expect(subscribeSpy.mock.calls[0][0]).toBe( + EmitterKey.DMS_Sync_Project_Archived_Status + ); + + await act(async () => jest.advanceTimersByTime(3000)); + expect(dispatchSpy).nthCalledWith(1, { + type: 'nav/initModalStatus', + payload: { + modalStatus: { + [ModalName.Company_Notice]: false + } + } + }); + expect(dispatchSpy).nthCalledWith(2, { + type: 'user/updateBindProjects', + payload: { + bindProjects: mockBindProjects + } + }); + expect(baseElement).toMatchSnapshot(); + + expect(baseElement).toMatchSnapshot(); + + fireEvent.mouseDown(getBySelector('.ant-select-selector'), baseElement); + await act(async () => jest.advanceTimersByTime(0)); + + expect(baseElement).toMatchSnapshot(); + + unmount(); + expect(unsubscribeSpy).toBeCalledTimes(1); + }); + + it('Click on the menu of the project selector', async () => { + const { baseElement } = superRender(); + await act(async () => jest.advanceTimersByTime(3000)); + fireEvent.mouseDown(getBySelector('.ant-select-selector'), baseElement); + await act(async () => jest.advanceTimersByTime(300)); + fireEvent.click(screen.getByText(mockBindProjects[1].project_name)); + expect(navigateSpy).toBeCalledTimes(1); + expect(navigateSpy).toBeCalledWith( + `/sqle/project/${mockBindProjects[1].project_id}/overview` + ); + }); +}); diff --git a/packages/base/src/page/Nav/SideMenu/__tests__/useRecentlyOpenedProjects.test.ts b/packages/base/src/page/Nav/SideMenu/__tests__/useRecentlyOpenedProjects.test.ts new file mode 100644 index 000000000..a564e09d5 --- /dev/null +++ b/packages/base/src/page/Nav/SideMenu/__tests__/useRecentlyOpenedProjects.test.ts @@ -0,0 +1,311 @@ +import { LocalStorageWrapper } from '@actiontech/shared'; +import { act, renderHook } from '@testing-library/react'; +import useRecentlyOpenedProjects from '../useRecentlyOpenedProjects'; +import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser'; +import { StorageKey } from '@actiontech/shared/lib/enum'; +import { mockCurrentUserReturn } from '@actiontech/shared/lib/testUtil/mockHook/data'; +import eventEmitter from '../../../../utils/EventEmitter'; +import EmitterKey from '../../../../data/EmitterKey'; +import EventEmitter from '../../../../utils/EventEmitter'; + +describe('test useRecentlyOpenedProjects.test', () => { + beforeEach(() => { + mockUseCurrentUser(); + }); + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + const username1 = 'admin'; + const username2 = 'test'; + + const bindProjects = [ + { + is_manager: true, + project_name: 'default', + project_id: '300', + archived: false + }, + { + is_manager: false, + project_name: 'default1', + project_id: '400', + archived: false + }, + { + is_manager: false, + project_name: 'default2', + project_id: '500', + archived: false + }, + { + is_manager: false, + project_name: 'default3', + project_id: '600', + archived: false + }, + { + is_manager: false, + project_name: 'default4', + project_id: '700', + archived: false + } + ]; + + it('should output error message when "JSON.parse" throws an exception', () => { + const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); + const LocalStorageWrapperGetSpy = jest.spyOn(LocalStorageWrapper, 'get'); + + LocalStorageWrapperGetSpy.mockReturnValue(''); + + const { result } = renderHook(() => useRecentlyOpenedProjects()); + + expect(result.current.recentlyProjects).toEqual([]); + + LocalStorageWrapperGetSpy.mockReturnValue( + '{admin: [{project_id:1, project_name:"default"}]' + ); + + renderHook(() => useRecentlyOpenedProjects()); + expect(errorSpy).toBeCalledTimes(1); + }); + + it('should perform as expected with update operation', () => { + const emitSpy = jest.spyOn(eventEmitter, 'emit'); + mockUseCurrentUser({ + username: username1, + bindProjects + }); + const LocalStorageWrapperSetSpy = jest.spyOn(LocalStorageWrapper, 'set'); + const { result } = renderHook(() => useRecentlyOpenedProjects()); + + expect(emitSpy).toBeCalledTimes(0); + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(0); + + act(() => { + result.current.updateRecentlyProject('401', 'not_bind_project'); + }); + + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(0); + + act(() => { + result.current.updateRecentlyProject('400', 'default1'); + }); + expect(result.current.currentProjectID).toBe('400'); + expect(emitSpy).toBeCalledTimes(2); + expect(emitSpy).nthCalledWith( + 1, + EmitterKey.Update_Current_Project_ID, + '400' + ); + expect(emitSpy).nthCalledWith( + 2, + EmitterKey.Update_Recently_Opened_Projects, + { + [username1]: [{ project_id: '400', project_name: 'default1' }] + } + ); + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(1); + expect(LocalStorageWrapperSetSpy).nthCalledWith( + 1, + StorageKey.DMS_Project_Catch, + JSON.stringify({ + [username1]: [{ project_id: '400', project_name: 'default1' }] + }) + ); + + expect(result.current.recentlyProjects).toEqual([ + { project_id: '400', project_name: 'default1' } + ]); + + act(() => { + result.current.updateRecentlyProject('500', 'default2'); + }); + + expect(result.current.currentProjectID).toBe('500'); + expect(emitSpy).toBeCalledTimes(4); + expect(emitSpy).nthCalledWith( + 3, + EmitterKey.Update_Current_Project_ID, + '500' + ); + expect(emitSpy).nthCalledWith( + 4, + EmitterKey.Update_Recently_Opened_Projects, + { + [username1]: [ + { project_id: '500', project_name: 'default2' }, + { project_id: '400', project_name: 'default1' } + ] + } + ); + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(2); + expect(LocalStorageWrapperSetSpy).nthCalledWith( + 2, + StorageKey.DMS_Project_Catch, + JSON.stringify({ + [username1]: [ + { project_id: '500', project_name: 'default2' }, + { project_id: '400', project_name: 'default1' } + ] + }) + ); + + expect(result.current.recentlyProjects).toEqual([ + { project_id: '500', project_name: 'default2' }, + { project_id: '400', project_name: 'default1' } + ]); + + act(() => { + result.current.updateRecentlyProject('600', 'default3'); + }); + + expect(result.current.currentProjectID).toBe('600'); + expect(emitSpy).toBeCalledTimes(6); + expect(emitSpy).nthCalledWith( + 5, + EmitterKey.Update_Current_Project_ID, + '600' + ); + expect(emitSpy).nthCalledWith( + 6, + EmitterKey.Update_Recently_Opened_Projects, + { + [username1]: [ + { project_id: '600', project_name: 'default3' }, + { project_id: '500', project_name: 'default2' }, + { project_id: '400', project_name: 'default1' } + ] + } + ); + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(3); + expect(LocalStorageWrapperSetSpy).nthCalledWith( + 3, + StorageKey.DMS_Project_Catch, + JSON.stringify({ + [username1]: [ + { project_id: '600', project_name: 'default3' }, + { project_id: '500', project_name: 'default2' }, + { project_id: '400', project_name: 'default1' } + ] + }) + ); + + expect(result.current.recentlyProjects).toEqual([ + { project_id: '600', project_name: 'default3' }, + { project_id: '500', project_name: 'default2' }, + { project_id: '400', project_name: 'default1' } + ]); + + act(() => { + result.current.updateRecentlyProject('700', 'default4'); + }); + + expect(result.current.currentProjectID).toBe('700'); + expect(emitSpy).toBeCalledTimes(8); + expect(emitSpy).nthCalledWith( + 7, + EmitterKey.Update_Current_Project_ID, + '700' + ); + expect(emitSpy).nthCalledWith( + 8, + EmitterKey.Update_Recently_Opened_Projects, + { + [username1]: [ + { project_id: '700', project_name: 'default4' }, + { project_id: '600', project_name: 'default3' }, + { project_id: '500', project_name: 'default2' } + ] + } + ); + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(4); + expect(LocalStorageWrapperSetSpy).nthCalledWith( + 4, + StorageKey.DMS_Project_Catch, + JSON.stringify({ + [username1]: [ + { project_id: '700', project_name: 'default4' }, + { project_id: '600', project_name: 'default3' }, + { project_id: '500', project_name: 'default2' } + ] + }) + ); + + expect(result.current.recentlyProjects).toEqual([ + { project_id: '700', project_name: 'default4' }, + { project_id: '600', project_name: 'default3' }, + { project_id: '500', project_name: 'default2' } + ]); + + act(() => { + result.current.updateRecentlyProject('600', 'default3'); + }); + + expect(result.current.currentProjectID).toBe('600'); + expect(emitSpy).toBeCalledTimes(10); + expect(emitSpy).nthCalledWith( + 9, + EmitterKey.Update_Current_Project_ID, + '600' + ); + expect(emitSpy).nthCalledWith( + 10, + EmitterKey.Update_Recently_Opened_Projects, + { + [username1]: [ + { project_id: '600', project_name: 'default3' }, + { project_id: '700', project_name: 'default4' }, + { project_id: '500', project_name: 'default2' } + ] + } + ); + expect(LocalStorageWrapperSetSpy).toBeCalledTimes(5); + expect(LocalStorageWrapperSetSpy).nthCalledWith( + 5, + StorageKey.DMS_Project_Catch, + JSON.stringify({ + [username1]: [ + { project_id: '600', project_name: 'default3' }, + { project_id: '700', project_name: 'default4' }, + { project_id: '500', project_name: 'default2' } + ] + }) + ); + + expect(result.current.recentlyProjects).toEqual([ + { project_id: '600', project_name: 'default3' }, + { project_id: '700', project_name: 'default4' }, + { project_id: '500', project_name: 'default2' } + ]); + }); + + it('should be an empty array when no update operation is performed', () => { + const subscribeSpy = jest.spyOn(EventEmitter, 'subscribe'); + const unsubscribeSpy = jest.spyOn(EventEmitter, 'unsubscribe'); + + const { result, unmount } = renderHook(() => useRecentlyOpenedProjects()); + + expect(result.current.recentlyProjects).toEqual([]); + + expect(unsubscribeSpy).toBeCalledTimes(0); + expect(subscribeSpy).toBeCalledTimes(2); + expect(subscribeSpy.mock.calls[0][0]).toBe( + EmitterKey.Update_Recently_Opened_Projects + ); + expect(subscribeSpy.mock.calls[1][0]).toBe( + EmitterKey.Update_Current_Project_ID + ); + + unmount(); + + expect(unsubscribeSpy).toBeCalledTimes(2); + expect(unsubscribeSpy.mock.calls[0][0]).toBe( + EmitterKey.Update_Recently_Opened_Projects + ); + expect(unsubscribeSpy.mock.calls[1][0]).toBe( + EmitterKey.Update_Current_Project_ID + ); + }); +}); diff --git a/packages/base/src/page/Nav/SideMenu/useRecentlyOpenedProjects.ts b/packages/base/src/page/Nav/SideMenu/useRecentlyOpenedProjects.ts index 5c5fa9f74..f84bcd84c 100644 --- a/packages/base/src/page/Nav/SideMenu/useRecentlyOpenedProjects.ts +++ b/packages/base/src/page/Nav/SideMenu/useRecentlyOpenedProjects.ts @@ -19,7 +19,7 @@ const useRecentlyOpenedProjects = () => { } catch (error) { // eslint-disable-next-line no-console console.error(error); - return []; + return {}; } }); From 49f6e741004594984c063a24190524faf9f901a2 Mon Sep 17 00:00:00 2001 From: lizhensheng Date: Thu, 29 Feb 2024 10:30:58 +0800 Subject: [PATCH 2/2] [chore]: fix review issue --- .../__snapshots__/index.test.tsx.snap | 775 ------------------ .../Nav/SideMenu/__tests__/index.test.tsx | 2 - 2 files changed, 777 deletions(-) diff --git a/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap b/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap index 14b0f5e5f..d570ab913 100644 --- a/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap +++ b/packages/base/src/page/Nav/SideMenu/__tests__/__snapshots__/index.test.tsx.snap @@ -1574,781 +1574,6 @@ exports[`test Base/Nav/SideMenu/index mount and unmount component 2`] = ` `; exports[`test Base/Nav/SideMenu/index mount and unmount component 3`] = ` - -
-
-
-
-
- - Action - - - SQLE - -
-
-
-
-
-
- - - - - - - - - - - - - -
- -
-
-
- - -
-
-
- - - A - - -
-
-
- - - - - - -
-
-
-
- -`; - -exports[`test Base/Nav/SideMenu/index mount and unmount component 4`] = `
{ }); expect(baseElement).toMatchSnapshot(); - expect(baseElement).toMatchSnapshot(); - fireEvent.mouseDown(getBySelector('.ant-select-selector'), baseElement); await act(async () => jest.advanceTimersByTime(0));