2026-03-06 09:54:27 -06:00
|
|
|
import { describe, expect, it } from "vitest";
|
2026-03-06 13:54:58 -06:00
|
|
|
import { hasAgentShortnameCollision, deduplicateAgentName } from "../services/agents.ts";
|
2026-03-06 09:54:27 -06:00
|
|
|
|
|
|
|
|
describe("hasAgentShortnameCollision", () => {
|
|
|
|
|
it("detects collisions by normalized shortname", () => {
|
|
|
|
|
const collision = hasAgentShortnameCollision("Codex Coder", [
|
|
|
|
|
{ id: "a1", name: "codex-coder", status: "idle" },
|
|
|
|
|
]);
|
|
|
|
|
expect(collision).toBe(true);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("ignores terminated agents", () => {
|
|
|
|
|
const collision = hasAgentShortnameCollision("Codex Coder", [
|
|
|
|
|
{ id: "a1", name: "codex-coder", status: "terminated" },
|
|
|
|
|
]);
|
|
|
|
|
expect(collision).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("ignores the excluded agent id", () => {
|
|
|
|
|
const collision = hasAgentShortnameCollision(
|
|
|
|
|
"Codex Coder",
|
|
|
|
|
[
|
|
|
|
|
{ id: "a1", name: "codex-coder", status: "idle" },
|
|
|
|
|
{ id: "a2", name: "other-agent", status: "idle" },
|
|
|
|
|
],
|
|
|
|
|
{ excludeAgentId: "a1" },
|
|
|
|
|
);
|
|
|
|
|
expect(collision).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("does not collide when candidate has no shortname", () => {
|
|
|
|
|
const collision = hasAgentShortnameCollision("!!!", [
|
|
|
|
|
{ id: "a1", name: "codex-coder", status: "idle" },
|
|
|
|
|
]);
|
|
|
|
|
expect(collision).toBe(false);
|
|
|
|
|
});
|
|
|
|
|
});
|
2026-03-06 13:54:58 -06:00
|
|
|
|
|
|
|
|
describe("deduplicateAgentName", () => {
|
|
|
|
|
it("returns original name when no collision", () => {
|
|
|
|
|
const name = deduplicateAgentName("OpenClaw", [
|
|
|
|
|
{ id: "a1", name: "other-agent", status: "idle" },
|
|
|
|
|
]);
|
|
|
|
|
expect(name).toBe("OpenClaw");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("appends suffix when name collides", () => {
|
|
|
|
|
const name = deduplicateAgentName("OpenClaw", [
|
|
|
|
|
{ id: "a1", name: "openclaw", status: "idle" },
|
|
|
|
|
]);
|
|
|
|
|
expect(name).toBe("OpenClaw 2");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("increments suffix until unique", () => {
|
|
|
|
|
const name = deduplicateAgentName("OpenClaw", [
|
|
|
|
|
{ id: "a1", name: "openclaw", status: "idle" },
|
|
|
|
|
{ id: "a2", name: "openclaw-2", status: "idle" },
|
|
|
|
|
{ id: "a3", name: "openclaw-3", status: "idle" },
|
|
|
|
|
]);
|
|
|
|
|
expect(name).toBe("OpenClaw 4");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("ignores terminated agents for collision", () => {
|
|
|
|
|
const name = deduplicateAgentName("OpenClaw", [
|
|
|
|
|
{ id: "a1", name: "openclaw", status: "terminated" },
|
|
|
|
|
]);
|
|
|
|
|
expect(name).toBe("OpenClaw");
|
|
|
|
|
});
|
|
|
|
|
});
|