Files
flyer-crawler.projectium.com/src/components/AdminRoute.test.tsx

55 lines
2.0 KiB
TypeScript

// src/components/AdminRoute.test.tsx
import React from 'react';
import { render, screen } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import { MemoryRouter, Routes, Route } from 'react-router-dom';
import { AdminRoute } from './AdminRoute';
import type { Profile } from '../types';
import { createMockProfile } from '../tests/utils/mockFactories';
// Unmock the component to test the real implementation
vi.unmock('./AdminRoute');
const AdminContent = () => <div>Admin Page Content</div>;
const HomePage = () => <div>Home Page</div>;
const renderWithRouter = (profile: Profile | null, initialPath: string) => {
render(
<MemoryRouter initialEntries={[initialPath]}>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/admin" element={<AdminRoute profile={profile} />}>
<Route index element={<AdminContent />} />
</Route>
</Routes>
</MemoryRouter>,
);
};
describe('AdminRoute', () => {
it('should render the admin content when user has admin role', () => {
const adminProfile: Profile = createMockProfile({ role: 'admin' });
renderWithRouter(adminProfile, '/admin');
expect(screen.getByText('Admin Page Content')).toBeInTheDocument();
expect(screen.queryByText('Home Page')).not.toBeInTheDocument();
});
it('should redirect to home page when user does not have admin role', () => {
const userProfile: Profile = createMockProfile({ role: 'user' });
renderWithRouter(userProfile, '/admin');
// The user is redirected, so we should see the home page content
expect(screen.getByText('Home Page')).toBeInTheDocument();
expect(screen.queryByText('Admin Page Content')).not.toBeInTheDocument();
});
it('should redirect to home page when profile is null', () => {
renderWithRouter(null, '/admin');
// The user is redirected, so we should see the home page content
expect(screen.getByText('Home Page')).toBeInTheDocument();
expect(screen.queryByText('Admin Page Content')).not.toBeInTheDocument();
});
});