@stratum-hq/lib 0.7.0 → 1.0.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.
Files changed (91) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +28 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/services/api-key-service.d.ts.map +1 -1
  6. package/dist/services/api-key-service.js +4 -1
  7. package/dist/services/api-key-service.js.map +1 -1
  8. package/dist/services/config-service.js +2 -2
  9. package/dist/services/config-service.js.map +1 -1
  10. package/dist/services/key-rotation-service.js +1 -1
  11. package/dist/services/key-rotation-service.js.map +1 -1
  12. package/dist/services/role-service.d.ts +13 -3
  13. package/dist/services/role-service.d.ts.map +1 -1
  14. package/dist/services/role-service.js +18 -5
  15. package/dist/services/role-service.js.map +1 -1
  16. package/dist/services/tenant-service.d.ts.map +1 -1
  17. package/dist/services/tenant-service.js +12 -2
  18. package/dist/services/tenant-service.js.map +1 -1
  19. package/dist/stratum.d.ts +4 -4
  20. package/dist/stratum.d.ts.map +1 -1
  21. package/dist/stratum.js +1 -1
  22. package/dist/stratum.js.map +1 -1
  23. package/package.json +8 -1
  24. package/dist/__tests__/crypto.test.d.ts +0 -2
  25. package/dist/__tests__/crypto.test.d.ts.map +0 -1
  26. package/dist/__tests__/crypto.test.js +0 -41
  27. package/dist/__tests__/crypto.test.js.map +0 -1
  28. package/dist/__tests__/migrate-schemas.test.d.ts +0 -2
  29. package/dist/__tests__/migrate-schemas.test.d.ts.map +0 -1
  30. package/dist/__tests__/migrate-schemas.test.js +0 -225
  31. package/dist/__tests__/migrate-schemas.test.js.map +0 -1
  32. package/dist/__tests__/stratum-als.test.d.ts +0 -2
  33. package/dist/__tests__/stratum-als.test.d.ts.map +0 -1
  34. package/dist/__tests__/stratum-als.test.js +0 -49
  35. package/dist/__tests__/stratum-als.test.js.map +0 -1
  36. package/dist/__tests__/webhook-signature.test.d.ts +0 -2
  37. package/dist/__tests__/webhook-signature.test.d.ts.map +0 -1
  38. package/dist/__tests__/webhook-signature.test.js +0 -103
  39. package/dist/__tests__/webhook-signature.test.js.map +0 -1
  40. package/dist/services/__tests__/abac-service.test.d.ts +0 -2
  41. package/dist/services/__tests__/abac-service.test.d.ts.map +0 -1
  42. package/dist/services/__tests__/abac-service.test.js +0 -108
  43. package/dist/services/__tests__/abac-service.test.js.map +0 -1
  44. package/dist/services/__tests__/api-key-service.test.d.ts +0 -2
  45. package/dist/services/__tests__/api-key-service.test.d.ts.map +0 -1
  46. package/dist/services/__tests__/api-key-service.test.js +0 -76
  47. package/dist/services/__tests__/api-key-service.test.js.map +0 -1
  48. package/dist/services/__tests__/audit-service.test.d.ts +0 -2
  49. package/dist/services/__tests__/audit-service.test.d.ts.map +0 -1
  50. package/dist/services/__tests__/audit-service.test.js +0 -230
  51. package/dist/services/__tests__/audit-service.test.js.map +0 -1
  52. package/dist/services/__tests__/config-service.test.d.ts +0 -2
  53. package/dist/services/__tests__/config-service.test.d.ts.map +0 -1
  54. package/dist/services/__tests__/config-service.test.js +0 -565
  55. package/dist/services/__tests__/config-service.test.js.map +0 -1
  56. package/dist/services/__tests__/consent-service.test.d.ts +0 -2
  57. package/dist/services/__tests__/consent-service.test.d.ts.map +0 -1
  58. package/dist/services/__tests__/consent-service.test.js +0 -169
  59. package/dist/services/__tests__/consent-service.test.js.map +0 -1
  60. package/dist/services/__tests__/event-service.test.d.ts +0 -2
  61. package/dist/services/__tests__/event-service.test.d.ts.map +0 -1
  62. package/dist/services/__tests__/event-service.test.js +0 -193
  63. package/dist/services/__tests__/event-service.test.js.map +0 -1
  64. package/dist/services/__tests__/key-rotation-service.test.d.ts +0 -2
  65. package/dist/services/__tests__/key-rotation-service.test.d.ts.map +0 -1
  66. package/dist/services/__tests__/key-rotation-service.test.js +0 -132
  67. package/dist/services/__tests__/key-rotation-service.test.js.map +0 -1
  68. package/dist/services/__tests__/permission-service.test.d.ts +0 -2
  69. package/dist/services/__tests__/permission-service.test.d.ts.map +0 -1
  70. package/dist/services/__tests__/permission-service.test.js +0 -480
  71. package/dist/services/__tests__/permission-service.test.js.map +0 -1
  72. package/dist/services/__tests__/retention-service.test.d.ts +0 -2
  73. package/dist/services/__tests__/retention-service.test.d.ts.map +0 -1
  74. package/dist/services/__tests__/retention-service.test.js +0 -152
  75. package/dist/services/__tests__/retention-service.test.js.map +0 -1
  76. package/dist/services/__tests__/role-service.test.d.ts +0 -2
  77. package/dist/services/__tests__/role-service.test.d.ts.map +0 -1
  78. package/dist/services/__tests__/role-service.test.js +0 -134
  79. package/dist/services/__tests__/role-service.test.js.map +0 -1
  80. package/dist/services/__tests__/tenant-service.test.d.ts +0 -2
  81. package/dist/services/__tests__/tenant-service.test.d.ts.map +0 -1
  82. package/dist/services/__tests__/tenant-service.test.js +0 -548
  83. package/dist/services/__tests__/tenant-service.test.js.map +0 -1
  84. package/dist/services/__tests__/test-helpers.d.ts +0 -9
  85. package/dist/services/__tests__/test-helpers.d.ts.map +0 -1
  86. package/dist/services/__tests__/test-helpers.js +0 -19
  87. package/dist/services/__tests__/test-helpers.js.map +0 -1
  88. package/dist/services/__tests__/webhook-service.test.d.ts +0 -2
  89. package/dist/services/__tests__/webhook-service.test.d.ts.map +0 -1
  90. package/dist/services/__tests__/webhook-service.test.js +0 -184
  91. package/dist/services/__tests__/webhook-service.test.js.map +0 -1
