-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathautopilot-status.test.ts
More file actions
110 lines (90 loc) · 3.97 KB
/
Copy pathautopilot-status.test.ts
File metadata and controls
110 lines (90 loc) · 3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import { describe, it, expect, beforeEach } from "vitest";
import { AutoPilotStatus } from "../src/core/autopilot-status.js";
describe("AutoPilotStatus", () => {
beforeEach(() => {
AutoPilotStatus.reset();
});
// -------------------------------------------------------------------------
// AUTO-05: status indicator transitions
// -------------------------------------------------------------------------
it("starts in 'idle' state (AUTO-05)", () => {
expect(AutoPilotStatus.getSnapshot().state).toBe("idle");
});
it("transitions idle → busy → active (AUTO-05)", () => {
AutoPilotStatus.setBusy();
expect(AutoPilotStatus.getSnapshot().state).toBe("busy");
AutoPilotStatus.setActive();
expect(AutoPilotStatus.getSnapshot().state).toBe("active");
});
it("setActive records lastCycleAt timestamp (AUTO-05)", () => {
expect(AutoPilotStatus.getSnapshot().lastCycleAt).toBeNull();
AutoPilotStatus.setActive();
expect(AutoPilotStatus.getSnapshot().lastCycleAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
});
it("setIdle returns to idle from any state (AUTO-05)", () => {
AutoPilotStatus.setBusy();
AutoPilotStatus.setIdle();
expect(AutoPilotStatus.getSnapshot().state).toBe("idle");
});
// -------------------------------------------------------------------------
// AUTO-06: activity feed
// -------------------------------------------------------------------------
it("record() prepends entries to the activity feed (AUTO-06)", () => {
AutoPilotStatus.record("Cycle started", "cycle_start");
AutoPilotStatus.record("Ingested 3 commits", "git_commit");
const { activity } = AutoPilotStatus.getSnapshot();
expect(activity[0].message).toBe("Ingested 3 commits");
expect(activity[1].message).toBe("Cycle started");
});
it("activity entries carry ISO timestamp and kind (AUTO-06)", () => {
AutoPilotStatus.record("File changed", "file_change");
const { activity } = AutoPilotStatus.getSnapshot();
expect(activity[0].kind).toBe("file_change");
expect(activity[0].timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
});
it("activity feed is capped at 50 entries (AUTO-06)", () => {
for (let i = 0; i < 60; i++) {
AutoPilotStatus.record(`event ${i}`, "cycle_complete");
}
const { activity } = AutoPilotStatus.getSnapshot(60);
expect(activity.length).toBe(50);
});
it("getSnapshot(maxActivity) limits the returned slice (AUTO-06)", () => {
for (let i = 0; i < 30; i++) {
AutoPilotStatus.record(`event ${i}`, "cycle_complete");
}
expect(AutoPilotStatus.getSnapshot(5).activity.length).toBe(5);
});
// -------------------------------------------------------------------------
// Stats counters
// -------------------------------------------------------------------------
it("addCommits accumulates across calls", () => {
AutoPilotStatus.addCommits(3);
AutoPilotStatus.addCommits(5);
expect(AutoPilotStatus.getSnapshot().stats.commitsIngested).toBe(8);
});
it("addLessons accumulates across calls", () => {
AutoPilotStatus.addLessons(2);
AutoPilotStatus.addLessons(1);
expect(AutoPilotStatus.getSnapshot().stats.lessonsExtracted).toBe(3);
});
it("incrementCycles counts completed cycles", () => {
AutoPilotStatus.incrementCycles();
AutoPilotStatus.incrementCycles();
expect(AutoPilotStatus.getSnapshot().stats.cyclesCompleted).toBe(2);
});
// -------------------------------------------------------------------------
// reset() for test isolation
// -------------------------------------------------------------------------
it("reset() returns to initial state", () => {
AutoPilotStatus.setBusy();
AutoPilotStatus.addCommits(10);
AutoPilotStatus.record("something", "error");
AutoPilotStatus.reset();
const snap = AutoPilotStatus.getSnapshot();
expect(snap.state).toBe("idle");
expect(snap.lastCycleAt).toBeNull();
expect(snap.activity).toHaveLength(0);
expect(snap.stats.commitsIngested).toBe(0);
});
});