From e9715b47f09e643c11854442850a3101a65bf5d8 Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Tue, 25 Feb 2025 15:31:13 +0800 Subject: [PATCH 1/2] [chore]: Optimization code --- packages/base/src/page/Account/PersonalSMS/index.tsx | 5 +---- .../page/System/GlobalSetting/SMSSetting/index.tsx | 12 +++--------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/packages/base/src/page/Account/PersonalSMS/index.tsx b/packages/base/src/page/Account/PersonalSMS/index.tsx index 3026e4698..06dc61503 100644 --- a/packages/base/src/page/Account/PersonalSMS/index.tsx +++ b/packages/base/src/page/Account/PersonalSMS/index.tsx @@ -2,7 +2,6 @@ import { useTranslation } from 'react-i18next'; import { useBoolean } from 'ahooks'; import { useMemo, useEffect } from 'react'; import { Spin, message } from 'antd'; -import { CustomLabelContent } from '@actiontech/shared/lib/components/CustomForm'; import ConfigField from './components/ConfigField'; import { ResponseCode } from '@actiontech/shared/lib/enum'; import { FormFields } from './index.type'; @@ -37,9 +36,7 @@ const PersonalSMS: React.FC = ({ enabled } = useConfigRender({ switchFieldName, - switchFieldLabel: ( - - ) + switchFieldLabel: t('dmsAccount.sms.title') }); useEffect(() => { diff --git a/packages/base/src/page/System/GlobalSetting/SMSSetting/index.tsx b/packages/base/src/page/System/GlobalSetting/SMSSetting/index.tsx index 9d9fa0fe2..9d3204bbb 100644 --- a/packages/base/src/page/System/GlobalSetting/SMSSetting/index.tsx +++ b/packages/base/src/page/System/GlobalSetting/SMSSetting/index.tsx @@ -2,7 +2,6 @@ import { useTranslation } from 'react-i18next'; import { useBoolean, useRequest } from 'ahooks'; import { useCallback, useMemo } from 'react'; import { Spin, Typography } from 'antd'; -import { CustomLabelContent } from '@actiontech/shared/lib/components/CustomForm'; import ConfigExtraButtons from './components/ConfigExtraButtons'; import ConfigField from './components/ConfigField'; import { ConfigurationService } from '@actiontech/shared/lib/api'; @@ -22,7 +21,7 @@ import { PermissionControl } from '@actiontech/shared/lib/features'; -const CodingSetting: React.FC = () => { +const SMSSetting: React.FC = () => { const { t } = useTranslation(); const [submitLoading, { setTrue: startSubmit, setFalse: submitFinish }] = @@ -38,12 +37,7 @@ const CodingSetting: React.FC = () => { enabled } = useConfigRender({ switchFieldName, - switchFieldLabel: ( - - ) + switchFieldLabel: t('dmsSystem.global.smsSetting.title') }); const { @@ -208,4 +202,4 @@ const CodingSetting: React.FC = () => { ); }; -export default CodingSetting; +export default SMSSetting; From 9d1e224e060f05e94e9dd0f9f91614b2894fa3d9 Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Tue, 25 Feb 2025 15:31:52 +0800 Subject: [PATCH 2/2] [test]: Update unit testing --- .../__snapshots__/index.test.tsx.snap | 264 ++++ .../PersonalSMS/__tests__/index.test.tsx | 165 ++ .../__snapshots__/index.ce.test.tsx.snap | 370 +++++ .../Account/__snapshots__/index.test.tsx.snap | 48 +- .../base/src/page/Account/index.ce.test.tsx | 35 + .../Login/__snapshots__/index.test.tsx.snap | 399 +++++ packages/base/src/page/Login/index.test.tsx | 91 +- .../__snapshots__/index.test.tsx.snap | 1321 +++++++++++++++++ .../SMSSetting/__tests__/index.test.tsx | 241 +++ .../__snapshots__/index.ce.test.tsx.snap | 411 +++++ .../__snapshots__/index.test.tsx.snap | 48 +- .../System/GlobalSetting/index.ce.test.tsx | 33 + .../base/src/testUtils/mockApi/global/data.ts | 3 +- .../base/src/testUtils/mockApi/sms/data.ts | 8 + .../base/src/testUtils/mockApi/sms/index.ts | 35 + .../__tests__/VerificationCodeInput.test.tsx | 81 + .../VerificationCodeInput.test.tsx.snap | 35 + .../shared/lib/utils/__tests__/Common.test.ts | 8 +- 18 files changed, 3511 insertions(+), 85 deletions(-) create mode 100644 packages/base/src/page/Account/PersonalSMS/__tests__/__snapshots__/index.test.tsx.snap create mode 100644 packages/base/src/page/Account/PersonalSMS/__tests__/index.test.tsx create mode 100644 packages/base/src/page/Account/__snapshots__/index.ce.test.tsx.snap create mode 100644 packages/base/src/page/Account/index.ce.test.tsx create mode 100644 packages/base/src/page/System/GlobalSetting/SMSSetting/__tests__/__snapshots__/index.test.tsx.snap create mode 100644 packages/base/src/page/System/GlobalSetting/SMSSetting/__tests__/index.test.tsx create mode 100644 packages/base/src/page/System/GlobalSetting/__snapshots__/index.ce.test.tsx.snap create mode 100644 packages/base/src/page/System/GlobalSetting/index.ce.test.tsx create mode 100644 packages/base/src/testUtils/mockApi/sms/data.ts create mode 100644 packages/base/src/testUtils/mockApi/sms/index.ts create mode 100644 packages/shared/lib/components/VerificationCodeInput/__tests__/VerificationCodeInput.test.tsx create mode 100644 packages/shared/lib/components/VerificationCodeInput/__tests__/__snapshots__/VerificationCodeInput.test.tsx.snap diff --git a/packages/base/src/page/Account/PersonalSMS/__tests__/__snapshots__/index.test.tsx.snap b/packages/base/src/page/Account/PersonalSMS/__tests__/__snapshots__/index.test.tsx.snap new file mode 100644 index 000000000..a726ec93a --- /dev/null +++ b/packages/base/src/page/Account/PersonalSMS/__tests__/__snapshots__/index.test.tsx.snap @@ -0,0 +1,264 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`base/System/GlobalSetting/PersonalSMS render init snap 1`] = ` + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +`; diff --git a/packages/base/src/page/Account/PersonalSMS/__tests__/index.test.tsx b/packages/base/src/page/Account/PersonalSMS/__tests__/index.test.tsx new file mode 100644 index 000000000..39141118e --- /dev/null +++ b/packages/base/src/page/Account/PersonalSMS/__tests__/index.test.tsx @@ -0,0 +1,165 @@ +import sms from '../../../../testUtils/mockApi/sms'; +import { cleanup, fireEvent, act, screen } from '@testing-library/react'; +import { superRender } from '@actiontech/shared/lib/testUtil/customRender'; +import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery'; +import PersonalSMS from '..'; +import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi'; +import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser'; +import { mockUserInfo } from '@actiontech/shared/lib/testUtil/mockHook/data'; +import account from '../../../../testUtils/mockApi/account'; + +describe('base/System/GlobalSetting/PersonalSMS', () => { + let updateCurrentUserSpy: jest.SpyInstance; + let sendSmsCodeSpy: jest.SpyInstance; + let verifySmsCodeSpy: jest.SpyInstance; + let getUserInfoSpy = jest.fn(); + const customRender = ({ + phone = mockUserInfo.userInfo.phone, + enabled = true + }) => { + return superRender( + + ); + }; + + beforeEach(() => { + mockUseCurrentUser(); + jest.useFakeTimers(); + updateCurrentUserSpy = account.updateCurrentUser(); + sendSmsCodeSpy = sms.sendSmsCode(); + verifySmsCodeSpy = sms.verifySmsCode(); + }); + + afterEach(() => { + jest.useRealTimers(); + jest.clearAllMocks(); + cleanup(); + }); + + it('render init snap', async () => { + const { baseElement } = customRender({}); + await act(async () => jest.advanceTimersByTime(0)); + expect(baseElement).toMatchSnapshot(); + expect(getBySelector('#enabled')).toBeChecked(); + }); + + it('render close personal sms', async () => { + customRender({}); + await act(async () => jest.advanceTimersByTime(3300)); + fireEvent.click(getBySelector('#enabled')); + await act(async () => jest.advanceTimersByTime(500)); + expect(screen.getByText('是否确认关闭当前配置?')).toBeInTheDocument(); + + fireEvent.click(screen.getByText('确 认')); + await act(async () => jest.advanceTimersByTime(0)); + expect(updateCurrentUserSpy).toHaveBeenCalledTimes(1); + expect(updateCurrentUserSpy).toHaveBeenCalledWith({ + current_user: { + two_factor_enabled: false + } + }); + await act(async () => jest.advanceTimersByTime(3000)); + expect(getUserInfoSpy).toHaveBeenCalledTimes(1); + }); + + it('render open personal sms', async () => { + customRender({ enabled: false }); + await act(async () => jest.advanceTimersByTime(3000)); + const switchEle = getBySelector('#enabled'); + expect(switchEle).not.toBeChecked(); + + fireEvent.click(switchEle); + await act(async () => jest.advanceTimersByTime(300)); + + fireEvent.click(screen.getByText('发送验证码')); + await act(async () => jest.advanceTimersByTime(3000)); + expect(sendSmsCodeSpy).toHaveBeenCalledTimes(1); + + fireEvent.change(getBySelector('#code'), { + target: { + value: '1234' + } + }); + await act(async () => jest.advanceTimersByTime(0)); + + fireEvent.click(screen.getByText('提 交')); + await act(async () => jest.advanceTimersByTime(0)); + expect(verifySmsCodeSpy).toHaveBeenCalledTimes(1); + expect(verifySmsCodeSpy).toHaveBeenNthCalledWith(1, { + code: '1234', + username: mockUserInfo.userInfo.name + }); + await act(async () => jest.advanceTimersByTime(3000)); + expect(updateCurrentUserSpy).toHaveBeenCalledTimes(1); + expect(updateCurrentUserSpy).toHaveBeenCalledWith({ + current_user: { + two_factor_enabled: true + } + }); + await act(async () => jest.advanceTimersByTime(3000)); + expect(getUserInfoSpy).toHaveBeenCalledTimes(1); + }); + + it('render open personal sms when user phone is empty string', async () => { + customRender({ enabled: false, phone: '' }); + await act(async () => jest.advanceTimersByTime(3000)); + const switchEle = getBySelector('#enabled'); + expect(switchEle).not.toBeChecked(); + + fireEvent.click(switchEle); + await act(async () => jest.advanceTimersByTime(0)); + + expect( + screen.getByText('请先完成手机号绑定后开启双因素认证') + ).toBeInTheDocument(); + }); + + it('render open personal sms when verify sms code fail', async () => { + verifySmsCodeSpy.mockImplementation(() => + createSpySuccessResponse({ + data: { + is_verify_sent_normally: false, + verify_error_message: '验证码错误' + } + }) + ); + customRender({ enabled: false }); + await act(async () => jest.advanceTimersByTime(3000)); + const switchEle = getBySelector('#enabled'); + expect(switchEle).not.toBeChecked(); + + fireEvent.click(switchEle); + await act(async () => jest.advanceTimersByTime(300)); + + fireEvent.click(screen.getByText('发送验证码')); + await act(async () => jest.advanceTimersByTime(3000)); + expect(sendSmsCodeSpy).toHaveBeenCalledTimes(1); + + fireEvent.change(getBySelector('#code'), { + target: { + value: '1234' + } + }); + await act(async () => jest.advanceTimersByTime(0)); + + fireEvent.click(screen.getByText('提 交')); + await act(async () => jest.advanceTimersByTime(0)); + expect(verifySmsCodeSpy).toHaveBeenCalledTimes(1); + expect(verifySmsCodeSpy).toHaveBeenNthCalledWith(1, { + code: '1234', + username: mockUserInfo.userInfo.name + }); + await act(async () => jest.advanceTimersByTime(3000)); + expect(screen.getByText('验证码错误')).toBeInTheDocument(); + await act(async () => jest.advanceTimersByTime(3000)); + expect(updateCurrentUserSpy).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/base/src/page/Account/__snapshots__/index.ce.test.tsx.snap b/packages/base/src/page/Account/__snapshots__/index.ce.test.tsx.snap new file mode 100644 index 000000000..a023ae61f --- /dev/null +++ b/packages/base/src/page/Account/__snapshots__/index.ce.test.tsx.snap @@ -0,0 +1,370 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test base/page/Account ce should match snapshot 1`] = ` + +
+
+
+
+ 个人中心 +
+
+
+
+
+ 账户基本信息 + +
+
+
+
+
+
+
+ 用户名 +
+
+
+
+
+ admin +
+
+ +
+
+
+
+
+
+
+ 邮箱 +
+
+
+
+
+ admin@gmail.com +
+
+ +
+
+
+
+
+
+
+ 企业微信UserID +
+
+
+
+
+ wx_test_id +
+
+ +
+
+
+
+
+
+
+ 手机号 +
+
+
+
+
+ 13112341234 +
+
+ +
+
+
+
+
+
+
+ 访问令牌 +
+
+ 您可以在IDE工具上使用访问令牌,进行用户认证 +
+
+ +
+
+
+ + Token + + +
+
+ + + + + +
+
+ +
+ + + +
+
+
+
+
+ + 过期时间 + + + 2024-03-31 10:25:10 + +
+
+
+
+
+
+
+
+ +`; diff --git a/packages/base/src/page/Account/__snapshots__/index.test.tsx.snap b/packages/base/src/page/Account/__snapshots__/index.test.tsx.snap index 392f9743c..0013677c0 100644 --- a/packages/base/src/page/Account/__snapshots__/index.test.tsx.snap +++ b/packages/base/src/page/Account/__snapshots__/index.test.tsx.snap @@ -378,7 +378,7 @@ exports[`test base/page/Account should match snapshot 1`] = ` class="switch-field-wrapper" >