42 lines
1.8 KiB
TypeScript
42 lines
1.8 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
|
|
import { ApiError } from "../src/services/api/request";
|
|
import { shouldRetryProjectNameConflict } from "../src/lib/project-name-conflict";
|
|
|
|
describe("project name conflict retries", () => {
|
|
test("retries only the structured project-name conflict", () => {
|
|
const projectNameConflict = new ApiError("文案可能变化", {
|
|
status: 409,
|
|
reason: "project_name_conflict",
|
|
});
|
|
|
|
expect(shouldRetryProjectNameConflict(projectNameConflict, 0)).toBe(true);
|
|
expect(shouldRetryProjectNameConflict(new ApiError("项目名称已存在", {
|
|
status: 409,
|
|
reason: "conflict",
|
|
}), 0)).toBe(false);
|
|
expect(shouldRetryProjectNameConflict(new Error("项目名称已存在"), 0)).toBe(false);
|
|
});
|
|
|
|
test("stops after the configured number of name retries", () => {
|
|
const projectNameConflict = new ApiError("项目名称已存在", {
|
|
status: 409,
|
|
reason: "project_name_conflict",
|
|
});
|
|
|
|
expect(shouldRetryProjectNameConflict(projectNameConflict, 4)).toBe(true);
|
|
expect(shouldRetryProjectNameConflict(projectNameConflict, 5)).toBe(false);
|
|
});
|
|
|
|
test("错误文案、非 409 状态和缺少专用原因的错误不能触发重试", () => {
|
|
for (const error of [
|
|
new ApiError("项目名称已存在", { status: 500, reason: "project_name_conflict" }),
|
|
new ApiError("UNIQUE constraint failed: projects.user_id, projects.name", { status: 409 }),
|
|
new Error("UNIQUE constraint failed: projects.user_id, projects.name"),
|
|
{ status: 409, reason: "project_name_conflict" },
|
|
]) {
|
|
expect(shouldRetryProjectNameConflict(error, 0)).toBe(false);
|
|
}
|
|
});
|
|
});
|