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", (): void => {
it("should provide WebSocket context to children", (): void => {
const mockUseWebSocket = vi.spyOn(useWebSocketModule, "useWebSocket");
mockUseWebSocket.mockReturnValue({
isConnected: true,
socket: null,
connectionError: 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", (): void => {
const mockUseWebSocket = vi.spyOn(useWebSocketModule, "useWebSocket");
mockUseWebSocket.mockReturnValue({
isConnected: false,
socket: null,
connectionError: 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", (): void => {
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", (): void => {
const mockUseWebSocket = vi.spyOn(useWebSocketModule, "useWebSocket");
// Initially disconnected
mockUseWebSocket.mockReturnValue({
isConnected: false,
socket: null,
connectionError: 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,
connectionError: null,
});
rerender(
);
expect(screen.getByTestId("status")).toHaveTextContent("Connected");
});
});