test(requests): document viewer-keyed cache isolation and invalidation cascade

This commit is contained in:
Silo Server Migration
2026-05-25 18:12:45 -04:00
parent e97286da01
commit 4d51608118
2 changed files with 31 additions and 0 deletions
@@ -2,6 +2,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
import { renderToStaticMarkup } from "react-dom/server";
import type { ReactNode } from "react";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { requestKeys } from "./keys";
const mocks = vi.hoisted(() => ({
useQuery: vi.fn(),
@@ -108,3 +109,30 @@ describe("useRequestSearch", () => {
expect(options.enabled).toBe(true);
});
});
describe("requestKeys.all invalidation", () => {
it("invalidates entries under requestKeys.search() when invalidating requestKeys.all", async () => {
const client = new QueryClient();
client.setQueryData(requestKeys.search("all", "dune", 1, "profile-1"), { sentinel: true });
expect(client.getQueryData(requestKeys.search("all", "dune", 1, "profile-1"))).toEqual({
sentinel: true,
});
await client.invalidateQueries({ queryKey: requestKeys.all });
const state = client.getQueryState(requestKeys.search("all", "dune", 1, "profile-1"));
expect(state?.isInvalidated).toBe(true);
});
});
describe("viewer-scoped cache isolation", () => {
it("does not return profile-1 results when keyed by profile-2", () => {
const client = new QueryClient();
client.setQueryData(requestKeys.search("all", "dune", 1, "profile-1"), {
results: [{ tmdb_id: 1 }],
});
expect(client.getQueryData(requestKeys.search("all", "dune", 1, "profile-2"))).toBeUndefined();
});
});
+3
View File
@@ -53,6 +53,9 @@ function buildListQuery(params: RequestListParams = {}) {
}
function invalidateRequestSurfaces(queryClient: ReturnType<typeof useQueryClient>) {
// requestKeys.all = ["requests"], so invalidating it cascades to nested keys,
// including requestKeys.search(...). Policy mutations rely on this to refresh
// viewer-scoped search results when request eligibility changes.
queryClient.invalidateQueries({ queryKey: requestKeys.all });
queryClient.invalidateQueries({ queryKey: adminKeys.requestsRoot() });
}