@jamesaphoenix/tx-test-utils 0.5.8 → 0.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/package.json +2 -10
- package/dist/chaos/chaos.test.d.ts +0 -9
- package/dist/chaos/chaos.test.d.ts.map +0 -1
- package/dist/chaos/chaos.test.js +0 -498
- package/dist/chaos/chaos.test.js.map +0 -1
- package/dist/factories/factories.test.d.ts +0 -8
- package/dist/factories/factories.test.d.ts.map +0 -1
- package/dist/factories/factories.test.js +0 -419
- package/dist/factories/factories.test.js.map +0 -1
- package/dist/helpers/effect.test.d.ts +0 -7
- package/dist/helpers/effect.test.d.ts.map +0 -1
- package/dist/helpers/effect.test.js +0 -271
- package/dist/helpers/effect.test.js.map +0 -1
- package/dist/llm-cache/cache.test.d.ts +0 -7
- package/dist/llm-cache/cache.test.d.ts.map +0 -1
- package/dist/llm-cache/cache.test.js +0 -310
- package/dist/llm-cache/cache.test.js.map +0 -1
- package/dist/mocks/mocks.test.d.ts +0 -10
- package/dist/mocks/mocks.test.d.ts.map +0 -1
- package/dist/mocks/mocks.test.js +0 -961
- package/dist/mocks/mocks.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,14 @@
|
|
|
5
5
|
Memory, tasks, and orchestration. You own the loop.
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
+
# Standalone binary (recommended — no runtime needed)
|
|
9
|
+
curl -fsSL https://raw.githubusercontent.com/jamesaphoenix/tx/main/install.sh | sh
|
|
10
|
+
|
|
11
|
+
# Or via npm (requires bun)
|
|
8
12
|
npm install -g @jamesaphoenix/tx-cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
```bash
|
|
9
16
|
tx init
|
|
10
17
|
```
|
|
11
18
|
|
package/package.json
CHANGED
|
@@ -1,59 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jamesaphoenix/tx-test-utils",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.10",
|
|
4
4
|
"description": "Test utilities, factories, fixtures, and helpers for tx monorepo",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
|
-
"bun": "./src/index.ts",
|
|
11
10
|
"types": "./dist/index.d.ts",
|
|
12
11
|
"import": "./dist/index.js"
|
|
13
12
|
},
|
|
14
13
|
"./database": {
|
|
15
|
-
"bun": "./src/database/index.ts",
|
|
16
14
|
"types": "./dist/database/index.d.ts",
|
|
17
15
|
"import": "./dist/database/index.js"
|
|
18
16
|
},
|
|
19
17
|
"./factories": {
|
|
20
|
-
"bun": "./src/factories/index.ts",
|
|
21
18
|
"types": "./dist/factories/index.d.ts",
|
|
22
19
|
"import": "./dist/factories/index.js"
|
|
23
20
|
},
|
|
24
21
|
"./fixtures": {
|
|
25
|
-
"bun": "./src/fixtures/index.ts",
|
|
26
22
|
"types": "./dist/fixtures/index.d.ts",
|
|
27
23
|
"import": "./dist/fixtures/index.js"
|
|
28
24
|
},
|
|
29
25
|
"./llm-cache": {
|
|
30
|
-
"bun": "./src/llm-cache/index.ts",
|
|
31
26
|
"types": "./dist/llm-cache/index.d.ts",
|
|
32
27
|
"import": "./dist/llm-cache/index.js"
|
|
33
28
|
},
|
|
34
29
|
"./mocks": {
|
|
35
|
-
"bun": "./src/mocks/index.ts",
|
|
36
30
|
"types": "./dist/mocks/index.d.ts",
|
|
37
31
|
"import": "./dist/mocks/index.js"
|
|
38
32
|
},
|
|
39
33
|
"./helpers": {
|
|
40
|
-
"bun": "./src/helpers/index.ts",
|
|
41
34
|
"types": "./dist/helpers/index.d.ts",
|
|
42
35
|
"import": "./dist/helpers/index.js"
|
|
43
36
|
},
|
|
44
37
|
"./setup": {
|
|
45
|
-
"bun": "./src/setup/index.ts",
|
|
46
38
|
"types": "./dist/setup/index.d.ts",
|
|
47
39
|
"import": "./dist/setup/index.js"
|
|
48
40
|
},
|
|
49
41
|
"./chaos": {
|
|
50
|
-
"bun": "./src/chaos/index.ts",
|
|
51
42
|
"types": "./dist/chaos/index.d.ts",
|
|
52
43
|
"import": "./dist/chaos/index.js"
|
|
53
44
|
}
|
|
54
45
|
},
|
|
55
46
|
"files": [
|
|
56
47
|
"dist",
|
|
48
|
+
"!dist/**/*.test.*",
|
|
57
49
|
"README.md"
|
|
58
50
|
],
|
|
59
51
|
"scripts": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chaos.test.d.ts","sourceRoot":"","sources":["../../src/chaos/chaos.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
package/dist/chaos/chaos.test.js
DELETED
|
@@ -1,498 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Chaos Engineering Utilities Integration Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests all chaos utilities using real in-memory SQLite per Rule 3.
|
|
5
|
-
*
|
|
6
|
-
* @module @tx/test-utils/chaos/chaos.test
|
|
7
|
-
*/
|
|
8
|
-
import { describe, it, expect, beforeEach } from "vitest";
|
|
9
|
-
import { Effect } from "effect";
|
|
10
|
-
import { createTestDatabase } from "../database/index.js";
|
|
11
|
-
import { fixtureId } from "../fixtures/index.js";
|
|
12
|
-
import { crashAfter, CrashSimulationError, killHeartbeat, WorkerHeartbeatController, raceWorkers, corruptState, replayJSONL, doubleComplete, partialWrite, delayedClaim, stressLoad } from "./chaos-utilities.js";
|
|
13
|
-
describe("Chaos Engineering Utilities Integration", () => {
|
|
14
|
-
let db;
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
db = await Effect.runPromise(createTestDatabase());
|
|
17
|
-
});
|
|
18
|
-
// ===========================================================================
|
|
19
|
-
// crashAfter tests
|
|
20
|
-
// ===========================================================================
|
|
21
|
-
describe("crashAfter", () => {
|
|
22
|
-
it("returns completed=true when operation finishes before timeout", async () => {
|
|
23
|
-
const result = await crashAfter({ ms: 100 }, async () => {
|
|
24
|
-
return "success";
|
|
25
|
-
});
|
|
26
|
-
expect(result.completed).toBe(true);
|
|
27
|
-
expect(result.value).toBe("success");
|
|
28
|
-
expect(result.elapsedMs).toBeLessThan(100);
|
|
29
|
-
});
|
|
30
|
-
it("returns completed=false when timeout occurs first", async () => {
|
|
31
|
-
const result = await crashAfter({ ms: 50 }, async () => {
|
|
32
|
-
await sleep(200);
|
|
33
|
-
return "should not get here";
|
|
34
|
-
});
|
|
35
|
-
expect(result.completed).toBe(false);
|
|
36
|
-
expect(result.value).toBeUndefined();
|
|
37
|
-
expect(result.elapsedMs).toBeGreaterThanOrEqual(50);
|
|
38
|
-
expect(result.elapsedMs).toBeLessThan(200);
|
|
39
|
-
});
|
|
40
|
-
it("calls beforeCrash callback when crash occurs", async () => {
|
|
41
|
-
let callbackCalled = false;
|
|
42
|
-
await crashAfter({
|
|
43
|
-
ms: 50,
|
|
44
|
-
beforeCrash: () => {
|
|
45
|
-
callbackCalled = true;
|
|
46
|
-
}
|
|
47
|
-
}, async () => {
|
|
48
|
-
await sleep(200);
|
|
49
|
-
});
|
|
50
|
-
expect(callbackCalled).toBe(true);
|
|
51
|
-
});
|
|
52
|
-
it("throws CrashSimulationError when throwOnCrash is true", async () => {
|
|
53
|
-
await expect(crashAfter({ ms: 50, throwOnCrash: true }, async () => {
|
|
54
|
-
await sleep(200);
|
|
55
|
-
})).rejects.toBeInstanceOf(CrashSimulationError);
|
|
56
|
-
});
|
|
57
|
-
it("captures operation errors", async () => {
|
|
58
|
-
const result = await crashAfter({ ms: 1000 }, async () => {
|
|
59
|
-
throw new Error("operation failed");
|
|
60
|
-
});
|
|
61
|
-
expect(result.completed).toBe(false);
|
|
62
|
-
expect(result.error).toBeDefined();
|
|
63
|
-
expect(result.error?.message).toBe("operation failed");
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
// ===========================================================================
|
|
67
|
-
// killHeartbeat tests
|
|
68
|
-
// ===========================================================================
|
|
69
|
-
describe("killHeartbeat / WorkerHeartbeatController", () => {
|
|
70
|
-
const workerId = fixtureId("heartbeat-worker");
|
|
71
|
-
beforeEach(() => {
|
|
72
|
-
// Create a worker for testing
|
|
73
|
-
const now = new Date();
|
|
74
|
-
db.run(`INSERT INTO workers (id, name, hostname, pid, status, registered_at, last_heartbeat_at, capabilities, metadata)
|
|
75
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [workerId, "Test Worker", "localhost", process.pid, "idle", now.toISOString(), now.toISOString(), "[]", "{}"]);
|
|
76
|
-
});
|
|
77
|
-
it("creates a controller with killHeartbeat", () => {
|
|
78
|
-
const controller = killHeartbeat({ workerId, db });
|
|
79
|
-
expect(controller).toBeInstanceOf(WorkerHeartbeatController);
|
|
80
|
-
expect(controller.isKilled()).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
it("kill sets heartbeat to past time", () => {
|
|
83
|
-
const controller = killHeartbeat({ workerId, db });
|
|
84
|
-
controller.kill(60);
|
|
85
|
-
expect(controller.isKilled()).toBe(true);
|
|
86
|
-
const worker = db.query("SELECT last_heartbeat_at FROM workers WHERE id = ?", [workerId])[0];
|
|
87
|
-
const heartbeatTime = new Date(worker.last_heartbeat_at);
|
|
88
|
-
const hourAgo = new Date(Date.now() - 60 * 60 * 1000);
|
|
89
|
-
expect(heartbeatTime.getTime()).toBeLessThanOrEqual(hourAgo.getTime() + 60000);
|
|
90
|
-
});
|
|
91
|
-
it("restore restores original heartbeat", () => {
|
|
92
|
-
const originalWorker = db.query("SELECT last_heartbeat_at FROM workers WHERE id = ?", [workerId])[0];
|
|
93
|
-
const controller = killHeartbeat({ workerId, db });
|
|
94
|
-
controller.kill();
|
|
95
|
-
controller.restore();
|
|
96
|
-
const restoredWorker = db.query("SELECT last_heartbeat_at FROM workers WHERE id = ?", [workerId])[0];
|
|
97
|
-
expect(restoredWorker.last_heartbeat_at).toBe(originalWorker.last_heartbeat_at);
|
|
98
|
-
expect(controller.isKilled()).toBe(false);
|
|
99
|
-
});
|
|
100
|
-
it("revive sets heartbeat to current time", () => {
|
|
101
|
-
const controller = killHeartbeat({ workerId, db });
|
|
102
|
-
controller.kill();
|
|
103
|
-
const beforeRevive = Date.now();
|
|
104
|
-
controller.revive();
|
|
105
|
-
const afterRevive = Date.now();
|
|
106
|
-
const worker = db.query("SELECT last_heartbeat_at FROM workers WHERE id = ?", [workerId])[0];
|
|
107
|
-
const heartbeatTime = new Date(worker.last_heartbeat_at).getTime();
|
|
108
|
-
expect(heartbeatTime).toBeGreaterThanOrEqual(beforeRevive - 1000);
|
|
109
|
-
expect(heartbeatTime).toBeLessThanOrEqual(afterRevive + 1000);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
// ===========================================================================
|
|
113
|
-
// raceWorkers tests
|
|
114
|
-
// ===========================================================================
|
|
115
|
-
describe("raceWorkers", () => {
|
|
116
|
-
const taskId = fixtureId("race-task");
|
|
117
|
-
beforeEach(() => {
|
|
118
|
-
// Create a task for workers to claim
|
|
119
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
120
|
-
VALUES (?, ?, '', 'backlog', 500, datetime('now'), datetime('now'), '{}')`, [taskId, "Task to Race For"]);
|
|
121
|
-
});
|
|
122
|
-
it("only one worker wins the race", async () => {
|
|
123
|
-
const result = await raceWorkers({
|
|
124
|
-
count: 5,
|
|
125
|
-
taskId,
|
|
126
|
-
db
|
|
127
|
-
});
|
|
128
|
-
expect(result.successfulClaims).toBe(1);
|
|
129
|
-
expect(result.winner).not.toBeNull();
|
|
130
|
-
expect(result.workers.length).toBe(5);
|
|
131
|
-
expect(result.losers.length).toBe(4);
|
|
132
|
-
});
|
|
133
|
-
it("registers all workers", async () => {
|
|
134
|
-
const result = await raceWorkers({
|
|
135
|
-
count: 3,
|
|
136
|
-
taskId,
|
|
137
|
-
db
|
|
138
|
-
});
|
|
139
|
-
const workers = db.query("SELECT id FROM workers");
|
|
140
|
-
expect(workers.length).toBe(3);
|
|
141
|
-
expect(workers.map(w => w.id)).toEqual(expect.arrayContaining(result.workers));
|
|
142
|
-
});
|
|
143
|
-
it("winner has active claim", async () => {
|
|
144
|
-
const result = await raceWorkers({
|
|
145
|
-
count: 3,
|
|
146
|
-
taskId,
|
|
147
|
-
db
|
|
148
|
-
});
|
|
149
|
-
const claim = db.query("SELECT worker_id, status FROM task_claims WHERE task_id = ? AND status = 'active'", [taskId])[0];
|
|
150
|
-
expect(claim).toBeDefined();
|
|
151
|
-
expect(claim.worker_id).toBe(result.winner);
|
|
152
|
-
expect(claim.status).toBe("active");
|
|
153
|
-
});
|
|
154
|
-
it("respects delay between workers", async () => {
|
|
155
|
-
const startTime = Date.now();
|
|
156
|
-
await raceWorkers({
|
|
157
|
-
count: 3,
|
|
158
|
-
taskId,
|
|
159
|
-
db,
|
|
160
|
-
delayBetweenMs: 20
|
|
161
|
-
});
|
|
162
|
-
const elapsedMs = Date.now() - startTime;
|
|
163
|
-
expect(elapsedMs).toBeGreaterThanOrEqual(40); // At least (n-1) * delay
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
// ===========================================================================
|
|
167
|
-
// corruptState tests
|
|
168
|
-
// ===========================================================================
|
|
169
|
-
describe("corruptState", () => {
|
|
170
|
-
const taskId = fixtureId("corrupt-task");
|
|
171
|
-
beforeEach(() => {
|
|
172
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
173
|
-
VALUES (?, ?, '', 'backlog', 500, datetime('now'), datetime('now'), '{}')`, [taskId, "Task to Corrupt"]);
|
|
174
|
-
});
|
|
175
|
-
it("injects invalid_status corruption", () => {
|
|
176
|
-
const result = corruptState({
|
|
177
|
-
table: "tasks",
|
|
178
|
-
type: "invalid_status",
|
|
179
|
-
db,
|
|
180
|
-
rowId: taskId
|
|
181
|
-
});
|
|
182
|
-
expect(result.corrupted).toBe(true);
|
|
183
|
-
const task = db.query("SELECT status FROM tasks WHERE id = ?", [taskId])[0];
|
|
184
|
-
expect(task.status).toBe("INVALID_STATUS");
|
|
185
|
-
});
|
|
186
|
-
it("injects invalid_json corruption", () => {
|
|
187
|
-
const result = corruptState({
|
|
188
|
-
table: "tasks",
|
|
189
|
-
type: "invalid_json",
|
|
190
|
-
db,
|
|
191
|
-
rowId: taskId
|
|
192
|
-
});
|
|
193
|
-
expect(result.corrupted).toBe(true);
|
|
194
|
-
const task = db.query("SELECT metadata FROM tasks WHERE id = ?", [taskId])[0];
|
|
195
|
-
expect(() => JSON.parse(task.metadata)).toThrow();
|
|
196
|
-
});
|
|
197
|
-
it("injects negative_score corruption", () => {
|
|
198
|
-
const result = corruptState({
|
|
199
|
-
table: "tasks",
|
|
200
|
-
type: "negative_score",
|
|
201
|
-
db,
|
|
202
|
-
rowId: taskId
|
|
203
|
-
});
|
|
204
|
-
expect(result.corrupted).toBe(true);
|
|
205
|
-
const task = db.query("SELECT score FROM tasks WHERE id = ?", [taskId])[0];
|
|
206
|
-
expect(task.score).toBe(-1000);
|
|
207
|
-
});
|
|
208
|
-
it("injects future_timestamp corruption", () => {
|
|
209
|
-
const result = corruptState({
|
|
210
|
-
table: "tasks",
|
|
211
|
-
type: "future_timestamp",
|
|
212
|
-
db,
|
|
213
|
-
rowId: taskId
|
|
214
|
-
});
|
|
215
|
-
expect(result.corrupted).toBe(true);
|
|
216
|
-
const task = db.query("SELECT created_at FROM tasks WHERE id = ?", [taskId])[0];
|
|
217
|
-
const createdAt = new Date(task.created_at);
|
|
218
|
-
expect(createdAt.getTime()).toBeGreaterThan(Date.now());
|
|
219
|
-
});
|
|
220
|
-
it("injects self_reference corruption", () => {
|
|
221
|
-
const result = corruptState({
|
|
222
|
-
table: "tasks",
|
|
223
|
-
type: "self_reference",
|
|
224
|
-
db,
|
|
225
|
-
rowId: taskId
|
|
226
|
-
});
|
|
227
|
-
expect(result.corrupted).toBe(true);
|
|
228
|
-
const task = db.query("SELECT parent_id FROM tasks WHERE id = ?", [taskId])[0];
|
|
229
|
-
expect(task.parent_id).toBe(taskId);
|
|
230
|
-
});
|
|
231
|
-
it("creates new row when rowId not provided", () => {
|
|
232
|
-
const result = corruptState({
|
|
233
|
-
table: "tasks",
|
|
234
|
-
type: "invalid_status",
|
|
235
|
-
db
|
|
236
|
-
});
|
|
237
|
-
expect(result.corrupted).toBe(true);
|
|
238
|
-
expect(result.rowId).toMatch(/^tx-/);
|
|
239
|
-
const task = db.query("SELECT status FROM tasks WHERE id = ?", [result.rowId])[0];
|
|
240
|
-
expect(task.status).toBe("INVALID_STATUS");
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
// ===========================================================================
|
|
244
|
-
// replayJSONL tests
|
|
245
|
-
// ===========================================================================
|
|
246
|
-
describe("replayJSONL", () => {
|
|
247
|
-
it("replays task upsert operations", () => {
|
|
248
|
-
const jsonl = `
|
|
249
|
-
{"v":1,"op":"upsert","ts":"2024-01-01T00:00:00Z","id":"tx-replay1","data":{"title":"Task 1","status":"backlog","score":500,"description":"","parentId":null,"metadata":{}}}
|
|
250
|
-
{"v":1,"op":"upsert","ts":"2024-01-02T00:00:00Z","id":"tx-replay2","data":{"title":"Task 2","status":"active","score":600,"description":"","parentId":null,"metadata":{}}}
|
|
251
|
-
`;
|
|
252
|
-
const result = replayJSONL({ db, content: jsonl });
|
|
253
|
-
expect(result.opsReplayed).toBe(2);
|
|
254
|
-
expect(result.tasksCreated).toBe(2);
|
|
255
|
-
const tasks = db.query("SELECT id, title FROM tasks ORDER BY id");
|
|
256
|
-
expect(tasks.length).toBe(2);
|
|
257
|
-
});
|
|
258
|
-
it("updates existing tasks on replay", () => {
|
|
259
|
-
// Create initial task
|
|
260
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
261
|
-
VALUES ('tx-existing', 'Original Title', '', 'backlog', 100, '2024-01-01T00:00:00Z', '2024-01-01T00:00:00Z', '{}')`, []);
|
|
262
|
-
const jsonl = `{"v":1,"op":"upsert","ts":"2024-01-02T00:00:00Z","id":"tx-existing","data":{"title":"Updated Title","status":"active","score":200,"description":"","parentId":null,"metadata":{}}}`;
|
|
263
|
-
const result = replayJSONL({ db, content: jsonl });
|
|
264
|
-
expect(result.tasksUpdated).toBe(1);
|
|
265
|
-
const task = db.query("SELECT title, score FROM tasks WHERE id = 'tx-existing'")[0];
|
|
266
|
-
expect(task.title).toBe("Updated Title");
|
|
267
|
-
expect(task.score).toBe(200);
|
|
268
|
-
});
|
|
269
|
-
it("handles dependency operations", () => {
|
|
270
|
-
// Create tasks first
|
|
271
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
272
|
-
VALUES ('tx-blocker', 'Blocker', '', 'active', 500, datetime('now'), datetime('now'), '{}')`, []);
|
|
273
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
274
|
-
VALUES ('tx-blocked', 'Blocked', '', 'backlog', 400, datetime('now'), datetime('now'), '{}')`, []);
|
|
275
|
-
const jsonl = `{"v":1,"op":"dep_add","ts":"2024-01-01T00:00:00Z","blockerId":"tx-blocker","blockedId":"tx-blocked"}`;
|
|
276
|
-
const result = replayJSONL({ db, content: jsonl });
|
|
277
|
-
expect(result.depsAdded).toBe(1);
|
|
278
|
-
const dep = db.query("SELECT blocker_id, blocked_id FROM task_dependencies WHERE blocker_id = 'tx-blocker'")[0];
|
|
279
|
-
expect(dep.blocked_id).toBe("tx-blocked");
|
|
280
|
-
});
|
|
281
|
-
it("clears data when clearFirst is true", () => {
|
|
282
|
-
// Create existing task
|
|
283
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
284
|
-
VALUES ('tx-oldtask', 'Old Task', '', 'backlog', 100, datetime('now'), datetime('now'), '{}')`, []);
|
|
285
|
-
const jsonl = `{"v":1,"op":"upsert","ts":"2024-01-01T00:00:00Z","id":"tx-newtask","data":{"title":"New Task","status":"backlog","score":500,"description":"","parentId":null,"metadata":{}}}`;
|
|
286
|
-
replayJSONL({ db, content: jsonl, clearFirst: true });
|
|
287
|
-
const tasks = db.query("SELECT id FROM tasks");
|
|
288
|
-
expect(tasks.length).toBe(1);
|
|
289
|
-
expect(tasks[0].id).toBe("tx-newtask");
|
|
290
|
-
});
|
|
291
|
-
it("handles invalid JSON lines gracefully", () => {
|
|
292
|
-
const jsonl = `
|
|
293
|
-
{"v":1,"op":"upsert","ts":"2024-01-01T00:00:00Z","id":"tx-valid1","data":{"title":"Valid Task","status":"backlog","score":500,"description":"","parentId":null,"metadata":{}}}
|
|
294
|
-
not valid json
|
|
295
|
-
{"v":1,"op":"upsert","ts":"2024-01-02T00:00:00Z","id":"tx-valid2","data":{"title":"Valid Task 2","status":"backlog","score":600,"description":"","parentId":null,"metadata":{}}}
|
|
296
|
-
`;
|
|
297
|
-
const result = replayJSONL({ db, content: jsonl });
|
|
298
|
-
expect(result.errors.length).toBe(1);
|
|
299
|
-
expect(result.tasksCreated).toBe(2);
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
// ===========================================================================
|
|
303
|
-
// doubleComplete tests
|
|
304
|
-
// ===========================================================================
|
|
305
|
-
describe("doubleComplete", () => {
|
|
306
|
-
const taskId = fixtureId("double-complete-task");
|
|
307
|
-
beforeEach(() => {
|
|
308
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
309
|
-
VALUES (?, ?, '', 'active', 500, datetime('now'), datetime('now'), '{}')`, [taskId, "Task to Complete Twice"]);
|
|
310
|
-
});
|
|
311
|
-
it("first completion succeeds", () => {
|
|
312
|
-
const result = doubleComplete({ taskId, db });
|
|
313
|
-
expect(result.firstCompleted).toBe(true);
|
|
314
|
-
expect(result.originalStatus).toBe("active");
|
|
315
|
-
expect(result.finalStatus).toBe("done");
|
|
316
|
-
});
|
|
317
|
-
it("tracks original status", () => {
|
|
318
|
-
const result = doubleComplete({ taskId, db });
|
|
319
|
-
expect(result.originalStatus).toBe("active");
|
|
320
|
-
});
|
|
321
|
-
it("returns task not found error for missing task", () => {
|
|
322
|
-
const result = doubleComplete({ taskId: "tx-nonexistent", db });
|
|
323
|
-
expect(result.firstCompleted).toBe(false);
|
|
324
|
-
expect(result.secondError).toBe("Task not found");
|
|
325
|
-
});
|
|
326
|
-
it("handles already-done tasks", () => {
|
|
327
|
-
// Complete the task first
|
|
328
|
-
db.run("UPDATE tasks SET status = 'done', completed_at = datetime('now') WHERE id = ?", [taskId]);
|
|
329
|
-
const result = doubleComplete({ taskId, db });
|
|
330
|
-
expect(result.firstCompleted).toBe(true); // Already done counts as completed
|
|
331
|
-
expect(result.originalStatus).toBe("done");
|
|
332
|
-
expect(result.finalStatus).toBe("done");
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
// ===========================================================================
|
|
336
|
-
// partialWrite tests
|
|
337
|
-
// ===========================================================================
|
|
338
|
-
describe("partialWrite", () => {
|
|
339
|
-
it("writes rows up to failure point without transaction", () => {
|
|
340
|
-
const result = partialWrite({
|
|
341
|
-
table: "tasks",
|
|
342
|
-
db,
|
|
343
|
-
rowCount: 10,
|
|
344
|
-
failAtRow: 5,
|
|
345
|
-
useTransaction: false
|
|
346
|
-
});
|
|
347
|
-
expect(result.rowsWritten).toBe(4); // Rows 1-4 succeed
|
|
348
|
-
expect(result.rowsFailed).toBe(6); // Rows 5-10 fail
|
|
349
|
-
expect(result.rolledBack).toBe(false);
|
|
350
|
-
expect(result.error).toContain("Simulated failure at row 5");
|
|
351
|
-
const tasks = db.query("SELECT id FROM tasks WHERE title LIKE 'Partial Write%'");
|
|
352
|
-
expect(tasks.length).toBe(4);
|
|
353
|
-
});
|
|
354
|
-
it("rolls back all rows with transaction", () => {
|
|
355
|
-
const result = partialWrite({
|
|
356
|
-
table: "tasks",
|
|
357
|
-
db,
|
|
358
|
-
rowCount: 10,
|
|
359
|
-
failAtRow: 5,
|
|
360
|
-
useTransaction: true
|
|
361
|
-
});
|
|
362
|
-
expect(result.rowsWritten).toBe(0);
|
|
363
|
-
expect(result.rolledBack).toBe(true);
|
|
364
|
-
expect(result.writtenIds.length).toBe(0);
|
|
365
|
-
expect(result.error).toContain("Simulated failure at row 5");
|
|
366
|
-
const tasks = db.query("SELECT id FROM tasks WHERE title LIKE 'Partial Write%'");
|
|
367
|
-
expect(tasks.length).toBe(0);
|
|
368
|
-
});
|
|
369
|
-
it("succeeds when failAtRow > rowCount", () => {
|
|
370
|
-
const result = partialWrite({
|
|
371
|
-
table: "tasks",
|
|
372
|
-
db,
|
|
373
|
-
rowCount: 5,
|
|
374
|
-
failAtRow: 10,
|
|
375
|
-
useTransaction: false
|
|
376
|
-
});
|
|
377
|
-
expect(result.rowsWritten).toBe(5);
|
|
378
|
-
expect(result.rowsFailed).toBe(0);
|
|
379
|
-
expect(result.error).toBeUndefined();
|
|
380
|
-
});
|
|
381
|
-
});
|
|
382
|
-
// ===========================================================================
|
|
383
|
-
// delayedClaim tests
|
|
384
|
-
// ===========================================================================
|
|
385
|
-
describe("delayedClaim", () => {
|
|
386
|
-
const taskId = fixtureId("delayed-claim-task");
|
|
387
|
-
const slowWorker = fixtureId("slow-worker");
|
|
388
|
-
beforeEach(() => {
|
|
389
|
-
// Create task
|
|
390
|
-
db.run(`INSERT INTO tasks (id, title, description, status, score, created_at, updated_at, metadata)
|
|
391
|
-
VALUES (?, ?, '', 'backlog', 500, datetime('now'), datetime('now'), '{}')`, [taskId, "Task to Claim"]);
|
|
392
|
-
// Create worker
|
|
393
|
-
db.run(`INSERT INTO workers (id, name, hostname, pid, status, registered_at, last_heartbeat_at, capabilities, metadata)
|
|
394
|
-
VALUES (?, ?, ?, ?, ?, datetime('now'), datetime('now'), '[]', '{}')`, [slowWorker, "Slow Worker", "localhost", process.pid, "idle"]);
|
|
395
|
-
});
|
|
396
|
-
it("successfully claims when no competition", async () => {
|
|
397
|
-
const result = await delayedClaim({
|
|
398
|
-
taskId,
|
|
399
|
-
workerId: slowWorker,
|
|
400
|
-
db,
|
|
401
|
-
delayMs: 50
|
|
402
|
-
});
|
|
403
|
-
expect(result.claimed).toBe(true);
|
|
404
|
-
expect(result.claimedBy).toBe(slowWorker);
|
|
405
|
-
expect(result.raceDetected).toBe(false);
|
|
406
|
-
expect(result.waitedMs).toBeGreaterThanOrEqual(50);
|
|
407
|
-
});
|
|
408
|
-
it("detects race when another worker claims during delay", async () => {
|
|
409
|
-
const fastWorker = fixtureId("fast-worker");
|
|
410
|
-
// Register fast worker first (required for foreign key constraint)
|
|
411
|
-
db.run(`INSERT INTO workers (id, name, hostname, pid, status, registered_at, last_heartbeat_at, capabilities, metadata)
|
|
412
|
-
VALUES (?, ?, ?, ?, ?, datetime('now'), datetime('now'), '[]', '{}')`, [fastWorker, "Fast Worker", "localhost", process.pid, "idle"]);
|
|
413
|
-
// Start delayed claim
|
|
414
|
-
const delayedPromise = delayedClaim({
|
|
415
|
-
taskId,
|
|
416
|
-
workerId: slowWorker,
|
|
417
|
-
db,
|
|
418
|
-
delayMs: 100,
|
|
419
|
-
checkRace: true
|
|
420
|
-
});
|
|
421
|
-
// Wait a bit then claim immediately with fast worker
|
|
422
|
-
await sleep(20);
|
|
423
|
-
db.run(`INSERT INTO task_claims (task_id, worker_id, claimed_at, lease_expires_at, renewed_count, status)
|
|
424
|
-
VALUES (?, ?, datetime('now'), datetime('now', '+30 minutes'), 0, 'active')`, [taskId, fastWorker]);
|
|
425
|
-
const result = await delayedPromise;
|
|
426
|
-
expect(result.raceDetected).toBe(true);
|
|
427
|
-
expect(result.claimed).toBe(false);
|
|
428
|
-
expect(result.claimedBy).toBe(fastWorker);
|
|
429
|
-
});
|
|
430
|
-
it("returns correct wait time", async () => {
|
|
431
|
-
const result = await delayedClaim({
|
|
432
|
-
taskId,
|
|
433
|
-
workerId: slowWorker,
|
|
434
|
-
db,
|
|
435
|
-
delayMs: 100
|
|
436
|
-
});
|
|
437
|
-
expect(result.waitedMs).toBeGreaterThanOrEqual(100);
|
|
438
|
-
expect(result.waitedMs).toBeLessThan(200);
|
|
439
|
-
});
|
|
440
|
-
});
|
|
441
|
-
// ===========================================================================
|
|
442
|
-
// stressLoad tests
|
|
443
|
-
// ===========================================================================
|
|
444
|
-
describe("stressLoad", () => {
|
|
445
|
-
it("creates specified number of tasks", () => {
|
|
446
|
-
const result = stressLoad({
|
|
447
|
-
taskCount: 100,
|
|
448
|
-
db
|
|
449
|
-
});
|
|
450
|
-
expect(result.tasksCreated).toBe(100);
|
|
451
|
-
expect(result.taskIds.length).toBe(100);
|
|
452
|
-
const count = db.query("SELECT COUNT(*) as count FROM tasks")[0];
|
|
453
|
-
expect(count.count).toBe(100);
|
|
454
|
-
});
|
|
455
|
-
it("creates tasks with mixed statuses when enabled", () => {
|
|
456
|
-
const result = stressLoad({
|
|
457
|
-
taskCount: 70,
|
|
458
|
-
db,
|
|
459
|
-
mixedStatuses: true
|
|
460
|
-
});
|
|
461
|
-
expect(result.tasksCreated).toBe(70);
|
|
462
|
-
const statuses = db.query("SELECT status, COUNT(*) as count FROM tasks GROUP BY status");
|
|
463
|
-
// Should have multiple different statuses
|
|
464
|
-
expect(statuses.length).toBeGreaterThan(1);
|
|
465
|
-
});
|
|
466
|
-
it("creates dependencies when requested", () => {
|
|
467
|
-
const result = stressLoad({
|
|
468
|
-
taskCount: 50,
|
|
469
|
-
db,
|
|
470
|
-
withDependencies: true,
|
|
471
|
-
dependencyRatio: 0.3
|
|
472
|
-
});
|
|
473
|
-
expect(result.tasksCreated).toBe(50);
|
|
474
|
-
expect(result.depsCreated).toBeGreaterThan(0);
|
|
475
|
-
const depCount = db.query("SELECT COUNT(*) as count FROM task_dependencies")[0];
|
|
476
|
-
expect(depCount.count).toBe(result.depsCreated);
|
|
477
|
-
});
|
|
478
|
-
it("reports performance metrics", () => {
|
|
479
|
-
const result = stressLoad({
|
|
480
|
-
taskCount: 100,
|
|
481
|
-
db
|
|
482
|
-
});
|
|
483
|
-
expect(result.elapsedMs).toBeGreaterThan(0);
|
|
484
|
-
expect(result.tasksPerSecond).toBeGreaterThan(0);
|
|
485
|
-
});
|
|
486
|
-
it("handles batch size correctly", () => {
|
|
487
|
-
const result = stressLoad({
|
|
488
|
-
taskCount: 250,
|
|
489
|
-
db,
|
|
490
|
-
batchSize: 100
|
|
491
|
-
});
|
|
492
|
-
expect(result.tasksCreated).toBe(250);
|
|
493
|
-
});
|
|
494
|
-
});
|
|
495
|
-
});
|
|
496
|
-
// Helper function
|
|
497
|
-
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
498
|
-
//# sourceMappingURL=chaos.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"chaos.test.js","sourceRoot":"","sources":["../../src/chaos/chaos.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"factories.test.d.ts","sourceRoot":"","sources":["../../src/factories/factories.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|