import { describe, it, expect, vi } from 'vitest' import { render, screen } from '@testing-library/react' import { MemoryRouter, Routes, Route } from 'react-router-dom' import RequireAuth from '@/auth/RequireAuth' import { AuthProvider } from '@/auth/AuthContext' // Мокаем localStorage const localStorageMock = (() => { let store: Record = {} return { getItem: vi.fn((key: string) => store[key] || null), setItem: vi.fn((key: string, value: string) => { store[key] = value }), removeItem: vi.fn((key: string) => { delete store[key] }), clear: vi.fn(() => { store = {} }), } })() Object.defineProperty(window, 'localStorage', { value: localStorageMock, }) describe('RequireAuth', () => { beforeEach(() => { localStorageMock.clear() vi.clearAllMocks() }) it('должен рендерить children когда пользователь авторизован', () => { localStorageMock.getItem.mockReturnValue('valid-token') render(
Protected Content
} />
) expect(screen.getByTestId('protected-content')).toBeInTheDocument() expect(screen.getByText('Protected Content')).toBeInTheDocument() }) it('должен перенаправлять на /login когда пользователь не авторизован', () => { localStorageMock.getItem.mockReturnValue(null) render(
Protected Content
} /> Login Page} />
) expect(screen.getByTestId('login-page')).toBeInTheDocument() expect(screen.getByText('Login Page')).toBeInTheDocument() }) it('должен сохранять state.from с текущим location при перенаправлении на login', () => { localStorageMock.getItem.mockReturnValue(null) render(
Settings
} /> Login Page} />
) // Должен показать login страницу expect(screen.getByTestId('login-page')).toBeInTheDocument() }) it('должен использовать replace: true при перенаправлении', () => { // Этот тест проверяет поведение Navigate компонента // В реальном сценарии replace предотвращает добавление записи в историю localStorageMock.getItem.mockReturnValue(null) const { container } = render(
Protected
} /> Login} />
) // Проверяем что рендерится login expect(container.textContent).toContain('Login') }) it('должен работать с вложенными роутами', () => { localStorageMock.getItem.mockReturnValue('valid-token') render( Profile} /> } /> ) expect(screen.getByTestId('profile')).toBeInTheDocument() }) it('должен блокировать доступ к защищённому маршруту без авторизации', () => { localStorageMock.getItem.mockReturnValue(null) render(
Admin Panel
} /> Login Page} />
) // Контент админки не должен быть доступен expect(screen.queryByTestId('admin-content')).not.toBeInTheDocument() // Должна показываться страница логина expect(screen.getByTestId('login-page')).toBeInTheDocument() }) })