diff --git a/src/datasets/cached-file.test.ts b/src/datasets/cached-file.test.ts index 74d2e2a..dfc35b8 100644 --- a/src/datasets/cached-file.test.ts +++ b/src/datasets/cached-file.test.ts @@ -110,6 +110,22 @@ describe("fetchCachedTextFile", () => { expect(requestCount).toBe(1); }); + it("refetches and overwrites a cached entry the validator rejects", async () => { + stubFetch([new Response('{"users":{}}', { status: 200 })]); + const { store, entries } = makeMemoryStore(); + entries.set(CACHE_KEY, { text: "rate limited" }); + + await expect( + run({ + ...REQUEST, + cacheStore: store, + validate: jsonTextValidator("object"), + }) + ).resolves.toBe('{"users":{}}'); + expect(requestCount).toBe(1); + expect(entries.get(CACHE_KEY)).toEqual({ text: '{"users":{}}' }); + }); + it("retries a rate-limited origin and caches the successful body", async () => { stubFetch([ new Response("slow down", { status: 429 }), diff --git a/src/datasets/cached-file.ts b/src/datasets/cached-file.ts index 2fc62c1..cbc6f51 100644 --- a/src/datasets/cached-file.ts +++ b/src/datasets/cached-file.ts @@ -138,7 +138,10 @@ export function fetchCachedTextFile( CachedTextSchema, yield* promise(() => store.readJson(key)) ); - if (Either.isRight(cached)) { + if ( + Either.isRight(cached) && + request.validate?.(cached.right.text) === undefined + ) { return cached.right.text; } }