个人中心全部,模糊乱序搜索,类型筛选
Change-Id: Id635654fccccaea80bfbf4d1480abd55f7d12046
diff --git a/src/components/Personal/Setting.test.jsx b/src/components/Personal/Setting.test.jsx
new file mode 100644
index 0000000..e8b1cc0
--- /dev/null
+++ b/src/components/Personal/Setting.test.jsx
@@ -0,0 +1,195 @@
+// Setting.test.jsx
+import React from 'react';
+import { render, screen, waitFor, fireEvent } from '@testing-library/react';
+import { MemoryRouter, useNavigate, useLocation } from 'react-router-dom';
+import Setting from './Setting';
+import { getUserInfo, updatePassword } from '../../api/personal';
+
+// Mock API 调用
+jest.mock('../../api/personal', () => ({
+ getUserInfo: jest.fn(),
+ updatePassword: jest.fn()
+}));
+
+// Mock react-router-dom hooks
+jest.mock('react-router-dom', () => ({
+ ...jest.requireActual('react-router-dom'),
+ useNavigate: jest.fn(),
+ useLocation: jest.fn()
+}));
+
+describe('Setting Component', () => {
+ const mockNavigate = jest.fn();
+ const mockLocation = {
+ pathname: '/personal/setting',
+ state: { dashboardTab: 'settings' }
+ };
+
+ beforeEach(() => {
+ useNavigate.mockReturnValue(mockNavigate);
+ useLocation.mockReturnValue(mockLocation);
+
+ // 重置所有 mock
+ jest.clearAllMocks();
+
+ // 设置默认 mock 返回值
+ getUserInfo.mockResolvedValue({
+ username: 'testuser',
+ email: 'test@example.com'
+ });
+
+ updatePassword.mockResolvedValue({ success: true });
+ });
+
+ it('应该正确加载并显示用户信息', async () => {
+ render(
+ <MemoryRouter>
+ <Setting />
+ </MemoryRouter>
+ );
+
+ await waitFor(() => {
+ expect(screen.getByText('个人设置')).toBeInTheDocument();
+ expect(screen.getByText('账户信息')).toBeInTheDocument();
+ expect(screen.getByText('用户名:')).toBeInTheDocument();
+ expect(screen.getByText('testuser')).toBeInTheDocument();
+ expect(screen.getByRole('heading', { name: '修改密码' })).toBeInTheDocument();
+ });
+ });
+
+ it('应该处理密码修改表单提交', async () => {
+ render(
+ <MemoryRouter>
+ <Setting />
+ </MemoryRouter>
+ );
+
+ // 填写表单
+ fireEvent.change(screen.getByLabelText('原密码:'), {
+ target: { value: 'oldpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('确认新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+
+ // 提交表单
+ fireEvent.click(screen.getByRole('button', { name: '修改密码' }));
+
+ await waitFor(() => {
+ expect(updatePassword).toHaveBeenCalledWith('oldpassword123', 'newpassword123');
+ expect(screen.getByText('密码修改成功')).toBeInTheDocument();
+ });
+ });
+
+
+ it('应该处理API错误', async () => {
+ updatePassword.mockRejectedValue(new Error('原密码不正确'));
+
+ render(
+ <MemoryRouter>
+ <Setting />
+ </MemoryRouter>
+ );
+
+ // 填写表单
+ fireEvent.change(screen.getByLabelText('原密码:'), {
+ target: { value: 'wrongpassword' }
+ });
+ fireEvent.change(screen.getByLabelText('新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('确认新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+
+ // 提交表单
+ fireEvent.click(screen.getByRole('button', { name: '修改密码' }));
+
+ await waitFor(() => {
+ expect(screen.getByText('原密码不正确')).toBeInTheDocument();
+ });
+ });
+
+ it('应该显示加载状态', async () => {
+ // 延迟API响应以测试加载状态
+ updatePassword.mockImplementation(() => new Promise(() => {}));
+
+ render(
+ <MemoryRouter>
+ <Setting />
+ </MemoryRouter>
+ );
+
+ // 填写表单
+ fireEvent.change(screen.getByLabelText('原密码:'), {
+ target: { value: 'oldpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('确认新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+
+ // 提交表单
+ fireEvent.click(screen.getByRole('button', { name: '修改密码' }));
+
+ // 检查加载状态
+ expect(screen.getByText('处理中...')).toBeInTheDocument();
+ expect(screen.getByRole('button', { name: '处理中...' })).toBeDisabled();
+ });
+
+ it('应该处理返回按钮点击', async () => {
+ render(
+ <MemoryRouter>
+ <Setting />
+ </MemoryRouter>
+ );
+
+ const backButton = screen.getByText(/← 返回个人中心/);
+ fireEvent.click(backButton);
+
+ expect(mockNavigate).toHaveBeenCalledWith('/personal', {
+ state: {
+ fromSubpage: true,
+ dashboardTab: 'settings'
+ },
+ replace: true
+ });
+ });
+
+ it('应该清空表单并显示成功消息', async () => {
+ render(
+ <MemoryRouter>
+ <Setting />
+ </MemoryRouter>
+ );
+
+ // 填写表单
+ fireEvent.change(screen.getByLabelText('原密码:'), {
+ target: { value: 'oldpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+ fireEvent.change(screen.getByLabelText('确认新密码:'), {
+ target: { value: 'newpassword123' }
+ });
+
+ // 提交表单
+ fireEvent.click(screen.getByRole('button', { name: '修改密码' }));
+
+ await waitFor(() => {
+ // 检查表单是否清空
+ expect(screen.getByLabelText('原密码:')).toHaveValue('');
+ expect(screen.getByLabelText('新密码:')).toHaveValue('');
+ expect(screen.getByLabelText('确认新密码:')).toHaveValue('');
+
+ // 检查成功消息
+ expect(screen.getByText('密码修改成功')).toBeInTheDocument();
+ });
+ });
+});
\ No newline at end of file