websocket-shared-client.test.tsx 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
  2. import { renderHook } from '@testing-library/react';
  3. import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
  4. import type { ReactNode } from 'react';
  5. import { useWebSocket } from '@/hooks/useWebSocket';
  6. import { useWebSocketBridge } from '@/api/websocketBridge';
  7. describe('shared WebSocket connection', () => {
  8. let socketCount = 0;
  9. let originalWS: typeof WebSocket;
  10. beforeEach(() => {
  11. socketCount = 0;
  12. originalWS = globalThis.WebSocket;
  13. class FakeWebSocket {
  14. static readonly CONNECTING = 0;
  15. static readonly OPEN = 1;
  16. static readonly CLOSING = 2;
  17. static readonly CLOSED = 3;
  18. readyState = FakeWebSocket.CONNECTING;
  19. constructor() {
  20. socketCount += 1;
  21. }
  22. addEventListener() {}
  23. removeEventListener() {}
  24. close() {}
  25. send() {}
  26. }
  27. globalThis.WebSocket = FakeWebSocket as unknown as typeof WebSocket;
  28. });
  29. afterEach(() => {
  30. globalThis.WebSocket = originalWS;
  31. vi.restoreAllMocks();
  32. });
  33. it('opens a single socket when the bridge and a page hook are both mounted', () => {
  34. const queryClient = new QueryClient();
  35. const wrapper = ({ children }: { children: ReactNode }) => (
  36. <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  37. );
  38. renderHook(() => useWebSocketBridge(), { wrapper });
  39. renderHook(() => useWebSocket({ traffic: () => {} }));
  40. expect(socketCount).toBe(1);
  41. });
  42. });