import { describe, expect, it } from "@effect/vitest";import { Effect } from "effect"; import { clearCompiledOpenApiSpecCache, compileOpenApiSpecCached } from "./backing"; const specText = (title: string): string => JSON.stringify({ openapi: "3.0.3", info: { title, version: "1.0.0" }, servers: [{ url: "https://api.example.com" }], paths: { "/me": { get: { operationId: "getMe", responses: { "200": { description: "ok", content: { "application/json": { schema: { type: "object", properties: { email: { type: "string" } } }, }, }, }, }, }, }, }, }); describe("compileOpenApiSpecCached", () => { it("reuses the compiled result for the same spec hash", () => { clearCompiledOpenApiSpecCache(); const text = specText("Cached API"); const first = Effect.runSync(compileOpenApiSpecCached("hash-a", text)); const second = Effect.runSync(compileOpenApiSpecCached("hash-a", text)); // Reference equality proves the second call skipped recompilation. expect(second).toBe(first); }); it("recompiles when the spec hash changes", () => { clearCompiledOpenApiSpecCache(); const first = Effect.runSync(compileOpenApiSpecCached("hash-a", specText("V1"))); const second = Effect.runSync(compileOpenApiSpecCached("hash-b", specText("V2"))); expect(second).not.toBe(first); expect(second.title).toBe("V2"); }); it("bypasses the cache when no hash is available", () => { clearCompiledOpenApiSpecCache(); const text = specText("No hash"); const first = Effect.runSync(compileOpenApiSpecCached(undefined, text)); const second = Effect.runSync(compileOpenApiSpecCached(undefined, text)); expect(second).not.toBe(first); }); it("evicts the oldest entry past capacity", () => { clearCompiledOpenApiSpecCache(); const first = Effect.runSync(compileOpenApiSpecCached("hash-0", specText("Zero"))); for (let index = 1; index <= 4; index++) { Effect.runSync(compileOpenApiSpecCached(`hash-${index}`, specText(`Spec ${index}`))); } // hash-0 was evicted by the four newer entries, so it recompiles. const again = Effect.runSync(compileOpenApiSpecCached("hash-0", specText("Zero"))); expect(again).not.toBe(first); });});
import { describe, expect, it } from "@effect/vitest";
import { Effect } from "effect";
import { clearCompiledOpenApiSpecCache, compileOpenApiSpecCached } from "./backing";
const specText = (title: string): string =>
JSON.stringify({
openapi: "3.0.3",
info: { title, version: "1.0.0" },
servers: [{ url: "https://api.example.com" }],
paths: {
"/me": {
get: {
operationId: "getMe",
responses: {
"200": {
description: "ok",
content: {
"application/json": {
schema: { type: "object", properties: { email: { type: "string" } } },
},
},
},
},
},
},
},
});
describe("compileOpenApiSpecCached", () => {
it("reuses the compiled result for the same spec hash", () => {
clearCompiledOpenApiSpecCache();
const text = specText("Cached API");
const first = Effect.runSync(compileOpenApiSpecCached("hash-a", text));
const second = Effect.runSync(compileOpenApiSpecCached("hash-a", text));
// Reference equality proves the second call skipped recompilation.
expect(second).toBe(first);
});
it("recompiles when the spec hash changes", () => {
clearCompiledOpenApiSpecCache();
const first = Effect.runSync(compileOpenApiSpecCached("hash-a", specText("V1")));
const second = Effect.runSync(compileOpenApiSpecCached("hash-b", specText("V2")));
expect(second).not.toBe(first);
expect(second.title).toBe("V2");
});
it("bypasses the cache when no hash is available", () => {
clearCompiledOpenApiSpecCache();
const text = specText("No hash");
const first = Effect.runSync(compileOpenApiSpecCached(undefined, text));
const second = Effect.runSync(compileOpenApiSpecCached(undefined, text));
expect(second).not.toBe(first);
});
it("evicts the oldest entry past capacity", () => {
clearCompiledOpenApiSpecCache();
const first = Effect.runSync(compileOpenApiSpecCached("hash-0", specText("Zero")));
for (let index = 1; index <= 4; index++) {
Effect.runSync(compileOpenApiSpecCached(`hash-${index}`, specText(`Spec ${index}`)));
}
// hash-0 was evicted by the four newer entries, so it recompiles.
const again = Effect.runSync(compileOpenApiSpecCached("hash-0", specText("Zero")));
expect(again).not.toBe(first);
});
});