58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { describe, expect, it, beforeEach, afterEach, vi } from "vitest";
|
|
import { renderHook, waitFor } from "@testing-library/react";
|
|
import { useFleetWebSocket } from "./useFleetWebSocket";
|
|
import { setStoredAuth } from "@/lib/auth";
|
|
import {
|
|
installMockWebSocket,
|
|
MockWebSocket,
|
|
uninstallMockWebSocket,
|
|
} from "@/test/mockWebSocket";
|
|
|
|
describe("useFleetWebSocket", () => {
|
|
beforeEach(() => {
|
|
sessionStorage.clear();
|
|
setStoredAuth({ username: "operator", password: "test-pass" });
|
|
installMockWebSocket();
|
|
});
|
|
|
|
afterEach(() => {
|
|
uninstallMockWebSocket();
|
|
});
|
|
|
|
it("connects and receives heartbeat updates", async () => {
|
|
const onMessage = vi.fn();
|
|
const { result } = renderHook(() =>
|
|
useFleetWebSocket({ enabled: true, onMessage, reconnectIntervalMs: 60_000 }),
|
|
);
|
|
|
|
await waitFor(() => {
|
|
expect(result.current.connectionState).toBe("connected");
|
|
});
|
|
|
|
const ws = MockWebSocket.latest();
|
|
expect(ws?.url).toContain("ticket=test-ws-ticket");
|
|
|
|
const heartbeat = {
|
|
type: "heartbeat" as const,
|
|
timestamp: new Date().toISOString(),
|
|
payload: { online: 2 },
|
|
};
|
|
ws?.simulateMessage(heartbeat);
|
|
|
|
await waitFor(() => {
|
|
expect(result.current.lastMessage).toEqual(heartbeat);
|
|
});
|
|
expect(onMessage).toHaveBeenCalledWith(heartbeat);
|
|
});
|
|
|
|
it("stays disconnected when unauthenticated", async () => {
|
|
sessionStorage.clear();
|
|
const { result } = renderHook(() => useFleetWebSocket({ enabled: true }));
|
|
|
|
await waitFor(() => {
|
|
expect(result.current.connectionState).toBe("disconnected");
|
|
});
|
|
expect(MockWebSocket.instances).toHaveLength(0);
|
|
});
|
|
});
|