@stratum-hq/db-adapters 0.1.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/dist/__tests__/base-adapter.test.d.ts +2 -0
- package/dist/__tests__/base-adapter.test.d.ts.map +1 -0
- package/dist/__tests__/base-adapter.test.js +194 -0
- package/dist/__tests__/base-adapter.test.js.map +1 -0
- package/dist/__tests__/database-manager.test.d.ts +2 -0
- package/dist/__tests__/database-manager.test.d.ts.map +1 -0
- package/dist/__tests__/database-manager.test.js +110 -0
- package/dist/__tests__/database-manager.test.js.map +1 -0
- package/dist/__tests__/pool-manager.test.d.ts +2 -0
- package/dist/__tests__/pool-manager.test.d.ts.map +1 -0
- package/dist/__tests__/pool-manager.test.js +174 -0
- package/dist/__tests__/pool-manager.test.js.map +1 -0
- package/dist/__tests__/rls-manager.test.d.ts +2 -0
- package/dist/__tests__/rls-manager.test.d.ts.map +1 -0
- package/dist/__tests__/rls-manager.test.js +180 -0
- package/dist/__tests__/rls-manager.test.js.map +1 -0
- package/dist/__tests__/rls-session.test.d.ts +2 -0
- package/dist/__tests__/rls-session.test.d.ts.map +1 -0
- package/dist/__tests__/rls-session.test.js +102 -0
- package/dist/__tests__/rls-session.test.js.map +1 -0
- package/dist/__tests__/schema-manager.test.d.ts +2 -0
- package/dist/__tests__/schema-manager.test.d.ts.map +1 -0
- package/dist/__tests__/schema-manager.test.js +116 -0
- package/dist/__tests__/schema-manager.test.js.map +1 -0
- package/dist/adapters/database-prisma.d.ts +50 -0
- package/dist/adapters/database-prisma.d.ts.map +1 -0
- package/dist/adapters/database-prisma.js +66 -0
- package/dist/adapters/database-prisma.js.map +1 -0
- package/dist/adapters/database-raw.d.ts +23 -0
- package/dist/adapters/database-raw.d.ts.map +1 -0
- package/dist/adapters/database-raw.js +52 -0
- package/dist/adapters/database-raw.js.map +1 -0
- package/dist/adapters/prisma.d.ts +14 -0
- package/dist/adapters/prisma.d.ts.map +1 -0
- package/dist/adapters/prisma.js +29 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/raw.d.ts +8 -0
- package/dist/adapters/raw.d.ts.map +1 -0
- package/dist/adapters/raw.js +26 -0
- package/dist/adapters/raw.js.map +1 -0
- package/dist/adapters/schema-prisma.d.ts +11 -0
- package/dist/adapters/schema-prisma.d.ts.map +1 -0
- package/dist/adapters/schema-prisma.js +35 -0
- package/dist/adapters/schema-prisma.js.map +1 -0
- package/dist/adapters/schema-raw.d.ts +13 -0
- package/dist/adapters/schema-raw.d.ts.map +1 -0
- package/dist/adapters/schema-raw.js +63 -0
- package/dist/adapters/schema-raw.js.map +1 -0
- package/dist/base-adapter.d.ts +7 -0
- package/dist/base-adapter.d.ts.map +1 -0
- package/dist/base-adapter.js +32 -0
- package/dist/base-adapter.js.map +1 -0
- package/dist/database/manager.d.ts +27 -0
- package/dist/database/manager.d.ts.map +1 -0
- package/dist/database/manager.js +68 -0
- package/dist/database/manager.js.map +1 -0
- package/dist/database/pool-manager.d.ts +44 -0
- package/dist/database/pool-manager.d.ts.map +1 -0
- package/dist/database/pool-manager.js +102 -0
- package/dist/database/pool-manager.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/migration-helpers.d.ts +6 -0
- package/dist/migration-helpers.d.ts.map +1 -0
- package/dist/migration-helpers.js +34 -0
- package/dist/migration-helpers.js.map +1 -0
- package/dist/rls/manager.d.ts +7 -0
- package/dist/rls/manager.d.ts.map +1 -0
- package/dist/rls/manager.js +46 -0
- package/dist/rls/manager.js.map +1 -0
- package/dist/rls/session.d.ts +5 -0
- package/dist/rls/session.d.ts.map +1 -0
- package/dist/rls/session.js +18 -0
- package/dist/rls/session.js.map +1 -0
- package/dist/schema/manager.d.ts +8 -0
- package/dist/schema/manager.d.ts.map +1 -0
- package/dist/schema/manager.js +49 -0
- package/dist/schema/manager.js.map +1 -0
- package/dist/schema/session.d.ts +5 -0
- package/dist/schema/session.d.ts.map +1 -0
- package/dist/schema/session.js +21 -0
- package/dist/schema/session.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/base-adapter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const base_adapter_js_1 = require("../base-adapter.js");
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Mock pg
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const mockQuery = vitest_1.vi.fn();
|
|
9
|
+
const mockRelease = vitest_1.vi.fn();
|
|
10
|
+
const mockConnect = vitest_1.vi.fn();
|
|
11
|
+
// Create a mock Pool class that will be used directly
|
|
12
|
+
class MockPool {
|
|
13
|
+
connect = mockConnect;
|
|
14
|
+
}
|
|
15
|
+
vitest_1.vi.mock("pg", () => {
|
|
16
|
+
return { default: { Pool: MockPool }, Pool: MockPool };
|
|
17
|
+
});
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Concrete subclass for testing the abstract BaseAdapter
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
class TestAdapter extends base_adapter_js_1.BaseAdapter {
|
|
22
|
+
// Expose executeWithTenantContext publicly for testing
|
|
23
|
+
async runWithTenant(tenantId, fn) {
|
|
24
|
+
return this.executeWithTenantContext(tenantId, fn);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Helpers
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function makeMockClient() {
|
|
31
|
+
const client = {
|
|
32
|
+
query: mockQuery,
|
|
33
|
+
release: mockRelease,
|
|
34
|
+
};
|
|
35
|
+
return client;
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Tests
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
(0, vitest_1.describe)("BaseAdapter", () => {
|
|
41
|
+
let adapter;
|
|
42
|
+
(0, vitest_1.beforeEach)(() => {
|
|
43
|
+
vitest_1.vi.clearAllMocks();
|
|
44
|
+
const mockClient = makeMockClient();
|
|
45
|
+
mockConnect.mockResolvedValue(mockClient);
|
|
46
|
+
mockQuery.mockResolvedValue({ rows: [] });
|
|
47
|
+
const pool = new MockPool();
|
|
48
|
+
adapter = new TestAdapter(pool);
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.describe)("executeWithTenantContext", () => {
|
|
51
|
+
(0, vitest_1.it)("acquires a client from the pool", async () => {
|
|
52
|
+
await adapter.runWithTenant("tenant-1", async () => "result");
|
|
53
|
+
(0, vitest_1.expect)(mockConnect).toHaveBeenCalledTimes(1);
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)("begins a transaction", async () => {
|
|
56
|
+
await adapter.runWithTenant("tenant-1", async () => "result");
|
|
57
|
+
(0, vitest_1.expect)(mockQuery).toHaveBeenCalledWith("BEGIN");
|
|
58
|
+
});
|
|
59
|
+
(0, vitest_1.it)("sets tenant context with correct SQL and parameters", async () => {
|
|
60
|
+
await adapter.runWithTenant("tenant-abc", async () => "ok");
|
|
61
|
+
(0, vitest_1.expect)(mockQuery).toHaveBeenCalledWith("SELECT set_config('app.current_tenant_id', $1, true)", ["tenant-abc"]);
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.it)("executes the provided query function", async () => {
|
|
64
|
+
const queryFn = vitest_1.vi.fn().mockResolvedValue("my-result");
|
|
65
|
+
await adapter.runWithTenant("tenant-1", queryFn);
|
|
66
|
+
(0, vitest_1.expect)(queryFn).toHaveBeenCalledTimes(1);
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.it)("passes the client to the query function", async () => {
|
|
69
|
+
const queryFn = vitest_1.vi.fn().mockResolvedValue("ok");
|
|
70
|
+
await adapter.runWithTenant("tenant-1", queryFn);
|
|
71
|
+
// The queryFn receives the mock client
|
|
72
|
+
const passedClient = queryFn.mock.calls[0][0];
|
|
73
|
+
(0, vitest_1.expect)(passedClient.query).toBeDefined();
|
|
74
|
+
(0, vitest_1.expect)(passedClient.release).toBeDefined();
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)("commits the transaction on success", async () => {
|
|
77
|
+
await adapter.runWithTenant("tenant-1", async () => "ok");
|
|
78
|
+
const queryCalls = mockQuery.mock.calls.map((c) => c[0]);
|
|
79
|
+
(0, vitest_1.expect)(queryCalls).toContain("COMMIT");
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("returns the result from the query function", async () => {
|
|
82
|
+
const result = await adapter.runWithTenant("tenant-1", async () => ({ data: [1, 2, 3] }));
|
|
83
|
+
(0, vitest_1.expect)(result).toEqual({ data: [1, 2, 3] });
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)("executes in the correct order: BEGIN, set_config, queryFn, COMMIT", async () => {
|
|
86
|
+
const callOrder = [];
|
|
87
|
+
mockQuery.mockImplementation(async (sql) => {
|
|
88
|
+
if (typeof sql === "string") {
|
|
89
|
+
if (sql === "BEGIN")
|
|
90
|
+
callOrder.push("BEGIN");
|
|
91
|
+
else if (sql.includes("set_config"))
|
|
92
|
+
callOrder.push("SET_CONFIG");
|
|
93
|
+
else if (sql === "COMMIT")
|
|
94
|
+
callOrder.push("COMMIT");
|
|
95
|
+
else if (sql === "ROLLBACK")
|
|
96
|
+
callOrder.push("ROLLBACK");
|
|
97
|
+
else if (sql === "RESET app.current_tenant_id")
|
|
98
|
+
callOrder.push("RESET");
|
|
99
|
+
}
|
|
100
|
+
return { rows: [] };
|
|
101
|
+
});
|
|
102
|
+
await adapter.runWithTenant("tenant-1", async () => {
|
|
103
|
+
callOrder.push("QUERY_FN");
|
|
104
|
+
return "done";
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.expect)(callOrder).toEqual([
|
|
107
|
+
"BEGIN",
|
|
108
|
+
"SET_CONFIG",
|
|
109
|
+
"QUERY_FN",
|
|
110
|
+
"COMMIT",
|
|
111
|
+
"RESET",
|
|
112
|
+
]);
|
|
113
|
+
});
|
|
114
|
+
(0, vitest_1.it)("rolls back on error from query function", async () => {
|
|
115
|
+
const error = new Error("query failed");
|
|
116
|
+
await (0, vitest_1.expect)(adapter.runWithTenant("tenant-1", async () => {
|
|
117
|
+
throw error;
|
|
118
|
+
})).rejects.toThrow("query failed");
|
|
119
|
+
(0, vitest_1.expect)(mockQuery).toHaveBeenCalledWith("ROLLBACK");
|
|
120
|
+
});
|
|
121
|
+
(0, vitest_1.it)("does not commit when query function throws", async () => {
|
|
122
|
+
try {
|
|
123
|
+
await adapter.runWithTenant("tenant-1", async () => {
|
|
124
|
+
throw new Error("fail");
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// expected
|
|
129
|
+
}
|
|
130
|
+
const queryCalls = mockQuery.mock.calls.map((c) => c[0]);
|
|
131
|
+
(0, vitest_1.expect)(queryCalls).not.toContain("COMMIT");
|
|
132
|
+
});
|
|
133
|
+
(0, vitest_1.it)("resets tenant context in finally block on success", async () => {
|
|
134
|
+
await adapter.runWithTenant("tenant-1", async () => "ok");
|
|
135
|
+
(0, vitest_1.expect)(mockQuery).toHaveBeenCalledWith("RESET app.current_tenant_id");
|
|
136
|
+
});
|
|
137
|
+
(0, vitest_1.it)("resets tenant context in finally block on error", async () => {
|
|
138
|
+
try {
|
|
139
|
+
await adapter.runWithTenant("tenant-1", async () => {
|
|
140
|
+
throw new Error("boom");
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// expected
|
|
145
|
+
}
|
|
146
|
+
(0, vitest_1.expect)(mockQuery).toHaveBeenCalledWith("RESET app.current_tenant_id");
|
|
147
|
+
});
|
|
148
|
+
(0, vitest_1.it)("releases the client on success", async () => {
|
|
149
|
+
await adapter.runWithTenant("tenant-1", async () => "ok");
|
|
150
|
+
(0, vitest_1.expect)(mockRelease).toHaveBeenCalledTimes(1);
|
|
151
|
+
});
|
|
152
|
+
(0, vitest_1.it)("releases the client on error", async () => {
|
|
153
|
+
try {
|
|
154
|
+
await adapter.runWithTenant("tenant-1", async () => {
|
|
155
|
+
throw new Error("fail");
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// expected
|
|
160
|
+
}
|
|
161
|
+
(0, vitest_1.expect)(mockRelease).toHaveBeenCalledTimes(1);
|
|
162
|
+
});
|
|
163
|
+
(0, vitest_1.it)("still releases client if RESET query fails", async () => {
|
|
164
|
+
let callCount = 0;
|
|
165
|
+
mockQuery.mockImplementation(async (sql) => {
|
|
166
|
+
callCount++;
|
|
167
|
+
if (typeof sql === "string" && sql.includes("RESET")) {
|
|
168
|
+
throw new Error("connection broken");
|
|
169
|
+
}
|
|
170
|
+
return { rows: [] };
|
|
171
|
+
});
|
|
172
|
+
await adapter.runWithTenant("tenant-1", async () => "ok");
|
|
173
|
+
// Client should still be released even though RESET threw
|
|
174
|
+
(0, vitest_1.expect)(mockRelease).toHaveBeenCalledTimes(1);
|
|
175
|
+
});
|
|
176
|
+
(0, vitest_1.it)("propagates the original error even if ROLLBACK fails", async () => {
|
|
177
|
+
mockQuery.mockImplementation(async (sql) => {
|
|
178
|
+
if (typeof sql === "string" && sql === "ROLLBACK") {
|
|
179
|
+
throw new Error("rollback failed");
|
|
180
|
+
}
|
|
181
|
+
return { rows: [] };
|
|
182
|
+
});
|
|
183
|
+
// The queryFn throws — we want the original error, but ROLLBACK also throws.
|
|
184
|
+
// In the current implementation, ROLLBACK failure replaces the original error
|
|
185
|
+
// because there's no catch around ROLLBACK. Let's verify behavior:
|
|
186
|
+
await (0, vitest_1.expect)(adapter.runWithTenant("tenant-1", async () => {
|
|
187
|
+
throw new Error("original error");
|
|
188
|
+
})).rejects.toThrow();
|
|
189
|
+
// Client should still be released
|
|
190
|
+
(0, vitest_1.expect)(mockRelease).toHaveBeenCalledTimes(1);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
//# sourceMappingURL=base-adapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-adapter.test.js","sourceRoot":"","sources":["../../src/__tests__/base-adapter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/database-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const manager_js_1 = require("../database/manager.js");
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// getDatabaseName
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
(0, vitest_1.describe)("getDatabaseName", () => {
|
|
9
|
+
(0, vitest_1.it)("returns correct name for a simple slug", () => {
|
|
10
|
+
(0, vitest_1.expect)((0, manager_js_1.getDatabaseName)("acme")).toBe("stratum_tenant_acme");
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)("handles slugs with numbers and underscores", () => {
|
|
13
|
+
(0, vitest_1.expect)((0, manager_js_1.getDatabaseName)("acme_corp_2")).toBe("stratum_tenant_acme_corp_2");
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)("throws on slug with hyphens", () => {
|
|
16
|
+
(0, vitest_1.expect)(() => (0, manager_js_1.getDatabaseName)("acme-corp")).toThrow(/Invalid tenant slug/);
|
|
17
|
+
});
|
|
18
|
+
(0, vitest_1.it)("throws on slug starting with a number", () => {
|
|
19
|
+
(0, vitest_1.expect)(() => (0, manager_js_1.getDatabaseName)("1acme")).toThrow(/Invalid tenant slug/);
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)("throws on empty slug", () => {
|
|
22
|
+
(0, vitest_1.expect)(() => (0, manager_js_1.getDatabaseName)("")).toThrow(/Invalid tenant slug/);
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)("throws on slug with uppercase letters", () => {
|
|
25
|
+
(0, vitest_1.expect)(() => (0, manager_js_1.getDatabaseName)("Acme")).toThrow(/Invalid tenant slug/);
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)("throws on slug that is too long (> 63 chars)", () => {
|
|
28
|
+
// 64 chars: 'a' + 63 'x'
|
|
29
|
+
const longSlug = "a" + "x".repeat(63);
|
|
30
|
+
(0, vitest_1.expect)(() => (0, manager_js_1.getDatabaseName)(longSlug)).toThrow(/Invalid tenant slug/);
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.it)("accepts maximum-length slug (63 chars)", () => {
|
|
33
|
+
const maxSlug = "a" + "x".repeat(62); // 63 chars total
|
|
34
|
+
(0, vitest_1.expect)((0, manager_js_1.getDatabaseName)(maxSlug)).toBe(`stratum_tenant_${maxSlug}`);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// databaseExists
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
(0, vitest_1.describe)("databaseExists", () => {
|
|
41
|
+
function makeClient(exists) {
|
|
42
|
+
return {
|
|
43
|
+
query: vitest_1.vi.fn().mockResolvedValue({ rows: [{ exists }] }),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
(0, vitest_1.it)("returns true when database exists", async () => {
|
|
47
|
+
const client = makeClient(true);
|
|
48
|
+
const result = await (0, manager_js_1.databaseExists)(client, "acme");
|
|
49
|
+
(0, vitest_1.expect)(result).toBe(true);
|
|
50
|
+
(0, vitest_1.expect)(client.query).toHaveBeenCalledWith(vitest_1.expect.stringContaining("pg_database"), ["stratum_tenant_acme"]);
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)("returns false when database does not exist", async () => {
|
|
53
|
+
const client = makeClient(false);
|
|
54
|
+
const result = await (0, manager_js_1.databaseExists)(client, "acme");
|
|
55
|
+
(0, vitest_1.expect)(result).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.it)("throws on invalid slug", async () => {
|
|
58
|
+
const client = makeClient(false);
|
|
59
|
+
await (0, vitest_1.expect)((0, manager_js_1.databaseExists)(client, "bad-slug")).rejects.toThrow(/Invalid tenant slug/);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// createDatabase
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
(0, vitest_1.describe)("createDatabase", () => {
|
|
66
|
+
function makeClient() {
|
|
67
|
+
return {
|
|
68
|
+
query: vitest_1.vi.fn().mockResolvedValue({}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
(0, vitest_1.it)("issues CREATE DATABASE with correct name", async () => {
|
|
72
|
+
const client = makeClient();
|
|
73
|
+
await (0, manager_js_1.createDatabase)(client, "acme");
|
|
74
|
+
(0, vitest_1.expect)(client.query).toHaveBeenCalledWith('CREATE DATABASE "stratum_tenant_acme"');
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)("includes TEMPLATE clause when templateDb is provided", async () => {
|
|
77
|
+
const client = makeClient();
|
|
78
|
+
await (0, manager_js_1.createDatabase)(client, "acme", "stratum_base");
|
|
79
|
+
(0, vitest_1.expect)(client.query).toHaveBeenCalledWith('CREATE DATABASE "stratum_tenant_acme" TEMPLATE "stratum_base"');
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)("throws on invalid template database name", async () => {
|
|
82
|
+
const client = makeClient();
|
|
83
|
+
await (0, vitest_1.expect)((0, manager_js_1.createDatabase)(client, "acme", "bad-template!")).rejects.toThrow(/Invalid template database name/);
|
|
84
|
+
(0, vitest_1.expect)(client.query).not.toHaveBeenCalled();
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)("throws on invalid slug", async () => {
|
|
87
|
+
const client = makeClient();
|
|
88
|
+
await (0, vitest_1.expect)((0, manager_js_1.createDatabase)(client, "bad-slug")).rejects.toThrow(/Invalid tenant slug/);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// dropDatabase
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
(0, vitest_1.describe)("dropDatabase", () => {
|
|
95
|
+
function makeClient() {
|
|
96
|
+
return {
|
|
97
|
+
query: vitest_1.vi.fn().mockResolvedValue({}),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
(0, vitest_1.it)("issues DROP DATABASE IF EXISTS with correct name", async () => {
|
|
101
|
+
const client = makeClient();
|
|
102
|
+
await (0, manager_js_1.dropDatabase)(client, "acme");
|
|
103
|
+
(0, vitest_1.expect)(client.query).toHaveBeenCalledWith('DROP DATABASE IF EXISTS "stratum_tenant_acme"');
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.it)("throws on invalid slug", async () => {
|
|
106
|
+
const client = makeClient();
|
|
107
|
+
await (0, vitest_1.expect)((0, manager_js_1.dropDatabase)(client, "bad slug")).rejects.toThrow(/Invalid tenant slug/);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=database-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/database-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pool-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const pool_manager_js_1 = require("../database/pool-manager.js");
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Mock pg.Pool
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const mockPoolEnd = vitest_1.vi.fn().mockResolvedValue(undefined);
|
|
9
|
+
vitest_1.vi.mock("pg", () => {
|
|
10
|
+
class Pool {
|
|
11
|
+
database;
|
|
12
|
+
totalCount = 0;
|
|
13
|
+
idleCount = 0;
|
|
14
|
+
end = mockPoolEnd;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.database = config.database;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return { default: { Pool } };
|
|
20
|
+
});
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Helpers
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
function makeManager(maxPools = 3) {
|
|
25
|
+
return new pool_manager_js_1.DatabasePoolManager({
|
|
26
|
+
baseConnectionConfig: {
|
|
27
|
+
host: "localhost",
|
|
28
|
+
port: 5432,
|
|
29
|
+
user: "stratum",
|
|
30
|
+
password: "secret",
|
|
31
|
+
},
|
|
32
|
+
maxPools,
|
|
33
|
+
idleTimeoutMs: 30_000,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Tests
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
(0, vitest_1.describe)("DatabasePoolManager", () => {
|
|
40
|
+
(0, vitest_1.beforeEach)(() => {
|
|
41
|
+
mockPoolEnd.mockClear();
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.describe)("slug validation", () => {
|
|
44
|
+
(0, vitest_1.it)("rejects slugs starting with a number", () => {
|
|
45
|
+
const mgr = makeManager();
|
|
46
|
+
(0, vitest_1.expect)(() => mgr.getPool("123acme")).toThrow("Invalid tenant slug");
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)("rejects slugs with uppercase letters", () => {
|
|
49
|
+
const mgr = makeManager();
|
|
50
|
+
(0, vitest_1.expect)(() => mgr.getPool("Acme")).toThrow("Invalid tenant slug");
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.it)("rejects slugs with hyphens", () => {
|
|
53
|
+
const mgr = makeManager();
|
|
54
|
+
(0, vitest_1.expect)(() => mgr.getPool("acme-corp")).toThrow("Invalid tenant slug");
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)("rejects slugs with special characters", () => {
|
|
57
|
+
const mgr = makeManager();
|
|
58
|
+
(0, vitest_1.expect)(() => mgr.getPool("acme; DROP TABLE")).toThrow("Invalid tenant slug");
|
|
59
|
+
});
|
|
60
|
+
(0, vitest_1.it)("rejects empty slugs", () => {
|
|
61
|
+
const mgr = makeManager();
|
|
62
|
+
(0, vitest_1.expect)(() => mgr.getPool("")).toThrow("Invalid tenant slug");
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)("accepts valid lowercase slugs with underscores", () => {
|
|
65
|
+
const mgr = makeManager();
|
|
66
|
+
(0, vitest_1.expect)(() => mgr.getPool("acme_corp")).not.toThrow();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.describe)("getPool", () => {
|
|
70
|
+
(0, vitest_1.it)("creates a new pool for an unseen tenant slug", () => {
|
|
71
|
+
const mgr = makeManager();
|
|
72
|
+
const pool = mgr.getPool("acme");
|
|
73
|
+
(0, vitest_1.expect)(pool).toBeDefined();
|
|
74
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(1);
|
|
75
|
+
});
|
|
76
|
+
(0, vitest_1.it)("returns the same pool instance on subsequent calls", () => {
|
|
77
|
+
const mgr = makeManager();
|
|
78
|
+
const pool1 = mgr.getPool("acme");
|
|
79
|
+
const pool2 = mgr.getPool("acme");
|
|
80
|
+
(0, vitest_1.expect)(pool1).toBe(pool2);
|
|
81
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(1);
|
|
82
|
+
});
|
|
83
|
+
(0, vitest_1.it)("creates separate pools for different slugs", () => {
|
|
84
|
+
const mgr = makeManager();
|
|
85
|
+
const pool1 = mgr.getPool("acme");
|
|
86
|
+
const pool2 = mgr.getPool("globex");
|
|
87
|
+
(0, vitest_1.expect)(pool1).not.toBe(pool2);
|
|
88
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)("connects to the correct database name", () => {
|
|
91
|
+
const mgr = makeManager();
|
|
92
|
+
const pool = mgr.getPool("acme");
|
|
93
|
+
(0, vitest_1.expect)(pool.database).toBe("stratum_tenant_acme");
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.describe)("LRU eviction", () => {
|
|
97
|
+
(0, vitest_1.it)("evicts the least recently used pool when maxPools is exceeded", async () => {
|
|
98
|
+
const mgr = makeManager(2);
|
|
99
|
+
mgr.getPool("tenant_a");
|
|
100
|
+
// Small delay to ensure different timestamps
|
|
101
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
102
|
+
mgr.getPool("tenant_b");
|
|
103
|
+
// tenant_a is now the LRU entry; adding tenant_c should evict it.
|
|
104
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
105
|
+
mgr.getPool("tenant_c");
|
|
106
|
+
// Allow the async eviction microtask to complete.
|
|
107
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
108
|
+
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(1);
|
|
109
|
+
// poolCount should be back to maxPools (2) after eviction.
|
|
110
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.it)("updates lastUsed when an existing pool is accessed", async () => {
|
|
113
|
+
const mgr = makeManager(2);
|
|
114
|
+
mgr.getPool("tenant_a");
|
|
115
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
116
|
+
mgr.getPool("tenant_b");
|
|
117
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
118
|
+
// Re-access tenant_a to make it the most recently used.
|
|
119
|
+
mgr.getPool("tenant_a");
|
|
120
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
121
|
+
// Now tenant_b is the LRU; adding tenant_c should evict tenant_b.
|
|
122
|
+
mgr.getPool("tenant_c");
|
|
123
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
124
|
+
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(1);
|
|
125
|
+
// tenant_a and tenant_c should remain.
|
|
126
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
(0, vitest_1.describe)("closePool", () => {
|
|
130
|
+
(0, vitest_1.it)("closes and removes the specified pool", async () => {
|
|
131
|
+
const mgr = makeManager();
|
|
132
|
+
mgr.getPool("acme");
|
|
133
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(1);
|
|
134
|
+
await mgr.closePool("acme");
|
|
135
|
+
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(1);
|
|
136
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(0);
|
|
137
|
+
});
|
|
138
|
+
(0, vitest_1.it)("is a no-op for unknown slug", async () => {
|
|
139
|
+
const mgr = makeManager();
|
|
140
|
+
await mgr.closePool("nonexistent");
|
|
141
|
+
(0, vitest_1.expect)(mockPoolEnd).not.toHaveBeenCalled();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
(0, vitest_1.describe)("closeAll", () => {
|
|
145
|
+
(0, vitest_1.it)("closes all pools", async () => {
|
|
146
|
+
const mgr = makeManager(10);
|
|
147
|
+
mgr.getPool("a");
|
|
148
|
+
mgr.getPool("b");
|
|
149
|
+
mgr.getPool("c");
|
|
150
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(3);
|
|
151
|
+
await mgr.closeAll();
|
|
152
|
+
(0, vitest_1.expect)(mockPoolEnd).toHaveBeenCalledTimes(3);
|
|
153
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(0);
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.it)("is safe to call when no pools exist", async () => {
|
|
156
|
+
const mgr = makeManager();
|
|
157
|
+
await (0, vitest_1.expect)(mgr.closeAll()).resolves.toBeUndefined();
|
|
158
|
+
(0, vitest_1.expect)(mockPoolEnd).not.toHaveBeenCalled();
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
(0, vitest_1.describe)("getStats", () => {
|
|
162
|
+
(0, vitest_1.it)("returns zero counts for a fresh manager", () => {
|
|
163
|
+
const mgr = makeManager();
|
|
164
|
+
(0, vitest_1.expect)(mgr.getStats()).toEqual({ poolCount: 0, activeConnections: 0 });
|
|
165
|
+
});
|
|
166
|
+
(0, vitest_1.it)("reflects current pool count", () => {
|
|
167
|
+
const mgr = makeManager(10);
|
|
168
|
+
mgr.getPool("x");
|
|
169
|
+
mgr.getPool("y");
|
|
170
|
+
(0, vitest_1.expect)(mgr.getStats().poolCount).toBe(2);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=pool-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-manager.test.js","sourceRoot":"","sources":["../../src/__tests__/pool-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rls-manager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rls-manager.test.ts"],"names":[],"mappings":""}
|