import { describe, it, expect, vi, beforeEach } from 'vitest' import { render, screen } from '@testing-library/react' import { PlayingPhase } from './PlayingPhase' import type { MapData } from '../maps' // Mock dependencies vi.mock('../Provider', () => ({ useKnowYourWorld: () => ({ state: { selectedMap: 'world' as const, selectedContinent: 'all', difficulty: 'easy', regionsFound: ['france', 'germany'], currentPrompt: 'spain', gameMode: 'cooperative' as const, regionsToFind: ['spain', 'italy', 'portugal'], }, clickRegion: vi.fn(), }), })) vi.mock('../maps', () => ({ getFilteredMapDataSync: () => ({ id: 'world', name: 'World Map', viewBox: '0 0 1000 500', regions: [ { id: 'spain', name: 'Spain', path: 'M 100 100 L 200 200' }, { id: 'italy', name: 'Italy', path: 'M 300 300 L 400 400' }, { id: 'portugal', name: 'Portugal', path: 'M 500 500 L 600 600' }, ], }) as MapData, })) vi.mock('./MapRenderer', () => ({ MapRenderer: ({ mapData, onRegionClick }: any) => (
Mock MapRenderer
), })) vi.mock('./GameInfoPanel', () => ({ GameInfoPanel: ({ currentRegionName, foundCount, totalRegions }: any) => (
Mock GameInfoPanel
Current: {currentRegionName}
Progress: {foundCount}/{totalRegions}
), })) describe('PlayingPhase', () => { beforeEach(() => { vi.clearAllMocks() }) it('renders the panel layout with game info and map panels', () => { const { container } = render() // Should have the main container expect(screen.getByTestId('game-info-panel')).toBeInTheDocument() expect(screen.getByTestId('map-renderer')).toBeInTheDocument() }) it('renders PanelGroup with vertical direction', () => { const { container } = render() // The playing-phase container should have flex column layout const playingPhase = container.querySelector('[data-component="playing-phase"]') expect(playingPhase).toBeInTheDocument() const styles = window.getComputedStyle(playingPhase!) expect(styles.display).toBe('flex') expect(styles.flexDirection).toBe('column') }) it('passes correct props to GameInfoPanel', () => { render() // Check that GameInfoPanel receives correct data expect(screen.getByText('Current: Spain')).toBeInTheDocument() expect(screen.getByText('Progress: 2/3')).toBeInTheDocument() }) it('passes correct props to MapRenderer', () => { render() const mapRenderer = screen.getByTestId('map-renderer') expect(mapRenderer).toHaveAttribute('data-map-id', 'world') }) it('calculates progress percentage correctly', () => { render() // 2 found out of 3 total = 66.67% // GameInfoPanel should receive progress prop (check via debug if needed) expect(screen.getByText('Progress: 2/3')).toBeInTheDocument() }) it('handles null currentPrompt gracefully', () => { vi.mocked(vi.importActual('../Provider')).useKnowYourWorld = () => ({ state: { selectedMap: 'world' as const, selectedContinent: 'all', difficulty: 'easy', regionsFound: ['france', 'germany'], currentPrompt: null, gameMode: 'cooperative' as const, regionsToFind: ['spain', 'italy', 'portugal'], }, clickRegion: vi.fn(), }) render() // Should show "Current: null" or similar (check GameInfoPanel mock) expect(screen.getByTestId('game-info-panel')).toBeInTheDocument() }) it('renders map panel with proper container styles', () => { const { container } = render() const mapPanel = container.querySelector('[data-component="map-panel"]') expect(mapPanel).toBeInTheDocument() const styles = window.getComputedStyle(mapPanel!) expect(styles.width).toBe('100%') expect(styles.height).toBe('100%') expect(styles.display).toBe('flex') expect(styles.overflow).toBe('hidden') }) it('passes clickRegion handler to MapRenderer', async () => { const mockClickRegion = vi.fn() vi.mocked(vi.importActual('../Provider')).useKnowYourWorld = () => ({ state: { selectedMap: 'world' as const, selectedContinent: 'all', difficulty: 'easy', regionsFound: [], currentPrompt: 'spain', gameMode: 'cooperative' as const, regionsToFind: ['spain'], }, clickRegion: mockClickRegion, }) render() const clickButton = screen.getByText('Click Spain') clickButton.click() expect(mockClickRegion).toHaveBeenCalledWith('spain', 'Spain') }) it('uses correct map data from getFilteredMapDataSync', () => { const mockGetFilteredMapDataSync = vi.fn().mockReturnValue({ id: 'usa', name: 'USA Map', viewBox: '0 0 2000 1000', regions: [ { id: 'california', name: 'California', path: 'M 0 0' }, { id: 'texas', name: 'Texas', path: 'M 100 100' }, ], }) vi.mocked(vi.importActual('../maps')).getFilteredMapDataSync = mockGetFilteredMapDataSync render() expect(mockGetFilteredMapDataSync).toHaveBeenCalledWith('world', 'all', 'easy') }) }) describe('PlayingPhase - Different Scenarios', () => { it('handles empty regionsFound array', () => { vi.mocked(vi.importActual('../Provider')).useKnowYourWorld = () => ({ state: { selectedMap: 'world' as const, selectedContinent: 'all', difficulty: 'easy', regionsFound: [], currentPrompt: 'spain', gameMode: 'cooperative' as const, regionsToFind: ['spain', 'italy'], }, clickRegion: vi.fn(), }) render() expect(screen.getByText('Progress: 0/2')).toBeInTheDocument() }) it('handles all regions found scenario', () => { vi.mocked(vi.importActual('../Provider')).useKnowYourWorld = () => ({ state: { selectedMap: 'world' as const, selectedContinent: 'all', difficulty: 'easy', regionsFound: ['spain', 'italy', 'portugal'], currentPrompt: null, gameMode: 'cooperative' as const, regionsToFind: ['spain', 'italy', 'portugal'], }, clickRegion: vi.fn(), }) render() expect(screen.getByText('Progress: 3/3')).toBeInTheDocument() }) it('renders with hard difficulty', () => { vi.mocked(vi.importActual('../Provider')).useKnowYourWorld = () => ({ state: { selectedMap: 'world' as const, selectedContinent: 'all', difficulty: 'hard', regionsFound: [], currentPrompt: 'luxembourg', gameMode: 'race' as const, regionsToFind: ['luxembourg', 'liechtenstein'], }, clickRegion: vi.fn(), }) render() expect(screen.getByTestId('game-info-panel')).toBeInTheDocument() expect(screen.getByTestId('map-renderer')).toBeInTheDocument() }) })