@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.
- package/dist/database/index.d.ts +8 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +7 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/test-database.d.ts +101 -0
- package/dist/database/test-database.d.ts.map +1 -0
- package/dist/database/test-database.js +130 -0
- package/dist/database/test-database.js.map +1 -0
- package/dist/factories/anchor.factory.d.ts +117 -0
- package/dist/factories/anchor.factory.d.ts.map +1 -0
- package/dist/factories/anchor.factory.js +201 -0
- package/dist/factories/anchor.factory.js.map +1 -0
- package/dist/factories/candidate.factory.d.ts +151 -0
- package/dist/factories/candidate.factory.d.ts.map +1 -0
- package/dist/factories/candidate.factory.js +194 -0
- package/dist/factories/candidate.factory.js.map +1 -0
- package/dist/factories/edge.factory.d.ts +119 -0
- package/dist/factories/edge.factory.d.ts.map +1 -0
- package/dist/factories/edge.factory.js +191 -0
- package/dist/factories/edge.factory.js.map +1 -0
- package/dist/factories/factories.test.d.ts +8 -0
- package/dist/factories/factories.test.d.ts.map +1 -0
- package/dist/factories/factories.test.js +419 -0
- package/dist/factories/factories.test.js.map +1 -0
- package/dist/factories/index.d.ts +15 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories/index.js +21 -0
- package/dist/factories/index.js.map +1 -0
- package/dist/factories/learning.factory.d.ts +107 -0
- package/dist/factories/learning.factory.d.ts.map +1 -0
- package/dist/factories/learning.factory.js +150 -0
- package/dist/factories/learning.factory.js.map +1 -0
- package/dist/factories/task.factory.d.ts +106 -0
- package/dist/factories/task.factory.d.ts.map +1 -0
- package/dist/factories/task.factory.js +151 -0
- package/dist/factories/task.factory.js.map +1 -0
- package/dist/fixtures/index.d.ts +36 -0
- package/dist/fixtures/index.d.ts.map +1 -0
- package/dist/fixtures/index.js +47 -0
- package/dist/fixtures/index.js.map +1 -0
- package/dist/helpers/effect.d.ts +186 -0
- package/dist/helpers/effect.d.ts.map +1 -0
- package/dist/helpers/effect.js +298 -0
- package/dist/helpers/effect.js.map +1 -0
- package/dist/helpers/effect.test.d.ts +7 -0
- package/dist/helpers/effect.test.d.ts.map +1 -0
- package/dist/helpers/effect.test.js +271 -0
- package/dist/helpers/effect.test.js.map +1 -0
- package/dist/helpers/index.d.ts +7 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +11 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-cache/cache.d.ts +152 -0
- package/dist/llm-cache/cache.d.ts.map +1 -0
- package/dist/llm-cache/cache.js +199 -0
- package/dist/llm-cache/cache.js.map +1 -0
- package/dist/llm-cache/cache.test.d.ts +7 -0
- package/dist/llm-cache/cache.test.d.ts.map +1 -0
- package/dist/llm-cache/cache.test.js +310 -0
- package/dist/llm-cache/cache.test.js.map +1 -0
- package/dist/llm-cache/cli.d.ts +113 -0
- package/dist/llm-cache/cli.d.ts.map +1 -0
- package/dist/llm-cache/cli.js +248 -0
- package/dist/llm-cache/cli.js.map +1 -0
- package/dist/llm-cache/index.d.ts +31 -0
- package/dist/llm-cache/index.d.ts.map +1 -0
- package/dist/llm-cache/index.js +31 -0
- package/dist/llm-cache/index.js.map +1 -0
- package/dist/mocks/anthropic.mock.d.ts +173 -0
- package/dist/mocks/anthropic.mock.d.ts.map +1 -0
- package/dist/mocks/anthropic.mock.js +125 -0
- package/dist/mocks/anthropic.mock.js.map +1 -0
- package/dist/mocks/ast-grep.mock.d.ts +216 -0
- package/dist/mocks/ast-grep.mock.d.ts.map +1 -0
- package/dist/mocks/ast-grep.mock.js +164 -0
- package/dist/mocks/ast-grep.mock.js.map +1 -0
- package/dist/mocks/file-system.mock.d.ts +181 -0
- package/dist/mocks/file-system.mock.d.ts.map +1 -0
- package/dist/mocks/file-system.mock.js +280 -0
- package/dist/mocks/file-system.mock.js.map +1 -0
- package/dist/mocks/index.d.ts +10 -0
- package/dist/mocks/index.d.ts.map +1 -0
- package/dist/mocks/index.js +16 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/mocks/mocks.test.d.ts +10 -0
- package/dist/mocks/mocks.test.d.ts.map +1 -0
- package/dist/mocks/mocks.test.js +961 -0
- package/dist/mocks/mocks.test.js.map +1 -0
- package/dist/mocks/openai.mock.d.ts +205 -0
- package/dist/mocks/openai.mock.d.ts.map +1 -0
- package/dist/mocks/openai.mock.js +178 -0
- package/dist/mocks/openai.mock.js.map +1 -0
- package/dist/setup/index.d.ts +7 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +9 -0
- package/dist/setup/index.js.map +1 -0
- package/package.json +80 -0
|
@@ -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"}
|