diff --git a/src/repositories/settlementRepository.test.ts b/src/repositories/settlementRepository.test.ts index b23648f..19af1d2 100644 --- a/src/repositories/settlementRepository.test.ts +++ b/src/repositories/settlementRepository.test.ts @@ -48,4 +48,28 @@ describe("SettlementRepository", () => { expect(repo.byAnchor("anchorA")).toHaveLength(2); expect(repo.count()).toBe(3); }); + + describe("remove", () => { + it("removes an existing settlement and returns true", () => { + const repo = new SettlementRepository(); + const s = repo.create(draft("anchorA", 100)); + expect(repo.count()).toBe(1); + + const result = repo.remove(s.id); + expect(result).toBe(true); + expect(repo.get(s.id)).toBeUndefined(); + expect(repo.count()).toBe(0); + expect(repo.all()).toHaveLength(0); + expect(repo.byAnchor("anchorA")).toHaveLength(0); + }); + + it("returns false when removing a non-existent id", () => { + const repo = new SettlementRepository(); + repo.create(draft("anchorA", 100)); + + const result = repo.remove(999); + expect(result).toBe(false); + expect(repo.count()).toBe(1); + }); + }); }); diff --git a/src/repositories/settlementRepository.ts b/src/repositories/settlementRepository.ts index 40326e1..0859668 100644 --- a/src/repositories/settlementRepository.ts +++ b/src/repositories/settlementRepository.ts @@ -45,6 +45,22 @@ export class SettlementRepository extends InMemoryRepository return this.getByKey(id); } + /** Removes a settlement, returning `true` if one existed. */ + remove(id: number): boolean { + const existing = this.getByKey(id); + const existed = this.removeByKey(id); + if (existed && existing) { + const anchorSet = this.anchorIndex.get(existing.anchor); + if (anchorSet) { + anchorSet.delete(id); + if (anchorSet.size === 0) { + this.anchorIndex.delete(existing.anchor); + } + } + } + return existed; + } + /** Returns every settlement, most recent first. */ all(): Settlement[] { return this.listAll().sort((a, b) => b.id - a.id);