Bulk delete in ListView is now complete with dependency conflict detection and user-facing recovery options, backed by shared utility logic and tests. The feature touched ListView's core behavior, companion tests, and a small changeset documenting the user-facing recovery behavior. Fusion-Task-Id: FN-3889
35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { extractDependencyDeleteConflict } from "../taskDelete";
|
|
|
|
describe("extractDependencyDeleteConflict", () => {
|
|
it("returns dependent ids from details.code payload", () => {
|
|
const err = Object.assign(new Error("conflict"), {
|
|
details: { code: "TASK_HAS_DEPENDENTS", dependentIds: ["FN-1", "FN-2", 3] },
|
|
});
|
|
|
|
expect(extractDependencyDeleteConflict(err)).toEqual({ dependentIds: ["FN-1", "FN-2"] });
|
|
});
|
|
|
|
it("returns null for missing or invalid details payload", () => {
|
|
const missingDetails = new Error("failed");
|
|
const invalidDetails = Object.assign(new Error("failed"), {
|
|
details: { code: "TASK_HAS_DEPENDENTS", dependentIds: "FN-1" },
|
|
});
|
|
|
|
expect(extractDependencyDeleteConflict(missingDetails)).toBeNull();
|
|
expect(extractDependencyDeleteConflict(invalidDetails)).toBeNull();
|
|
});
|
|
|
|
it("falls back to parsing ids from message", () => {
|
|
const err = new Error("Cannot delete FN-22 because dependent tasks FN-100 and FN-101 block it; FN-100");
|
|
|
|
expect(extractDependencyDeleteConflict(err)).toEqual({ dependentIds: ["FN-100", "FN-101"] });
|
|
});
|
|
|
|
it("returns null for non-Error inputs", () => {
|
|
expect(extractDependencyDeleteConflict(null)).toBeNull();
|
|
expect(extractDependencyDeleteConflict({ message: "FN-1 FN-2" })).toBeNull();
|
|
expect(extractDependencyDeleteConflict("boom")).toBeNull();
|
|
});
|
|
});
|