@stratum-hq/lib 0.7.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +28 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/services/api-key-service.d.ts.map +1 -1
  6. package/dist/services/api-key-service.js +4 -1
  7. package/dist/services/api-key-service.js.map +1 -1
  8. package/dist/services/config-service.js +2 -2
  9. package/dist/services/config-service.js.map +1 -1
  10. package/dist/services/key-rotation-service.js +1 -1
  11. package/dist/services/key-rotation-service.js.map +1 -1
  12. package/dist/services/role-service.d.ts +13 -3
  13. package/dist/services/role-service.d.ts.map +1 -1
  14. package/dist/services/role-service.js +18 -5
  15. package/dist/services/role-service.js.map +1 -1
  16. package/dist/services/tenant-service.d.ts.map +1 -1
  17. package/dist/services/tenant-service.js +12 -2
  18. package/dist/services/tenant-service.js.map +1 -1
  19. package/dist/stratum.d.ts +4 -4
  20. package/dist/stratum.d.ts.map +1 -1
  21. package/dist/stratum.js +1 -1
  22. package/dist/stratum.js.map +1 -1
  23. package/package.json +8 -1
  24. package/dist/__tests__/crypto.test.d.ts +0 -2
  25. package/dist/__tests__/crypto.test.d.ts.map +0 -1
  26. package/dist/__tests__/crypto.test.js +0 -41
  27. package/dist/__tests__/crypto.test.js.map +0 -1
  28. package/dist/__tests__/migrate-schemas.test.d.ts +0 -2
  29. package/dist/__tests__/migrate-schemas.test.d.ts.map +0 -1
  30. package/dist/__tests__/migrate-schemas.test.js +0 -225
  31. package/dist/__tests__/migrate-schemas.test.js.map +0 -1
  32. package/dist/__tests__/stratum-als.test.d.ts +0 -2
  33. package/dist/__tests__/stratum-als.test.d.ts.map +0 -1
  34. package/dist/__tests__/stratum-als.test.js +0 -49
  35. package/dist/__tests__/stratum-als.test.js.map +0 -1
  36. package/dist/__tests__/webhook-signature.test.d.ts +0 -2
  37. package/dist/__tests__/webhook-signature.test.d.ts.map +0 -1
  38. package/dist/__tests__/webhook-signature.test.js +0 -103
  39. package/dist/__tests__/webhook-signature.test.js.map +0 -1
  40. package/dist/services/__tests__/abac-service.test.d.ts +0 -2
  41. package/dist/services/__tests__/abac-service.test.d.ts.map +0 -1
  42. package/dist/services/__tests__/abac-service.test.js +0 -108
  43. package/dist/services/__tests__/abac-service.test.js.map +0 -1
  44. package/dist/services/__tests__/api-key-service.test.d.ts +0 -2
  45. package/dist/services/__tests__/api-key-service.test.d.ts.map +0 -1
  46. package/dist/services/__tests__/api-key-service.test.js +0 -76
  47. package/dist/services/__tests__/api-key-service.test.js.map +0 -1
  48. package/dist/services/__tests__/audit-service.test.d.ts +0 -2
  49. package/dist/services/__tests__/audit-service.test.d.ts.map +0 -1
  50. package/dist/services/__tests__/audit-service.test.js +0 -230
  51. package/dist/services/__tests__/audit-service.test.js.map +0 -1
  52. package/dist/services/__tests__/config-service.test.d.ts +0 -2
  53. package/dist/services/__tests__/config-service.test.d.ts.map +0 -1
  54. package/dist/services/__tests__/config-service.test.js +0 -565
  55. package/dist/services/__tests__/config-service.test.js.map +0 -1
  56. package/dist/services/__tests__/consent-service.test.d.ts +0 -2
  57. package/dist/services/__tests__/consent-service.test.d.ts.map +0 -1
  58. package/dist/services/__tests__/consent-service.test.js +0 -169
  59. package/dist/services/__tests__/consent-service.test.js.map +0 -1
  60. package/dist/services/__tests__/event-service.test.d.ts +0 -2
  61. package/dist/services/__tests__/event-service.test.d.ts.map +0 -1
  62. package/dist/services/__tests__/event-service.test.js +0 -193
  63. package/dist/services/__tests__/event-service.test.js.map +0 -1
  64. package/dist/services/__tests__/key-rotation-service.test.d.ts +0 -2
  65. package/dist/services/__tests__/key-rotation-service.test.d.ts.map +0 -1
  66. package/dist/services/__tests__/key-rotation-service.test.js +0 -132
  67. package/dist/services/__tests__/key-rotation-service.test.js.map +0 -1
  68. package/dist/services/__tests__/permission-service.test.d.ts +0 -2
  69. package/dist/services/__tests__/permission-service.test.d.ts.map +0 -1
  70. package/dist/services/__tests__/permission-service.test.js +0 -480
  71. package/dist/services/__tests__/permission-service.test.js.map +0 -1
  72. package/dist/services/__tests__/retention-service.test.d.ts +0 -2
  73. package/dist/services/__tests__/retention-service.test.d.ts.map +0 -1
  74. package/dist/services/__tests__/retention-service.test.js +0 -152
  75. package/dist/services/__tests__/retention-service.test.js.map +0 -1
  76. package/dist/services/__tests__/role-service.test.d.ts +0 -2
  77. package/dist/services/__tests__/role-service.test.d.ts.map +0 -1
  78. package/dist/services/__tests__/role-service.test.js +0 -134
  79. package/dist/services/__tests__/role-service.test.js.map +0 -1
  80. package/dist/services/__tests__/tenant-service.test.d.ts +0 -2
  81. package/dist/services/__tests__/tenant-service.test.d.ts.map +0 -1
  82. package/dist/services/__tests__/tenant-service.test.js +0 -548
  83. package/dist/services/__tests__/tenant-service.test.js.map +0 -1
  84. package/dist/services/__tests__/test-helpers.d.ts +0 -9
  85. package/dist/services/__tests__/test-helpers.d.ts.map +0 -1
  86. package/dist/services/__tests__/test-helpers.js +0 -19
  87. package/dist/services/__tests__/test-helpers.js.map +0 -1
  88. package/dist/services/__tests__/webhook-service.test.d.ts +0 -2
  89. package/dist/services/__tests__/webhook-service.test.d.ts.map +0 -1
  90. package/dist/services/__tests__/webhook-service.test.js +0 -184
  91. package/dist/services/__tests__/webhook-service.test.js.map +0 -1
