Skip to content

Commit ef8abed

Browse files
committed
test(config): check settings import laziness in a fresh process
1 parent 4a35a60 commit ef8abed

3 files changed

Lines changed: 36 additions & 12 deletions

File tree

‎scripts/settings-lazy-probe.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { schemaMaterializations } from "../src/schema/lazy.js";
2+
3+
const before = schemaMaterializations();
4+
await import("../src/config/settings.js");
5+
process.stdout.write(
6+
JSON.stringify({ before, afterImport: schemaMaterializations() }),
7+
);

‎src/config/settings-lazy.test.ts‎

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
1-
import { mkdtemp, rm, writeFile } from "node:fs/promises";
2-
import { tmpdir } from "node:os";
31
import { join } from "node:path";
42
import { expect, test } from "bun:test";
53

6-
test("importing settings allows a malformed file to fail when read", async () => {
7-
const settings = await import("./settings.js");
4+
const settingsLazinessProbe = join(
5+
import.meta.dirname,
6+
"../../scripts/settings-lazy-probe.ts",
7+
);
88

9-
const dir = await mkdtemp(join(tmpdir(), "lazy-settings-"));
10-
try {
11-
const path = join(dir, "settings.json");
12-
await writeFile(path, JSON.stringify({ providers: "nope" }));
13-
await expect(settings.loadSettings(path)).rejects.toThrow();
14-
} finally {
15-
await rm(dir, { recursive: true, force: true });
16-
}
9+
test("importing settings does not build schemas", async () => {
10+
const child = Bun.spawn([process.execPath, settingsLazinessProbe], {
11+
stdout: "pipe",
12+
stderr: "pipe",
13+
});
14+
const [exitCode, stdout, stderr] = await Promise.all([
15+
child.exited,
16+
new Response(child.stdout).text(),
17+
new Response(child.stderr).text(),
18+
]);
19+
20+
expect(exitCode, stderr).toBe(0);
21+
const materializations = JSON.parse(stdout) as {
22+
before: number;
23+
afterImport: number;
24+
};
25+
expect(materializations.afterImport).toBe(materializations.before);
1726
});

‎src/schema/lazy.ts‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
1+
let materializations = 0;
2+
3+
/** How many memoized schemas have been built in this process. */
4+
export function schemaMaterializations(): number {
5+
return materializations;
6+
}
7+
18
export function memoSchema<T>(build: () => T): () => T {
29
let cached: T | undefined;
310
let ready = false;
411
return () => {
512
if (!ready) {
613
cached = build();
714
ready = true;
15+
materializations += 1;
816
}
917
return cached as T;
1018
};

0 commit comments

Comments
 (0)