paperclip/ui/src/hooks/useSharedPolling.test.ts

95 lines
3.2 KiB
TypeScript

import { QueryClient } from "@tanstack/react-query";
import { afterEach, describe, expect, it } from "vitest";
import {
beginLocalInboxArchive,
clearLocalInboxArchive,
} from "../lib/inboxArchiveCache";
import { applySharedPollingResult } from "./useSharedPolling";
describe("applySharedPollingResult", () => {
afterEach(() => {
clearLocalInboxArchive("company-1", "issue-archived");
});
it("drops result messages that are older than local query state", () => {
const queryClient = new QueryClient();
const queryKey = ["live-runs", "company-1"];
queryClient.setQueryData(queryKey, [{ id: "run-1", lastEventAt: "newer" }], { updatedAt: 2_000 });
const applied = applySharedPollingResult(queryClient, queryKey, {
type: "result",
key: "company:live-runs",
from: "leader",
at: 1_000,
dataUpdatedAt: 1_000,
data: [{ id: "run-1", lastEventAt: "older" }],
});
expect(applied).toBe(false);
expect(queryClient.getQueryData(queryKey)).toEqual([{ id: "run-1", lastEventAt: "newer" }]);
expect(queryClient.getQueryState(queryKey)?.dataUpdatedAt).toBe(2_000);
});
it("applies newer result messages with the producer dataUpdatedAt", () => {
const queryClient = new QueryClient();
const queryKey = ["live-runs", "company-1"];
queryClient.setQueryData(queryKey, [{ id: "run-1", lastEventAt: "older" }], { updatedAt: 1_000 });
const applied = applySharedPollingResult(queryClient, queryKey, {
type: "result",
key: "company:live-runs",
from: "leader",
at: 4_000,
dataUpdatedAt: 3_000,
data: [{ id: "run-1", lastEventAt: "newer" }],
});
expect(applied).toBe(true);
expect(queryClient.getQueryData(queryKey)).toEqual([{ id: "run-1", lastEventAt: "newer" }]);
expect(queryClient.getQueryState(queryKey)?.dataUpdatedAt).toBe(3_000);
});
it("filters locally archived issues from newer inbox broadcasts", () => {
const queryClient = new QueryClient();
const queryKey = ["issues", "company-1", "mine-by-me"];
beginLocalInboxArchive("company-1", "issue-archived");
const applied = applySharedPollingResult(queryClient, queryKey, {
type: "result",
key: "company:inbox",
from: "leader",
at: 4_000,
dataUpdatedAt: 3_000,
data: [{ id: "issue-archived" }, { id: "issue-visible" }],
});
expect(applied).toBe(true);
expect(queryClient.getQueryData(queryKey)).toEqual([{ id: "issue-visible" }]);
});
it("filters locally archived issues from the generic compact inbox broadcast", () => {
const queryClient = new QueryClient();
const queryKey = [
"issues",
"company-1",
"compact",
"with-routine-executions",
"live-descendant-summary",
250,
];
beginLocalInboxArchive("company-1", "issue-archived");
const applied = applySharedPollingResult(queryClient, queryKey, {
type: "result",
key: "company:inbox:issues",
from: "leader",
at: 4_000,
dataUpdatedAt: 3_000,
data: [{ id: "issue-archived" }, { id: "issue-visible" }],
});
expect(applied).toBe(true);
expect(queryClient.getQueryData(queryKey)).toEqual([{ id: "issue-visible" }]);
});
});