@@ -1,480 +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 permission-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 permissionService = __importStar(require("../permission-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
- // resolvePermissions
51
- // ---------------------------------------------------------------------------
52
- (0, vitest_1.describe)("resolvePermissions", () => {
53
- (0, vitest_1.it)("LOCKED mode: child cannot override", async () => {
54
- const pool = (0, test_helpers_js_1.makeMockPool)();
55
- const mockQuery = vitest_1.vi.fn();
56
- // Query 1: ancestry_path for child
57
- mockQuery.mockResolvedValueOnce({
58
- rows: [{ ancestry_path: "/parent-id" }],
59
- });
60
- // Query 2: batch-load all policies
61
- mockQuery.mockResolvedValueOnce({
62
- rows: [
63
- {
64
- id: "policy-1",
65
- tenant_id: "parent-id",
66
- key: "can_export",
67
- value: JSON.stringify(false),
68
- mode: core_1.PermissionMode.LOCKED,
69
- revocation_mode: core_1.RevocationMode.CASCADE,
70
- source_tenant_id: "parent-id",
71
- created_at: "2024-01-01T00:00:00.000Z",
72
- updated_at: "2024-01-01T00:00:00.000Z",
73
- },
74
- // Child attempts to set the same key
75
- {
76
- id: "policy-2",
77
- tenant_id: "child-id",
78
- key: "can_export",
79
- value: JSON.stringify(true),
80
- mode: core_1.PermissionMode.INHERITED,
81
- revocation_mode: core_1.RevocationMode.CASCADE,
82
- source_tenant_id: "child-id",
83
- created_at: "2024-01-01T00:00:00.000Z",
84
- updated_at: "2024-01-01T00:00:00.000Z",
85
- },
86
- ],
87
- });
88
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
89
- const client = { query: mockQuery };
90
- return fn(client);
91
- });
92
- const result = await permissionService.resolvePermissions(pool, "child-id");
93
- // Parent's LOCKED value wins
94
- (0, vitest_1.expect)(result.can_export.value).toBe(JSON.stringify(false));
95
- (0, vitest_1.expect)(result.can_export.locked).toBe(true);
96
- (0, vitest_1.expect)(result.can_export.delegated).toBe(false);
97
- (0, vitest_1.expect)(result.can_export.source_tenant_id).toBe("parent-id");
98
- (0, vitest_1.expect)(result.can_export.mode).toBe(core_1.PermissionMode.LOCKED);
99
- });
100
- (0, vitest_1.it)("INHERITED mode: child can override", async () => {
101
- const pool = (0, test_helpers_js_1.makeMockPool)();
102
- const mockQuery = vitest_1.vi.fn();
103
- mockQuery.mockResolvedValueOnce({
104
- rows: [{ ancestry_path: "/parent-id" }],
105
- });
106
- mockQuery.mockResolvedValueOnce({
107
- rows: [
108
- {
109
- id: "policy-1",
110
- tenant_id: "parent-id",
111
- key: "theme_preference",
112
- value: JSON.stringify("default"),
113
- mode: core_1.PermissionMode.INHERITED,
114
- revocation_mode: core_1.RevocationMode.CASCADE,
115
- source_tenant_id: "parent-id",
116
- created_at: "2024-01-01T00:00:00.000Z",
117
- updated_at: "2024-01-01T00:00:00.000Z",
118
- },
119
- {
120
- id: "policy-2",
121
- tenant_id: "child-id",
122
- key: "theme_preference",
123
- value: JSON.stringify("custom"),
124
- mode: core_1.PermissionMode.INHERITED,
125
- revocation_mode: core_1.RevocationMode.CASCADE,
126
- source_tenant_id: "child-id",
127
- created_at: "2024-01-01T00:00:00.000Z",
128
- updated_at: "2024-01-01T00:00:00.000Z",
129
- },
130
- ],
131
- });
132
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
133
- const client = { query: mockQuery };
134
- return fn(client);
135
- });
136
- const result = await permissionService.resolvePermissions(pool, "child-id");
137
- // Child override prevails
138
- (0, vitest_1.expect)(result.theme_preference.value).toBe(JSON.stringify("custom"));
139
- (0, vitest_1.expect)(result.theme_preference.locked).toBe(false);
140
- (0, vitest_1.expect)(result.theme_preference.delegated).toBe(false);
141
- (0, vitest_1.expect)(result.theme_preference.source_tenant_id).toBe("child-id");
142
- });
143
- (0, vitest_1.it)("DELEGATED mode: child can override and re-delegate", async () => {
144
- const pool = (0, test_helpers_js_1.makeMockPool)();
145
- const mockQuery = vitest_1.vi.fn();
146
- // 3-level hierarchy: root -> msp -> client
147
- mockQuery.mockResolvedValueOnce({
148
- rows: [{ ancestry_path: "/root-id/msp-id" }],
149
- });
150
- mockQuery.mockResolvedValueOnce({
151
- rows: [
152
- // Root sets a DELEGATED permission
153
- {
154
- id: "policy-root",
155
- tenant_id: "root-id",
156
- key: "billing_access",
157
- value: JSON.stringify(true),
158
- mode: core_1.PermissionMode.DELEGATED,
159
- revocation_mode: core_1.RevocationMode.CASCADE,
160
- source_tenant_id: "root-id",
161
- created_at: "2024-01-01T00:00:00.000Z",
162
- updated_at: "2024-01-01T00:00:00.000Z",
163
- },
164
- // MSP overrides with its own DELEGATED policy
165
- {
166
- id: "policy-msp",
167
- tenant_id: "msp-id",
168
- key: "billing_access",
169
- value: JSON.stringify(false),
170
- mode: core_1.PermissionMode.DELEGATED,
171
- revocation_mode: core_1.RevocationMode.CASCADE,
172
- source_tenant_id: "msp-id",
173
- created_at: "2024-01-01T00:00:00.000Z",
174
- updated_at: "2024-01-01T00:00:00.000Z",
175
- },
176
- // Client overrides again
177
- {
178
- id: "policy-client",
179
- tenant_id: "client-id",
180
- key: "billing_access",
181
- value: JSON.stringify(true),
182
- mode: core_1.PermissionMode.INHERITED,
183
- revocation_mode: core_1.RevocationMode.CASCADE,
184
- source_tenant_id: "client-id",
185
- created_at: "2024-01-01T00:00:00.000Z",
186
- updated_at: "2024-01-01T00:00:00.000Z",
187
- },
188
- ],
189
- });
190
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
191
- const client = { query: mockQuery };
192
- return fn(client);
193
- });
194
- const result = await permissionService.resolvePermissions(pool, "client-id");
195
- // Client's final override wins since MSP was DELEGATED (not LOCKED)
196
- (0, vitest_1.expect)(result.billing_access.value).toBe(JSON.stringify(true));
197
- (0, vitest_1.expect)(result.billing_access.source_tenant_id).toBe("client-id");
198
- (0, vitest_1.expect)(result.billing_access.locked).toBe(false);
199
- });
200
- (0, vitest_1.it)("permission resolution walks ancestor chain correctly", async () => {
201
- const pool = (0, test_helpers_js_1.makeMockPool)();
202
- const mockQuery = vitest_1.vi.fn();
203
- // 4-level hierarchy: root -> org -> team -> user
204
- mockQuery.mockResolvedValueOnce({
205
- rows: [{ ancestry_path: "/root-id/org-id/team-id" }],
206
- });
207
- mockQuery.mockResolvedValueOnce({
208
- rows: [
209
- {
210
- id: "p1",
211
- tenant_id: "root-id",
212
- key: "feature_a",
213
- value: JSON.stringify(true),
214
- mode: core_1.PermissionMode.INHERITED,
215
- revocation_mode: core_1.RevocationMode.CASCADE,
216
- source_tenant_id: "root-id",
217
- created_at: "2024-01-01T00:00:00.000Z",
218
- updated_at: "2024-01-01T00:00:00.000Z",
219
- },
220
- {
221
- id: "p2",
222
- tenant_id: "org-id",
223
- key: "feature_b",
224
- value: JSON.stringify("org-value"),
225
- mode: core_1.PermissionMode.INHERITED,
226
- revocation_mode: core_1.RevocationMode.CASCADE,
227
- source_tenant_id: "org-id",
228
- created_at: "2024-01-01T00:00:00.000Z",
229
- updated_at: "2024-01-01T00:00:00.000Z",
230
- },
231
- {
232
- id: "p3",
233
- tenant_id: "team-id",
234
- key: "feature_a",
235
- value: JSON.stringify(false),
236
- mode: core_1.PermissionMode.INHERITED,
237
- revocation_mode: core_1.RevocationMode.CASCADE,
238
- source_tenant_id: "team-id",
239
- created_at: "2024-01-01T00:00:00.000Z",
240
- updated_at: "2024-01-01T00:00:00.000Z",
241
- },
242
- // user-id has no policies
243
- ],
244
- });
245
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
246
- const client = { query: mockQuery };
247
- return fn(client);
248
- });
249
- const result = await permissionService.resolvePermissions(pool, "user-id");
250
- // feature_a: team overrides root
251
- (0, vitest_1.expect)(result.feature_a.value).toBe(JSON.stringify(false));
252
- (0, vitest_1.expect)(result.feature_a.source_tenant_id).toBe("team-id");
253
- // feature_b: inherited from org
254
- (0, vitest_1.expect)(result.feature_b.value).toBe(JSON.stringify("org-value"));
255
- (0, vitest_1.expect)(result.feature_b.source_tenant_id).toBe("org-id");
256
- });
257
- (0, vitest_1.it)("throws TenantNotFoundError for unknown tenant", async () => {
258
- const pool = (0, test_helpers_js_1.makeMockPool)();
259
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
260
- vitest_1.vi.mocked(poolHelpers.withClient).mockImplementation(async (_pool, fn) => {
261
- const client = { query: mockQuery };
262
- return fn(client);
263
- });
264
- await (0, vitest_1.expect)(permissionService.resolvePermissions(pool, "nonexistent")).rejects.toThrow(core_1.TenantNotFoundError);
265
- });
266
- });
267
- // ---------------------------------------------------------------------------
268
- // Revocation CASCADE
269
- // ---------------------------------------------------------------------------
270
- (0, vitest_1.describe)("deletePermission", () => {
271
- (0, vitest_1.it)("CASCADE: removing parent permission removes children", async () => {
272
- const pool = (0, test_helpers_js_1.makeMockPool)();
273
- const mockQuery = vitest_1.vi.fn();
274
- // Query 1: load the policy being deleted
275
- mockQuery.mockResolvedValueOnce({
276
- rows: [
277
- {
278
- id: "policy-parent",
279
- tenant_id: "parent-id",
280
- key: "can_access_reports",
281
- value: JSON.stringify(true),
282
- mode: core_1.PermissionMode.INHERITED,
283
- revocation_mode: core_1.RevocationMode.CASCADE,
284
- source_tenant_id: "parent-id",
285
- created_at: "2024-01-01T00:00:00.000Z",
286
- updated_at: "2024-01-01T00:00:00.000Z",
287
- },
288
- ],
289
- });
290
- // Query 2: find descendants
291
- mockQuery.mockResolvedValueOnce({
292
- rows: [{ id: "child-1" }, { id: "child-2" }],
293
- });
294
- // Query 3: DELETE from descendants
295
- mockQuery.mockResolvedValueOnce({ rowCount: 2 });
296
- // Query 4: DELETE the parent policy itself
297
- mockQuery.mockResolvedValueOnce({ rowCount: 1 });
298
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
299
- const client = { query: mockQuery };
300
- return fn(client);
301
- });
302
- await permissionService.deletePermission(pool, "parent-id", "policy-parent");
303
- // Verify descendant deletion query was called
304
- const descendantDeleteCall = mockQuery.mock.calls[2];
305
- (0, vitest_1.expect)(descendantDeleteCall[0]).toContain("DELETE FROM permission_policies");
306
- (0, vitest_1.expect)(descendantDeleteCall[1]).toEqual([["child-1", "child-2"], "can_access_reports"]);
307
- // Verify parent policy deletion
308
- const parentDeleteCall = mockQuery.mock.calls[3];
309
- (0, vitest_1.expect)(parentDeleteCall[0]).toContain("DELETE FROM permission_policies WHERE id");
310
- (0, vitest_1.expect)(parentDeleteCall[1]).toEqual(["policy-parent"]);
311
- });
312
- (0, vitest_1.it)("PERMANENT: cannot revoke a PERMANENT permission", async () => {
313
- const pool = (0, test_helpers_js_1.makeMockPool)();
314
- const mockQuery = vitest_1.vi.fn();
315
- mockQuery.mockResolvedValueOnce({
316
- rows: [
317
- {
318
- id: "policy-perm",
319
- tenant_id: "tenant-id",
320
- key: "immutable_perm",
321
- value: JSON.stringify(true),
322
- mode: core_1.PermissionMode.INHERITED,
323
- revocation_mode: core_1.RevocationMode.PERMANENT,
324
- source_tenant_id: "tenant-id",
325
- created_at: "2024-01-01T00:00:00.000Z",
326
- updated_at: "2024-01-01T00:00:00.000Z",
327
- },
328
- ],
329
- });
330
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
331
- const client = { query: mockQuery };
332
- return fn(client);
333
- });
334
- await (0, vitest_1.expect)(permissionService.deletePermission(pool, "tenant-id", "policy-perm")).rejects.toThrow(core_1.PermissionRevocationDeniedError);
335
- });
336
- (0, vitest_1.it)("SOFT: deletes only the policy, leaving descendants intact", async () => {
337
- const pool = (0, test_helpers_js_1.makeMockPool)();
338
- const mockQuery = vitest_1.vi.fn();
339
- mockQuery.mockResolvedValueOnce({
340
- rows: [
341
- {
342
- id: "policy-soft",
343
- tenant_id: "tenant-id",
344
- key: "soft_perm",
345
- value: JSON.stringify(true),
346
- mode: core_1.PermissionMode.INHERITED,
347
- revocation_mode: core_1.RevocationMode.SOFT,
348
- source_tenant_id: "tenant-id",
349
- created_at: "2024-01-01T00:00:00.000Z",
350
- updated_at: "2024-01-01T00:00:00.000Z",
351
- },
352
- ],
353
- });
354
- // Only one DELETE for the policy itself
355
- mockQuery.mockResolvedValueOnce({ rowCount: 1 });
356
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
357
- const client = { query: mockQuery };
358
- return fn(client);
359
- });
360
- await permissionService.deletePermission(pool, "tenant-id", "policy-soft");
361
- // Only 2 queries: select existing + delete self
362
- (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(2);
363
- (0, vitest_1.expect)(mockQuery.mock.calls[1][0]).toContain("DELETE FROM permission_policies WHERE id");
364
- });
365
- (0, vitest_1.it)("throws PermissionNotFoundError when policy does not exist", async () => {
366
- const pool = (0, test_helpers_js_1.makeMockPool)();
367
- const mockQuery = vitest_1.vi.fn().mockResolvedValueOnce({ rows: [] });
368
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
369
- const client = { query: mockQuery };
370
- return fn(client);
371
- });
372
- await (0, vitest_1.expect)(permissionService.deletePermission(pool, "tenant-id", "nonexistent")).rejects.toThrow(core_1.PermissionNotFoundError);
373
- });
374
- });
375
- // ---------------------------------------------------------------------------
376
- // createPermission
377
- // ---------------------------------------------------------------------------
378
- (0, vitest_1.describe)("createPermission", () => {
379
- (0, vitest_1.it)("rejects when ancestor has LOCKED the key", async () => {
380
- const pool = (0, test_helpers_js_1.makeMockPool)();
381
- const mockQuery = vitest_1.vi.fn();
382
- // Query 1: ancestry_path
383
- mockQuery.mockResolvedValueOnce({
384
- rows: [{ ancestry_path: "/ancestor-id" }],
385
- });
386
- // Query 2: ancestor lock check
387
- mockQuery.mockResolvedValueOnce({
388
- rows: [
389
- {
390
- id: "locked-policy",
391
- tenant_id: "ancestor-id",
392
- key: "locked_perm",
393
- mode: core_1.PermissionMode.LOCKED,
394
- source_tenant_id: "ancestor-id",
395
- },
396
- ],
397
- });
398
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
399
- const client = { query: mockQuery };
400
- return fn(client);
401
- });
402
- await (0, vitest_1.expect)(permissionService.createPermission(pool, "child-id", {
403
- key: "locked_perm",
404
- value: true,
405
- mode: core_1.PermissionMode.INHERITED,
406
- revocation_mode: core_1.RevocationMode.CASCADE,
407
- })).rejects.toThrow(core_1.PermissionLockedError);
408
- });
409
- (0, vitest_1.it)("creates permission successfully when no ancestor lock exists", async () => {
410
- const pool = (0, test_helpers_js_1.makeMockPool)();
411
- const mockQuery = vitest_1.vi.fn();
412
- // ancestry_path
413
- mockQuery.mockResolvedValueOnce({
414
- rows: [{ ancestry_path: "/parent-id" }],
415
- });
416
- // no locked ancestors
417
- mockQuery.mockResolvedValueOnce({ rows: [] });
418
- // INSERT returning new policy
419
- const newPolicy = {
420
- id: "new-policy-id",
421
- tenant_id: "child-id",
422
- key: "new_perm",
423
- value: JSON.stringify(true),
424
- mode: core_1.PermissionMode.INHERITED,
425
- revocation_mode: core_1.RevocationMode.CASCADE,
426
- source_tenant_id: "child-id",
427
- created_at: "2024-01-01T00:00:00.000Z",
428
- updated_at: "2024-01-01T00:00:00.000Z",
429
- };
430
- mockQuery.mockResolvedValueOnce({ rows: [newPolicy] });
431
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
432
- const client = { query: mockQuery };
433
- return fn(client);
434
- });
435
- const result = await permissionService.createPermission(pool, "child-id", {
436
- key: "new_perm",
437
- value: true,
438
- mode: core_1.PermissionMode.INHERITED,
439
- revocation_mode: core_1.RevocationMode.CASCADE,
440
- });
441
- (0, vitest_1.expect)(result.id).toBe("new-policy-id");
442
- (0, vitest_1.expect)(result.key).toBe("new_perm");
443
- });
444
- (0, vitest_1.it)("root tenant skips ancestor lock check", async () => {
445
- const pool = (0, test_helpers_js_1.makeMockPool)();
446
- const mockQuery = vitest_1.vi.fn();
447
- // Root has ancestry_path "/"
448
- mockQuery.mockResolvedValueOnce({
449
- rows: [{ ancestry_path: "/" }],
450
- });
451
- // No lock check query issued (ancestorIds.length === 0)
452
- // Direct to INSERT
453
- const newPolicy = {
454
- id: "root-policy",
455
- tenant_id: "root-id",
456
- key: "admin_access",
457
- value: JSON.stringify(true),
458
- mode: core_1.PermissionMode.LOCKED,
459
- revocation_mode: core_1.RevocationMode.CASCADE,
460
- source_tenant_id: "root-id",
461
- created_at: "2024-01-01T00:00:00.000Z",
462
- updated_at: "2024-01-01T00:00:00.000Z",
463
- };
464
- mockQuery.mockResolvedValueOnce({ rows: [newPolicy] });
465
- vitest_1.vi.mocked(poolHelpers.withTransaction).mockImplementation(async (_pool, fn) => {
466
- const client = { query: mockQuery };
467
- return fn(client);
468
- });
469
- const result = await permissionService.createPermission(pool, "root-id", {
470
- key: "admin_access",
471
- value: true,
472
- mode: core_1.PermissionMode.LOCKED,
473
- revocation_mode: core_1.RevocationMode.CASCADE,
474
- });
475
- (0, vitest_1.expect)(result.id).toBe("root-policy");
476
- // Only 2 queries: ancestry + INSERT (no lock check)
477
- (0, vitest_1.expect)(mockQuery).toHaveBeenCalledTimes(2);
478
- });
479
- });
480
- //# sourceMappingURL=permission-service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permission-service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/permission-service.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=retention-service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retention-service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/retention-service.test.ts"],"names":[],"mappings":""}