55 lines
2.4 KiB
TypeScript
55 lines
2.4 KiB
TypeScript
import assert from "node:assert/strict";
|
|
|
|
import { LeaseManager } from "../src/lease-manager.js";
|
|
|
|
let now = 1_000;
|
|
const opened: string[] = [];
|
|
const closed: string[] = [];
|
|
const manager = new LeaseManager({
|
|
ttlMs: 100,
|
|
now: () => now,
|
|
resolveTarget: (requestedPetId) => {
|
|
if (!requestedPetId) return { targetKind: "default", actualPetId: "builtin" };
|
|
if (requestedPetId === "missing") return { targetKind: "default", actualPetId: "builtin", fallbackReason: "pet_not_installed" };
|
|
return { targetKind: "explicit", actualPetId: requestedPetId };
|
|
},
|
|
getDefaultPetId: () => "builtin",
|
|
getPetDisplayName: (petId) => petId,
|
|
onFirstExplicitLease: (petId) => opened.push(petId),
|
|
onLastExplicitLease: (petId) => closed.push(petId),
|
|
});
|
|
|
|
const defaultLease = manager.acquire();
|
|
assert.equal(defaultLease.usingDefaultPet, true, "Default lease did not target default.");
|
|
assert.equal(defaultLease.targetKind, "default", "Default lease targetKind should be 'default'.");
|
|
manager.release(defaultLease.leaseId);
|
|
assert.equal(closed.length, 0, "Default release closed a temp familiar.");
|
|
|
|
const first = manager.acquire("lantern");
|
|
const second = manager.acquire("lantern");
|
|
assert.equal(opened.join(","), "lantern", "Explicit familiar did not open once for multiple leases.");
|
|
manager.release(first.leaseId);
|
|
assert.equal(closed.length, 0, "Explicit familiar closed before final lease release.");
|
|
manager.release(first.leaseId);
|
|
manager.release(second.leaseId);
|
|
assert.equal(closed.join(","), "lantern", "Explicit familiar did not close after final release.");
|
|
|
|
const missing = manager.acquire("missing");
|
|
assert.equal(missing.fallbackReason, "pet_not_installed", "Missing familiar did not fall back to default.");
|
|
assert.equal(missing.usingDefaultPet, true, "Missing familiar should use default.");
|
|
manager.release(missing.leaseId);
|
|
|
|
const expiring = manager.acquire("orbit");
|
|
now += 50;
|
|
manager.heartbeat(expiring.leaseId);
|
|
now += 75;
|
|
assert.equal(manager.cleanupExpired().length, 0, "Heartbeat did not extend lease.");
|
|
now += 50;
|
|
assert.equal(manager.cleanupExpired().length, 1, "Expired lease was not cleaned up.");
|
|
|
|
const expiredBeforeHeartbeat = manager.acquire("moss");
|
|
now += 200;
|
|
assert.throws(() => manager.heartbeat(expiredBeforeHeartbeat.leaseId));
|
|
assert.equal(manager.get(expiredBeforeHeartbeat.leaseId), null, "Expired lease was still readable before cleanup.");
|
|
|
|
console.log("Lease manager validation passed.");
|