Fix failing immersion-tracker tests

This commit is contained in:
2026-02-17 02:30:09 -08:00
parent 78715e801c
commit 804755bd3d
2 changed files with 14 additions and 13 deletions

View File

@@ -48,28 +48,29 @@ test("startSession generates UUID-like session identifiers", () => {
} }
}); });
test("destroy finalizes session with a single telemetry flush path", () => { test("destroy finalizes active session and persists final telemetry", () => {
const dbPath = makeDbPath(); const dbPath = makeDbPath();
let tracker: ImmersionTrackerService | null = null; let tracker: ImmersionTrackerService | null = null;
try { try {
tracker = new ImmersionTrackerService({ dbPath }); tracker = new ImmersionTrackerService({ dbPath });
const privateApi = tracker as unknown as {
flushTelemetry: (force?: boolean) => void;
};
let flushCalls = 0;
const originalFlushTelemetry = privateApi.flushTelemetry.bind(tracker);
privateApi.flushTelemetry = (force?: boolean): void => {
flushCalls += 1;
originalFlushTelemetry(force);
};
tracker.handleMediaChange("/tmp/episode-2.mkv", "Episode 2"); tracker.handleMediaChange("/tmp/episode-2.mkv", "Episode 2");
tracker.recordSubtitleLine("Hello immersion", 0, 1); tracker.recordSubtitleLine("Hello immersion", 0, 1);
tracker.destroy(); tracker.destroy();
assert.equal(flushCalls, 1); const db = new DatabaseSync(dbPath);
const sessionRow = db
.prepare("SELECT ended_at_ms FROM imm_sessions LIMIT 1")
.get() as { ended_at_ms: number | null } | null;
const telemetryCountRow = db
.prepare("SELECT COUNT(*) AS total FROM imm_session_telemetry")
.get() as { total: number };
db.close();
assert.ok(sessionRow);
assert.ok(Number(sessionRow?.ended_at_ms ?? 0) > 0);
assert.ok(Number(telemetryCountRow.total) >= 2);
} finally { } finally {
tracker?.destroy(); tracker?.destroy();
cleanupDbPath(dbPath); cleanupDbPath(dbPath);

View File

@@ -210,7 +210,6 @@ export class ImmersionTrackerService {
destroy(): void { destroy(): void {
if (this.isDestroyed) return; if (this.isDestroyed) return;
this.isDestroyed = true;
if (this.flushTimer) { if (this.flushTimer) {
clearTimeout(this.flushTimer); clearTimeout(this.flushTimer);
this.flushTimer = null; this.flushTimer = null;
@@ -220,6 +219,7 @@ export class ImmersionTrackerService {
this.maintenanceTimer = null; this.maintenanceTimer = null;
} }
this.finalizeActiveSession(); this.finalizeActiveSession();
this.isDestroyed = true;
this.db.close(); this.db.close();
} }