4db44d3f85
Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
79 lines
2.7 KiB
TypeScript
79 lines
2.7 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { ApiError } from "@/lib/api/client";
|
|
|
|
import { getTaskMoveErrorDetail, getTaskMoveErrorMessage } from "./task-move-error-message";
|
|
|
|
const activeSessionError = "task has an active session";
|
|
|
|
describe("getTaskMoveErrorMessage", () => {
|
|
const fallback = "fallback";
|
|
const activeSessionMessage = "active session";
|
|
|
|
it("uses an Error message", () => {
|
|
expect(getTaskMoveErrorMessage(new Error(activeSessionMessage), fallback)).toBe(
|
|
activeSessionMessage,
|
|
);
|
|
});
|
|
|
|
it("supports string rejections", () => {
|
|
expect(getTaskMoveErrorMessage(activeSessionMessage, fallback)).toBe(activeSessionMessage);
|
|
});
|
|
|
|
it("uses the fallback for empty or unknown errors", () => {
|
|
expect(getTaskMoveErrorMessage(new Error(" "), fallback)).toBe(fallback);
|
|
expect(getTaskMoveErrorMessage({ message: activeSessionMessage }, fallback)).toBe(fallback);
|
|
});
|
|
|
|
it("translates a structured active-session conflict", () => {
|
|
const translate = (key: string) => `translated:${key}`;
|
|
const error = new ApiError(activeSessionError, 409, {
|
|
error: activeSessionError,
|
|
code: "task_move_active_session",
|
|
});
|
|
|
|
expect(getTaskMoveErrorMessage(error, fallback, translate)).toBe(
|
|
"translated:task:taskMoveErrorActiveSession",
|
|
);
|
|
});
|
|
|
|
it("uses a translated generic message for an unknown API error", () => {
|
|
const translate = (key: string) => `translated:${key}`;
|
|
const error = new ApiError("internal details", 500, {
|
|
error: "internal details",
|
|
code: "unexpected_move_error",
|
|
});
|
|
|
|
expect(getTaskMoveErrorMessage(error, fallback, translate)).toBe(
|
|
"translated:task:taskMoveErrorGeneric",
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("getTaskMoveErrorDetail", () => {
|
|
const title = "Failed to move task";
|
|
|
|
it("returns the server reason as the detail", () => {
|
|
expect(getTaskMoveErrorDetail(new Error("task has an active session (RUNNING)"), title)).toBe(
|
|
"task has an active session (RUNNING)",
|
|
);
|
|
});
|
|
|
|
it("uses the translated conflict detail", () => {
|
|
const error = new ApiError(activeSessionError, 409, {
|
|
error: activeSessionError,
|
|
code: "task_move_active_session",
|
|
});
|
|
const translate = (key: string) => `translated:${key}`;
|
|
|
|
expect(getTaskMoveErrorDetail(error, title, translate)).toBe(
|
|
"translated:task:taskMoveErrorActiveSession",
|
|
);
|
|
});
|
|
|
|
it("returns null when the detail would only repeat the title", () => {
|
|
expect(getTaskMoveErrorDetail({ message: "hidden" }, title)).toBeNull();
|
|
expect(getTaskMoveErrorDetail(new Error(" "), title)).toBeNull();
|
|
expect(getTaskMoveErrorDetail(new Error(title), title)).toBeNull();
|
|
});
|
|
});
|