@jamesaphoenix/tx-test-utils 0.4.2

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.
Files changed (101) hide show
  1. package/dist/database/index.d.ts +8 -0
  2. package/dist/database/index.d.ts.map +1 -0
  3. package/dist/database/index.js +7 -0
  4. package/dist/database/index.js.map +1 -0
  5. package/dist/database/test-database.d.ts +101 -0
  6. package/dist/database/test-database.d.ts.map +1 -0
  7. package/dist/database/test-database.js +130 -0
  8. package/dist/database/test-database.js.map +1 -0
  9. package/dist/factories/anchor.factory.d.ts +117 -0
  10. package/dist/factories/anchor.factory.d.ts.map +1 -0
  11. package/dist/factories/anchor.factory.js +201 -0
  12. package/dist/factories/anchor.factory.js.map +1 -0
  13. package/dist/factories/candidate.factory.d.ts +151 -0
  14. package/dist/factories/candidate.factory.d.ts.map +1 -0
  15. package/dist/factories/candidate.factory.js +194 -0
  16. package/dist/factories/candidate.factory.js.map +1 -0
  17. package/dist/factories/edge.factory.d.ts +119 -0
  18. package/dist/factories/edge.factory.d.ts.map +1 -0
  19. package/dist/factories/edge.factory.js +191 -0
  20. package/dist/factories/edge.factory.js.map +1 -0
  21. package/dist/factories/factories.test.d.ts +8 -0
  22. package/dist/factories/factories.test.d.ts.map +1 -0
  23. package/dist/factories/factories.test.js +419 -0
  24. package/dist/factories/factories.test.js.map +1 -0
  25. package/dist/factories/index.d.ts +15 -0
  26. package/dist/factories/index.d.ts.map +1 -0
  27. package/dist/factories/index.js +21 -0
  28. package/dist/factories/index.js.map +1 -0
  29. package/dist/factories/learning.factory.d.ts +107 -0
  30. package/dist/factories/learning.factory.d.ts.map +1 -0
  31. package/dist/factories/learning.factory.js +150 -0
  32. package/dist/factories/learning.factory.js.map +1 -0
  33. package/dist/factories/task.factory.d.ts +106 -0
  34. package/dist/factories/task.factory.d.ts.map +1 -0
  35. package/dist/factories/task.factory.js +151 -0
  36. package/dist/factories/task.factory.js.map +1 -0
  37. package/dist/fixtures/index.d.ts +36 -0
  38. package/dist/fixtures/index.d.ts.map +1 -0
  39. package/dist/fixtures/index.js +47 -0
  40. package/dist/fixtures/index.js.map +1 -0
  41. package/dist/helpers/effect.d.ts +186 -0
  42. package/dist/helpers/effect.d.ts.map +1 -0
  43. package/dist/helpers/effect.js +298 -0
  44. package/dist/helpers/effect.js.map +1 -0
  45. package/dist/helpers/effect.test.d.ts +7 -0
  46. package/dist/helpers/effect.test.d.ts.map +1 -0
  47. package/dist/helpers/effect.test.js +271 -0
  48. package/dist/helpers/effect.test.js.map +1 -0
  49. package/dist/helpers/index.d.ts +7 -0
  50. package/dist/helpers/index.d.ts.map +1 -0
  51. package/dist/helpers/index.js +11 -0
  52. package/dist/helpers/index.js.map +1 -0
  53. package/dist/index.d.ts +26 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +52 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/llm-cache/cache.d.ts +152 -0
  58. package/dist/llm-cache/cache.d.ts.map +1 -0
  59. package/dist/llm-cache/cache.js +199 -0
  60. package/dist/llm-cache/cache.js.map +1 -0
  61. package/dist/llm-cache/cache.test.d.ts +7 -0
  62. package/dist/llm-cache/cache.test.d.ts.map +1 -0
  63. package/dist/llm-cache/cache.test.js +310 -0
  64. package/dist/llm-cache/cache.test.js.map +1 -0
  65. package/dist/llm-cache/cli.d.ts +113 -0
  66. package/dist/llm-cache/cli.d.ts.map +1 -0
  67. package/dist/llm-cache/cli.js +248 -0
  68. package/dist/llm-cache/cli.js.map +1 -0
  69. package/dist/llm-cache/index.d.ts +31 -0
  70. package/dist/llm-cache/index.d.ts.map +1 -0
  71. package/dist/llm-cache/index.js +31 -0
  72. package/dist/llm-cache/index.js.map +1 -0
  73. package/dist/mocks/anthropic.mock.d.ts +173 -0
  74. package/dist/mocks/anthropic.mock.d.ts.map +1 -0
  75. package/dist/mocks/anthropic.mock.js +125 -0
  76. package/dist/mocks/anthropic.mock.js.map +1 -0
  77. package/dist/mocks/ast-grep.mock.d.ts +216 -0
  78. package/dist/mocks/ast-grep.mock.d.ts.map +1 -0
  79. package/dist/mocks/ast-grep.mock.js +164 -0
  80. package/dist/mocks/ast-grep.mock.js.map +1 -0
  81. package/dist/mocks/file-system.mock.d.ts +181 -0
  82. package/dist/mocks/file-system.mock.d.ts.map +1 -0
  83. package/dist/mocks/file-system.mock.js +280 -0
  84. package/dist/mocks/file-system.mock.js.map +1 -0
  85. package/dist/mocks/index.d.ts +10 -0
  86. package/dist/mocks/index.d.ts.map +1 -0
  87. package/dist/mocks/index.js +16 -0
  88. package/dist/mocks/index.js.map +1 -0
  89. package/dist/mocks/mocks.test.d.ts +10 -0
  90. package/dist/mocks/mocks.test.d.ts.map +1 -0
  91. package/dist/mocks/mocks.test.js +961 -0
  92. package/dist/mocks/mocks.test.js.map +1 -0
  93. package/dist/mocks/openai.mock.d.ts +205 -0
  94. package/dist/mocks/openai.mock.d.ts.map +1 -0
  95. package/dist/mocks/openai.mock.js +178 -0
  96. package/dist/mocks/openai.mock.js.map +1 -0
  97. package/dist/setup/index.d.ts +7 -0
  98. package/dist/setup/index.d.ts.map +1 -0
  99. package/dist/setup/index.js +9 -0
  100. package/dist/setup/index.js.map +1 -0
  101. package/package.json +80 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for entity factories.