@@ -1,565 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const vitest_1 = require("vitest");
37
- // Mock pool-helpers before importing config-service
38
- vitest_1.vi.mock("../../pool-helpers.js", () => ({
39
- withClient: vitest_1.vi.fn(),
40
- withTransaction: vitest_1.vi.fn(),
41
- }));
42
- // Mock crypto module
43
- vitest_1.vi.mock("../../crypto.js", () => ({
44
- encrypt: vitest_1.vi.fn((plaintext) => `encrypted:${plaintext}`),
45
- decrypt: vitest_1.vi.fn((encrypted) => {
46
- if (encrypted.startsWith("encrypted:")) {
47
- return encrypted.slice("encrypted:".length);
48
- }
49
- return encrypted;
50
- }),
51
- }));
52
- const poolHelpers = __importStar(require("../../pool-helpers.js"));
53
- const configService = __importStar(require("../config-service.js"));
54
- const test_helpers_js_1 = require("./test-helpers.js");
55
- const core_1 = require("@stratum-hq/core");
56
- (0, vitest_1.beforeEach)(() => {
57
- vitest_1.vi.clearAllMocks();
58
- });
59
- // ---------------------------------------------------------------------------
60
- // resolveConfig
61
- // ---------------------------------------------------------------------------
62
- (0, vitest_1.describe)("resolveConfig", () => {
63
- (0, vitest_1.it)("resolves config across a 3-level hierarchy (root -> MSP -> client)", async () => {
64
- const pool = (0, test_helpers_js_1.makeMockPool)();
65
- const mockQuery = vitest_1.vi.fn();
66
- // Query 1: SELECT ancestry_path for client tenant (non-archived)
67
- mockQuery.mockResolvedValueOnce({
68
- rows: [{ ancestry_path: "/root-id/msp-id" }],
69
- });
70
- // Query 2: batch-load config entries for all ancestors + self
71
- mockQuery.mockResolvedValueOnce({
72
- rows: [
73
- // root sets "theme" and "max_users"
74
- {
75
- tenant_id: "root-id",
76
- key: "theme",
77
- value: "dark",
78
- locked: false,
79
- sensitive: false,
80
- source_tenant_id: "root-id",
81
- },
82
- {
83
- tenant_id: "root-id",
84
- key: "max_users",
85
- value: 100,
86
- locked: false,
87
- sensitive: false,
88
- source_tenant_id: "root-id",
89
- },
90
- // MSP overrides "theme", adds "region"
91
- {
92
- tenant_id: "msp-id",
93
- key: "theme",
94
- value: "light",
95
- locked: false,
96
- sensitive: false,
97
- source_tenant_id: "msp-id",
98
- },
99
- {
100
- tenant_id: "msp-id",
101
- key: "region",
102
- value: "us-east",
103
- locked: false,
104
- sensitive: false,
105
- source_tenant_id: "msp-id",
106
- },
107
- // Client overrides "max_users"
108
- {
109
- tenant_id: "client-id",
110
- key: "max_users",
111
- value: 50,
112
- locked: false,
113
- sensitive: false,
114
- source_tenant_id: "client-id",
115
- },
116
- ],
117
- });
118
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
119
- const client = { query: mockQuery };
120
- return fn(client);
121
- });
122
- const result = await configService.resolveConfig(pool, "client-id");
123
- // theme: MSP overrides root -> "light", inherited from client's perspective
124
- (0, vitest_1.expect)(result.theme.value).toBe("light");
125
- (0, vitest_1.expect)(result.theme.inherited).toBe(true);
126
- (0, vitest_1.expect)(result.theme.source_tenant_id).toBe("msp-id");
127
- // max_users: client overrides root -> 50, not inherited
128
- (0, vitest_1.expect)(result.max_users.value).toBe(50);
129
- (0, vitest_1.expect)(result.max_users.inherited).toBe(false);
130
- (0, vitest_1.expect)(result.max_users.source_tenant_id).toBe("client-id");
131
- // region: MSP sets it, inherited to client
132
- (0, vitest_1.expect)(result.region.value).toBe("us-east");
133
- (0, vitest_1.expect)(result.region.inherited).toBe(true);
134
- (0, vitest_1.expect)(result.region.source_tenant_id).toBe("msp-id");
135
- });
136
- (0, vitest_1.it)("inherits config from parent when child has no override", async () => {
137
- const pool = (0, test_helpers_js_1.makeMockPool)();
138
- const mockQuery = vitest_1.vi.fn();
139
- mockQuery.mockResolvedValueOnce({
140
- rows: [{ ancestry_path: "/parent-id" }],
141
- });
142
- mockQuery.mockResolvedValueOnce({
143
- rows: [
144
- {
145
- tenant_id: "parent-id",
146
- key: "feature_flag",
147
- value: true,
148
- locked: false,
149
- sensitive: false,
150
- source_tenant_id: "parent-id",
151
- },
152
- ],
153
- });
154
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
155
- const client = { query: mockQuery };
156
- return fn(client);
157
- });
158
- const result = await configService.resolveConfig(pool, "child-id");
159
- (0, vitest_1.expect)(result.feature_flag.value).toBe(true);
160
- (0, vitest_1.expect)(result.feature_flag.inherited).toBe(true);
161
- (0, vitest_1.expect)(result.feature_flag.source_tenant_id).toBe("parent-id");
162
- });
163
- (0, vitest_1.it)("child can override parent values", async () => {
164
- const pool = (0, test_helpers_js_1.makeMockPool)();
165
- const mockQuery = vitest_1.vi.fn();
166
- mockQuery.mockResolvedValueOnce({
167
- rows: [{ ancestry_path: "/parent-id" }],
168
- });
169
- mockQuery.mockResolvedValueOnce({
170
- rows: [
171
- {
172
- tenant_id: "parent-id",
173
- key: "color",
174
- value: "blue",
175
- locked: false,
176
- sensitive: false,
177
- source_tenant_id: "parent-id",
178
- },
179
- {
180
- tenant_id: "child-id",
181
- key: "color",
182
- value: "red",
183
- locked: false,
184
- sensitive: false,
185
- source_tenant_id: "child-id",
186
- },
187
- ],
188
- });
189
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
190
- const client = { query: mockQuery };
191
- return fn(client);
192
- });
193
- const result = await configService.resolveConfig(pool, "child-id");
194
- (0, vitest_1.expect)(result.color.value).toBe("red");
195
- (0, vitest_1.expect)(result.color.inherited).toBe(false);
196
- (0, vitest_1.expect)(result.color.source_tenant_id).toBe("child-id");
197
- });
198
- (0, vitest_1.it)("locked keys cannot be overridden by children", async () => {
199
- const pool = (0, test_helpers_js_1.makeMockPool)();
200
- const mockQuery = vitest_1.vi.fn();
201
- mockQuery.mockResolvedValueOnce({
202
- rows: [{ ancestry_path: "/parent-id" }],
203
- });
204
- mockQuery.mockResolvedValueOnce({
205
- rows: [
206
- {
207
- tenant_id: "parent-id",
208
- key: "security_policy",
209
- value: "strict",
210
- locked: true,
211
- sensitive: false,
212
- source_tenant_id: "parent-id",
213
- },
214
- // Child attempts to override locked key
215
- {
216
- tenant_id: "child-id",
217
- key: "security_policy",
218
- value: "relaxed",
219
- locked: false,
220
- sensitive: false,
221
- source_tenant_id: "child-id",
222
- },
223
- ],
224
- });
225
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
226
- const client = { query: mockQuery };
227
- return fn(client);
228
- });
229
- const result = await configService.resolveConfig(pool, "child-id");
230
- // Parent's locked value prevails
231
- (0, vitest_1.expect)(result.security_policy.value).toBe("strict");
232
- (0, vitest_1.expect)(result.security_policy.locked).toBe(true);
233
- (0, vitest_1.expect)(result.security_policy.source_tenant_id).toBe("parent-id");
234
- });
235
- (0, vitest_1.it)("sensitive (encrypted) values are decrypted during resolution", async () => {
236
- const pool = (0, test_helpers_js_1.makeMockPool)();
237
- const mockQuery = vitest_1.vi.fn();
238
- mockQuery.mockResolvedValueOnce({
239
- rows: [{ ancestry_path: "/" }],
240
- });
241
- // Sensitive entry: value is stored as JSON-stringified encrypted string
242
- // The code does: JSON.parse(decrypt(JSON.parse(entry.value as string)))
243
- // entry.value is stored as: JSON.stringify(encrypt(JSON.stringify(actualValue)))
244
- // So entry.value = JSON.stringify("encrypted:\"my-secret\"") = '"encrypted:\\"my-secret\\""'
245
- const encryptedPayload = `encrypted:${JSON.stringify("my-secret")}`;
246
- mockQuery.mockResolvedValueOnce({
247
- rows: [
248
- {
249
- tenant_id: "root-id",
250
- key: "api_key",
251
- value: JSON.stringify(encryptedPayload),
252
- locked: false,
253
- sensitive: true,
254
- source_tenant_id: "root-id",
255
- },
256
- ],
257
- });
258
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
259
- const client = { query: mockQuery };
260
- return fn(client);
261
- });
262
- const result = await configService.resolveConfig(pool, "root-id");
263
- (0, vitest_1.expect)(result.api_key.value).toBe("my-secret");
264
- });
265
- (0, vitest_1.it)("archived ancestors are excluded from inheritance chain", async () => {
266
- const pool = (0, test_helpers_js_1.makeMockPool)();
267
- const mockQuery = vitest_1.vi.fn();
268
- // ancestry path includes an archived ancestor
269
- mockQuery.mockResolvedValueOnce({
270
- rows: [{ ancestry_path: "/root-id/archived-id" }],
271
- });
272
- // The SQL query joins with tenants WHERE status != 'archived',
273
- // so archived-id's entries won't be returned
274
- mockQuery.mockResolvedValueOnce({
275
- rows: [
276
- {
277
- tenant_id: "root-id",
278
- key: "setting",
279
- value: "from-root",
280
- locked: false,
281
- sensitive: false,
282
- source_tenant_id: "root-id",
283
- },
284
- // archived-id's entry is NOT returned due to the JOIN filter
285
- // child has no override
286
- ],
287
- });
288
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
289
- const client = { query: mockQuery };
290
- return fn(client);
291
- });
292
- const result = await configService.resolveConfig(pool, "child-id");
293
- // Only root's value is present; archived ancestor's config is excluded
294
- (0, vitest_1.expect)(result.setting.value).toBe("from-root");
295
- (0, vitest_1.expect)(result.setting.source_tenant_id).toBe("root-id");
296
- });
297
- (0, vitest_1.it)("handles empty ancestry path (root tenant)", async () => {
298
- const pool = (0, test_helpers_js_1.makeMockPool)();
299
- const mockQuery = vitest_1.vi.fn();
300
- mockQuery.mockResolvedValueOnce({
301
- rows: [{ ancestry_path: "/" }],
302
- });
303
- mockQuery.mockResolvedValueOnce({
304
- rows: [
305
- {
306
- tenant_id: "root-id",
307
- key: "root_setting",
308
- value: "value",
309
- locked: false,
310
- sensitive: false,
311
- source_tenant_id: "root-id",
312
- },
313
- ],
314
- });
315
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
316
- const client = { query: mockQuery };
317
- return fn(client);
318
- });
319
- const result = await configService.resolveConfig(pool, "root-id");
320
- (0, vitest_1.expect)(result.root_setting.value).toBe("value");
321
- (0, vitest_1.expect)(result.root_setting.inherited).toBe(false);
322
- });
323
- (0, vitest_1.it)("throws TenantArchivedError when tenant itself is archived", async () => {
324
- const pool = (0, test_helpers_js_1.makeMockPool)();
325
- const mockQuery = vitest_1.vi.fn();
326
- // First query: ancestry_path query returns no rows (status='archived' filtered out)
327
- mockQuery.mockResolvedValueOnce({ rows: [] });
328
- // Second query: check if tenant exists at all
329
- mockQuery.mockResolvedValueOnce({ rows: [{ id: "archived-tenant" }] });
330
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
331
- const client = { query: mockQuery };
332
- return fn(client);
333
- });
334
- await (0, vitest_1.expect)(configService.resolveConfig(pool, "archived-tenant")).rejects.toThrow(core_1.TenantArchivedError);
335
- });
336
- (0, vitest_1.it)("throws TenantNotFoundError when tenant does not exist", async () => {
337
- const pool = (0, test_helpers_js_1.makeMockPool)();
338
- const mockQuery = vitest_1.vi.fn();
339
- mockQuery.mockResolvedValueOnce({ rows: [] });
340
- mockQuery.mockResolvedValueOnce({ rows: [] });
341
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
342
- const client = { query: mockQuery };
343
- return fn(client);
344
- });
345
- await (0, vitest_1.expect)(configService.resolveConfig(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
346
- });
347
- });
348
- // ---------------------------------------------------------------------------
349
- // batchSetConfig
350
- // ---------------------------------------------------------------------------
351
- (0, vitest_1.describe)("batchSetConfig", () => {
352
- (0, vitest_1.it)("partial success: some keys locked, others succeed", async () => {
353
- const pool = (0, test_helpers_js_1.makeMockPool)();
354
- const mockQuery = vitest_1.vi.fn();
355
- // Query 1: SELECT ancestry_path
356
- mockQuery.mockResolvedValueOnce({
357
- rows: [{ ancestry_path: "/parent-id" }],
358
- });
359
- // Query 2: batch-load ancestor locks
360
- mockQuery.mockResolvedValueOnce({
361
- rows: [
362
- {
363
- key: "locked_key",
364
- locked: true,
365
- source_tenant_id: "parent-id",
366
- tenant_id: "parent-id",
367
- },
368
- ],
369
- });
370
- // Query 3: INSERT for the unlocked key "open_key"
371
- mockQuery.mockResolvedValueOnce({
372
- rows: [
373
- {
374
- id: "entry-1",
375
- tenant_id: "child-id",
376
- key: "open_key",
377
- value: JSON.stringify("new-value"),
378
- locked: false,
379
- sensitive: false,
380
- source_tenant_id: "child-id",
381
- inherited: false,
382
- created_at: "2024-01-01T00:00:00.000Z",
383
- updated_at: "2024-01-01T00:00:00.000Z",
384
- },
385
- ],
386
- });
387
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
388
- const client = { query: mockQuery };
389
- return fn(client);
390
- });
391
- const result = await configService.batchSetConfig(pool, "child-id", [
392
- { key: "locked_key", value: "attempt" },
393
- { key: "open_key", value: "new-value" },
394
- ]);
395
- (0, vitest_1.expect)(result.succeeded).toBe(1);
396
- (0, vitest_1.expect)(result.failed).toBe(1);
397
- (0, vitest_1.expect)(result.results).toHaveLength(2);
398
- // First result: locked_key failed
399
- (0, vitest_1.expect)(result.results[0].key).toBe("locked_key");
400
- (0, vitest_1.expect)(result.results[0].status).toBe("error");
401
- (0, vitest_1.expect)(result.results[0].error).toContain("locked");
402
- // Second result: open_key succeeded
403
- (0, vitest_1.expect)(result.results[1].key).toBe("open_key");
404
- (0, vitest_1.expect)(result.results[1].status).toBe("ok");
405
- (0, vitest_1.expect)(result.results[1].entry).toBeDefined();
406
- });
407
- (0, vitest_1.it)("all keys succeed when none are locked", async () => {
408
- const pool = (0, test_helpers_js_1.makeMockPool)();
409
- const mockQuery = vitest_1.vi.fn();
410
- // Query 1: SELECT ancestry_path
411
- mockQuery.mockResolvedValueOnce({
412
- rows: [{ ancestry_path: "/parent-id" }],
413
- });
414
- // Query 2: no locked keys
415
- mockQuery.mockResolvedValueOnce({ rows: [] });
416
- // Query 3 & 4: two INSERT queries succeed
417
- const makeEntry = (key) => ({
418
- id: `entry-${key}`,
419
- tenant_id: "child-id",
420
- key,
421
- value: JSON.stringify("val"),
422
- locked: false,
423
- sensitive: false,
424
- source_tenant_id: "child-id",
425
- inherited: false,
426
- created_at: "2024-01-01T00:00:00.000Z",
427
- updated_at: "2024-01-01T00:00:00.000Z",
428
- });
429
- mockQuery.mockResolvedValueOnce({ rows: [makeEntry("key_a")] });
430
- mockQuery.mockResolvedValueOnce({ rows: [makeEntry("key_b")] });
431
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
432
- const client = { query: mockQuery };
433
- return fn(client);
434
- });
435
- const result = await configService.batchSetConfig(pool, "child-id", [
436
- { key: "key_a", value: "val" },
437
- { key: "key_b", value: "val" },
438
- ]);
439
- (0, vitest_1.expect)(result.succeeded).toBe(2);
440
- (0, vitest_1.expect)(result.failed).toBe(0);
441
- (0, vitest_1.expect)(result.results.every((r) => r.status === "ok")).toBe(true);
442
- });
443
- (0, vitest_1.it)("all keys locked yields all errors", async () => {
444
- const pool = (0, test_helpers_js_1.makeMockPool)();
445
- const mockQuery = vitest_1.vi.fn();
446
- mockQuery.mockResolvedValueOnce({
447
- rows: [{ ancestry_path: "/parent-id" }],
448
- });
449
- mockQuery.mockResolvedValueOnce({
450
- rows: [
451
- { key: "k1", locked: true, source_tenant_id: "parent-id", tenant_id: "parent-id" },
452
- { key: "k2", locked: true, source_tenant_id: "parent-id", tenant_id: "parent-id" },
453
- ],
454
- });
455
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
456
- const client = { query: mockQuery };
457
- return fn(client);
458
- });
459
- const result = await configService.batchSetConfig(pool, "child-id", [
460
- { key: "k1", value: "a" },
461
- { key: "k2", value: "b" },
462
- ]);
463
- (0, vitest_1.expect)(result.succeeded).toBe(0);
464
- (0, vitest_1.expect)(result.failed).toBe(2);
465
- (0, vitest_1.expect)(result.results.every((r) => r.status === "error")).toBe(true);
466
- });
467
- (0, vitest_1.it)("throws TenantNotFoundError when tenant does not exist", async () => {
468
- const pool = (0, test_helpers_js_1.makeMockPool)();
469
- const mockQuery = vitest_1.vi.fn();
470
- mockQuery.mockResolvedValueOnce({ rows: [] });
471
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
472
- const client = { query: mockQuery };
473
- return fn(client);
474
- });
475
- await (0, vitest_1.expect)(configService.batchSetConfig(pool, "nonexistent", [{ key: "k", value: "v" }])).rejects.toThrow(core_1.TenantNotFoundError);
476
- });
477
- (0, vitest_1.it)("root tenant with no ancestors skips lock check", async () => {
478
- const pool = (0, test_helpers_js_1.makeMockPool)();
479
- const mockQuery = vitest_1.vi.fn();
480
- // Root has ancestry_path "/"
481
- mockQuery.mockResolvedValueOnce({
482
- rows: [{ ancestry_path: "/" }],
483
- });
484
- // No lock query issued for root (ancestorIds.length === 0)
485
- // Direct to INSERT
486
- mockQuery.mockResolvedValueOnce({
487
- rows: [
488
- {
489
- id: "entry-1",
490
- tenant_id: "root-id",
491
- key: "setting",
492
- value: JSON.stringify("val"),
493
- locked: false,
494
- sensitive: false,
495
- source_tenant_id: "root-id",
496
- inherited: false,
497
- created_at: "2024-01-01T00:00:00.000Z",
498
- updated_at: "2024-01-01T00:00:00.000Z",
499
- },
500
- ],
501
- });
502
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
503
- const client = { query: mockQuery };
504
- return fn(client);
505
- });
506
- const result = await configService.batchSetConfig(pool, "root-id", [
507
- { key: "setting", value: "val" },
508
- ]);
509
- (0, vitest_1.expect)(result.succeeded).toBe(1);
510
- (0, vitest_1.expect)(result.failed).toBe(0);
511
- // Only 2 queries: ancestry_path + INSERT (no lock check)
512
- (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(2);
513
- });
514
- });
515
- // ---------------------------------------------------------------------------
516
- // setConfig
517
- // ---------------------------------------------------------------------------
518
- (0, vitest_1.describe)("setConfig", () => {
519
- (0, vitest_1.it)("throws ConfigLockedError when ancestor has locked the key", async () => {
520
- const pool = (0, test_helpers_js_1.makeMockPool)();
521
- const mockQuery = vitest_1.vi.fn();
522
- mockQuery.mockResolvedValueOnce({
523
- rows: [{ ancestry_path: "/parent-id" }],
524
- });
525
- mockQuery.mockResolvedValueOnce({
526
- rows: [
527
- {
528
- key: "locked_key",
529
- locked: true,
530
- source_tenant_id: "parent-id",
531
- tenant_id: "parent-id",
532
- },
533
- ],
534
- });
535
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
536
- const client = { query: mockQuery };
537
- return fn(client);
538
- });
539
- await (0, vitest_1.expect)(configService.setConfig(pool, "child-id", "locked_key", { value: "override", locked: false, sensitive: false })).rejects.toThrow(core_1.ConfigLockedError);
540
- });
541
- });
542
- // ---------------------------------------------------------------------------
543
- // deleteConfig
544
- // ---------------------------------------------------------------------------
545
- (0, vitest_1.describe)("deleteConfig", () => {
546
- (0, vitest_1.it)("throws ConfigNotFoundError when key does not exist", async () => {
547
- const pool = (0, test_helpers_js_1.makeMockPool)();
548
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rowCount: 0 });
549
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
550
- const client = { query: mockQuery };
551
- return fn(client);
552
- });
553
- await (0, vitest_1.expect)(configService.deleteConfig(pool, "tenant-id", "nonexistent_key")).rejects.toThrow(core_1.ConfigNotFoundError);
554
- });
555
- (0, vitest_1.it)("deletes successfully when key exists", async () => {
556
- const pool = (0, test_helpers_js_1.makeMockPool)();
557
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rowCount: 1 });
558
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
559
- const client = { query: mockQuery };
560
- return fn(client);
561
- });
562
- await (0, vitest_1.expect)(configService.deleteConfig(pool, "tenant-id", "existing_key")).resolves.toBeUndefined();
563
- });
564
- });
565
- //# sourceMappingURL=config-service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/config-service.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=consent-service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"consent-service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/consent-service.test.ts"],"names":[],"mappings":""}