@jamesaphoenix/tx-test-utils 0.4.2 → 0.5.0
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 +480 -0
- package/dist/adapters/better-sqlite3-adapter.d.ts +36 -0
- package/dist/adapters/better-sqlite3-adapter.d.ts.map +1 -0
- package/dist/adapters/better-sqlite3-adapter.js +78 -0
- package/dist/adapters/better-sqlite3-adapter.js.map +1 -0
- package/dist/chaos/chaos-utilities.d.ts +465 -0
- package/dist/chaos/chaos-utilities.d.ts.map +1 -0
- package/dist/chaos/chaos-utilities.js +791 -0
- package/dist/chaos/chaos-utilities.js.map +1 -0
- package/dist/chaos/chaos.test.d.ts +9 -0
- package/dist/chaos/chaos.test.d.ts.map +1 -0
- package/dist/chaos/chaos.test.js +498 -0
- package/dist/chaos/chaos.test.js.map +1 -0
- package/dist/chaos/index.d.ts +20 -0
- package/dist/chaos/index.d.ts.map +1 -0
- package/dist/chaos/index.js +39 -0
- package/dist/chaos/index.js.map +1 -0
- package/dist/database/index.d.ts +1 -1
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +1 -1
- package/dist/database/index.js.map +1 -1
- package/dist/database/test-database.d.ts +25 -5
- package/dist/database/test-database.d.ts.map +1 -1
- package/dist/database/test-database.js +62 -5
- package/dist/database/test-database.js.map +1 -1
- package/dist/factories/learning.factory.js +1 -1
- package/dist/factories/learning.factory.js.map +1 -1
- package/dist/helpers/index.d.ts +2 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +4 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/shared-test-layer.d.ts +69 -0
- package/dist/helpers/shared-test-layer.d.ts.map +1 -0
- package/dist/helpers/shared-test-layer.js +107 -0
- package/dist/helpers/shared-test-layer.js.map +1 -0
- package/dist/helpers/sqlite-factory.d.ts +24 -0
- package/dist/helpers/sqlite-factory.d.ts.map +1 -0
- package/dist/helpers/sqlite-factory.js +36 -0
- package/dist/helpers/sqlite-factory.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -1
- package/dist/index.js.map +1 -1
- package/dist/singleton.d.ts +49 -0
- package/dist/singleton.d.ts.map +1 -0
- package/dist/singleton.js +66 -0
- package/dist/singleton.js.map +1 -0
- package/package.json +20 -10
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chaos Engineering Utilities for tx
|
|
3
|
+
*
|
|
4
|
+
* Provides reusable primitives for hardening tx through controlled failures.
|
|
5
|
+
* Use these utilities to test race conditions, failures, and edge cases.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { chaos } from '@tx/test-utils'
|
|
10
|
+
*
|
|
11
|
+
* await chaos.raceWorkers(5, taskId)
|
|
12
|
+
* await chaos.crashAfter(100)
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @module @tx/test-utils/chaos
|
|
16
|
+
*/
|
|
17
|
+
export {
|
|
18
|
+
// Process failure simulation
|
|
19
|
+
crashAfter, CrashSimulationError,
|
|
20
|
+
// Worker heartbeat manipulation
|
|
21
|
+
killHeartbeat, WorkerHeartbeatController,
|
|
22
|
+
// Race condition testing
|
|
23
|
+
raceWorkers,
|
|
24
|
+
// State corruption
|
|
25
|
+
corruptState,
|
|
26
|
+
// JSONL replay
|
|
27
|
+
replayJSONL,
|
|
28
|
+
// Double completion testing
|
|
29
|
+
doubleComplete,
|
|
30
|
+
// Partial write simulation
|
|
31
|
+
partialWrite,
|
|
32
|
+
// Delayed claim testing
|
|
33
|
+
delayedClaim,
|
|
34
|
+
// Stress testing
|
|
35
|
+
stressLoad } from "./chaos-utilities.js";
|
|
36
|
+
// Convenience default export for namespace-style usage
|
|
37
|
+
import * as chaosUtilities from "./chaos-utilities.js";
|
|
38
|
+
export const chaos = chaosUtilities;
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chaos/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO;AACL,6BAA6B;AAC7B,UAAU,EACV,oBAAoB;AAGpB,gCAAgC;AAChC,aAAa,EACb,yBAAyB;AAEzB,yBAAyB;AACzB,WAAW;AAGX,mBAAmB;AACnB,YAAY;AAGZ,eAAe;AACf,WAAW;AAIX,4BAA4B;AAC5B,cAAc;AAGd,2BAA2B;AAC3B,YAAY;AAGZ,wBAAwB;AACxB,YAAY;AAGZ,iBAAiB;AACjB,UAAU,EAGX,MAAM,sBAAsB,CAAA;AAE7B,uDAAuD;AACvD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AACtD,MAAM,CAAC,MAAM,KAAK,GAAG,cAAc,CAAA"}
|
package/dist/database/index.d.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module @tx/test-utils/database
|
|
5
5
|
*/
|
|
6
|
-
export { createTestDatabase, TestDatabaseService, TestDatabaseLive, createTestDatabaseLayer } from "./test-database.js";
|
|
6
|
+
export { createTestDatabase, TestDatabaseService, TestDatabaseLive, createTestDatabaseLayer, wrapDbAsTestDatabase } from "./test-database.js";
|
|
7
7
|
export type { TestDatabase } from "./test-database.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/database/index.js
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module @tx/test-utils/database
|
|
5
5
|
*/
|
|
6
|
-
export { createTestDatabase, TestDatabaseService, TestDatabaseLive, createTestDatabaseLayer } from "./test-database.js";
|
|
6
|
+
export { createTestDatabase, TestDatabaseService, TestDatabaseLive, createTestDatabaseLayer, wrapDbAsTestDatabase } from "./test-database.js";
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,oBAAoB,CAAA"}
|
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module @tx/test-utils/database
|
|
8
8
|
*/
|
|
9
|
-
import Database from "
|
|
9
|
+
import { Database } from "bun:sqlite";
|
|
10
10
|
import { Context, Effect, Layer } from "effect";
|
|
11
|
+
import { type SqliteRunResult } from "@jamesaphoenix/tx-core";
|
|
11
12
|
/**
|
|
12
13
|
* Interface for test database operations.
|
|
13
|
-
* Wraps
|
|
14
|
+
* Wraps bun:sqlite with convenience methods for testing.
|
|
14
15
|
*/
|
|
15
16
|
export interface TestDatabase {
|
|
16
|
-
/** The underlying
|
|
17
|
-
readonly db: Database
|
|
17
|
+
/** The underlying bun:sqlite Database instance */
|
|
18
|
+
readonly db: Database;
|
|
18
19
|
/** Close the database connection */
|
|
19
20
|
readonly close: () => Effect.Effect<void>;
|
|
20
21
|
/** Delete all data from tables (preserves schema and migrations table) */
|
|
@@ -24,7 +25,7 @@ export interface TestDatabase {
|
|
|
24
25
|
/** Execute raw SQL (DDL or DML) */
|
|
25
26
|
readonly exec: (sql: string) => void;
|
|
26
27
|
/** Execute a parameterized INSERT/UPDATE/DELETE and return run result */
|
|
27
|
-
readonly run: (sql: string, params?: unknown[]) =>
|
|
28
|
+
readonly run: (sql: string, params?: unknown[]) => SqliteRunResult;
|
|
28
29
|
/** Execute a function within a transaction */
|
|
29
30
|
readonly transaction: <T>(fn: () => T) => T;
|
|
30
31
|
}
|
|
@@ -97,5 +98,24 @@ export declare const TestDatabaseLive: Layer.Layer<TestDatabaseService, Error, n
|
|
|
97
98
|
* ```
|
|
98
99
|
*/
|
|
99
100
|
export declare const createTestDatabaseLayer: () => Layer.Layer<TestDatabaseService, Error>;
|
|
101
|
+
/**
|
|
102
|
+
* Wrap a raw bun:sqlite Database as a TestDatabase interface.
|
|
103
|
+
*
|
|
104
|
+
* Use this to wrap the singleton test database from getSharedTestLayer()
|
|
105
|
+
* for use with factories that require a TestDatabase.
|
|
106
|
+
*
|
|
107
|
+
* @param db - The raw bun:sqlite Database instance
|
|
108
|
+
* @returns A TestDatabase wrapper
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* import { getSharedTestLayer, wrapDbAsTestDatabase, CandidateFactory } from '@jamesaphoenix/tx-test-utils'
|
|
113
|
+
*
|
|
114
|
+
* const shared = await getSharedTestLayer()
|
|
115
|
+
* const testDb = wrapDbAsTestDatabase(shared.getDb())
|
|
116
|
+
* const factory = new CandidateFactory(testDb)
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
export declare const wrapDbAsTestDatabase: (db: Database) => TestDatabase;
|
|
100
120
|
export {};
|
|
101
121
|
//# sourceMappingURL=test-database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-database.d.ts","sourceRoot":"","sources":["../../src/database/test-database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"test-database.d.ts","sourceRoot":"","sources":["../../src/database/test-database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE9E;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;IACrB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACzC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAA;IACrE,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,eAAe,CAAA;IAClE,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;CAC5C;;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,mBAAoB,SAAQ,wBAGtC;CAAG;AAEN;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAoEnE,CAAA;AAEJ;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,gBAAgB,gDAG5B,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,uBAAuB,QAAO,KAAK,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAI9E,CAAA;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,QAAQ,KAAG,YAgDlD,CAAA"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module @tx/test-utils/database
|
|
8
8
|
*/
|
|
9
|
-
import Database from "
|
|
9
|
+
import { Database } from "bun:sqlite";
|
|
10
10
|
import { Context, Effect, Layer } from "effect";
|
|
11
11
|
import { applyMigrations } from "@jamesaphoenix/tx-core";
|
|
12
12
|
/**
|
|
@@ -41,8 +41,9 @@ export const createTestDatabase = () => Effect.try({
|
|
|
41
41
|
try: () => {
|
|
42
42
|
const db = new Database(":memory:");
|
|
43
43
|
// Enable WAL mode for better concurrent access (matches production settings)
|
|
44
|
-
db.
|
|
45
|
-
db.
|
|
44
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
45
|
+
db.run("PRAGMA foreign_keys = ON");
|
|
46
|
+
db.run("PRAGMA busy_timeout = " + (process.env.TX_DB_BUSY_TIMEOUT || "5000"));
|
|
46
47
|
// Run all migrations
|
|
47
48
|
applyMigrations(db);
|
|
48
49
|
const testDb = {
|
|
@@ -65,11 +66,11 @@ export const createTestDatabase = () => Effect.try({
|
|
|
65
66
|
`)
|
|
66
67
|
.all();
|
|
67
68
|
// Disable foreign keys temporarily to allow deletion in any order
|
|
68
|
-
db.
|
|
69
|
+
db.run("PRAGMA foreign_keys = OFF");
|
|
69
70
|
for (const { name } of tables) {
|
|
70
71
|
db.exec(`DELETE FROM "${name}"`);
|
|
71
72
|
}
|
|
72
|
-
db.
|
|
73
|
+
db.run("PRAGMA foreign_keys = ON");
|
|
73
74
|
}),
|
|
74
75
|
query: (sql, params = []) => {
|
|
75
76
|
return db.prepare(sql).all(...params);
|
|
@@ -127,4 +128,60 @@ export const TestDatabaseLive = Layer.scoped(TestDatabaseService, Effect.acquire
|
|
|
127
128
|
* ```
|
|
128
129
|
*/
|
|
129
130
|
export const createTestDatabaseLayer = () => Layer.scoped(TestDatabaseService, Effect.acquireRelease(createTestDatabase(), (db) => db.close()));
|
|
131
|
+
/**
|
|
132
|
+
* Wrap a raw bun:sqlite Database as a TestDatabase interface.
|
|
133
|
+
*
|
|
134
|
+
* Use this to wrap the singleton test database from getSharedTestLayer()
|
|
135
|
+
* for use with factories that require a TestDatabase.
|
|
136
|
+
*
|
|
137
|
+
* @param db - The raw bun:sqlite Database instance
|
|
138
|
+
* @returns A TestDatabase wrapper
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* import { getSharedTestLayer, wrapDbAsTestDatabase, CandidateFactory } from '@jamesaphoenix/tx-test-utils'
|
|
143
|
+
*
|
|
144
|
+
* const shared = await getSharedTestLayer()
|
|
145
|
+
* const testDb = wrapDbAsTestDatabase(shared.getDb())
|
|
146
|
+
* const factory = new CandidateFactory(testDb)
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export const wrapDbAsTestDatabase = (db) => ({
|
|
150
|
+
db,
|
|
151
|
+
close: () => Effect.sync(() => {
|
|
152
|
+
db.close();
|
|
153
|
+
}),
|
|
154
|
+
reset: () => Effect.sync(() => {
|
|
155
|
+
// Get all user tables (exclude sqlite internals, migrations tracking, and FTS tables)
|
|
156
|
+
const tables = db
|
|
157
|
+
.prepare(`
|
|
158
|
+
SELECT name FROM sqlite_master
|
|
159
|
+
WHERE type='table'
|
|
160
|
+
AND name NOT LIKE 'sqlite_%'
|
|
161
|
+
AND name != 'schema_version'
|
|
162
|
+
AND name NOT LIKE '%_fts'
|
|
163
|
+
AND name NOT LIKE '%_fts_%'
|
|
164
|
+
AND name NOT LIKE '%_config'
|
|
165
|
+
`)
|
|
166
|
+
.all();
|
|
167
|
+
// Disable foreign keys temporarily to allow deletion in any order
|
|
168
|
+
db.run("PRAGMA foreign_keys = OFF");
|
|
169
|
+
for (const { name } of tables) {
|
|
170
|
+
db.exec(`DELETE FROM "${name}"`);
|
|
171
|
+
}
|
|
172
|
+
db.run("PRAGMA foreign_keys = ON");
|
|
173
|
+
}),
|
|
174
|
+
query: (sql, params = []) => {
|
|
175
|
+
return db.prepare(sql).all(...params);
|
|
176
|
+
},
|
|
177
|
+
exec: (sql) => {
|
|
178
|
+
db.exec(sql);
|
|
179
|
+
},
|
|
180
|
+
run: (sql, params = []) => {
|
|
181
|
+
return db.prepare(sql).run(...params);
|
|
182
|
+
},
|
|
183
|
+
transaction: (fn) => {
|
|
184
|
+
return db.transaction(fn)();
|
|
185
|
+
}
|
|
186
|
+
});
|
|
130
187
|
//# sourceMappingURL=test-database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-database.js","sourceRoot":"","sources":["../../src/database/test-database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"test-database.js","sourceRoot":"","sources":["../../src/database/test-database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learning.factory.js","sourceRoot":"","sources":["../../src/factories/learning.factory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqCH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,CAAC,CAAA;IACF,EAAE,CAAc;IAEjC,YAAY,EAAgB;QAC1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAiC,EAAE;QACxC,IAAI,CAAC,OAAO,EAAE,CAAA;QACd,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QAEtB,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAA;QACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAA;QAClE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAA;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAA;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAA;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAA;QAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAA;QAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAA;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAA;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,GAAG,CAAA;QAE1C,oDAAoD;QACpD,MAAM,eAAe,GAAG,SAAS;YAC/B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC;YAC3E,CAAC,CAAC,IAAI,CAAA;QAER,IAAI,CAAC,EAAE,CAAC,GAAG,CACT;gDAC0C,EAC1C;YACE,EAAE;YACF,OAAO;YACP,UAAU;YACV,SAAS;YACT,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;YACxB,QAAQ;YACR,UAAU;YACV,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;YAC5C,YAAY;YACZ,eAAe;YACf,SAAS,CAAC,WAAW,EAAE;SACxB,CACF,CAAA;QAED,OAAO;YACL,EAAE,EAAE,EAAgB;YACpB,OAAO;YACP,UAAU;YACV,SAAS;YACT,QAAQ;YACR,QAAQ;YACR,UAAU;YACV,UAAU;YACV,YAAY;YACZ,SAAS;
|
|
1
|
+
{"version":3,"file":"learning.factory.js","sourceRoot":"","sources":["../../src/factories/learning.factory.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers/index.d.ts
CHANGED
|
@@ -4,4 +4,6 @@
|
|
|
4
4
|
* @module @tx/test-utils/helpers
|
|
5
5
|
*/
|
|
6
6
|
export { runEffect, runEffectFail, runEffectEither, expectEffectSuccess, expectEffectFailure, mergeLayers, createTestContext, type RunEffectOptions, type EffectResult } from "./effect.js";
|
|
7
|
+
export { createSharedTestLayer, type SharedTestLayer, type SharedTestLayerResult } from "./shared-test-layer.js";
|
|
8
|
+
export { createSqliteDatabase, createMigratedSqliteDatabase } from "./sqlite-factory.js";
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA"}
|
package/dist/helpers/index.js
CHANGED
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
// Effect test helpers
|
|
7
7
|
export { runEffect, runEffectFail, runEffectEither, expectEffectSuccess, expectEffectFailure, mergeLayers, createTestContext } from "./effect.js";
|
|
8
|
+
// Shared test layer for memory-efficient integration tests
|
|
9
|
+
export { createSharedTestLayer } from "./shared-test-layer.js";
|
|
10
|
+
// SQLite database factory for tests
|
|
11
|
+
export { createSqliteDatabase, createMigratedSqliteDatabase } from "./sqlite-factory.js";
|
|
8
12
|
// TODO: Implement temp file helpers
|
|
9
13
|
// export { createTempDir, writeTestTypeScriptFile, createTestSourceFiles } from './temp-files.js'
|
|
10
14
|
// export type { TempDir } from './temp-files.js'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sBAAsB;AACtB,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EAGlB,MAAM,aAAa,CAAA;AAEpB,oCAAoC;AACpC,kGAAkG;AAClG,iDAAiD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sBAAsB;AACtB,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EAGlB,MAAM,aAAa,CAAA;AAEpB,2DAA2D;AAC3D,OAAO,EACL,qBAAqB,EAGtB,MAAM,wBAAwB,CAAA;AAE/B,oCAAoC;AACpC,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,qBAAqB,CAAA;AAE5B,oCAAoC;AACpC,kGAAkG;AAClG,iDAAiD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test layer utilities for memory-efficient integration tests.
|
|
3
|
+
*
|
|
4
|
+
* Instead of creating a new database per test, creates ONE database per describe block
|
|
5
|
+
* and resets between tests. This reduces memory from ~54GB to ~8GB for the test suite.
|
|
6
|
+
*
|
|
7
|
+
* @module @tx/test-utils/helpers/shared-test-layer
|
|
8
|
+
*/
|
|
9
|
+
import { Layer } from "effect";
|
|
10
|
+
import type { Database } from "bun:sqlite";
|
|
11
|
+
/**
|
|
12
|
+
* Result of creating a shared test layer.
|
|
13
|
+
*/
|
|
14
|
+
export interface SharedTestLayer<L> {
|
|
15
|
+
/** The Effect layer - pass to Effect.provide() */
|
|
16
|
+
readonly layer: Layer.Layer<L, never, never>;
|
|
17
|
+
/** Reset all database tables (call in afterEach) */
|
|
18
|
+
readonly reset: () => Promise<void>;
|
|
19
|
+
/** Close the database (call in afterAll) */
|
|
20
|
+
readonly close: () => Promise<void>;
|
|
21
|
+
/** Access to underlying database for advanced use cases */
|
|
22
|
+
readonly getDb: () => Database;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a shared app layer for testing.
|
|
26
|
+
*
|
|
27
|
+
* This creates ONE in-memory SQLite database that can be reset between tests.
|
|
28
|
+
* Much more memory-efficient than creating a new database per test.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { createSharedTestLayer } from '@jamesaphoenix/tx-test-utils'
|
|
33
|
+
* import { describe, it, beforeAll, afterEach, afterAll } from 'vitest'
|
|
34
|
+
*
|
|
35
|
+
* describe('MyService', () => {
|
|
36
|
+
* let shared: SharedTestLayer<...>
|
|
37
|
+
*
|
|
38
|
+
* beforeAll(async () => {
|
|
39
|
+
* shared = await createSharedTestLayer()
|
|
40
|
+
* })
|
|
41
|
+
*
|
|
42
|
+
* afterEach(async () => {
|
|
43
|
+
* await shared.reset() // Clean slate between tests
|
|
44
|
+
* })
|
|
45
|
+
*
|
|
46
|
+
* afterAll(async () => {
|
|
47
|
+
* await shared.close()
|
|
48
|
+
* })
|
|
49
|
+
*
|
|
50
|
+
* it('test 1', async () => {
|
|
51
|
+
* const result = await Effect.runPromise(
|
|
52
|
+
* myEffect.pipe(Effect.provide(shared.layer))
|
|
53
|
+
* )
|
|
54
|
+
* })
|
|
55
|
+
* })
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare const createSharedTestLayer: () => Promise<{
|
|
59
|
+
layer: Layer.Layer<import("@jamesaphoenix/tx-core").MigrationService | import("@jamesaphoenix/tx-core").SqliteClient | import("@jamesaphoenix/tx-core").TaskRepository | import("@jamesaphoenix/tx-core").DependencyRepository | import("@jamesaphoenix/tx-core").LearningRepository | import("@jamesaphoenix/tx-core").FileLearningRepository | import("@jamesaphoenix/tx-core").AttemptRepository | import("@jamesaphoenix/tx-core").RunRepository | import("@jamesaphoenix/tx-core").AnchorRepository | import("@jamesaphoenix/tx-core").EdgeRepository | import("@jamesaphoenix/tx-core").DeduplicationRepository | import("@jamesaphoenix/tx-core").CandidateRepository | import("@jamesaphoenix/tx-core").TrackedProjectRepository | import("@jamesaphoenix/tx-core").WorkerRepository | import("@jamesaphoenix/tx-core").ClaimRepository | import("@jamesaphoenix/tx-core").OrchestratorStateRepository | import("@jamesaphoenix/tx-core").TaskService | import("@jamesaphoenix/tx-core").DependencyService | import("@jamesaphoenix/tx-core").ReadyService | import("@jamesaphoenix/tx-core").HierarchyService | import("@jamesaphoenix/tx-core").EdgeService | import("@jamesaphoenix/tx-core").GraphExpansionService | import("@jamesaphoenix/tx-core").FeedbackTrackerService | import("@jamesaphoenix/tx-core").DiversifierService | import("@jamesaphoenix/tx-core").RetrieverService | import("@jamesaphoenix/tx-core").LearningService | import("@jamesaphoenix/tx-core").FileLearningService | import("@jamesaphoenix/tx-core").AttemptService | import("@jamesaphoenix/tx-core").AnchorVerificationService | import("@jamesaphoenix/tx-core").AnchorService | import("@jamesaphoenix/tx-core").DeduplicationService | import("@jamesaphoenix/tx-core").SyncService | import("@jamesaphoenix/tx-core").SwarmVerificationService | import("@jamesaphoenix/tx-core").PromotionService | import("@jamesaphoenix/tx-core").WorkerService | import("@jamesaphoenix/tx-core").ClaimService | import("@jamesaphoenix/tx-core").OrchestratorService | import("@jamesaphoenix/tx-core").DaemonService | import("@jamesaphoenix/tx-core").TracingService | import("@jamesaphoenix/tx-core").CompactionRepository | import("@jamesaphoenix/tx-core").CompactionService | import("@jamesaphoenix/tx-core").ValidationService | import("@jamesaphoenix/tx-core").MessageRepository | import("@jamesaphoenix/tx-core").MessageService | import("@jamesaphoenix/tx-core").DocRepository | import("@jamesaphoenix/tx-core").DocService, boolean | import("@jamesaphoenix/tx-core").DatabaseError | import("@jamesaphoenix/tx-core").EmbeddingUnavailableError | import("@jamesaphoenix/tx-core").LlmUnavailableError, never>;
|
|
60
|
+
reset: () => Promise<void>;
|
|
61
|
+
close: () => Promise<void>;
|
|
62
|
+
getDb: () => Database;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Type helper for the return type of createSharedTestLayer.
|
|
66
|
+
* Use this when you need to type the shared layer variable.
|
|
67
|
+
*/
|
|
68
|
+
export type SharedTestLayerResult = Awaited<ReturnType<typeof createSharedTestLayer>>;
|
|
69
|
+
//# sourceMappingURL=shared-test-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-test-layer.d.ts","sourceRoot":"","sources":["../../src/helpers/shared-test-layer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC5C,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,MAAM,QAAQ,CAAA;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,qBAAqB;;iBA4BR,OAAO,CAAC,IAAI,CAAC;iBA6Bb,OAAO,CAAC,IAAI,CAAC;iBAOnB,QAAQ;EAQ3B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test layer utilities for memory-efficient integration tests.
|
|
3
|
+
*
|
|
4
|
+
* Instead of creating a new database per test, creates ONE database per describe block
|
|
5
|
+
* and resets between tests. This reduces memory from ~54GB to ~8GB for the test suite.
|
|
6
|
+
*
|
|
7
|
+
* @module @tx/test-utils/helpers/shared-test-layer
|
|
8
|
+
*/
|
|
9
|
+
import { Layer } from "effect";
|
|
10
|
+
/**
|
|
11
|
+
* Create a shared app layer for testing.
|
|
12
|
+
*
|
|
13
|
+
* This creates ONE in-memory SQLite database that can be reset between tests.
|
|
14
|
+
* Much more memory-efficient than creating a new database per test.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { createSharedTestLayer } from '@jamesaphoenix/tx-test-utils'
|
|
19
|
+
* import { describe, it, beforeAll, afterEach, afterAll } from 'vitest'
|
|
20
|
+
*
|
|
21
|
+
* describe('MyService', () => {
|
|
22
|
+
* let shared: SharedTestLayer<...>
|
|
23
|
+
*
|
|
24
|
+
* beforeAll(async () => {
|
|
25
|
+
* shared = await createSharedTestLayer()
|
|
26
|
+
* })
|
|
27
|
+
*
|
|
28
|
+
* afterEach(async () => {
|
|
29
|
+
* await shared.reset() // Clean slate between tests
|
|
30
|
+
* })
|
|
31
|
+
*
|
|
32
|
+
* afterAll(async () => {
|
|
33
|
+
* await shared.close()
|
|
34
|
+
* })
|
|
35
|
+
*
|
|
36
|
+
* it('test 1', async () => {
|
|
37
|
+
* const result = await Effect.runPromise(
|
|
38
|
+
* myEffect.pipe(Effect.provide(shared.layer))
|
|
39
|
+
* )
|
|
40
|
+
* })
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export const createSharedTestLayer = async () => {
|
|
45
|
+
// Dynamically import to avoid circular dependencies
|
|
46
|
+
const { makeAppLayerFromInfra, SqliteClient, applyMigrations } = await import("@jamesaphoenix/tx-core");
|
|
47
|
+
const { Database } = await import("bun:sqlite");
|
|
48
|
+
// Create ONE database instance directly — this ensures all tests share the
|
|
49
|
+
// exact same DB connection rather than each Layer build creating a new one
|
|
50
|
+
// (Layer.effect-based layers like SqliteClientLive create new connections per build).
|
|
51
|
+
const db = new Database(":memory:");
|
|
52
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
53
|
+
db.run("PRAGMA foreign_keys = ON");
|
|
54
|
+
db.run("PRAGMA busy_timeout = " + (process.env.TX_DB_BUSY_TIMEOUT || "5000"));
|
|
55
|
+
applyMigrations(db);
|
|
56
|
+
// Use Layer.succeed to provide the concrete DB instance — this is a constant
|
|
57
|
+
// layer that always provides the same DB reference, unlike Layer.effect which
|
|
58
|
+
// would create a new connection on each build.
|
|
59
|
+
const infra = Layer.succeed(SqliteClient, db);
|
|
60
|
+
// Wrap with Layer.fresh so that service layers (repos, services) are NOT
|
|
61
|
+
// memoized across separate Effect.provide calls. This ensures each test gets
|
|
62
|
+
// fresh service instances while sharing the same underlying database.
|
|
63
|
+
const layer = Layer.fresh(makeAppLayerFromInfra(infra));
|
|
64
|
+
/**
|
|
65
|
+
* Reset all tables in the database.
|
|
66
|
+
* Preserves schema but deletes all data.
|
|
67
|
+
*/
|
|
68
|
+
const reset = async () => {
|
|
69
|
+
// Get all user tables (exclude sqlite internals, migrations tracking, and FTS tables)
|
|
70
|
+
const tables = db
|
|
71
|
+
.prepare(`
|
|
72
|
+
SELECT name FROM sqlite_master
|
|
73
|
+
WHERE type='table'
|
|
74
|
+
AND name NOT LIKE 'sqlite_%'
|
|
75
|
+
AND name != 'schema_version'
|
|
76
|
+
AND name NOT LIKE '%_fts'
|
|
77
|
+
AND name NOT LIKE '%_fts_%'
|
|
78
|
+
AND name NOT LIKE '%_config'
|
|
79
|
+
`)
|
|
80
|
+
.all();
|
|
81
|
+
// Disable foreign keys temporarily to allow deletion in any order
|
|
82
|
+
db.run("PRAGMA foreign_keys = OFF");
|
|
83
|
+
for (const { name } of tables) {
|
|
84
|
+
db.exec(`DELETE FROM "${name}"`);
|
|
85
|
+
}
|
|
86
|
+
// Reset auto-increment counters so IDs start from 1 in each test
|
|
87
|
+
db.exec("DELETE FROM sqlite_sequence");
|
|
88
|
+
db.run("PRAGMA foreign_keys = ON");
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Close the database connection.
|
|
92
|
+
*/
|
|
93
|
+
const close = async () => {
|
|
94
|
+
db.close();
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Get the underlying database instance.
|
|
98
|
+
*/
|
|
99
|
+
const getDb = () => db;
|
|
100
|
+
return {
|
|
101
|
+
layer,
|
|
102
|
+
reset,
|
|
103
|
+
close,
|
|
104
|
+
getDb
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=shared-test-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-test-layer.js","sourceRoot":"","sources":["../../src/helpers/shared-test-layer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAkB9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;IAC9C,oDAAoD;IACpD,MAAM,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;IACvG,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;IAE/C,2EAA2E;IAC3E,2EAA2E;IAC3E,sFAAsF;IACtF,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA;IACnC,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACnC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IAClC,EAAE,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,CAAC,CAAA;IAC7E,eAAe,CAAC,EAAE,CAAC,CAAA;IAEnB,6EAA6E;IAC7E,8EAA8E;IAC9E,+CAA+C;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAA+B,CAAC,CAAA;IAE1E,yEAAyE;IACzE,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD;;;OAGG;IACH,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,sFAAsF;QACtF,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CACN;;;;;;;;OAQD,CACA;aACA,GAAG,EAA6B,CAAA;QAEnC,kEAAkE;QAClE,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACnC,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;YAC9B,EAAE,CAAC,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAA;QAClC,CAAC;QACD,iEAAiE;QACjE,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QACtC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACpC,CAAC,CAAA;IAED;;OAEG;IACH,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;QACtC,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC,CAAA;IAED;;OAEG;IACH,MAAM,KAAK,GAAG,GAAa,EAAE,CAAC,EAAE,CAAA;IAEhC,OAAO;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;KACN,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite database factory for tests.
|
|
3
|
+
*
|
|
4
|
+
* Creates database instances for use in tests. Since we run tests with
|
|
5
|
+
* `bunx --bun vitest run`, bun:sqlite is always available.
|
|
6
|
+
*
|
|
7
|
+
* @module @tx/test-utils/helpers/sqlite-factory
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Create an in-memory SQLite database with PRAGMAs set.
|
|
11
|
+
* Migrations are NOT applied — call applyMigrations(db) yourself if needed.
|
|
12
|
+
*
|
|
13
|
+
* @param path - Database file path, or ":memory:" (default)
|
|
14
|
+
*/
|
|
15
|
+
export declare const createSqliteDatabase: (path?: string) => Promise<import("bun:sqlite").Database>;
|
|
16
|
+
/**
|
|
17
|
+
* Create a SQLite database with all migrations applied.
|
|
18
|
+
*
|
|
19
|
+
* Convenience wrapper around createSqliteDatabase + applyMigrations.
|
|
20
|
+
*
|
|
21
|
+
* @param path - Database file path, or ":memory:" (default)
|
|
22
|
+
*/
|
|
23
|
+
export declare const createMigratedSqliteDatabase: (path?: string) => Promise<import("bun:sqlite").Database>;
|
|
24
|
+
//# sourceMappingURL=sqlite-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-factory.d.ts","sourceRoot":"","sources":["../../src/helpers/sqlite-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAAU,aAAiB,2CAS3D,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,GAAU,aAAiB,2CAKnE,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite database factory for tests.
|
|
3
|
+
*
|
|
4
|
+
* Creates database instances for use in tests. Since we run tests with
|
|
5
|
+
* `bunx --bun vitest run`, bun:sqlite is always available.
|
|
6
|
+
*
|
|
7
|
+
* @module @tx/test-utils/helpers/sqlite-factory
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Create an in-memory SQLite database with PRAGMAs set.
|
|
11
|
+
* Migrations are NOT applied — call applyMigrations(db) yourself if needed.
|
|
12
|
+
*
|
|
13
|
+
* @param path - Database file path, or ":memory:" (default)
|
|
14
|
+
*/
|
|
15
|
+
export const createSqliteDatabase = async (path = ":memory:") => {
|
|
16
|
+
const { Database } = await import("bun:sqlite");
|
|
17
|
+
const db = new Database(path);
|
|
18
|
+
db.run("PRAGMA journal_mode = WAL");
|
|
19
|
+
db.run("PRAGMA foreign_keys = ON");
|
|
20
|
+
db.run("PRAGMA busy_timeout = " + (process.env.TX_DB_BUSY_TIMEOUT || "5000"));
|
|
21
|
+
return db;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Create a SQLite database with all migrations applied.
|
|
25
|
+
*
|
|
26
|
+
* Convenience wrapper around createSqliteDatabase + applyMigrations.
|
|
27
|
+
*
|
|
28
|
+
* @param path - Database file path, or ":memory:" (default)
|
|
29
|
+
*/
|
|
30
|
+
export const createMigratedSqliteDatabase = async (path = ":memory:") => {
|
|
31
|
+
const { applyMigrations } = await import("@jamesaphoenix/tx-core");
|
|
32
|
+
const db = await createSqliteDatabase(path);
|
|
33
|
+
applyMigrations(db);
|
|
34
|
+
return db;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=sqlite-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-factory.js","sourceRoot":"","sources":["../../src/helpers/sqlite-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,IAAI,GAAG,UAAU,EAAE,EAAE;IAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7B,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACnC,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IAClC,EAAE,CAAC,GAAG,CACJ,wBAAwB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,CACtE,CAAA;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,EAAE,IAAI,GAAG,UAAU,EAAE,EAAE;IACtE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAA;IAClE,MAAM,EAAE,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC3C,eAAe,CAAC,EAAE,CAAC,CAAA;IACnB,OAAO,EAAE,CAAA;AACX,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,11 +16,15 @@
|
|
|
16
16
|
* @module @tx/test-utils
|
|
17
17
|
*/
|
|
18
18
|
export { fixtureId, namespacedFixtureId, sequentialFixtureIds, contentFixtureId } from "./fixtures/index.js";
|
|
19
|
-
export { createTestDatabase, TestDatabaseService, TestDatabaseLive, createTestDatabaseLayer } from "./database/index.js";
|
|
19
|
+
export { createTestDatabase, TestDatabaseService, TestDatabaseLive, createTestDatabaseLayer, wrapDbAsTestDatabase } from "./database/index.js";
|
|
20
20
|
export type { TestDatabase } from "./database/index.js";
|
|
21
21
|
export { TaskFactory, createTestTask, createTestTasks, type CreateTaskOptions, LearningFactory, createTestLearning, createTestLearnings, type CreateLearningOptions, EdgeFactory, createTestEdge, createEdgeBetweenLearnings, type CreateEdgeOptions, AnchorFactory, createTestAnchor, type CreateAnchorOptions, CandidateFactory, createTestCandidate, type CreateCandidateOptions, type LearningCandidate, type CandidateConfidence, type CandidateStatus } from "./factories/index.js";
|
|
22
22
|
export { hashInput, cachedLLMCall, withLLMCache, configureLLMCache, getCacheConfig, resetCacheConfig, getCacheStats, clearCache, formatCacheStats, getCacheEntry, listCacheEntries } from "./llm-cache/index.js";
|
|
23
23
|
export type { CacheEntry, CachedLLMCallOptions, WithLLMCacheOptions, CacheStats, ClearCacheOptions } from "./llm-cache/index.js";
|
|
24
24
|
export { runEffect, runEffectFail, runEffectEither, expectEffectSuccess, expectEffectFailure, mergeLayers, createTestContext, type RunEffectOptions, type EffectResult } from "./helpers/index.js";
|
|
25
|
+
export { createSharedTestLayer, type SharedTestLayer, type SharedTestLayerResult } from "./helpers/index.js";
|
|
26
|
+
export { createSqliteDatabase, createMigratedSqliteDatabase } from "./helpers/index.js";
|
|
27
|
+
export { getSharedTestLayer, resetTestDb, closeTestDb, isTestDbInitialized } from "./singleton.js";
|
|
25
28
|
export { createMockAnthropic, createMockAnthropicForExtraction, type MockMessage, type MockAnthropicCall, type MockAnthropicResponse, type MockAnthropicConfig, type MockAnthropicResult, createMockOpenAI, createMockOpenAIForExtraction, createMockOpenAIForExtractionRaw, type MockOpenAIMessage, type MockOpenAIChatCall, type MockOpenAIChatResponse, type MockOpenAIConfig, type MockOpenAIResult } from "./mocks/index.js";
|
|
29
|
+
export { chaos, crashAfter, CrashSimulationError, type CrashAfterOptions, type CrashAfterResult, killHeartbeat, WorkerHeartbeatController, type KillHeartbeatOptions, raceWorkers, type RaceWorkersOptions, type RaceWorkersResult, corruptState, type CorruptStateOptions, type CorruptionType, replayJSONL, type ReplayJSONLOptions, type ReplayJSONLResult, type SyncOperation, doubleComplete, type DoubleCompleteOptions, type DoubleCompleteResult, partialWrite, type PartialWriteOptions, type PartialWriteResult, delayedClaim, type DelayedClaimOptions, type DelayedClaimResult, stressLoad, type StressLoadOptions, type StressLoadResult } from "./chaos/index.js";
|
|
26
30
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,EAEL,WAAW,EACX,cAAc,EACd,eAAe,EACf,KAAK,iBAAiB,EAEtB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,qBAAqB,EAE1B,WAAW,EACX,cAAc,EACd,0BAA0B,EAC1B,KAAK,iBAAiB,EAEtB,aAAa,EACb,gBAAgB,EAChB,KAAK,mBAAmB,EAExB,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAEL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAEhB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EACjB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,mBAAmB,EACnB,UAAU,EACV,iBAAiB,EAClB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,oBAAoB,EACpB,4BAA4B,EAC7B,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,mBAAmB,EACpB,MAAM,gBAAgB,CAAA;AAOvB,OAAO,EACL,mBAAmB,EACnB,gCAAgC,EAChC,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,6BAA6B,EAC7B,gCAAgC,EAChC,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AASzB,OAAO,EAEL,KAAK,EAEL,UAAU,EACV,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,aAAa,EACb,yBAAyB,EACzB,KAAK,oBAAoB,EAEzB,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,cAAc,EAEnB,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAElB,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAEzB,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAEvB,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAEvB,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA"}
|