/**
* アラート種別ラベルの期待値表(指示書S 2-2 / 完了条件7 / D-105)
*
* ★fixtures の実データを通す★ — 「`precheck_minutes: 20` の行が『20分前異常』と
* 表示されること」は本指示書の完了条件(指示書S 完了条件7)。
* 目視だけで済ませないため、ここで固定する(`CLAUDE.md` §6-2)。
* ★JA / EN の両方を見る★ — `"出発失敗"` 等は従来 `lib/i18n.ts` にキーが無く
* EN でも日本語のまま出ていた(D-093 項2-3 の指摘)。対訳を入れたことを固定する。
*/
import { describe, expect, it } from "vitest";
import { PRECHECK_MINUTES_BEFORE } from "@/lib/config";
import { prechecks } from "@/lib/fixtures/prechecks";
import { translate, type Lang } from "@/lib/i18n";
import { precheckSeverityLabel } from "@/lib/prechecks/label";
const ja = (text: string) => translate("ja", text);
const en = (text: string) => translate("en", text);
function labelsFor(lang: Lang): string[] {
const t = lang === "ja" ? ja : en;
return prechecks.map((item) => precheckSeverityLabel(t, item));
}
describe("precheckSeverityLabel", () => {
it("設定値の分数(60 / 30)は「◯分前異常」になる", () => {
const [first, second] = PRECHECK_MINUTES_BEFORE;
expect(
precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: first })
).toBe(`${first}分前異常`);
expect(
precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: second })
).toBe(`${second}分前異常`);
});
it("★設定値以外の任意の分数でも組み立てられる(D-093 項2「20だったら20分前」)★", () => {
expect(
precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: 20 })
).toBe("20分前異常");
expect(
precheckSeverityLabel(ja, { severity: "precheck", precheck_minutes: 45 })
).toBe("45分前異常");
});
it("launch_failed は「出発失敗」(分数を出さない)", () => {
expect(
precheckSeverityLabel(ja, { severity: "launch_failed", precheck_minutes: null })
).toBe("出発失敗");
});
it("precheck なのに分数が null なら「事前チェック異常」に倒す(空文字にしない)", () => {
const label = precheckSeverityLabel(ja, {
severity: "precheck",
precheck_minutes: null,
});
expect(label).toBe("事前チェック異常");
expect(label).not.toBe("");
expect(label).not.toContain("null");
});
it("EN では対訳が効く(従来はキーが無く日本語のまま出ていた)", () => {
expect(
precheckSeverityLabel(en, { severity: "launch_failed", precheck_minutes: null })
).toBe("Launch failed");
expect(
precheckSeverityLabel(en, { severity: "precheck", precheck_minutes: 20 })
).toBe("Error 20 min before");
expect(
precheckSeverityLabel(en, { severity: "precheck", precheck_minutes: null })
).toBe("Pre-check error");
});
it("★fixtures の全件が JA で「60分前異常 / 30分前異常 / 20分前異常 / 出発失敗」になる★", () => {
const labels = new Set(labelsFor("ja"));
const [first, second] = PRECHECK_MINUTES_BEFORE;
expect(labels).toEqual(
new Set([`${first}分前異常`, `${second}分前異常`, "20分前異常", "出発失敗"])
);
});
it("fixtures の全件が EN でも日本語を含まない", () => {
for (const label of labelsFor("en")) {
expect(label).not.toMatch(/[-ヿ一-鿿]/);
}
});
});