/** * Phase 2.5 tests: VideoPlayer component. * * Covers: * - Renders video element with correct src * - Renders controls attribute * - Shows loading state when video not loaded * - Forwards ref to video element * - Handles video error state * - Has proper dimensions styling * - Renders without crashing with null src */ import React from 'react' import { render, screen, fireEvent } from '@testing-library/react' import { describe, it, expect, vi, beforeEach } from 'vitest' import { VideoPlayer } from '../components/VideoPlayer' describe('VideoPlayer (Phase 2.5)', () => { const mockSrc = 'http://localhost:8000/api/v1/video/vid-123' beforeEach(() => { vi.clearAllMocks() }) it('renders video element with correct src', () => { render() const video = screen.getByTestId('video-player') expect(video).toBeInTheDocument() expect(video).toHaveAttribute('src', mockSrc) }) it('renders controls attribute', () => { render() const video = screen.getByTestId('video-player') expect(video).toHaveAttribute('controls') }) it('shows loading state when video not loaded', () => { render() expect(screen.getByTestId('video-loading')).toBeInTheDocument() }) it('forwards ref to video element', () => { const ref = React.createRef() render() expect(ref.current).not.toBeNull() expect(ref.current?.tagName.toLowerCase()).toBe('video') }) it('handles video error state', () => { render() const video = screen.getByTestId('video-player') fireEvent.error(video) expect(screen.getByTestId('video-error')).toBeInTheDocument() expect(screen.getByText(/failed to load video/i)).toBeInTheDocument() }) it('has proper dimensions styling', () => { render() const video = screen.getByTestId('video-player') expect(video).toHaveClass('w-full') expect(video).toHaveClass('max-h-60') }) it('renders without crashing with null src', () => { render() expect(screen.getByTestId('video-player')).toBeInTheDocument() }) })