66 lines · 2.4 KB · TypeScript
RawDownload
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);  });});