import React from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { vi, describe, test, beforeEach, expect } from 'vitest'; import { BrowserRouter } from 'react-router-dom'; import { FilterProvider } from '../../contexts/FilterContext'; import { AdminProvider } from '../../contexts/AdminContext'; import HeaderNav from '../../components/HeaderNav'; // Mock react-router-dom const mockNavigate = vi.fn(); const mockUseLocation = vi.fn(); vi.mock('react-router-dom', () => ({ BrowserRouter: ({ children }: { children: React.ReactNode }) => <>{children}, useNavigate: () => mockNavigate, useLocation: () => mockUseLocation(), })); // Mock the contexts const mockUseFilterContext = { search: '', srcFilter: '', catFilter: '', regionFilter: '', countryFilter: '', imageTypeFilter: '', showReferenceExamples: false, setSearch: vi.fn(), setSrcFilter: vi.fn(), setCatFilter: vi.fn(), setRegionFilter: vi.fn(), setCountryFilter: vi.fn(), setImageTypeFilter: vi.fn(), setShowReferenceExamples: vi.fn(), clearAllFilters: vi.fn(), }; const mockUseAdminContext = { isAdmin: false, login: vi.fn(), logout: vi.fn(), }; vi.mock('../../contexts/FilterContext', () => ({ FilterProvider: ({ children }: { children: React.ReactNode }) => <>{children}, useFilterContext: () => mockUseFilterContext, })); vi.mock('../../contexts/AdminContext', () => ({ AdminProvider: ({ children }: { children: React.ReactNode }) => <>{children}, useAdminContext: () => mockUseAdminContext, })); describe('HeaderNav + Routing Integration', () => { beforeEach(() => { vi.clearAllMocks(); mockUseLocation.mockReturnValue({ pathname: '/' }); }); test('HeaderNav navigates to upload page when logo is clicked', async () => { const user = userEvent.setup(); // Mock current location to be on a different page so logo click will navigate mockUseLocation.mockReturnValue({ pathname: '/explore' }); render( ); // Find and click the logo/brand const logo = screen.getByText(/PromptAid Vision/i); await user.click(logo); expect(mockNavigate).toHaveBeenCalledWith('/'); }); test('HeaderNav navigates to help page when help button is clicked', async () => { const user = userEvent.setup(); render( ); // Find and click the help button const helpButton = screen.getByRole('button', { name: /help/i }); await user.click(helpButton); expect(mockNavigate).toHaveBeenCalledWith('/help'); }); test('HeaderNav shows navigation buttons', () => { render( ); // Check if navigation buttons are visible expect(screen.getByRole('button', { name: /upload/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /explore/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /analytics/i })).toBeInTheDocument(); }); test('HeaderNav shows current page in navigation', () => { // Mock current location mockUseLocation.mockReturnValue({ pathname: '/explore' }); render( ); // Check if current page is highlighted or active const exploreButton = screen.getByRole('button', { name: /explore/i }); expect(exploreButton).toBeInTheDocument(); }); });