/**
* 指示書BJ §4 表E(`lib/ds-logs/modal-text.ts`)。`t` は渡した文字列をそのまま返す。
*/
import { describe, expect, it } from "vitest";
import { ApiFetchError } from "@/lib/api/client";
import { apiErrorMessage } from "@/lib/ds-logs/modal-text";
import { EXPORT_FILE_IDS_TOO_LARGE_MESSAGE } from "@/lib/ds-logs/validate";
import { translate } from "@/lib/i18n";
const t = (text: string) => text;
describe("apiErrorMessage() — 表E", () => {
it("E1 status 0・cause は DOMException AbortError → null", () => {
const e = new ApiFetchError({
status: 0,
code: null,
serverMessage: null,
cause: new DOMException("x", "AbortError"),
});
expect(apiErrorMessage(e, t)).toBeNull();
});
it("E2 status 0・cause は name=AbortError の Error → null", () => {
const e = new ApiFetchError({
status: 0,
code: null,
serverMessage: null,
cause: Object.assign(new Error("x"), { name: "AbortError" }),
});
expect(apiErrorMessage(e, t)).toBeNull();
});
it("E3 status 0・cause は TypeError → 通信失敗", () => {
const e = new ApiFetchError({
status: 0,
code: null,
serverMessage: null,
cause: new TypeError("Failed to fetch"),
});
expect(apiErrorMessage(e, t)).toBe("通信に失敗しました。時間をおいて再度お試しください");
});
it("E4 status 0・cause なし → E3 と同じ", () => {
const e = new ApiFetchError({ status: 0, code: null, serverMessage: null });
expect(apiErrorMessage(e, t)).toBe("通信に失敗しました。時間をおいて再度お試しください");
});
it("E5 502 agent_error・result_invalid", () => {
const e = new ApiFetchError({
status: 502,
code: "agent_error",
serverMessage: "制御盤でエラーが発生しました",
details: { agent_code: ["result_invalid"] },
});
expect(apiErrorMessage(e, t)).toBe("制御盤の結果の形が不正です");
});
it("E6 502 agent_error・too_large", () => {
const e = new ApiFetchError({
status: 502,
code: "agent_error",
serverMessage: "制御盤でエラーが発生しました",
details: { agent_code: ["too_large"] },
});
expect(apiErrorMessage(e, t)).toBe("選んだファイルが大きすぎます(1回 100 MB まで)");
});
it("E7 502 agent_error・未知の code", () => {
const e = new ApiFetchError({
status: 502,
code: "agent_error",
serverMessage: "制御盤でエラーが発生しました",
details: { agent_code: ["x"] },
});
expect(apiErrorMessage(e, t)).toBe("制御盤でエラーが発生しました(x)");
});
it("E8 409 agent_offline・last_seen_at 空", () => {
const e = new ApiFetchError({
status: 409,
code: "agent_offline",
serverMessage: "制御盤が接続されていません",
details: { last_seen_at: [] },
});
expect(apiErrorMessage(e, t)).toBe("制御盤が接続されていません(最終接続: -)");
});
it("E9 ApiFetchError でない → 既定文言", () => {
expect(apiErrorMessage(new Error("x"), t)).toBe("データの取得に失敗しました");
});
it("K7-6 422 validation_failed・file_ids 合計超過", () => {
const e = new ApiFetchError({
status: 422,
code: "validation_failed",
serverMessage: EXPORT_FILE_IDS_TOO_LARGE_MESSAGE,
details: { file_ids: ["x"] },
});
expect(apiErrorMessage(e, t)).toBe(EXPORT_FILE_IDS_TOO_LARGE_MESSAGE);
expect(apiErrorMessage(e, (s) => translate("en", s))).toBe(
"Too many files selected. Please select fewer files"
);
});
it("K7-7 422 validation_failed・他の文言はそのまま", () => {
const e = new ApiFetchError({
status: 422,
code: "validation_failed",
serverMessage: "file_idsの形式が不正です",
details: { file_ids: ["x"] },
});
expect(apiErrorMessage(e, t)).toBe("file_idsの形式が不正です");
});
});