Files
cloudflare__vinext/tests/app-hydration-cache-publication.test.ts
T
James Anderson f0ba7b4afe fix(app-router): reuse committed client cache payloads (#2251)
* fix(app-router): seed client navigation cache

* fix(cache): parse prerender cache metadata marker

* test(cache): cover prerender metadata done marker

* fix(cache): preserve static committed stale time

* fix(link): honor dynamic stale time for auto prefetches

* fix(router): retain committed client cache state

* fix(router): publish client cache after commit

* fix(router): gate hydration cache publication

* fix(router): guard late client cache publication

* fix(router): isolate client cache parity coverage

* fix(router): preserve authoritative navigation commits

* fix(router): preserve committed navigation streams
2026-06-28 22:01:58 +00:00

85 lines
2.5 KiB
TypeScript

import { describe, expect, it, vi } from "vite-plus/test";
import { createHydrationCachePublication } from "../packages/vinext/src/server/app-hydration-cache-publication.js";
describe("initial hydration cache publication", () => {
it("publishes a candidate only after the BrowserRoot commit", () => {
const publication = createHydrationCachePublication();
const invalidate = vi.fn();
const publish = vi.fn(() => invalidate);
publication.publish(publish);
expect(publish).not.toHaveBeenCalled();
publication.commit();
expect(publish).toHaveBeenCalledOnce();
expect(invalidate).not.toHaveBeenCalled();
});
it("publishes a late candidate after the BrowserRoot commit", () => {
const publication = createHydrationCachePublication();
const publish = vi.fn(() => vi.fn());
publication.commit();
publication.publish(publish);
expect(publish).toHaveBeenCalledOnce();
});
it("publishes a candidate that finishes buffering after hydration completes", () => {
const publication = createHydrationCachePublication();
const publish = vi.fn(() => vi.fn());
publication.commit();
publication.complete();
publication.publish(publish);
expect(publish).toHaveBeenCalledOnce();
});
it("cancels an unpublished candidate when hydration fails", () => {
const publication = createHydrationCachePublication();
const publish = vi.fn(() => vi.fn());
publication.publish(publish);
publication.fail();
publication.commit();
expect(publish).not.toHaveBeenCalled();
});
it("invalidates a committed candidate when hydration fails before passive completion", () => {
const publication = createHydrationCachePublication();
const invalidate = vi.fn();
publication.commit();
publication.publish(() => invalidate);
publication.fail();
expect(invalidate).toHaveBeenCalledOnce();
});
it("does not discard a completed hydration candidate for a later root error", () => {
const publication = createHydrationCachePublication();
const invalidate = vi.fn();
publication.commit();
publication.publish(() => invalidate);
publication.complete();
publication.fail();
expect(invalidate).not.toHaveBeenCalled();
});
it("invalidates the exact published candidate on cleanup", () => {
const publication = createHydrationCachePublication();
const invalidate = vi.fn();
publication.commit();
publication.publish(() => invalidate);
publication.invalidate();
publication.invalidate();
expect(invalidate).toHaveBeenCalledOnce();
});
});