LoginPage.test.tsx 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import React from 'react';
  2. import { describe, it, expect, vi, beforeEach } from 'vitest';
  3. import { screen, fireEvent, waitFor } from '@testing-library/react';
  4. import { LoginPage } from '../../src/components/LoginPage';
  5. import { AuthProvider } from '../../src/hooks/AuthProvider';
  6. import { renderWithProviders } from '../test-utils';
  7. // Mock react-router
  8. vi.mock('react-router', () => ({
  9. useNavigate: () => vi.fn(),
  10. }));
  11. // Mock sonner
  12. vi.mock('sonner', () => ({
  13. toast: {
  14. success: vi.fn(),
  15. error: vi.fn(),
  16. },
  17. }));
  18. // Mock shared UI components - 简化mock避免复杂渲染问题
  19. vi.mock('@d8d/shared-ui-components', () => ({
  20. Button: ({ children, ...props }: any) => React.createElement('button', { ...props, 'data-testid': 'button' }, children),
  21. Card: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'card' }, children),
  22. CardContent: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'card-content' }, children),
  23. CardDescription: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'card-description' }, children),
  24. CardFooter: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'card-footer' }, children),
  25. CardHeader: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'card-header' }, children),
  26. CardTitle: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'card-title' }, children),
  27. Form: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'form' }, children),
  28. FormControl: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'form-control' }, children),
  29. FormField: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'form-field' }, children),
  30. FormItem: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'form-item' }, children),
  31. FormLabel: ({ children, ...props }: any) => React.createElement('label', { ...props, 'data-testid': 'form-label' }, children),
  32. FormMessage: ({ children, ...props }: any) => React.createElement('div', { ...props, 'data-testid': 'form-message' }, children),
  33. Input: ({ ...props }: any) => React.createElement('input', { ...props, 'data-testid': 'input' }),
  34. }));
  35. describe('LoginPage', () => {
  36. beforeEach(() => {
  37. vi.clearAllMocks();
  38. });
  39. const renderWithAuthProvider = (component: React.ReactElement) => {
  40. return renderWithProviders(
  41. <AuthProvider>
  42. {component}
  43. </AuthProvider>
  44. );
  45. };
  46. it('应该渲染登录页面', () => {
  47. renderWithAuthProvider(<LoginPage />);
  48. // 验证页面基本结构
  49. expect(screen.getByTestId('card')).toBeInTheDocument();
  50. expect(screen.getByTestId('form')).toBeInTheDocument();
  51. expect(screen.getByTestId('button')).toBeInTheDocument();
  52. });
  53. it('应该显示用户名和密码输入框', () => {
  54. renderWithAuthProvider(<LoginPage />);
  55. // 验证输入框存在
  56. const inputs = screen.getAllByTestId('input');
  57. expect(inputs.length).toBeGreaterThan(0);
  58. });
  59. it('应该显示登录按钮', () => {
  60. renderWithAuthProvider(<LoginPage />);
  61. // 验证按钮存在
  62. const buttons = screen.getAllByTestId('button');
  63. expect(buttons.length).toBeGreaterThan(0);
  64. });
  65. });