import { describe, it, expect, vi } from 'vitest'; import { render, screen } from '@testing-library/react'; import { WebSocketProvider, useWebSocketContext } from './WebSocketProvider'; import * as useWebSocketModule from '../hooks/useWebSocket'; // Mock the useWebSocket hook vi.mock('../hooks/useWebSocket'); describe('WebSocketProvider', () => { it('should provide WebSocket context to children', () => { const mockUseWebSocket = vi.spyOn(useWebSocketModule, 'useWebSocket'); mockUseWebSocket.mockReturnValue({ isConnected: true, socket: null, }); function TestComponent(): React.JSX.Element { const { isConnected } = useWebSocketContext(); return
{isConnected ? 'Connected' : 'Disconnected'}
; } render( ); expect(screen.getByText('Connected')).toBeInTheDocument(); }); it('should pass callbacks to useWebSocket hook', () => { const mockUseWebSocket = vi.spyOn(useWebSocketModule, 'useWebSocket'); mockUseWebSocket.mockReturnValue({ isConnected: false, socket: null, }); const onTaskCreated = vi.fn(); const onTaskUpdated = vi.fn(); const onTaskDeleted = vi.fn(); render(
Test
); expect(mockUseWebSocket).toHaveBeenCalledWith( 'workspace-123', 'auth-token', { onTaskCreated, onTaskUpdated, onTaskDeleted, onEventCreated: undefined, onEventUpdated: undefined, onEventDeleted: undefined, onProjectUpdated: undefined, } ); }); it('should throw error when useWebSocketContext is used outside provider', () => { function TestComponent(): React.JSX.Element { useWebSocketContext(); return
Test
; } // Suppress console.error for this test const originalError = console.error; console.error = vi.fn(); expect(() => { render(); }).toThrow('useWebSocketContext must be used within WebSocketProvider'); console.error = originalError; }); it('should update context when connection status changes', () => { const mockUseWebSocket = vi.spyOn(useWebSocketModule, 'useWebSocket'); // Initially disconnected mockUseWebSocket.mockReturnValue({ isConnected: false, socket: null, }); function TestComponent(): React.JSX.Element { const { isConnected } = useWebSocketContext(); return
{isConnected ? 'Connected' : 'Disconnected'}
; } const { rerender } = render( ); expect(screen.getByTestId('status')).toHaveTextContent('Disconnected'); // Update to connected mockUseWebSocket.mockReturnValue({ isConnected: true, socket: null, }); rerender( ); expect(screen.getByTestId('status')).toHaveTextContent('Connected'); }); });