import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { history } from '@umijs/max'; import LoginPage from '@/pages/Login'; import { apiRequest } from '@/services/api'; vi.mock('@/services/api', () => ({ apiRequest: vi.fn(), jsonOptions: (method: string, body: unknown) => ({ method, body: JSON.stringify(body) }), setCsrfToken: vi.fn(), })); describe('登录页', () => { beforeEach(() => { vi.clearAllMocks(); }); it('首次登录后进入强制改密页', async () => { vi.mocked(apiRequest).mockResolvedValue({ username: 'admin', must_change_password: true, csrf_token: 'csrf', }); render(); fireEvent.change(screen.getByLabelText('密码'), { target: { value: 'qwe0.123456' } }); fireEvent.click(screen.getByRole('button', { name: /登\s*录/ })); await waitFor(() => expect(apiRequest).toHaveBeenCalled()); expect(history.replace).toHaveBeenCalledWith('/change-password'); }); it('展示后端登录错误', async () => { vi.mocked(apiRequest).mockRejectedValue(new Error('用户名或密码错误。')); render(); fireEvent.change(screen.getByLabelText('密码'), { target: { value: 'bad-password' } }); fireEvent.click(screen.getByRole('button', { name: /登\s*录/ })); expect(await screen.findByText('用户名或密码错误。')).toBeInTheDocument(); }); });