Login.test.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { fireEvent, render, screen, waitFor } from '@testing-library/react';
  2. import { beforeEach, describe, expect, it, vi } from 'vitest';
  3. import { history } from '@umijs/max';
  4. import LoginPage from '@/pages/Login';
  5. import { apiRequest } from '@/services/api';
  6. vi.mock('@/services/api', () => ({
  7. apiRequest: vi.fn(),
  8. jsonOptions: (method: string, body: unknown) => ({ method, body: JSON.stringify(body) }),
  9. setCsrfToken: vi.fn(),
  10. }));
  11. describe('登录页', () => {
  12. beforeEach(() => {
  13. vi.clearAllMocks();
  14. });
  15. it('首次登录后进入强制改密页', async () => {
  16. vi.mocked(apiRequest).mockResolvedValue({
  17. username: 'admin',
  18. must_change_password: true,
  19. csrf_token: 'csrf',
  20. });
  21. render(<LoginPage />);
  22. fireEvent.change(screen.getByLabelText('密码'), { target: { value: 'qwe0.123456' } });
  23. fireEvent.click(screen.getByRole('button', { name: /登\s*录/ }));
  24. await waitFor(() => expect(apiRequest).toHaveBeenCalled());
  25. expect(history.replace).toHaveBeenCalledWith('/change-password');
  26. });
  27. it('展示后端登录错误', async () => {
  28. vi.mocked(apiRequest).mockRejectedValue(new Error('用户名或密码错误。'));
  29. render(<LoginPage />);
  30. fireEvent.change(screen.getByLabelText('密码'), { target: { value: 'bad-password' } });
  31. fireEvent.click(screen.getByRole('button', { name: /登\s*录/ }));
  32. expect(await screen.findByText('用户名或密码错误。')).toBeInTheDocument();
  33. });
  34. });