Add rules covering bug prevention (noLeakedRender, noFloatingPromises, noImportCycles, noReactForwardRef), security (noScriptUrl, noAlert), performance (noAwaitInLoops, useTopLevelRegex), and code style (noNestedTernary, useGlobalThis, useNullishCoalescing, useSortedClasses, plus ~40 more). Fix all violations: extract top-level regex constants, guard React && renders with boolean coercion, refactor nested ternaries, replace window with globalThis, sort Tailwind classes, and introduce expectDomainError test helper to eliminate conditional expects. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
59 lines
2.0 KiB
TypeScript
59 lines
2.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { deletePlayerCharacter } from "../delete-player-character.js";
|
|
import type { PlayerCharacter } from "../player-character-types.js";
|
|
import { playerCharacterId } from "../player-character-types.js";
|
|
import { isDomainError } from "../types.js";
|
|
import { expectDomainError } from "./test-helpers.js";
|
|
|
|
const id1 = playerCharacterId("pc-1");
|
|
const id2 = playerCharacterId("pc-2");
|
|
|
|
function makePC(overrides?: Partial<PlayerCharacter>): PlayerCharacter {
|
|
return {
|
|
id: id1,
|
|
name: "Aragorn",
|
|
ac: 16,
|
|
maxHp: 120,
|
|
color: "green",
|
|
icon: "sword",
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
describe("deletePlayerCharacter", () => {
|
|
it("deletes an existing character", () => {
|
|
const result = deletePlayerCharacter([makePC()], id1);
|
|
if (isDomainError(result)) throw new Error(result.message);
|
|
expect(result.characters).toHaveLength(0);
|
|
});
|
|
|
|
it("returns error for not-found id", () => {
|
|
const result = deletePlayerCharacter([makePC()], id2);
|
|
expectDomainError(result, "player-character-not-found");
|
|
});
|
|
|
|
it("emits PlayerCharacterDeleted event", () => {
|
|
const result = deletePlayerCharacter([makePC()], id1);
|
|
if (isDomainError(result)) throw new Error(result.message);
|
|
expect(result.events).toHaveLength(1);
|
|
expect(result.events[0].type).toBe("PlayerCharacterDeleted");
|
|
});
|
|
|
|
it("preserves other characters when deleting one", () => {
|
|
const pc1 = makePC({ id: id1, name: "Aragorn" });
|
|
const pc2 = makePC({ id: id2, name: "Legolas" });
|
|
const result = deletePlayerCharacter([pc1, pc2], id1);
|
|
if (isDomainError(result)) throw new Error(result.message);
|
|
expect(result.characters).toHaveLength(1);
|
|
expect(result.characters[0].name).toBe("Legolas");
|
|
});
|
|
|
|
it("event includes deleted character name", () => {
|
|
const result = deletePlayerCharacter([makePC()], id1);
|
|
if (isDomainError(result)) throw new Error(result.message);
|
|
const event = result.events[0];
|
|
if (event.type !== "PlayerCharacterDeleted") throw new Error("wrong event");
|
|
expect(event.name).toBe("Aragorn");
|
|
});
|
|
});
|