From 5479101c8c94258361d66916b1ab15a63be38cdc Mon Sep 17 00:00:00 2001 From: DongHyeonka Date: Sat, 15 Aug 2026 17:55:37 +0900 Subject: [PATCH] fix: exercise production evidence asset lookup --- .../adapters/static/evidence-assets.ts | 25 +++++++++++++++++ .../tech-log/migration-baseline.test.ts | 28 +++++-------------- 2 files changed, 32 insertions(+), 21 deletions(-) create mode 100644 src/features/tech-log/adapters/static/evidence-assets.ts diff --git a/src/features/tech-log/adapters/static/evidence-assets.ts b/src/features/tech-log/adapters/static/evidence-assets.ts new file mode 100644 index 0000000..8bef2f1 --- /dev/null +++ b/src/features/tech-log/adapters/static/evidence-assets.ts @@ -0,0 +1,25 @@ +export const evidenceAssets = { + "fetch-strategy-boundary": { + src: "/media/fetch-strategy-boundary.svg", + width: 1080, + height: 420, + triggerLabel: "Fetch Join과 Batch Fetch 비교 다이어그램 크게 보기", + dialogLabel: "Fetch Join과 Batch Fetch의 페이징 경계 확대", + }, +} as const; + +export type SupportedEvidenceKey = keyof typeof evidenceAssets; + +export function isSupportedEvidenceKey( + key: string, +): key is SupportedEvidenceKey { + return Object.hasOwn(evidenceAssets, key); +} + +export function getEvidenceAsset(key: string) { + if (!isSupportedEvidenceKey(key)) { + throw new Error(`Unknown local evidence asset: ${key}`); + } + + return evidenceAssets[key]; +} diff --git a/tests/features/tech-log/migration-baseline.test.ts b/tests/features/tech-log/migration-baseline.test.ts index ca4a5af..0a035b0 100644 --- a/tests/features/tech-log/migration-baseline.test.ts +++ b/tests/features/tech-log/migration-baseline.test.ts @@ -4,6 +4,8 @@ import { resolve } from "node:path"; import { describe, expect, it } from "vitest"; +import { getEvidenceAsset } from "../../../src/features/tech-log/adapters/static/evidence-assets.ts"; + const publicDirectory = resolve(process.cwd(), "public"); const approvedSvgAssets = [ @@ -17,25 +19,6 @@ const approvedSvgAssets = [ }, ] as const; -const localEvidenceAssets = { - "fetch-strategy-boundary": { - src: "/media/fetch-strategy-boundary.svg", - width: 1080, - height: 420, - triggerLabel: "Fetch Join과 Batch Fetch 비교 다이어그램 크게 보기", - dialogLabel: "Fetch Join과 Batch Fetch의 페이징 경계 확대", - }, -} as const; - -function getLocalEvidenceAsset(key: string) { - const asset = localEvidenceAssets[key as keyof typeof localEvidenceAssets]; - if (!asset) { - throw new Error(`Unknown local evidence asset: ${key}`); - } - - return asset; -} - function sha256(filePath: string) { return createHash("sha256").update(readFileSync(filePath)).digest("hex"); } @@ -51,7 +34,7 @@ describe("TechLog migration baseline", () => { }); it("resolves the fetch strategy evidence to its published asset contract", () => { - expect(getLocalEvidenceAsset("fetch-strategy-boundary")).toEqual({ + expect(getEvidenceAsset("fetch-strategy-boundary")).toEqual({ src: "/media/fetch-strategy-boundary.svg", width: 1080, height: 420, @@ -61,11 +44,14 @@ describe("TechLog migration baseline", () => { const evidencePath = resolve( publicDirectory, - getLocalEvidenceAsset("fetch-strategy-boundary").src.slice(1), + getEvidenceAsset("fetch-strategy-boundary").src.slice(1), ); expect(existsSync(evidencePath)).toBe(true); expect(sha256(evidencePath)).toBe( "b07926823ed77fc200f962a1f64a440e130cefa6bed31144b611612af9b02606", ); + expect(() => getEvidenceAsset("unknown")).toThrow( + "Unknown local evidence asset: unknown", + ); }); });