import { WS_METHODS } from "@t3tools/contracts"; import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test"; import { acknowledgeRpcRequest, getSlowRpcAckRequests, resetRequestLatencyStateForTests, trackRpcRequestSent, SLOW_RPC_ACK_THRESHOLD_MS, MAX_TRACKED_RPC_ACK_REQUESTS, } from "./requestLatencyState"; describe("requestLatencyState", () => { beforeEach(() => { vi.useFakeTimers(); resetRequestLatencyStateForTests(); }); afterEach(() => { vi.useRealTimers(); }); it("marks unary requests as slow when the ack threshold is exceeded", () => { trackRpcRequestSent("1", "server.getConfig"); vi.advanceTimersByTime(SLOW_RPC_ACK_THRESHOLD_MS - 1); expect(getSlowRpcAckRequests()).toEqual([]); vi.advanceTimersByTime(1); expect(getSlowRpcAckRequests()).toMatchObject([ { requestId: "1", tag: "server.getConfig", thresholdMs: SLOW_RPC_ACK_THRESHOLD_MS, }, ]); }); it("clears the slow request once the server acknowledges it", () => { trackRpcRequestSent("1", "git.status"); vi.advanceTimersByTime(SLOW_RPC_ACK_THRESHOLD_MS); expect(getSlowRpcAckRequests()).toHaveLength(1); acknowledgeRpcRequest("1"); expect(getSlowRpcAckRequests()).toEqual([]); }); it("ignores long-lived subscribe requests", () => { trackRpcRequestSent("1", "subscribeServerConfig"); vi.advanceTimersByTime(SLOW_RPC_ACK_THRESHOLD_MS * 2); expect(getSlowRpcAckRequests()).toEqual([]); }); it("ignores the long-lived preview automation connection", () => { trackRpcRequestSent("1", WS_METHODS.previewAutomationConnect); vi.advanceTimersByTime(SLOW_RPC_ACK_THRESHOLD_MS * 2); expect(getSlowRpcAckRequests()).toEqual([]); }); it("evicts the oldest pending requests once the tracker reaches capacity", () => { for (let index = 0; index < MAX_TRACKED_RPC_ACK_REQUESTS + 1; index += 1) { trackRpcRequestSent(String(index), "server.getConfig"); } vi.advanceTimersByTime(SLOW_RPC_ACK_THRESHOLD_MS); const slowRequests = getSlowRpcAckRequests(); expect(slowRequests).toHaveLength(MAX_TRACKED_RPC_ACK_REQUESTS); expect(slowRequests[0]?.requestId).toBe("1"); expect(slowRequests.at(-1)?.requestId).toBe(String(MAX_TRACKED_RPC_ACK_REQUESTS)); }); });