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();
});
});