@stratum-hq/lib 0.6.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 (95) 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/migrations/019_rls_policies.sql +236 -0
  6. package/dist/pool-helpers.d.ts.map +1 -1
  7. package/dist/pool-helpers.js +31 -1
  8. package/dist/pool-helpers.js.map +1 -1
  9. package/dist/services/api-key-service.d.ts.map +1 -1
  10. package/dist/services/api-key-service.js +4 -1
  11. package/dist/services/api-key-service.js.map +1 -1
  12. package/dist/services/config-service.js +2 -2
  13. package/dist/services/config-service.js.map +1 -1
  14. package/dist/services/key-rotation-service.js +1 -1
  15. package/dist/services/key-rotation-service.js.map +1 -1
  16. package/dist/services/role-service.d.ts +13 -3
  17. package/dist/services/role-service.d.ts.map +1 -1
  18. package/dist/services/role-service.js +18 -5
  19. package/dist/services/role-service.js.map +1 -1
  20. package/dist/services/tenant-service.d.ts.map +1 -1
  21. package/dist/services/tenant-service.js +12 -2
  22. package/dist/services/tenant-service.js.map +1 -1
  23. package/dist/stratum.d.ts +4 -4
  24. package/dist/stratum.d.ts.map +1 -1
  25. package/dist/stratum.js +1 -1
  26. package/dist/stratum.js.map +1 -1
  27. package/package.json +8 -1
  28. package/dist/__tests__/crypto.test.d.ts +0 -2
  29. package/dist/__tests__/crypto.test.d.ts.map +0 -1
  30. package/dist/__tests__/crypto.test.js +0 -41
  31. package/dist/__tests__/crypto.test.js.map +0 -1
  32. package/dist/__tests__/migrate-schemas.test.d.ts +0 -2
  33. package/dist/__tests__/migrate-schemas.test.d.ts.map +0 -1
  34. package/dist/__tests__/migrate-schemas.test.js +0 -225
  35. package/dist/__tests__/migrate-schemas.test.js.map +0 -1
  36. package/dist/__tests__/stratum-als.test.d.ts +0 -2
  37. package/dist/__tests__/stratum-als.test.d.ts.map +0 -1
  38. package/dist/__tests__/stratum-als.test.js +0 -49
  39. package/dist/__tests__/stratum-als.test.js.map +0 -1
  40. package/dist/__tests__/webhook-signature.test.d.ts +0 -2
  41. package/dist/__tests__/webhook-signature.test.d.ts.map +0 -1
  42. package/dist/__tests__/webhook-signature.test.js +0 -103
  43. package/dist/__tests__/webhook-signature.test.js.map +0 -1
  44. package/dist/services/__tests__/abac-service.test.d.ts +0 -2
  45. package/dist/services/__tests__/abac-service.test.d.ts.map +0 -1
  46. package/dist/services/__tests__/abac-service.test.js +0 -108
  47. package/dist/services/__tests__/abac-service.test.js.map +0 -1
  48. package/dist/services/__tests__/api-key-service.test.d.ts +0 -2
  49. package/dist/services/__tests__/api-key-service.test.d.ts.map +0 -1
  50. package/dist/services/__tests__/api-key-service.test.js +0 -76
  51. package/dist/services/__tests__/api-key-service.test.js.map +0 -1
  52. package/dist/services/__tests__/audit-service.test.d.ts +0 -2
  53. package/dist/services/__tests__/audit-service.test.d.ts.map +0 -1
  54. package/dist/services/__tests__/audit-service.test.js +0 -230
  55. package/dist/services/__tests__/audit-service.test.js.map +0 -1
  56. package/dist/services/__tests__/config-service.test.d.ts +0 -2
  57. package/dist/services/__tests__/config-service.test.d.ts.map +0 -1
  58. package/dist/services/__tests__/config-service.test.js +0 -565
  59. package/dist/services/__tests__/config-service.test.js.map +0 -1
  60. package/dist/services/__tests__/consent-service.test.d.ts +0 -2
  61. package/dist/services/__tests__/consent-service.test.d.ts.map +0 -1
  62. package/dist/services/__tests__/consent-service.test.js +0 -169
  63. package/dist/services/__tests__/consent-service.test.js.map +0 -1
  64. package/dist/services/__tests__/event-service.test.d.ts +0 -2
  65. package/dist/services/__tests__/event-service.test.d.ts.map +0 -1
  66. package/dist/services/__tests__/event-service.test.js +0 -193
  67. package/dist/services/__tests__/event-service.test.js.map +0 -1
  68. package/dist/services/__tests__/key-rotation-service.test.d.ts +0 -2
  69. package/dist/services/__tests__/key-rotation-service.test.d.ts.map +0 -1
  70. package/dist/services/__tests__/key-rotation-service.test.js +0 -132
  71. package/dist/services/__tests__/key-rotation-service.test.js.map +0 -1
  72. package/dist/services/__tests__/permission-service.test.d.ts +0 -2
  73. package/dist/services/__tests__/permission-service.test.d.ts.map +0 -1
  74. package/dist/services/__tests__/permission-service.test.js +0 -480
  75. package/dist/services/__tests__/permission-service.test.js.map +0 -1
  76. package/dist/services/__tests__/retention-service.test.d.ts +0 -2
  77. package/dist/services/__tests__/retention-service.test.d.ts.map +0 -1
  78. package/dist/services/__tests__/retention-service.test.js +0 -152
  79. package/dist/services/__tests__/retention-service.test.js.map +0 -1
  80. package/dist/services/__tests__/role-service.test.d.ts +0 -2
  81. package/dist/services/__tests__/role-service.test.d.ts.map +0 -1
  82. package/dist/services/__tests__/role-service.test.js +0 -134
  83. package/dist/services/__tests__/role-service.test.js.map +0 -1
  84. package/dist/services/__tests__/tenant-service.test.d.ts +0 -2
  85. package/dist/services/__tests__/tenant-service.test.d.ts.map +0 -1
  86. package/dist/services/__tests__/tenant-service.test.js +0 -548
  87. package/dist/services/__tests__/tenant-service.test.js.map +0 -1
  88. package/dist/services/__tests__/test-helpers.d.ts +0 -9
  89. package/dist/services/__tests__/test-helpers.d.ts.map +0 -1
  90. package/dist/services/__tests__/test-helpers.js +0 -19
  91. package/dist/services/__tests__/test-helpers.js.map +0 -1
  92. package/dist/services/__tests__/webhook-service.test.d.ts +0 -2
  93. package/dist/services/__tests__/webhook-service.test.d.ts.map +0 -1
  94. package/dist/services/__tests__/webhook-service.test.js +0 -184
  95. package/dist/services/__tests__/webhook-service.test.js.map +0 -1
