import { describe, it, expect } from 'vitest'; import { render, screen } from '@testing-library/react'; import { DraftGrid } from '../DraftGrid'; import { mockDraftSlots } from '~/test/fixtures/team'; function formatTime(seconds: number | undefined) { if (seconds === undefined) return '--:--'; const mins = Math.floor(seconds / 60); const secs = seconds % 60; return `${mins}:${secs.toString().padStart(2, '0')}`; } describe('DraftGrid Component', () => { const mockGrid = [ [ { pickNumber: 1, participant: { id: 'p1', name: 'Player 1' }, sport: { id: 's1', name: 'NFL' }, team: { id: 't1', name: 'Team 1' } }, null, ], [ null, { pickNumber: 4, participant: { id: 'p2', name: 'Player 2' }, sport: { id: 's2', name: 'NBA' }, team: { id: 't2', name: 'Team 2' } }, ], ]; describe('Rendering', () => { it('should render team names in headers', () => { render( ); expect(screen.getByText('Team 1', { selector: 'span' })).toBeInTheDocument(); expect(screen.getByText('Team 2', { selector: 'span' })).toBeInTheDocument(); }); it('should render draft grid with correct structure', () => { render( ); // Should have cells for all picks const cells = screen.getAllByTitle(/Overall Pick/i); expect(cells.length).toBeGreaterThan(0); }); it('should display picked players', () => { render( ); expect(screen.getByText('Player 1')).toBeInTheDocument(); expect(screen.getByText('NFL')).toBeInTheDocument(); expect(screen.getByText('Player 2')).toBeInTheDocument(); expect(screen.getByText('NBA')).toBeInTheDocument(); }); }); describe('Current Pick Highlighting', () => { it('should show "Up Next" when draft is pre_draft', () => { render( ); expect(screen.getByText('Up Next')).toBeInTheDocument(); }); it('should show "Paused Draft" when draft is paused', () => { render( ); expect(screen.getByText('Paused Draft')).toBeInTheDocument(); }); it('should show "On The Clock" when draft is active', () => { render( ); expect(screen.getByText('On The Clock')).toBeInTheDocument(); }); it('should apply correct styling to current pick', () => { render( ); const currentPickCell = screen.getByText('On The Clock').closest('.border-transparent'); expect(currentPickCell).toHaveClass('bg-muted/80'); expect(currentPickCell).toHaveClass('border-transparent'); }); }); describe('Pick Numbering', () => { it('should display round and pick numbers', () => { render( ); // Should show format like "1.01", "1.02", etc. expect(screen.getByText(/1\.01/)).toBeInTheDocument(); }); }); describe('Optional Features', () => { it('should render with title when provided', () => { render( ); expect(screen.getByText('Draft Board')).toBeInTheDocument(); }); it('should display timers when provided', () => { render( ); expect(screen.getByText('2:00')).toBeInTheDocument(); expect(screen.getByText('1:30')).toBeInTheDocument(); }); }); describe('Snake Draft Order', () => { it('should reverse picks on even rounds', () => { const snakeGrid = [ [ { pickNumber: 1, participant: { id: 'p1', name: 'Pick 1' }, sport: { id: 's1', name: 'NFL' }, team: { id: 't1', name: 'Team 1' } }, { pickNumber: 2, participant: { id: 'p2', name: 'Pick 2' }, sport: { id: 's2', name: 'NBA' }, team: { id: 't2', name: 'Team 2' } }, ], [ { pickNumber: 3, participant: { id: 'p3', name: 'Pick 4' }, sport: { id: 's1', name: 'MLB' }, team: { id: 't2', name: 'Team 2' } }, { pickNumber: 4, participant: { id: 'p4', name: 'Pick 3' }, sport: { id: 's2', name: 'NHL' }, team: { id: 't1', name: 'Team 1' } }, ], ]; render( ); // All picks should be visible expect(screen.getByText('Pick 1')).toBeInTheDocument(); expect(screen.getByText('Pick 2')).toBeInTheDocument(); expect(screen.getByText('Pick 3')).toBeInTheDocument(); expect(screen.getByText('Pick 4')).toBeInTheDocument(); }); }); });