3
+ *
4
+ * Verifies that all factories correctly create test data with
5
+ * proper defaults and customizable options.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=factories.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factories.test.d.ts","sourceRoot":"","sources":["../../src/factories/factories.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Tests for entity factories.
3
+ *
4
+ * Verifies that all factories correctly create test data with
5
+ * proper defaults and customizable options.
6
+ */
7
+ import { Effect } from "effect";
8
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
9
+ import { createTestDatabase } from "../database/index.js";
10
+ import { TaskFactory, createTestTask, createTestTasks, LearningFactory, createTestLearning, createTestLearnings, EdgeFactory, createTestEdge, createEdgeBetweenLearnings, AnchorFactory, createTestAnchor, CandidateFactory, createTestCandidate, fixtureId } from "./index.js";
11
+ describe("TaskFactory", () => {
12
+ let db;
13
+ beforeEach(async () => {
14
+ db = await Effect.runPromise(createTestDatabase());
15
+ });
16
+ afterEach(async () => {
17
+ await Effect.runPromise(db.close());
18
+ });
19
+ it("should create a task with default values", () => {
20
+ const task = createTestTask(db);
21
+ expect(task.id).toMatch(/^tx-[a-f0-9]{8}$/);
22
+ expect(task.title).toMatch(/^Test Task \d+$/);
23
+ expect(task.status).toBe("backlog");
24
+ expect(task.score).toBe(500);
25
+ expect(task.description).toBe("");
26
+ expect(task.parentId).toBeNull();
27
+ expect(task.createdAt).toBeInstanceOf(Date);
28
+ });
29
+ it("should create a task with custom values", () => {
30
+ const task = createTestTask(db, {
31
+ id: "tx-custom01",
32
+ title: "Custom Task",
33
+ description: "A custom description",
34
+ status: "active",
35
+ score: 800
36
+ });
37
+ expect(task.id).toBe("tx-custom01");
38
+ expect(task.title).toBe("Custom Task");
39
+ expect(task.description).toBe("A custom description");
40
+ expect(task.status).toBe("active");
41
+ expect(task.score).toBe(800);
42
+ });
43
+ it("should create multiple tasks", () => {
44
+ const tasks = createTestTasks(db, 5);
45
+ expect(tasks).toHaveLength(5);
46
+ const ids = tasks.map((t) => t.id);
47
+ const uniqueIds = new Set(ids);
48
+ expect(uniqueIds.size).toBe(5); // All IDs should be unique
49
+ });
50
+ it("should create task hierarchy with children", () => {
51
+ const factory = new TaskFactory(db);
52
+ const { parent, children } = factory.withChildren({ title: "Parent Task" }, 3, { status: "backlog" });
53
+ expect(parent.title).toBe("Parent Task");
54
+ expect(children).toHaveLength(3);
55
+ children.forEach((child) => {
56
+ expect(child.parentId).toBe(parent.id);
57
+ });
58
+ });
59
+ it("should create completed task with completedAt timestamp", () => {
60
+ const factory = new TaskFactory(db);
61
+ const task = factory.completed({ title: "Done Task" });
62
+ expect(task.status).toBe("done");
63
+ expect(task.completedAt).toBeInstanceOf(Date);
64
+ });
65
+ it("should persist task to database", () => {
66
+ const task = createTestTask(db, { title: "Persisted Task" });
67
+ const rows = db.query("SELECT id, title FROM tasks WHERE id = ?", [task.id]);
68
+ expect(rows).toHaveLength(1);
69
+ expect(rows[0].title).toBe("Persisted Task");
70
+ });
71
+ });
72
+ describe("LearningFactory", () => {
73
+ let db;
74
+ beforeEach(async () => {
75
+ db = await Effect.runPromise(createTestDatabase());
76
+ });
77
+ afterEach(async () => {
78
+ await Effect.runPromise(db.close());
79
+ });
80
+ it("should create a learning with default values", () => {
81
+ const learning = createTestLearning(db);
82
+ expect(learning.id).toBeGreaterThan(0);
83
+ expect(learning.content).toMatch(/^Test learning \d+$/);
84
+ expect(learning.sourceType).toBe("manual");
85
+ expect(learning.sourceRef).toBeNull();
86
+ expect(learning.keywords).toEqual([]);
87
+ expect(learning.category).toBeNull();
88
+ expect(learning.usageCount).toBe(0);
89
+ });
90
+ it("should create a learning with custom values", () => {
91
+ const learning = createTestLearning(db, {
92
+ content: "Always use Effect-TS for typed errors",
93
+ category: "patterns",
94
+ sourceType: "run",
95
+ sourceRef: "run-123",
96
+ keywords: ["effect", "typescript", "errors"]
97
+ });
98
+ expect(learning.content).toBe("Always use Effect-TS for typed errors");
99
+ expect(learning.category).toBe("patterns");
100
+ expect(learning.sourceType).toBe("run");
101
+ expect(learning.sourceRef).toBe("run-123");
102
+ expect(learning.keywords).toEqual(["effect", "typescript", "errors"]);
103
+ });
104
+ it("should create multiple learnings", () => {
105
+ const learnings = createTestLearnings(db, 5, { category: "testing" });
106
+ expect(learnings).toHaveLength(5);
107
+ learnings.forEach((l) => {
108
+ expect(l.category).toBe("testing");
109
+ });
110
+ });
111
+ it("should create learning with embedding", () => {
112
+ const factory = new LearningFactory(db);
113
+ const embedding = new Float32Array([0.1, 0.2, 0.3, 0.4, 0.5]);
114
+ const learning = factory.withEmbedding(embedding, { content: "Vector test" });
115
+ expect(learning.embedding).toBeInstanceOf(Float32Array);
116
+ expect(learning.embedding?.length).toBe(5);
117
+ });
118
+ it("should persist learning to database", () => {
119
+ const learning = createTestLearning(db, { content: "Persisted Learning" });
120
+ const rows = db.query("SELECT id, content FROM learnings WHERE id = ?", [learning.id]);
121
+ expect(rows).toHaveLength(1);
122
+ expect(rows[0].content).toBe("Persisted Learning");
123
+ });
124
+ });
125
+ describe("EdgeFactory", () => {
126
+ let db;
127
+ beforeEach(async () => {
128
+ db = await Effect.runPromise(createTestDatabase());
129
+ });
130
+ afterEach(async () => {
131
+ await Effect.runPromise(db.close());
132
+ });
133
+ it("should create an edge with default values", () => {
134
+ const edge = createTestEdge(db);
135
+ expect(edge.id).toBeGreaterThan(0);
136
+ expect(edge.edgeType).toBe("SIMILAR_TO");
137
+ expect(edge.sourceType).toBe("learning");
138
+ expect(edge.targetType).toBe("learning");
139
+ expect(edge.weight).toBe(1.0);
140
+ expect(edge.metadata).toEqual({});
141
+ });
142
+ it("should create edge between two learnings", () => {
143
+ const edge = createEdgeBetweenLearnings(db, 1, 2, "SIMILAR_TO", 0.85);
144
+ expect(edge.edgeType).toBe("SIMILAR_TO");
145
+ expect(edge.sourceType).toBe("learning");
146
+ expect(edge.sourceId).toBe("1");
147
+ expect(edge.targetType).toBe("learning");
148
+ expect(edge.targetId).toBe("2");
149
+ expect(edge.weight).toBe(0.85);
150
+ });
151
+ it("should create anchor edge to file", () => {
152
+ const factory = new EdgeFactory(db);
153
+ const edge = factory.anchorToFile(1, "src/service.ts", 0.9);
154
+ expect(edge.edgeType).toBe("ANCHORED_TO");
155
+ expect(edge.sourceId).toBe("1");
156
+ expect(edge.targetType).toBe("file");
157
+ expect(edge.targetId).toBe("src/service.ts");
158
+ });
159
+ it("should create derived-from edge", () => {
160
+ const factory = new EdgeFactory(db);
161
+ const edge = factory.derivedFromRun(1, "run-abc123");
162
+ expect(edge.edgeType).toBe("DERIVED_FROM");
163
+ expect(edge.targetType).toBe("run");
164
+ expect(edge.targetId).toBe("run-abc123");
165
+ });
166
+ it("should persist edge to database", () => {
167
+ const edge = createTestEdge(db, {
168
+ sourceId: "1",
169
+ targetId: "2",
170
+ weight: 0.75
171
+ });
172
+ const rows = db.query("SELECT id, weight FROM learning_edges WHERE id = ?", [edge.id]);
173
+ expect(rows).toHaveLength(1);
174
+ expect(rows[0].weight).toBe(0.75);
175
+ });
176
+ });
177
+ describe("AnchorFactory", () => {
178
+ let db;
179
+ beforeEach(async () => {
180
+ db = await Effect.runPromise(createTestDatabase());
181
+ // Create a learning for anchors to reference
182
+ createTestLearning(db, { id: 1 });
183
+ });
184
+ afterEach(async () => {
185
+ await Effect.runPromise(db.close());
186
+ });
187
+ it("should create an anchor with required values", () => {
188
+ const anchor = createTestAnchor(db, { learningId: 1 });
189
+ expect(anchor.id).toBeGreaterThan(0);
190
+ expect(anchor.learningId).toBe(1);
191
+ expect(anchor.anchorType).toBe("symbol");
192
+ expect(anchor.status).toBe("valid");
193
+ });
194
+ it("should create symbol anchor", () => {
195
+ const factory = new AnchorFactory(db);
196
+ const anchor = factory.symbolAnchor(1, "src/service.ts", "handleRequest");
197
+ expect(anchor.anchorType).toBe("symbol");
198
+ expect(anchor.anchorValue).toBe("handleRequest");
199
+ expect(anchor.filePath).toBe("src/service.ts");
200
+ expect(anchor.symbolFqname).toBe("src/service.ts::handleRequest");
201
+ });
202
+ it("should create glob anchor", () => {
203
+ const factory = new AnchorFactory(db);
204
+ const anchor = factory.globAnchor(1, "src/repo/*.ts");
205
+ expect(anchor.anchorType).toBe("glob");
206
+ expect(anchor.anchorValue).toBe("src/repo/*.ts");
207
+ });
208
+ it("should create line range anchor", () => {
209
+ const factory = new AnchorFactory(db);
210
+ const anchor = factory.lineRangeAnchor(1, "src/service.ts", 10, 25);
211
+ expect(anchor.anchorType).toBe("line_range");
212
+ expect(anchor.lineStart).toBe(10);
213
+ expect(anchor.lineEnd).toBe(25);
214
+ });
215
+ it("should create drifted anchor", () => {
216
+ const factory = new AnchorFactory(db);
217
+ const anchor = factory.driftedAnchor(1, "src/changed.ts");
218
+ expect(anchor.status).toBe("drifted");
219
+ });
220
+ it("should persist anchor to database", () => {
221
+ const anchor = createTestAnchor(db, {
222
+ learningId: 1,
223
+ filePath: "src/test.ts"
224
+ });
225
+ const rows = db.query("SELECT id, file_path FROM learning_anchors WHERE id = ?", [anchor.id]);
226
+ expect(rows).toHaveLength(1);
227
+ expect(rows[0].file_path).toBe("src/test.ts");
228
+ });
229
+ });
230
+ describe("CandidateFactory", () => {
231
+ let db;
232
+ beforeEach(async () => {
233
+ db = await Effect.runPromise(createTestDatabase());
234
+ });
235
+ afterEach(async () => {
236
+ await Effect.runPromise(db.close());
237
+ });
238
+ it("should create a candidate with default values", () => {
239
+ const candidate = createTestCandidate(db);
240
+ expect(candidate.id).toBeGreaterThan(0);
241
+ expect(candidate.content).toMatch(/^Test candidate learning \d+$/);
242
+ expect(candidate.confidence).toBe("medium");
243
+ expect(candidate.status).toBe("pending");
244
+ expect(candidate.sourceFile).toMatch(/^~\/.claude\/projects\/test\/session-\d+\.jsonl$/);
245
+ });
246
+ it("should create high-confidence candidate", () => {
247
+ const factory = new CandidateFactory(db);
248
+ const candidate = factory.highConfidence({ content: "Always use Effect" });
249
+ expect(candidate.confidence).toBe("high");
250
+ expect(candidate.content).toBe("Always use Effect");
251
+ });
252
+ it("should create promoted candidate", () => {
253
+ // First create a learning to reference
254
+ const learning = createTestLearning(db, { id: 100 });
255
+ const factory = new CandidateFactory(db);
256
+ const candidate = factory.promoted({
257
+ content: "Promoted learning",
258
+ promotedLearningId: learning.id
259
+ });
260
+ expect(candidate.status).toBe("promoted");
261
+ expect(candidate.promotedLearningId).toBe(learning.id);
262
+ expect(candidate.reviewedBy).toBe("auto");
263
+ expect(candidate.reviewedAt).toBeInstanceOf(Date);
264
+ });
265
+ it("should create rejected candidate", () => {
266
+ const factory = new CandidateFactory(db);
267
+ const candidate = factory.rejected("Too specific to context", {
268
+ content: "Very specific learning"
269
+ });
270
+ expect(candidate.status).toBe("rejected");
271
+ expect(candidate.rejectionReason).toBe("Too specific to context");
272
+ expect(candidate.reviewedAt).toBeInstanceOf(Date);
273
+ });
274
+ it("should create merged candidate", () => {
275
+ const learning = createTestLearning(db, { id: 50 });
276
+ const factory = new CandidateFactory(db);
277
+ const candidate = factory.merged(learning.id, { content: "Duplicate learning" });
278
+ expect(candidate.status).toBe("merged");
279
+ expect(candidate.promotedLearningId).toBe(learning.id);
280
+ });
281
+ it("should persist candidate to database", () => {
282
+ const candidate = createTestCandidate(db, {
283
+ content: "Persisted Candidate",
284
+ confidence: "high"
285
+ });
286
+ const rows = db.query("SELECT id, content, confidence FROM learning_candidates WHERE id = ?", [candidate.id]);
287
+ expect(rows).toHaveLength(1);
288
+ expect(rows[0].content).toBe("Persisted Candidate");
289
+ expect(rows[0].confidence).toBe("high");
290
+ });
291
+ });
292
+ describe("fixtureId", () => {
293
+ it("should generate deterministic IDs", () => {
294
+ const id1 = fixtureId("test-fixture");
295
+ const id2 = fixtureId("test-fixture");
296
+ expect(id1).toBe(id2);
297
+ expect(id1).toMatch(/^tx-[a-f0-9]{8}$/);
298
+ });
299
+ it("should generate different IDs for different inputs", () => {
300
+ const id1 = fixtureId("fixture-a");
301
+ const id2 = fixtureId("fixture-b");
302
+ expect(id1).not.toBe(id2);
303
+ });
304
+ });
305
+ describe("EdgeRepository.findByMultipleSources", () => {
306
+ let db;
307
+ beforeEach(async () => {
308
+ db = await Effect.runPromise(createTestDatabase());
309
+ });
310
+ afterEach(async () => {
311
+ await Effect.runPromise(db.close());
312
+ });
313
+ it("should return empty map for empty sourceIds array", async () => {
314
+ // Import EdgeRepository and create layer
315
+ const { EdgeRepository, EdgeRepositoryLive, SqliteClient } = await import("@jamesaphoenix/tx-core");
316
+ const { Layer } = await import("effect");
317
+ // Create a SqliteClient layer from the test database
318
+ const TestSqliteClient = Layer.succeed(SqliteClient, db.db);
319
+ const TestEdgeRepoLayer = Layer.provide(EdgeRepositoryLive, TestSqliteClient);
320
+ const program = Effect.gen(function* () {
321
+ const edgeRepo = yield* EdgeRepository;
322
+ return yield* edgeRepo.findByMultipleSources("learning", []);
323
+ });
324
+ const result = await Effect.runPromise(Effect.provide(program, TestEdgeRepoLayer));
325
+ expect(result).toBeInstanceOf(Map);
326
+ expect(result.size).toBe(0);
327
+ });
328
+ it("should fetch edges for multiple source IDs in one query", async () => {
329
+ // Create test edges using a single factory to avoid ID collisions
330
+ const edgeFactory = new EdgeFactory(db);
331
+ edgeFactory.create({ sourceType: "learning", sourceId: "1", targetId: "10", weight: 0.9 });
332
+ edgeFactory.create({ sourceType: "learning", sourceId: "1", targetId: "11", weight: 0.8 });
333
+ edgeFactory.create({ sourceType: "learning", sourceId: "2", targetId: "20", weight: 0.7 });
334
+ edgeFactory.create({ sourceType: "learning", sourceId: "3", targetId: "30", weight: 0.6 });
335
+ // Import EdgeRepository and create layer
336
+ const { EdgeRepository, EdgeRepositoryLive, SqliteClient } = await import("@jamesaphoenix/tx-core");
337
+ const { Layer } = await import("effect");
338
+ const TestSqliteClient = Layer.succeed(SqliteClient, db.db);
339
+ const TestEdgeRepoLayer = Layer.provide(EdgeRepositoryLive, TestSqliteClient);
340
+ const program = Effect.gen(function* () {
341
+ const edgeRepo = yield* EdgeRepository;
342
+ return yield* edgeRepo.findByMultipleSources("learning", ["1", "2"]);
343
+ });
344
+ const result = await Effect.runPromise(Effect.provide(program, TestEdgeRepoLayer));
345
+ expect(result).toBeInstanceOf(Map);
346
+ expect(result.size).toBe(2);
347
+ // Check source 1 has 2 edges
348
+ const source1Edges = result.get("1");
349
+ expect(source1Edges).toBeDefined();
350
+ expect(source1Edges).toHaveLength(2);
351
+ // Edges should be sorted by weight DESC
352
+ expect(source1Edges[0].weight).toBe(0.9);
353
+ expect(source1Edges[1].weight).toBe(0.8);
354
+ // Check source 2 has 1 edge
355
+ const source2Edges = result.get("2");
356
+ expect(source2Edges).toBeDefined();
357
+ expect(source2Edges).toHaveLength(1);
358
+ expect(source2Edges[0].targetId).toBe("20");
359
+ });
360
+ it("should return empty arrays for sourceIds with no edges", async () => {
361
+ // Create edge only for source 1
362
+ createTestEdge(db, { sourceType: "learning", sourceId: "1", targetId: "10" });
363
+ const { EdgeRepository, EdgeRepositoryLive, SqliteClient } = await import("@jamesaphoenix/tx-core");
364
+ const { Layer } = await import("effect");
365
+ const TestSqliteClient = Layer.succeed(SqliteClient, db.db);
366
+ const TestEdgeRepoLayer = Layer.provide(EdgeRepositoryLive, TestSqliteClient);
367
+ const program = Effect.gen(function* () {
368
+ const edgeRepo = yield* EdgeRepository;
369
+ return yield* edgeRepo.findByMultipleSources("learning", ["1", "2", "3"]);
370
+ });
371
+ const result = await Effect.runPromise(Effect.provide(program, TestEdgeRepoLayer));
372
+ expect(result.size).toBe(3);
373
+ expect(result.get("1")).toHaveLength(1);
374
+ expect(result.get("2")).toHaveLength(0);
375
+ expect(result.get("3")).toHaveLength(0);
376
+ });
377
+ it("should filter by sourceType", async () => {
378
+ // Create edges with different source types using a single factory
379
+ const edgeFactory = new EdgeFactory(db);
380
+ edgeFactory.create({ sourceType: "learning", sourceId: "1", targetId: "10" });
381
+ edgeFactory.create({ sourceType: "file", sourceId: "1", targetId: "20" });
382
+ const { EdgeRepository, EdgeRepositoryLive, SqliteClient } = await import("@jamesaphoenix/tx-core");
383
+ const { Layer } = await import("effect");
384
+ const TestSqliteClient = Layer.succeed(SqliteClient, db.db);
385
+ const TestEdgeRepoLayer = Layer.provide(EdgeRepositoryLive, TestSqliteClient);
386
+ const program = Effect.gen(function* () {
387
+ const edgeRepo = yield* EdgeRepository;
388
+ return yield* edgeRepo.findByMultipleSources("learning", ["1"]);
389
+ });
390
+ const result = await Effect.runPromise(Effect.provide(program, TestEdgeRepoLayer));
391
+ expect(result.size).toBe(1);
392
+ const edges = result.get("1");
393
+ expect(edges).toHaveLength(1);
394
+ expect(edges[0].sourceType).toBe("learning");
395
+ });
396
+ it("should exclude invalidated edges", async () => {
397
+ // Create a valid edge
398
+ createTestEdge(db, { sourceType: "learning", sourceId: "1", targetId: "10" });
399
+ // Create an invalidated edge by inserting directly
400
+ db.exec(`
401
+ INSERT INTO learning_edges (edge_type, source_type, source_id, target_type, target_id, weight, metadata, invalidated_at)
402
+ VALUES ('SIMILAR_TO', 'learning', '1', 'learning', '11', 1.0, '{}', datetime('now'))
403
+ `);
404
+ const { EdgeRepository, EdgeRepositoryLive, SqliteClient } = await import("@jamesaphoenix/tx-core");
405
+ const { Layer } = await import("effect");
406
+ const TestSqliteClient = Layer.succeed(SqliteClient, db.db);
407
+ const TestEdgeRepoLayer = Layer.provide(EdgeRepositoryLive, TestSqliteClient);
408
+ const program = Effect.gen(function* () {
409
+ const edgeRepo = yield* EdgeRepository;
410
+ return yield* edgeRepo.findByMultipleSources("learning", ["1"]);
411
+ });
412
+ const result = await Effect.runPromise(Effect.provide(program, TestEdgeRepoLayer));
413
+ expect(result.size).toBe(1);
414
+ const edges = result.get("1");
415
+ expect(edges).toHaveLength(1); // Only the valid edge
416
+ expect(edges[0].targetId).toBe("10");
417
+ });
418
+ });
419
+ //# sourceMappingURL=factories.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factories.test.js","sourceRoot":"","sources":["../../src/factories/factories.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Entity factories for creating test data.
3
+ *
4
+ * Provides factory classes and convenience functions for creating
5
+ * test instances of all core tx entities with deterministic fixture IDs.
6
+ *
7
+ * @module @tx/test-utils/factories
8
+ */
9
+ export { TaskFactory, createTestTask, createTestTasks, type CreateTaskOptions } from "./task.factory.js";
10
+ export { LearningFactory, createTestLearning, createTestLearnings, type CreateLearningOptions } from "./learning.factory.js";
11
+ export { EdgeFactory, createTestEdge, createEdgeBetweenLearnings, type CreateEdgeOptions } from "./edge.factory.js";
12
+ export { AnchorFactory, createTestAnchor, type CreateAnchorOptions } from "./anchor.factory.js";
13
+ export { CandidateFactory, createTestCandidate, type CreateCandidateOptions, type LearningCandidate, type CandidateConfidence, type CandidateStatus } from "./candidate.factory.js";
14
+ export { fixtureId, namespacedFixtureId, sequentialFixtureIds, contentFixtureId } from "../fixtures/index.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factories/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,WAAW,EACX,cAAc,EACd,0BAA0B,EAC1B,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Entity factories for creating test data.
3
+ *
4
+ * Provides factory classes and convenience functions for creating
5
+ * test instances of all core tx entities with deterministic fixture IDs.
6
+ *
7
+ * @module @tx/test-utils/factories
8
+ */
9
+ // Task factory
10
+ export { TaskFactory, createTestTask, createTestTasks } from "./task.factory.js";
11
+ // Learning factory
12
+ export { LearningFactory, createTestLearning, createTestLearnings } from "./learning.factory.js";
13
+ // Edge factory
14
+ export { EdgeFactory, createTestEdge, createEdgeBetweenLearnings } from "./edge.factory.js";
15
+ // Anchor factory
16
+ export { AnchorFactory, createTestAnchor } from "./anchor.factory.js";
17
+ // Candidate factory
18
+ export { CandidateFactory, createTestCandidate } from "./candidate.factory.js";
19
+ // Re-export fixture ID utilities for convenience
20
+ export { fixtureId, namespacedFixtureId, sequentialFixtureIds, contentFixtureId } from "../fixtures/index.js";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/factories/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAe;AACf,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EAEhB,MAAM,mBAAmB,CAAA;AAE1B,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,uBAAuB,CAAA;AAE9B,eAAe;AACf,OAAO,EACL,WAAW,EACX,cAAc,EACd,0BAA0B,EAE3B,MAAM,mBAAmB,CAAA;AAE1B,iBAAiB;AACjB,OAAO,EACL,aAAa,EACb,gBAAgB,EAEjB,MAAM,qBAAqB,CAAA;AAE5B,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EAKpB,MAAM,wBAAwB,CAAA;AAE/B,iDAAiD;AACjD,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Learning factory for creating test learning data.
3
+ *
4
+ * @module @tx/test-utils/factories/learning
5
+ */
6
+ import type { Learning, LearningSourceType } from "@jamesaphoenix/tx-types";
7
+ import type { TestDatabase } from "../database/index.js";
8
+ /**
9
+ * Options for creating a test learning.
10
+ */
11
+ export interface CreateLearningOptions {
12
+ /** Learning ID (auto-generated if not provided) */
13
+ id?: number;
14
+ /** Learning content */
15
+ content?: string;
16
+ /** Source type */
17
+ sourceType?: LearningSourceType;
18
+ /** Source reference (e.g., task ID, run ID) */
19
+ sourceRef?: string | null;
20
+ /** Keywords for search */
21
+ keywords?: string[];
22
+ /** Category */
23
+ category?: string | null;
24
+ /** Usage count */
25
+ usageCount?: number;
26
+ /** Last used timestamp */
27
+ lastUsedAt?: Date | null;
28
+ /** Outcome score (0-1) */
29
+ outcomeScore?: number | null;
30
+ /** Embedding vector */
31
+ embedding?: Float32Array | null;
32
+ /** Creation timestamp */
33
+ createdAt?: Date;
34
+ }
35
+ /**
36
+ * Factory class for creating test learnings.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const db = await Effect.runPromise(createTestDatabase())
41
+ * const factory = new LearningFactory(db)
42
+ *
43
+ * // Create single learning
44
+ * const learning = factory.create({ content: 'Always use Effect for async ops' })
45
+ *
46
+ * // Create with embedding for vector search testing
47
+ * const embedding = new Float32Array([0.1, 0.2, 0.3, ...])
48
+ * const withVector = factory.withEmbedding(embedding, { content: 'Test learning' })
49
+ *
50
+ * // Create multiple learnings
51
+ * const learnings = await factory.createMany(5, { category: 'testing' })
52
+ * ```
53
+ */
54
+ export declare class LearningFactory {
55
+ private counter;
56
+ private readonly db;
57
+ constructor(db: TestDatabase);
58
+ /**
59
+ * Create a single test learning.
60
+ */
61
+ create(options?: CreateLearningOptions): Learning;
62
+ /**
63
+ * Create multiple test learnings.
64
+ */
65
+ createMany(count: number, options?: CreateLearningOptions): Learning[];
66
+ /**
67
+ * Create a learning with specific content.
68
+ */
69
+ withContent(content: string, options?: CreateLearningOptions): Learning;
70
+ /**
71
+ * Create a learning with embedding vector for vector search testing.
72
+ */
73
+ withEmbedding(embedding: Float32Array, options?: CreateLearningOptions): Learning;
74
+ /**
75
+ * Create a learning with a specific category.
76
+ */
77
+ withCategory(category: string, options?: CreateLearningOptions): Learning;
78
+ /**
79
+ * Create a learning from a specific source.
80
+ */
81
+ fromSource(sourceType: LearningSourceType, sourceRef: string, options?: CreateLearningOptions): Learning;
82
+ /**
83
+ * Reset the internal counter.
84
+ */
85
+ reset(): void;
86
+ }
87
+ /**
88
+ * Create a single test learning (convenience function).
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const db = await Effect.runPromise(createTestDatabase())
93
+ * const learning = createTestLearning(db, { content: 'Use Effect-TS for typed errors' })
94
+ * ```
95
+ */
96
+ export declare const createTestLearning: (db: TestDatabase, options?: CreateLearningOptions) => Learning;
97
+ /**
98
+ * Create multiple test learnings (convenience function).
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const db = await Effect.runPromise(createTestDatabase())
103
+ * const learnings = createTestLearnings(db, 10, { category: 'patterns' })
104
+ * ```
105
+ */
106
+ export declare const createTestLearnings: (db: TestDatabase, count: number, options?: CreateLearningOptions) => Learning[];
107
+ //# sourceMappingURL=learning.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning.factory.d.ts","sourceRoot":"","sources":["../../src/factories/learning.factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,QAAQ,EAER,kBAAkB,EACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAC/B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;IACxB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,uBAAuB;IACvB,SAAS,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;IAC/B,yBAAyB;IACzB,SAAS,CAAC,EAAE,IAAI,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAc;gBAErB,EAAE,EAAE,YAAY;IAI5B;;OAEG;IACH,MAAM,CAAC,OAAO,GAAE,qBAA0B,GAAG,QAAQ;IAsDrD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ,EAAE;IAW1E;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ;IAI3E;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ;IAIrF;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,QAAQ;IAI7E;;OAEG;IACH,UAAU,CACR,UAAU,EAAE,kBAAkB,EAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAA0B,GAClC,QAAQ;IAIX;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAC7B,IAAI,YAAY,EAChB,UAAS,qBAA0B,KAClC,QAGF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,IAAI,YAAY,EAChB,OAAO,MAAM,EACb,UAAS,qBAA0B,KAClC,QAAQ,EAGV,CAAA"}