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/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/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" >