@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,451 @@
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 tenant-service
28
+ vitest_1.vi.mock("../../pool-helpers.js", () => ({
29
+ withClient: vitest_1.vi.fn(),
30
+ withTransaction: vitest_1.vi.fn(),
31
+ }));
32
+ const poolHelpers = __importStar(require("../../pool-helpers.js"));
33
+ const tenantService = __importStar(require("../tenant-service.js"));
34
+ const test_helpers_js_1 = require("./test-helpers.js");
35
+ const core_1 = require("@stratum-hq/core");
36
+ function makeInput(overrides = {}) {
37
+ return {
38
+ parent_id: null,
39
+ name: "Test",
40
+ slug: "test",
41
+ config: {},
42
+ metadata: {},
43
+ isolation_strategy: "SHARED_RLS",
44
+ ...overrides,
45
+ };
46
+ }
47
+ const NOW = "2024-01-01T00:00:00.000Z";
48
+ function makeTenant(overrides = {}) {
49
+ return {
50
+ id: "tenant-1",
51
+ parent_id: null,
52
+ ancestry_path: "/",
53
+ depth: 0,
54
+ name: "Root",
55
+ slug: "root",
56
+ config: {},
57
+ metadata: {},
58
+ isolation_strategy: "SHARED_RLS",
59
+ status: "active",
60
+ region_id: null,
61
+ deleted_at: null,
62
+ created_at: NOW,
63
+ updated_at: NOW,
64
+ ...overrides,
65
+ };
66
+ }
67
+ (0, vitest_1.beforeEach)(() => {
68
+ vitest_1.vi.clearAllMocks();
69
+ });
70
+ // ---------------------------------------------------------------------------
71
+ // createTenant
72
+ // ---------------------------------------------------------------------------
73
+ (0, vitest_1.describe)("createTenant", () => {
74
+ (0, vitest_1.it)("creates a tenant with a parent (advisory lock acquired)", async () => {
75
+ const pool = (0, test_helpers_js_1.makeMockPool)();
76
+ const mockQuery = vitest_1.vi.fn();
77
+ const parent = makeTenant({
78
+ id: "parent-1",
79
+ name: "Parent",
80
+ slug: "parent",
81
+ ancestry_path: "/",
82
+ depth: 0,
83
+ });
84
+ const child = makeTenant({
85
+ id: "child-1",
86
+ parent_id: "parent-1",
87
+ name: "Child",
88
+ slug: "child",
89
+ ancestry_path: "/parent-1",
90
+ depth: 1,
91
+ });
92
+ // Query 1: pg_advisory_xact_lock
93
+ mockQuery.mockResolvedValueOnce({ rows: [] });
94
+ // Query 2: SELECT parent
95
+ mockQuery.mockResolvedValueOnce({ rows: [parent] });
96
+ // Query 3: INSERT child
97
+ mockQuery.mockResolvedValueOnce({ rows: [child] });
98
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
99
+ const client = { query: mockQuery };
100
+ return fn(client);
101
+ });
102
+ const result = await tenantService.createTenant(pool, makeInput({
103
+ parent_id: "parent-1",
104
+ name: "Child",
105
+ slug: "child",
106
+ }));
107
+ (0, vitest_1.expect)(result.id).toBe("child-1");
108
+ (0, vitest_1.expect)(result.parent_id).toBe("parent-1");
109
+ (0, vitest_1.expect)(result.ancestry_path).toBe("/parent-1");
110
+ // Verify advisory lock was acquired
111
+ (0, vitest_1.expect)(mockQuery.mock.calls[0][0]).toContain("pg_advisory_xact_lock");
112
+ (0, vitest_1.expect)(mockQuery.mock.calls[0][1]).toEqual(["parent-1"]);
113
+ });
114
+ (0, vitest_1.it)("creates a root tenant without parent", async () => {
115
+ const pool = (0, test_helpers_js_1.makeMockPool)();
116
+ const mockQuery = vitest_1.vi.fn();
117
+ const rootTenant = makeTenant({
118
+ id: "root-1",
119
+ parent_id: null,
120
+ name: "Root Org",
121
+ slug: "root_org",
122
+ ancestry_path: "/",
123
+ depth: 0,
124
+ });
125
+ // Only one query: INSERT (no advisory lock, no parent lookup)
126
+ mockQuery.mockResolvedValueOnce({ rows: [rootTenant] });
127
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
128
+ const client = { query: mockQuery };
129
+ return fn(client);
130
+ });
131
+ const result = await tenantService.createTenant(pool, makeInput({
132
+ parent_id: null,
133
+ name: "Root Org",
134
+ slug: "root_org",
135
+ }));
136
+ (0, vitest_1.expect)(result.id).toBe("root-1");
137
+ (0, vitest_1.expect)(result.parent_id).toBeNull();
138
+ (0, vitest_1.expect)(result.ancestry_path).toBe("/");
139
+ (0, vitest_1.expect)(result.depth).toBe(0);
140
+ // Only 1 query: the INSERT
141
+ (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(1);
142
+ (0, vitest_1.expect)(mockQuery.mock.calls[0][0]).toContain("INSERT INTO tenants");
143
+ });
144
+ (0, vitest_1.it)("throws TenantArchivedError when parent is archived", async () => {
145
+ const pool = (0, test_helpers_js_1.makeMockPool)();
146
+ const mockQuery = vitest_1.vi.fn();
147
+ const archivedParent = makeTenant({
148
+ id: "archived-parent",
149
+ status: "archived",
150
+ });
151
+ // Query 1: advisory lock
152
+ mockQuery.mockResolvedValueOnce({ rows: [] });
153
+ // Query 2: SELECT parent - returns archived parent
154
+ mockQuery.mockResolvedValueOnce({ rows: [archivedParent] });
155
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
156
+ const client = { query: mockQuery };
157
+ return fn(client);
158
+ });
159
+ await (0, vitest_1.expect)(tenantService.createTenant(pool, makeInput({
160
+ parent_id: "archived-parent",
161
+ name: "Child",
162
+ slug: "child",
163
+ }))).rejects.toThrow(core_1.TenantArchivedError);
164
+ });
165
+ (0, vitest_1.it)("throws TenantNotFoundError when parent does not exist", async () => {
166
+ const pool = (0, test_helpers_js_1.makeMockPool)();
167
+ const mockQuery = vitest_1.vi.fn();
168
+ // advisory lock
169
+ mockQuery.mockResolvedValueOnce({ rows: [] });
170
+ // parent not found
171
+ mockQuery.mockResolvedValueOnce({ rows: [] });
172
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
173
+ const client = { query: mockQuery };
174
+ return fn(client);
175
+ });
176
+ await (0, vitest_1.expect)(tenantService.createTenant(pool, makeInput({
177
+ parent_id: "nonexistent",
178
+ name: "Child",
179
+ slug: "child",
180
+ }))).rejects.toThrow(core_1.TenantNotFoundError);
181
+ });
182
+ });
183
+ // ---------------------------------------------------------------------------
184
+ // moveTenant
185
+ // ---------------------------------------------------------------------------
186
+ (0, vitest_1.describe)("moveTenant", () => {
187
+ (0, vitest_1.it)("throws TenantCycleDetectedError when moving to own descendant", async () => {
188
+ const pool = (0, test_helpers_js_1.makeMockPool)();
189
+ const mockQuery = vitest_1.vi.fn();
190
+ const tenant = makeTenant({
191
+ id: "parent-id",
192
+ ancestry_path: "/root-id",
193
+ depth: 1,
194
+ status: "active",
195
+ });
196
+ const newParent = makeTenant({
197
+ id: "child-id",
198
+ parent_id: "parent-id",
199
+ ancestry_path: "/root-id/parent-id",
200
+ depth: 2,
201
+ status: "active",
202
+ });
203
+ // Query 1: advisory lock on tenant
204
+ mockQuery.mockResolvedValueOnce({ rows: [] });
205
+ // Query 2: advisory lock on new parent
206
+ mockQuery.mockResolvedValueOnce({ rows: [] });
207
+ // Query 3: SELECT tenant being moved
208
+ mockQuery.mockResolvedValueOnce({ rows: [tenant] });
209
+ // Query 4: SELECT new parent
210
+ mockQuery.mockResolvedValueOnce({ rows: [newParent] });
211
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
212
+ const client = { query: mockQuery };
213
+ return fn(client);
214
+ });
215
+ await (0, vitest_1.expect)(tenantService.moveTenant(pool, "parent-id", "child-id")).rejects.toThrow(core_1.TenantCycleDetectedError);
216
+ });
217
+ (0, vitest_1.it)("throws TenantCycleDetectedError when moving tenant to itself", async () => {
218
+ const pool = (0, test_helpers_js_1.makeMockPool)();
219
+ const mockQuery = vitest_1.vi.fn();
220
+ const tenant = makeTenant({
221
+ id: "same-id",
222
+ ancestry_path: "/root-id",
223
+ depth: 1,
224
+ status: "active",
225
+ });
226
+ // Both queries return the same tenant
227
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 1
228
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 2
229
+ mockQuery.mockResolvedValueOnce({ rows: [tenant] }); // SELECT tenant
230
+ mockQuery.mockResolvedValueOnce({ rows: [tenant] }); // SELECT new parent (same)
231
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
232
+ const client = { query: mockQuery };
233
+ return fn(client);
234
+ });
235
+ await (0, vitest_1.expect)(tenantService.moveTenant(pool, "same-id", "same-id")).rejects.toThrow(core_1.TenantCycleDetectedError);
236
+ });
237
+ (0, vitest_1.it)("throws TenantNotFoundError when tenant being moved does not exist", async () => {
238
+ const pool = (0, test_helpers_js_1.makeMockPool)();
239
+ const mockQuery = vitest_1.vi.fn();
240
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 1
241
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 2
242
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // tenant not found
243
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
244
+ const client = { query: mockQuery };
245
+ return fn(client);
246
+ });
247
+ await (0, vitest_1.expect)(tenantService.moveTenant(pool, "nonexistent", "some-parent")).rejects.toThrow(core_1.TenantNotFoundError);
248
+ });
249
+ (0, vitest_1.it)("successfully moves a tenant to a valid new parent", async () => {
250
+ const pool = (0, test_helpers_js_1.makeMockPool)();
251
+ const mockQuery = vitest_1.vi.fn();
252
+ const tenant = makeTenant({
253
+ id: "move-me",
254
+ parent_id: "old-parent",
255
+ ancestry_path: "/old-parent",
256
+ depth: 1,
257
+ status: "active",
258
+ });
259
+ const newParent = makeTenant({
260
+ id: "new-parent",
261
+ ancestry_path: "/",
262
+ depth: 0,
263
+ status: "active",
264
+ });
265
+ const updatedTenant = makeTenant({
266
+ id: "move-me",
267
+ parent_id: "new-parent",
268
+ ancestry_path: "/new-parent",
269
+ depth: 1,
270
+ status: "active",
271
+ });
272
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 1
273
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 2
274
+ mockQuery.mockResolvedValueOnce({ rows: [tenant] }); // SELECT tenant
275
+ mockQuery.mockResolvedValueOnce({ rows: [newParent] }); // SELECT new parent
276
+ mockQuery.mockResolvedValueOnce({ rows: [updatedTenant] }); // UPDATE tenant
277
+ mockQuery.mockResolvedValueOnce({ rows: [] }); // SELECT descendants (none)
278
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
279
+ const client = { query: mockQuery };
280
+ return fn(client);
281
+ });
282
+ const result = await tenantService.moveTenant(pool, "move-me", "new-parent");
283
+ (0, vitest_1.expect)(result.id).toBe("move-me");
284
+ (0, vitest_1.expect)(result.parent_id).toBe("new-parent");
285
+ (0, vitest_1.expect)(result.ancestry_path).toBe("/new-parent");
286
+ });
287
+ });
288
+ // ---------------------------------------------------------------------------
289
+ // deleteTenant (soft delete)
290
+ // ---------------------------------------------------------------------------
291
+ (0, vitest_1.describe)("deleteTenant", () => {
292
+ (0, vitest_1.it)("soft deletes a tenant with no active children", async () => {
293
+ const pool = (0, test_helpers_js_1.makeMockPool)();
294
+ const mockQuery = vitest_1.vi.fn();
295
+ const tenant = makeTenant({
296
+ id: "delete-me",
297
+ status: "active",
298
+ });
299
+ // Query 1: SELECT existing tenant
300
+ mockQuery.mockResolvedValueOnce({ rows: [tenant] });
301
+ // Query 2: COUNT children
302
+ mockQuery.mockResolvedValueOnce({ rows: [{ count: "0" }] });
303
+ // Query 3: UPDATE to archived
304
+ mockQuery.mockResolvedValueOnce({ rowCount: 1 });
305
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
306
+ const client = { query: mockQuery };
307
+ return fn(client);
308
+ });
309
+ await (0, vitest_1.expect)(tenantService.deleteTenant(pool, "delete-me")).resolves.toBeUndefined();
310
+ // Verify the UPDATE sets status to 'archived'
311
+ const updateCall = mockQuery.mock.calls[2];
312
+ (0, vitest_1.expect)(updateCall[0]).toContain("status = 'archived'");
313
+ (0, vitest_1.expect)(updateCall[0]).toContain("deleted_at = now()");
314
+ });
315
+ (0, vitest_1.it)("throws TenantHasChildrenError when tenant has active children", async () => {
316
+ const pool = (0, test_helpers_js_1.makeMockPool)();
317
+ const mockQuery = vitest_1.vi.fn();
318
+ const tenant = makeTenant({ id: "parent-with-kids", status: "active" });
319
+ mockQuery.mockResolvedValueOnce({ rows: [tenant] });
320
+ mockQuery.mockResolvedValueOnce({ rows: [{ count: "3" }] });
321
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
322
+ const client = { query: mockQuery };
323
+ return fn(client);
324
+ });
325
+ await (0, vitest_1.expect)(tenantService.deleteTenant(pool, "parent-with-kids")).rejects.toThrow(core_1.TenantHasChildrenError);
326
+ });
327
+ (0, vitest_1.it)("throws TenantNotFoundError when tenant does not exist or is already archived", async () => {
328
+ const pool = (0, test_helpers_js_1.makeMockPool)();
329
+ const mockQuery = vitest_1.vi.fn();
330
+ mockQuery.mockResolvedValueOnce({ rows: [] });
331
+ vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
332
+ const client = { query: mockQuery };
333
+ return fn(client);
334
+ });
335
+ await (0, vitest_1.expect)(tenantService.deleteTenant(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
336
+ });
337
+ });
338
+ // ---------------------------------------------------------------------------
339
+ // getAncestors
340
+ // ---------------------------------------------------------------------------
341
+ (0, vitest_1.describe)("getAncestors", () => {
342
+ (0, vitest_1.it)("returns correct ancestor chain", async () => {
343
+ const pool = (0, test_helpers_js_1.makeMockPool)();
344
+ const mockQuery = vitest_1.vi.fn();
345
+ const leaf = makeTenant({
346
+ id: "leaf-id",
347
+ ancestry_path: "/root-id/mid-id/leaf-id",
348
+ depth: 3,
349
+ });
350
+ const root = makeTenant({ id: "root-id", depth: 0, ancestry_path: "/" });
351
+ const mid = makeTenant({
352
+ id: "mid-id",
353
+ depth: 1,
354
+ ancestry_path: "/root-id",
355
+ parent_id: "root-id",
356
+ });
357
+ // Query 1: SELECT leaf tenant
358
+ mockQuery.mockResolvedValueOnce({ rows: [leaf] });
359
+ // Query 2: SELECT ancestors ORDER BY depth ASC
360
+ mockQuery.mockResolvedValueOnce({ rows: [root, mid] });
361
+ vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
362
+ const client = { query: mockQuery };
363
+ return fn(client);
364
+ });
365
+ const result = await tenantService.getAncestors(pool, "leaf-id");
366
+ (0, vitest_1.expect)(result).toHaveLength(2);
367
+ (0, vitest_1.expect)(result[0].id).toBe("root-id");
368
+ (0, vitest_1.expect)(result[1].id).toBe("mid-id");
369
+ });
370
+ (0, vitest_1.it)("returns empty array for root tenant", async () => {
371
+ const pool = (0, test_helpers_js_1.makeMockPool)();
372
+ const mockQuery = vitest_1.vi.fn();
373
+ const root = makeTenant({ id: "root-id", ancestry_path: "/", depth: 0 });
374
+ // Query 1: SELECT root tenant (ancestry_path="/")
375
+ mockQuery.mockResolvedValueOnce({ rows: [root] });
376
+ // getAncestorIds("/") returns [] from parseAncestryPath, then slicing gives []
377
+ // so getAncestors returns early with []
378
+ vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
379
+ const client = { query: mockQuery };
380
+ return fn(client);
381
+ });
382
+ const result = await tenantService.getAncestors(pool, "root-id");
383
+ (0, vitest_1.expect)(result).toEqual([]);
384
+ // Only 1 query: SELECT the tenant (no ancestor query needed)
385
+ (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(1);
386
+ });
387
+ (0, vitest_1.it)("throws TenantNotFoundError for unknown tenant", async () => {
388
+ const pool = (0, test_helpers_js_1.makeMockPool)();
389
+ const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
390
+ vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
391
+ const client = { query: mockQuery };
392
+ return fn(client);
393
+ });
394
+ await (0, vitest_1.expect)(tenantService.getAncestors(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
395
+ });
396
+ });
397
+ // ---------------------------------------------------------------------------
398
+ // getDescendants
399
+ // ---------------------------------------------------------------------------
400
+ (0, vitest_1.describe)("getDescendants", () => {
401
+ (0, vitest_1.it)("returns subtree", async () => {
402
+ const pool = (0, test_helpers_js_1.makeMockPool)();
403
+ const mockQuery = vitest_1.vi.fn();
404
+ // Query 1: check existence
405
+ mockQuery.mockResolvedValueOnce({ rows: [{ id: "parent-id" }] });
406
+ // Query 2: SELECT descendants
407
+ const child1 = makeTenant({
408
+ id: "child-1",
409
+ parent_id: "parent-id",
410
+ ancestry_path: "/parent-id",
411
+ depth: 1,
412
+ });
413
+ const grandchild1 = makeTenant({
414
+ id: "grandchild-1",
415
+ parent_id: "child-1",
416
+ ancestry_path: "/parent-id/child-1",
417
+ depth: 2,
418
+ });
419
+ mockQuery.mockResolvedValueOnce({ rows: [child1, grandchild1] });
420
+ vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
421
+ const client = { query: mockQuery };
422
+ return fn(client);
423
+ });
424
+ const result = await tenantService.getDescendants(pool, "parent-id");
425
+ (0, vitest_1.expect)(result).toHaveLength(2);
426
+ (0, vitest_1.expect)(result[0].id).toBe("child-1");
427
+ (0, vitest_1.expect)(result[1].id).toBe("grandchild-1");
428
+ });
429
+ (0, vitest_1.it)("returns empty array when no descendants exist", async () => {
430
+ const pool = (0, test_helpers_js_1.makeMockPool)();
431
+ const mockQuery = vitest_1.vi.fn();
432
+ mockQuery.mockResolvedValueOnce({ rows: [{ id: "leaf-id" }] });
433
+ mockQuery.mockResolvedValueOnce({ rows: [] });
434
+ vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
435
+ const client = { query: mockQuery };
436
+ return fn(client);
437
+ });
438
+ const result = await tenantService.getDescendants(pool, "leaf-id");
439
+ (0, vitest_1.expect)(result).toEqual([]);
440
+ });
441
+ (0, vitest_1.it)("throws TenantNotFoundError for unknown tenant", async () => {
442
+ const pool = (0, test_helpers_js_1.makeMockPool)();
443
+ const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
444
+ vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
445
+ const client = { query: mockQuery };
446
+ return fn(client);
447
+ });
448
+ await (0, vitest_1.expect)(tenantService.getDescendants(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
449
+ });
450
+ });
451
+ //# sourceMappingURL=tenant-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/tenant-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function createMockPool(): {
2
+ mockPool: any;
3
+ mockClient: {
4
+ query: import("vitest").Mock<any, any>;
5
+ release: import("vitest").Mock<any, any>;
6
+ };
7
+ };
8
+ export declare function makeMockPool(): import("pg").Pool;
9
+ //# sourceMappingURL=test-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/test-helpers.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc;;;;;;EAS7B;AAED,wBAAgB,YAAY,sBAE3B"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeMockPool = exports.createMockPool = void 0;
4
+ const vitest_1 = require("vitest");
5
+ function createMockPool() {
6
+ const mockClient = {
7
+ query: vitest_1.vi.fn(),
8
+ release: vitest_1.vi.fn(),
9
+ };
10
+ const mockPool = {
11
+ connect: vitest_1.vi.fn().mockResolvedValue(mockClient),
12
+ };
13
+ return { mockPool, mockClient };
14
+ }
15
+ exports.createMockPool = createMockPool;
16
+ function makeMockPool() {
17
+ return {};
18
+ }
19
+ exports.makeMockPool = makeMockPool;
20
+ //# sourceMappingURL=test-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/services/__tests__/test-helpers.ts"],"names":[],"mappings":";;;AAAA,mCAA4B;AAE5B,SAAgB,cAAc;IAC5B,MAAM,UAAU,GAAG;QACjB,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE;KACjB,CAAC;IACF,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC;KACxC,CAAC;IACT,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AATD,wCASC;AAED,SAAgB,YAAY;IAC1B,OAAO,EAAuB,CAAC;AACjC,CAAC;AAFD,oCAEC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=webhook-service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/webhook-service.test.ts"],"names":[],"mappings":""}