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