GenerAI / worldmonitor /server /__tests__ /summarize-article-cache-readonly.test.ts
amogaddy's picture
Integra World Monitor (AGPL-3.0, self-hosted) nello Space: pagina, menu, e arricchimento notizie per la AI (part 5)
20f83d9 verified
Raw
History Blame Contribute Delete
1.95 kB
// @vitest-environment node
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
const getCachedJson = vi.fn();
vi.mock("../_shared/redis", () => ({
getCachedJson: (...a: unknown[]) => getCachedJson(...a),
}));
import { getSummarizeArticleCache } from "../worldmonitor/news/v1/get-summarize-article-cache";
const originalFetch = globalThis.fetch;
function makeContext() {
return {
request: new Request("https://www.worldmonitor.app/api/news/v1/summarize-article-cache?cache_key=summary:v1:test-key"),
pathParams: {},
headers: {},
};
}
beforeEach(() => {
getCachedJson.mockReset();
globalThis.fetch = vi.fn(async () => {
throw new Error("cache lookup must not call providers");
}) as typeof fetch;
});
afterEach(() => {
globalThis.fetch = originalFetch;
});
describe("summarize-article-cache read-only behavior", () => {
test("returns cached summaries without calling provider fetch", async () => {
getCachedJson.mockResolvedValue({ summary: "Cached brief", model: "llama", tokens: 123 });
const result = await getSummarizeArticleCache(makeContext(), {
cacheKey: "summary:v1:test-key",
});
expect(result).toMatchObject({
summary: "Cached brief",
model: "llama",
provider: "cache",
tokens: 0,
fallback: false,
status: "SUMMARIZE_STATUS_CACHED",
});
expect(getCachedJson).toHaveBeenCalledWith("summary:v1:test-key");
expect(globalThis.fetch).not.toHaveBeenCalled();
});
test("returns an empty miss without calling provider fetch", async () => {
getCachedJson.mockResolvedValue(null);
const result = await getSummarizeArticleCache(makeContext(), {
cacheKey: "summary:v1:test-key",
});
expect(result).toMatchObject({
summary: "",
provider: "",
fallback: true,
status: "SUMMARIZE_STATUS_UNSPECIFIED",
});
expect(globalThis.fetch).not.toHaveBeenCalled();
});
});