@@ -1,548 +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 tenant-service
38
- vitest_1.vi.mock("../../pool-helpers.js", () => ({
39
- withClient: vitest_1.vi.fn(),
40
- withTransaction: vitest_1.vi.fn(),
41
- }));
42
- const poolHelpers = __importStar(require("../../pool-helpers.js"));
43
- const tenantService = __importStar(require("../tenant-service.js"));
44
- const test_helpers_js_1 = require("./test-helpers.js");
45
- const core_1 = require("@stratum-hq/core");
46
- function makeInput(overrides = {}) {
47
- return {
48
- parent_id: null,
49
- name: "Test",
50
- slug: "test",
51
- config: {},
52
- metadata: {},
53
- isolation_strategy: "SHARED_RLS",
54
- ...overrides,
55
- };
56
- }
57
- const NOW = "2024-01-01T00:00:00.000Z";
58
- function makeTenant(overrides = {}) {
59
- return {
60
- id: "tenant-1",
61
- parent_id: null,
62
- ancestry_path: "/",
63
- depth: 0,
64
- name: "Root",
65
- slug: "root",
66
- config: {},
67
- metadata: {},
68
- isolation_strategy: "SHARED_RLS",
69
- status: "active",
70
- region_id: null,
71
- deleted_at: null,
72
- created_at: NOW,
73
- updated_at: NOW,
74
- ...overrides,
75
- };
76
- }
77
- (0, vitest_1.beforeEach)(() => {
78
- vitest_1.vi.clearAllMocks();
79
- });
80
- // ---------------------------------------------------------------------------
81
- // createTenant
82
- // ---------------------------------------------------------------------------
83
- (0, vitest_1.describe)("createTenant", () => {
84
- (0, vitest_1.it)("creates a tenant with a parent (advisory lock acquired)", async () => {
85
- const pool = (0, test_helpers_js_1.makeMockPool)();
86
- const mockQuery = vitest_1.vi.fn();
87
- const parent = makeTenant({
88
- id: "parent-1",
89
- name: "Parent",
90
- slug: "parent",
91
- ancestry_path: "/",
92
- depth: 0,
93
- });
94
- const child = makeTenant({
95
- id: "child-1",
96
- parent_id: "parent-1",
97
- name: "Child",
98
- slug: "child",
99
- ancestry_path: "/parent-1",
100
- depth: 1,
101
- });
102
- // Query 1: pg_advisory_xact_lock
103
- mockQuery.mockResolvedValueOnce({ rows: [] });
104
- // Query 2: SELECT parent
105
- mockQuery.mockResolvedValueOnce({ rows: [parent] });
106
- // Query 3: INSERT child
107
- mockQuery.mockResolvedValueOnce({ rows: [child] });
108
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
109
- const client = { query: mockQuery };
110
- return fn(client);
111
- });
112
- const result = await tenantService.createTenant(pool, makeInput({
113
- parent_id: "parent-1",
114
- name: "Child",
115
- slug: "child",
116
- }));
117
- (0, vitest_1.expect)(result.id).toBe("child-1");
118
- (0, vitest_1.expect)(result.parent_id).toBe("parent-1");
119
- (0, vitest_1.expect)(result.ancestry_path).toBe("/parent-1");
120
- // Verify advisory lock was acquired
121
- (0, vitest_1.expect)(mockQuery.mock.calls[0][0]).toContain("pg_advisory_xact_lock");
122
- (0, vitest_1.expect)(mockQuery.mock.calls[0][1]).toEqual(["parent-1"]);
123
- });
124
- (0, vitest_1.it)("creates a root tenant without parent", async () => {
125
- const pool = (0, test_helpers_js_1.makeMockPool)();
126
- const mockQuery = vitest_1.vi.fn();
127
- const rootTenant = makeTenant({
128
- id: "root-1",
129
- parent_id: null,
130
- name: "Root Org",
131
- slug: "root_org",
132
- ancestry_path: "/",
133
- depth: 0,
134
- });
135
- // Only one query: INSERT (no advisory lock, no parent lookup)
136
- mockQuery.mockResolvedValueOnce({ rows: [rootTenant] });
137
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
138
- const client = { query: mockQuery };
139
- return fn(client);
140
- });
141
- const result = await tenantService.createTenant(pool, makeInput({
142
- parent_id: null,
143
- name: "Root Org",
144
- slug: "root_org",
145
- }));
146
- (0, vitest_1.expect)(result.id).toBe("root-1");
147
- (0, vitest_1.expect)(result.parent_id).toBeNull();
148
- (0, vitest_1.expect)(result.ancestry_path).toBe("/");
149
- (0, vitest_1.expect)(result.depth).toBe(0);
150
- // Only 1 query: the INSERT
151
- (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(1);
152
- (0, vitest_1.expect)(mockQuery.mock.calls[0][0]).toContain("INSERT INTO tenants");
153
- });
154
- (0, vitest_1.it)("throws TenantArchivedError when parent is archived", async () => {
155
- const pool = (0, test_helpers_js_1.makeMockPool)();
156
- const mockQuery = vitest_1.vi.fn();
157
- const archivedParent = makeTenant({
158
- id: "archived-parent",
159
- status: "archived",
160
- });
161
- // Query 1: advisory lock
162
- mockQuery.mockResolvedValueOnce({ rows: [] });
163
- // Query 2: SELECT parent - returns archived parent
164
- mockQuery.mockResolvedValueOnce({ rows: [archivedParent] });
165
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
166
- const client = { query: mockQuery };
167
- return fn(client);
168
- });
169
- await (0, vitest_1.expect)(tenantService.createTenant(pool, makeInput({
170
- parent_id: "archived-parent",
171
- name: "Child",
172
- slug: "child",
173
- }))).rejects.toThrow(core_1.TenantArchivedError);
174
- });
175
- (0, vitest_1.it)("throws TenantNotFoundError when parent does not exist", async () => {
176
- const pool = (0, test_helpers_js_1.makeMockPool)();
177
- const mockQuery = vitest_1.vi.fn();
178
- // advisory lock
179
- mockQuery.mockResolvedValueOnce({ rows: [] });
180
- // parent not found
181
- mockQuery.mockResolvedValueOnce({ rows: [] });
182
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
183
- const client = { query: mockQuery };
184
- return fn(client);
185
- });
186
- await (0, vitest_1.expect)(tenantService.createTenant(pool, makeInput({
187
- parent_id: "nonexistent",
188
- name: "Child",
189
- slug: "child",
190
- }))).rejects.toThrow(core_1.TenantNotFoundError);
191
- });
192
- });
193
- // ---------------------------------------------------------------------------
194
- // moveTenant
195
- // ---------------------------------------------------------------------------
196
- (0, vitest_1.describe)("moveTenant", () => {
197
- (0, vitest_1.it)("throws TenantCycleDetectedError when moving to own descendant", async () => {
198
- const pool = (0, test_helpers_js_1.makeMockPool)();
199
- const mockQuery = vitest_1.vi.fn();
200
- const tenant = makeTenant({
201
- id: "parent-id",
202
- ancestry_path: "/root-id",
203
- depth: 1,
204
- status: "active",
205
- });
206
- const newParent = makeTenant({
207
- id: "child-id",
208
- parent_id: "parent-id",
209
- ancestry_path: "/root-id/parent-id",
210
- depth: 2,
211
- status: "active",
212
- });
213
- // Query 1: advisory lock on tenant
214
- mockQuery.mockResolvedValueOnce({ rows: [] });
215
- // Query 2: advisory lock on new parent
216
- mockQuery.mockResolvedValueOnce({ rows: [] });
217
- // Query 3: SELECT tenant being moved
218
- mockQuery.mockResolvedValueOnce({ rows: [tenant] });
219
- // Query 4: SELECT new parent
220
- mockQuery.mockResolvedValueOnce({ rows: [newParent] });
221
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
222
- const client = { query: mockQuery };
223
- return fn(client);
224
- });
225
- await (0, vitest_1.expect)(tenantService.moveTenant(pool, "parent-id", "child-id")).rejects.toThrow(core_1.TenantCycleDetectedError);
226
- });
227
- (0, vitest_1.it)("throws TenantCycleDetectedError when moving tenant to itself", async () => {
228
- const pool = (0, test_helpers_js_1.makeMockPool)();
229
- const mockQuery = vitest_1.vi.fn();
230
- const tenant = makeTenant({
231
- id: "same-id",
232
- ancestry_path: "/root-id",
233
- depth: 1,
234
- status: "active",
235
- });
236
- // Both queries return the same tenant
237
- mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 1
238
- mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 2
239
- mockQuery.mockResolvedValueOnce({ rows: [tenant] }); // SELECT tenant
240
- mockQuery.mockResolvedValueOnce({ rows: [tenant] }); // SELECT new parent (same)
241
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
242
- const client = { query: mockQuery };
243
- return fn(client);
244
- });
245
- await (0, vitest_1.expect)(tenantService.moveTenant(pool, "same-id", "same-id")).rejects.toThrow(core_1.TenantCycleDetectedError);
246
- });
247
- (0, vitest_1.it)("throws TenantNotFoundError when tenant being moved does not exist", async () => {
248
- const pool = (0, test_helpers_js_1.makeMockPool)();
249
- const mockQuery = vitest_1.vi.fn();
250
- mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 1
251
- mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 2
252
- mockQuery.mockResolvedValueOnce({ rows: [] }); // tenant not found
253
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
254
- const client = { query: mockQuery };
255
- return fn(client);
256
- });
257
- await (0, vitest_1.expect)(tenantService.moveTenant(pool, "nonexistent", "some-parent")).rejects.toThrow(core_1.TenantNotFoundError);
258
- });
259
- (0, vitest_1.it)("successfully moves a tenant to a valid new parent", async () => {
260
- const pool = (0, test_helpers_js_1.makeMockPool)();
261
- const mockQuery = vitest_1.vi.fn();
262
- const tenant = makeTenant({
263
- id: "move-me",
264
- parent_id: "old-parent",
265
- ancestry_path: "/old-parent",
266
- depth: 1,
267
- status: "active",
268
- });
269
- const newParent = makeTenant({
270
- id: "new-parent",
271
- ancestry_path: "/",
272
- depth: 0,
273
- status: "active",
274
- });
275
- const updatedTenant = makeTenant({
276
- id: "move-me",
277
- parent_id: "new-parent",
278
- ancestry_path: "/new-parent",
279
- depth: 1,
280
- status: "active",
281
- });
282
- mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 1
283
- mockQuery.mockResolvedValueOnce({ rows: [] }); // advisory lock 2
284
- mockQuery.mockResolvedValueOnce({ rows: [tenant] }); // SELECT tenant
285
- mockQuery.mockResolvedValueOnce({ rows: [newParent] }); // SELECT new parent
286
- mockQuery.mockResolvedValueOnce({ rows: [updatedTenant] }); // UPDATE tenant
287
- mockQuery.mockResolvedValueOnce({ rows: [] }); // SELECT descendants (none)
288
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
289
- const client = { query: mockQuery };
290
- return fn(client);
291
- });
292
- const result = await tenantService.moveTenant(pool, "move-me", "new-parent");
293
- (0, vitest_1.expect)(result.id).toBe("move-me");
294
- (0, vitest_1.expect)(result.parent_id).toBe("new-parent");
295
- (0, vitest_1.expect)(result.ancestry_path).toBe("/new-parent");
296
- });
297
- });
298
- // ---------------------------------------------------------------------------
299
- // deleteTenant (soft delete)
300
- // ---------------------------------------------------------------------------
301
- (0, vitest_1.describe)("deleteTenant", () => {
302
- (0, vitest_1.it)("soft deletes a tenant with no active children", async () => {
303
- const pool = (0, test_helpers_js_1.makeMockPool)();
304
- const mockQuery = vitest_1.vi.fn();
305
- const tenant = makeTenant({
306
- id: "delete-me",
307
- status: "active",
308
- });
309
- // Query 1: SELECT existing tenant
310
- mockQuery.mockResolvedValueOnce({ rows: [tenant] });
311
- // Query 2: COUNT children
312
- mockQuery.mockResolvedValueOnce({ rows: [{ count: "0" }] });
313
- // Query 3: UPDATE to archived
314
- mockQuery.mockResolvedValueOnce({ rowCount: 1 });
315
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
316
- const client = { query: mockQuery };
317
- return fn(client);
318
- });
319
- await (0, vitest_1.expect)(tenantService.deleteTenant(pool, "delete-me")).resolves.toBeUndefined();
320
- // Verify the UPDATE sets status to 'archived'
321
- const updateCall = mockQuery.mock.calls[2];
322
- (0, vitest_1.expect)(updateCall[0]).toContain("status = 'archived'");
323
- (0, vitest_1.expect)(updateCall[0]).toContain("deleted_at = now()");
324
- });
325
- (0, vitest_1.it)("throws TenantHasChildrenError when tenant has active children", async () => {
326
- const pool = (0, test_helpers_js_1.makeMockPool)();
327
- const mockQuery = vitest_1.vi.fn();
328
- const tenant = makeTenant({ id: "parent-with-kids", status: "active" });
329
- mockQuery.mockResolvedValueOnce({ rows: [tenant] });
330
- mockQuery.mockResolvedValueOnce({ rows: [{ count: "3" }] });
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, "parent-with-kids")).rejects.toThrow(core_1.TenantHasChildrenError);
336
- });
337
- (0, vitest_1.it)("throws TenantNotFoundError when tenant does not exist or is already archived", async () => {
338
- const pool = (0, test_helpers_js_1.makeMockPool)();
339
- const mockQuery = vitest_1.vi.fn();
340
- mockQuery.mockResolvedValueOnce({ rows: [] });
341
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
342
- const client = { query: mockQuery };
343
- return fn(client);
344
- });
345
- await (0, vitest_1.expect)(tenantService.deleteTenant(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
346
- });
347
- });
348
- // ---------------------------------------------------------------------------
349
- // getAncestors
350
- // ---------------------------------------------------------------------------
351
- (0, vitest_1.describe)("getAncestors", () => {
352
- (0, vitest_1.it)("returns correct ancestor chain", async () => {
353
- const pool = (0, test_helpers_js_1.makeMockPool)();
354
- const mockQuery = vitest_1.vi.fn();
355
- // Real ancestry paths EXCLUDE the tenant's own id (createTenant appends
356
- // the PARENT's id to the parent's path) — regression guard for the bug
357
- // where getAncestorIds sliced off the nearest ancestor.
358
- const leaf = makeTenant({
359
- id: "leaf-id",
360
- ancestry_path: "/root-id/mid-id",
361
- depth: 2,
362
- });
363
- const root = makeTenant({ id: "root-id", depth: 0, ancestry_path: "/" });
364
- const mid = makeTenant({
365
- id: "mid-id",
366
- depth: 1,
367
- ancestry_path: "/root-id",
368
- parent_id: "root-id",
369
- });
370
- // Query 1: SELECT leaf tenant
371
- mockQuery.mockResolvedValueOnce({ rows: [leaf] });
372
- // Query 2: SELECT ancestors ORDER BY depth ASC
373
- mockQuery.mockResolvedValueOnce({ rows: [root, mid] });
374
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
375
- const client = { query: mockQuery };
376
- return fn(client);
377
- });
378
- const result = await tenantService.getAncestors(pool, "leaf-id");
379
- (0, vitest_1.expect)(result).toHaveLength(2);
380
- (0, vitest_1.expect)(result[0].id).toBe("root-id");
381
- (0, vitest_1.expect)(result[1].id).toBe("mid-id");
382
- // The ancestor query must include BOTH path ids — the direct parent too
383
- (0, vitest_1.expect)(mockQuery.mock.calls[1][1]).toEqual([["root-id", "mid-id"]]);
384
- });
385
- (0, vitest_1.it)("returns empty array for root tenant", async () => {
386
- const pool = (0, test_helpers_js_1.makeMockPool)();
387
- const mockQuery = vitest_1.vi.fn();
388
- const root = makeTenant({ id: "root-id", ancestry_path: "/", depth: 0 });
389
- // Query 1: SELECT root tenant (ancestry_path="/")
390
- mockQuery.mockResolvedValueOnce({ rows: [root] });
391
- // getAncestorIds("/") returns [] so getAncestors returns early with []
392
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
393
- const client = { query: mockQuery };
394
- return fn(client);
395
- });
396
- const result = await tenantService.getAncestors(pool, "root-id");
397
- (0, vitest_1.expect)(result).toEqual([]);
398
- // Only 1 query: SELECT the tenant (no ancestor query needed)
399
- (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(1);
400
- });
401
- (0, vitest_1.it)("throws TenantNotFoundError for unknown tenant", async () => {
402
- const pool = (0, test_helpers_js_1.makeMockPool)();
403
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
404
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
405
- const client = { query: mockQuery };
406
- return fn(client);
407
- });
408
- await (0, vitest_1.expect)(tenantService.getAncestors(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
409
- });
410
- });
411
- // ---------------------------------------------------------------------------
412
- // getRoot
413
- // ---------------------------------------------------------------------------
414
- (0, vitest_1.describe)("getRoot", () => {
415
- (0, vitest_1.it)("returns the top-most ancestor for a nested tenant", async () => {
416
- const pool = (0, test_helpers_js_1.makeMockPool)();
417
- const mockQuery = vitest_1.vi.fn();
418
- const leaf = makeTenant({
419
- id: "leaf-id",
420
- ancestry_path: "/root-id/mid-id",
421
- depth: 2,
422
- });
423
- const root = makeTenant({ id: "root-id", ancestry_path: "/", depth: 0 });
424
- // Query 1: SELECT the tenant. Query 2: SELECT the root by ancestorIds[0].
425
- mockQuery.mockResolvedValueOnce({ rows: [leaf] });
426
- mockQuery.mockResolvedValueOnce({ rows: [root] });
427
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
428
- const client = { query: mockQuery };
429
- return fn(client);
430
- });
431
- const result = await tenantService.getRoot(pool, "leaf-id");
432
- (0, vitest_1.expect)(result.id).toBe("root-id");
433
- // Second query looks up the root id (path element 0), not the whole chain.
434
- (0, vitest_1.expect)(mockQuery.mock.calls[1][1]).toEqual(["root-id"]);
435
- });
436
- (0, vitest_1.it)("returns the tenant itself when it is already a root", async () => {
437
- const pool = (0, test_helpers_js_1.makeMockPool)();
438
- const mockQuery = vitest_1.vi.fn();
439
- const root = makeTenant({ id: "root-id", ancestry_path: "/", depth: 0 });
440
- mockQuery.mockResolvedValueOnce({ rows: [root] });
441
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
442
- const client = { query: mockQuery };
443
- return fn(client);
444
- });
445
- const result = await tenantService.getRoot(pool, "root-id");
446
- (0, vitest_1.expect)(result.id).toBe("root-id");
447
- // No second query: an empty ancestry path means it is already the root.
448
- (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(1);
449
- });
450
- (0, vitest_1.it)("throws TenantNotFoundError for unknown tenant", async () => {
451
- const pool = (0, test_helpers_js_1.makeMockPool)();
452
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
453
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
454
- const client = { query: mockQuery };
455
- return fn(client);
456
- });
457
- await (0, vitest_1.expect)(tenantService.getRoot(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
458
- });
459
- });
460
- // ---------------------------------------------------------------------------
461
- // getDescendants
462
- // ---------------------------------------------------------------------------
463
- (0, vitest_1.describe)("getDescendants", () => {
464
- (0, vitest_1.it)("returns subtree", async () => {
465
- const pool = (0, test_helpers_js_1.makeMockPool)();
466
- const mockQuery = vitest_1.vi.fn();
467
- // Query 1: check existence
468
- mockQuery.mockResolvedValueOnce({ rows: [{ id: "parent-id" }] });
469
- // Query 2: SELECT descendants
470
- const child1 = makeTenant({
471
- id: "child-1",
472
- parent_id: "parent-id",
473
- ancestry_path: "/parent-id",
474
- depth: 1,
475
- });
476
- const grandchild1 = makeTenant({
477
- id: "grandchild-1",
478
- parent_id: "child-1",
479
- ancestry_path: "/parent-id/child-1",
480
- depth: 2,
481
- });
482
- mockQuery.mockResolvedValueOnce({ rows: [child1, grandchild1] });
483
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
484
- const client = { query: mockQuery };
485
- return fn(client);
486
- });
487
- const result = await tenantService.getDescendants(pool, "parent-id");
488
- (0, vitest_1.expect)(result).toHaveLength(2);
489
- (0, vitest_1.expect)(result[0].id).toBe("child-1");
490
- (0, vitest_1.expect)(result[1].id).toBe("grandchild-1");
491
- });
492
- // These are SQL-string assertions per this repo's testing contract: the mock
493
- // client does not run Postgres, so what they prove is that the subtree query
494
- // carries the right predicate. The three states (active / archived / soft-
495
- // deleted) are exercised for real against a database in
496
- // packages/integration-tests/src/tenant-descendants.integration.test.ts.
497
- (0, vitest_1.it)("excludes archived and soft-deleted descendants by default", async () => {
498
- const pool = (0, test_helpers_js_1.makeMockPool)();
499
- const mockQuery = vitest_1.vi.fn();
500
- mockQuery.mockResolvedValueOnce({ rows: [{ id: "parent-id" }] });
501
- mockQuery.mockResolvedValueOnce({ rows: [] });
502
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
503
- const client = { query: mockQuery };
504
- return fn(client);
505
- });
506
- await tenantService.getDescendants(pool, "parent-id");
507
- // The subtree query (2nd call) filters to active rows only. deleteTenant
508
- // sets status='archived' alongside deleted_at, so this one predicate drops
509
- // both archived and soft-deleted descendants — matching getChildren.
510
- const subtreeSql = mockQuery.mock.calls[1][0];
511
- (0, vitest_1.expect)(subtreeSql).toContain("status = 'active'");
512
- });
513
- (0, vitest_1.it)("includes descendants of any status when includeArchived is true", async () => {
514
- const pool = (0, test_helpers_js_1.makeMockPool)();
515
- const mockQuery = vitest_1.vi.fn();
516
- mockQuery.mockResolvedValueOnce({ rows: [{ id: "parent-id" }] });
517
- mockQuery.mockResolvedValueOnce({ rows: [] });
518
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
519
- const client = { query: mockQuery };
520
- return fn(client);
521
- });
522
- await tenantService.getDescendants(pool, "parent-id", true);
523
- const subtreeSql = mockQuery.mock.calls[1][0];
524
- (0, vitest_1.expect)(subtreeSql).not.toContain("status = 'active'");
525
- });
526
- (0, vitest_1.it)("returns empty array when no descendants exist", async () => {
527
- const pool = (0, test_helpers_js_1.makeMockPool)();
528
- const mockQuery = vitest_1.vi.fn();
529
- mockQuery.mockResolvedValueOnce({ rows: [{ id: "leaf-id" }] });
530
- mockQuery.mockResolvedValueOnce({ rows: [] });
531
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
532
- const client = { query: mockQuery };
533
- return fn(client);
534
- });
535
- const result = await tenantService.getDescendants(pool, "leaf-id");
536
- (0, vitest_1.expect)(result).toEqual([]);
537
- });
538
- (0, vitest_1.it)("throws TenantNotFoundError for unknown tenant", async () => {
539
- const pool = (0, test_helpers_js_1.makeMockPool)();
540
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
541
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
542
- const client = { query: mockQuery };
543
- return fn(client);
544
- });
545
- await (0, vitest_1.expect)(tenantService.getDescendants(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
546
- });
547
- });
548
- //# sourceMappingURL=tenant-service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tenant-service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/tenant-service.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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,IACb,OAAO,IAAI,EAAE,IAAI,CAC/B"}
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMockPool = createMockPool;
4
- exports.makeMockPool = makeMockPool;
5
- const vitest_1 = require("vitest");
6
- function createMockPool() {
7
- const mockClient = {
8
- query: vitest_1.vi.fn(),
9
- release: vitest_1.vi.fn(),
10
- };
11
- const mockPool = {
12
- connect: vitest_1.vi.fn().mockResolvedValue(mockClient),
13
- };
14
- return { mockPool, mockClient };
15
- }
16
- function makeMockPool() {
17
- return {};
18
- }
19
- //# sourceMappingURL=test-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/services/__tests__/test-helpers.ts"],"names":[],"mappings":";;AAEA,wCASC;AAED,oCAEC;AAfD,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;AAED,SAAgB,YAAY;IAC1B,OAAO,EAAuB,CAAC;AACjC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=webhook-service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhook-service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/webhook-service.test.ts"],"names":[],"mappings":""}