@proteinjs/user-server 1.11.1 → 1.13.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 (49) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/generated/index.d.ts.map +1 -1
  3. package/dist/generated/index.js +3 -1
  4. package/dist/generated/index.js.map +1 -1
  5. package/dist/src/authorization/UserActivityStamp.d.ts +32 -0
  6. package/dist/src/authorization/UserActivityStamp.d.ts.map +1 -0
  7. package/dist/src/authorization/UserActivityStamp.js +126 -0
  8. package/dist/src/authorization/UserActivityStamp.js.map +1 -0
  9. package/dist/src/authorization/userCache.d.ts.map +1 -1
  10. package/dist/src/authorization/userCache.js +9 -0
  11. package/dist/src/authorization/userCache.js.map +1 -1
  12. package/dist/src/migrations/SweepMalformedAccessGrants.d.ts +76 -0
  13. package/dist/src/migrations/SweepMalformedAccessGrants.d.ts.map +1 -0
  14. package/dist/src/migrations/SweepMalformedAccessGrants.js +354 -0
  15. package/dist/src/migrations/SweepMalformedAccessGrants.js.map +1 -0
  16. package/dist/src/routes/devLogin.d.ts +5 -0
  17. package/dist/src/routes/devLogin.d.ts.map +1 -1
  18. package/dist/src/routes/devLogin.js +13 -0
  19. package/dist/src/routes/devLogin.js.map +1 -1
  20. package/dist/src/services/Roles.d.ts +2 -0
  21. package/dist/src/services/Roles.d.ts.map +1 -1
  22. package/dist/src/services/Roles.js +22 -2
  23. package/dist/src/services/Roles.js.map +1 -1
  24. package/dist/test/DevLogin.test.js +41 -0
  25. package/dist/test/DevLogin.test.js.map +1 -1
  26. package/dist/test/MachineAccounts.integration.test.js +91 -7
  27. package/dist/test/MachineAccounts.integration.test.js.map +1 -1
  28. package/dist/test/Roles.integration.test.js +141 -2
  29. package/dist/test/Roles.integration.test.js.map +1 -1
  30. package/dist/test/SweepMalformedAccessGrants.integration.test.d.ts +2 -0
  31. package/dist/test/SweepMalformedAccessGrants.integration.test.d.ts.map +1 -0
  32. package/dist/test/SweepMalformedAccessGrants.integration.test.js +424 -0
  33. package/dist/test/SweepMalformedAccessGrants.integration.test.js.map +1 -0
  34. package/dist/test/UserActivityStamp.integration.test.d.ts +2 -0
  35. package/dist/test/UserActivityStamp.integration.test.d.ts.map +1 -0
  36. package/dist/test/UserActivityStamp.integration.test.js +255 -0
  37. package/dist/test/UserActivityStamp.integration.test.js.map +1 -0
  38. package/generated/index.ts +3 -1
  39. package/package.json +4 -3
  40. package/src/authorization/UserActivityStamp.ts +66 -0
  41. package/src/authorization/userCache.ts +9 -0
  42. package/src/migrations/SweepMalformedAccessGrants.ts +229 -0
  43. package/src/routes/devLogin.ts +15 -0
  44. package/src/services/Roles.ts +28 -2
  45. package/test/DevLogin.test.ts +26 -0
  46. package/test/MachineAccounts.integration.test.ts +76 -33
  47. package/test/Roles.integration.test.ts +67 -2
  48. package/test/SweepMalformedAccessGrants.integration.test.ts +255 -0
  49. package/test/UserActivityStamp.integration.test.ts +122 -0
@@ -0,0 +1,424 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var db_1 = require("@proteinjs/db");
40
+ var reflection_1 = require("@proteinjs/reflection");
41
+ var user_1 = require("@proteinjs/user");
42
+ var SweepMalformedAccessGrants_1 = require("../src/migrations/SweepMalformedAccessGrants");
43
+ var UserServerTestEnvironment_1 = require("./UserServerTestEnvironment");
44
+ var testEnv = new UserServerTestEnvironment_1.UserServerTestEnvironment();
45
+ var objectCache = function () { return reflection_1.SourceRepository.get().objectCache; };
46
+ /** Same harness cast as MachineAccounts.integration.test.ts: recompute the static watcher map on the next Db. */
47
+ var resetTableWatcherMap = function () {
48
+ var runner = (0, db_1.getDbAsSystem)().tableWatcherRunner;
49
+ runner.constructor.tableWatcherMap = undefined;
50
+ };
51
+ /**
52
+ * Observes access_grant deletes the way the app's watchers do (ContentReferenceAccessGrantTableWatcher
53
+ * lives in space-common, above this package): a delete that rides the Db layer lands here with the
54
+ * deleted rows; a raw-SQL delete never would.
55
+ */
56
+ var RecordingAccessGrantWatcher = /** @class */ (function () {
57
+ function RecordingAccessGrantWatcher() {
58
+ }
59
+ RecordingAccessGrantWatcher.prototype.name = function () {
60
+ return 'RecordingAccessGrantWatcher';
61
+ };
62
+ RecordingAccessGrantWatcher.prototype.table = function () {
63
+ return user_1.tables.AccessGrant;
64
+ };
65
+ RecordingAccessGrantWatcher.prototype.afterDelete = function (_count, deletedRecords) {
66
+ return __awaiter(this, void 0, void 0, function () {
67
+ var _i, deletedRecords_1, record;
68
+ return __generator(this, function (_a) {
69
+ for (_i = 0, deletedRecords_1 = deletedRecords; _i < deletedRecords_1.length; _i++) {
70
+ record = deletedRecords_1[_i];
71
+ RecordingAccessGrantWatcher.deletedIds.push(record.id);
72
+ }
73
+ return [2 /*return*/];
74
+ });
75
+ });
76
+ };
77
+ RecordingAccessGrantWatcher.deletedIds = [];
78
+ return RecordingAccessGrantWatcher;
79
+ }());
80
+ /**
81
+ * SweepMalformedAccessGrants (one-time migration): the AccessGrant well-formedness invariant now
82
+ * refuses a grant with no principal or resource id, but the rows its two pre-fix producers left
83
+ * behind (the test environment's NULL-principal `thought` grant that crashed Deploy to Test
84
+ * 32614670162) are still there. The sweep deletes EXACTLY the invariant's complement
85
+ * (`principal IS NULL OR resource IS NULL`) by id through the Db layer — watchers fire — and
86
+ * nothing else: well-formed grants survive, and DANGLING grants (non-null ids pointing at purged
87
+ * rows) are reported, never deleted. Idempotent.
88
+ *
89
+ * Red-first: written against the contract; a no-op sweep fails the delete legs, and a sweep on
90
+ * the wrong predicate fails the well-formed-survives legs.
91
+ */
92
+ describe('SweepMalformedAccessGrants — deletes exactly the malformed rows through the Db layer; reports dangling; idempotent', function () {
93
+ var owner;
94
+ var grantee;
95
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
96
+ return __generator(this, function (_a) {
97
+ switch (_a.label) {
98
+ case 0: return [4 /*yield*/, testEnv.beforeAll()];
99
+ case 1:
100
+ _a.sent();
101
+ // The dangling report resolves resource tables by name off the source graph (none is loaded
102
+ // in tests) — register exactly this package's tables, as the app's composition would.
103
+ objectCache()['@proteinjs/db/Table'] = Object.values(user_1.tables);
104
+ objectCache()['@proteinjs/db/TableWatcher'] = [new RecordingAccessGrantWatcher()];
105
+ resetTableWatcherMap();
106
+ return [2 /*return*/];
107
+ }
108
+ });
109
+ }); }, 120000);
110
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
111
+ return __generator(this, function (_a) {
112
+ switch (_a.label) {
113
+ case 0:
114
+ delete objectCache()['@proteinjs/db/Table'];
115
+ delete objectCache()['@proteinjs/db/TableWatcher'];
116
+ resetTableWatcherMap();
117
+ return [4 /*yield*/, testEnv.afterAll()];
118
+ case 1:
119
+ _a.sent();
120
+ return [2 /*return*/];
121
+ }
122
+ });
123
+ }); }, 60000);
124
+ beforeEach(function () { return __awaiter(void 0, void 0, void 0, function () {
125
+ var db;
126
+ return __generator(this, function (_a) {
127
+ switch (_a.label) {
128
+ case 0:
129
+ db = (0, db_1.getDbAsSystem)();
130
+ return [4 /*yield*/, db.delete(user_1.tables.AccessGrant, {})];
131
+ case 1:
132
+ _a.sent();
133
+ return [4 /*yield*/, db.delete(user_1.tables.User, {})];
134
+ case 2:
135
+ _a.sent();
136
+ RecordingAccessGrantWatcher.deletedIds = [];
137
+ return [4 /*yield*/, testEnv.createUser({ name: 'Owner', email: 'owner@test.local' })];
138
+ case 3:
139
+ owner = _a.sent();
140
+ return [4 /*yield*/, testEnv.createUser({ name: 'Grantee', email: 'grantee@test.local' })];
141
+ case 4:
142
+ grantee = _a.sent();
143
+ return [2 /*return*/];
144
+ }
145
+ });
146
+ }); });
147
+ /** A well-formed grant, inserted as system (the invariant admits it). Resource rides the user table here. */
148
+ function insertGrant(args) {
149
+ var _a;
150
+ return __awaiter(this, void 0, void 0, function () {
151
+ var resourceTable;
152
+ return __generator(this, function (_b) {
153
+ switch (_b.label) {
154
+ case 0:
155
+ resourceTable = (_a = args.resourceTable) !== null && _a !== void 0 ? _a : user_1.tables.User.name;
156
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().insert(user_1.tables.AccessGrant, {
157
+ principal: new db_1.Reference(user_1.tables.User.name, args.principalId),
158
+ resource: new db_1.Reference(resourceTable, args.resourceId),
159
+ resourceTable: resourceTable,
160
+ accessLevel: args.accessLevel,
161
+ })];
162
+ case 1: return [2 /*return*/, _b.sent()];
163
+ }
164
+ });
165
+ });
166
+ }
167
+ /**
168
+ * Seed the malformed shape BENEATH the insert invariant (which rightly refuses it now): insert
169
+ * well-formed, then null the reference in place — the row the environment actually holds.
170
+ */
171
+ function nullOut(grantId, field) {
172
+ return __awaiter(this, void 0, void 0, function () {
173
+ var _a;
174
+ return __generator(this, function (_b) {
175
+ switch (_b.label) {
176
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().update(user_1.tables.AccessGrant, (_a = {}, _a[field] = null, _a), { id: grantId })];
177
+ case 1:
178
+ _b.sent();
179
+ return [2 /*return*/];
180
+ }
181
+ });
182
+ });
183
+ }
184
+ function grantById(id) {
185
+ return __awaiter(this, void 0, void 0, function () {
186
+ return __generator(this, function (_a) {
187
+ switch (_a.label) {
188
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.AccessGrant, { id: id })];
189
+ case 1: return [2 /*return*/, _a.sent()];
190
+ }
191
+ });
192
+ });
193
+ }
194
+ function allGrantIds() {
195
+ return __awaiter(this, void 0, void 0, function () {
196
+ var grants;
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(user_1.tables.AccessGrant, new db_1.QueryBuilder(user_1.tables.AccessGrant.name))];
200
+ case 1:
201
+ grants = _a.sent();
202
+ return [2 /*return*/, grants.map(function (grant) { return grant.id; }).sort()];
203
+ }
204
+ });
205
+ });
206
+ }
207
+ it('dry run reports without deleting; real run deletes exactly the malformed rows (watchers fire); well-formed and dangling survive; re-run is a no-op', function () { return __awaiter(void 0, void 0, void 0, function () {
208
+ var ownerGrant, readGrant, nullPrincipal, nullResource, purgedPrincipal, purgedResource, unregisteredTable, _a, _b, seededIds, _c, sweep, dry, _d, real, _e, _f, _g, _h, _j, _k, _l, _m, dangling, _o, again, _p;
209
+ var _q, _r, _s, _t, _u, _v;
210
+ return __generator(this, function (_w) {
211
+ switch (_w.label) {
212
+ case 0: return [4 /*yield*/, insertGrant({ principalId: owner.id, resourceId: owner.id, accessLevel: 'owner' })];
213
+ case 1:
214
+ ownerGrant = _w.sent();
215
+ return [4 /*yield*/, insertGrant({ principalId: grantee.id, resourceId: owner.id, accessLevel: 'read' })];
216
+ case 2:
217
+ readGrant = _w.sent();
218
+ return [4 /*yield*/, insertGrant({ principalId: grantee.id, resourceId: owner.id, accessLevel: 'write' })];
219
+ case 3:
220
+ nullPrincipal = _w.sent();
221
+ return [4 /*yield*/, nullOut(nullPrincipal.id, 'principal')];
222
+ case 4:
223
+ _w.sent();
224
+ return [4 /*yield*/, insertGrant({ principalId: grantee.id, resourceId: owner.id, accessLevel: 'admin' })];
225
+ case 5:
226
+ nullResource = _w.sent();
227
+ return [4 /*yield*/, nullOut(nullResource.id, 'resource')];
228
+ case 6:
229
+ _w.sent();
230
+ return [4 /*yield*/, insertGrant({
231
+ principalId: 'purged-user',
232
+ resourceId: owner.id,
233
+ accessLevel: 'read',
234
+ })];
235
+ case 7:
236
+ purgedPrincipal = _w.sent();
237
+ return [4 /*yield*/, insertGrant({
238
+ principalId: grantee.id,
239
+ resourceId: 'purged-row',
240
+ accessLevel: 'read',
241
+ })];
242
+ case 8:
243
+ purgedResource = _w.sent();
244
+ return [4 /*yield*/, insertGrant({
245
+ principalId: grantee.id,
246
+ resourceId: 'some-thought',
247
+ resourceTable: 'thought',
248
+ accessLevel: 'write',
249
+ })];
250
+ case 9:
251
+ unregisteredTable = _w.sent();
252
+ _a = expect;
253
+ return [4 /*yield*/, grantById(nullPrincipal.id)];
254
+ case 10:
255
+ _a.apply(void 0, [(_r = (_q = (_w.sent())) === null || _q === void 0 ? void 0 : _q.principal) !== null && _r !== void 0 ? _r : null]).toBeNull();
256
+ _b = expect;
257
+ return [4 /*yield*/, grantById(nullResource.id)];
258
+ case 11:
259
+ _b.apply(void 0, [(_t = (_s = (_w.sent())) === null || _s === void 0 ? void 0 : _s.resource) !== null && _t !== void 0 ? _t : null]).toBeNull();
260
+ seededIds = [
261
+ ownerGrant.id,
262
+ readGrant.id,
263
+ nullPrincipal.id,
264
+ nullResource.id,
265
+ purgedPrincipal.id,
266
+ purgedResource.id,
267
+ unregisteredTable.id,
268
+ ].sort();
269
+ _c = expect;
270
+ return [4 /*yield*/, allGrantIds()];
271
+ case 12:
272
+ _c.apply(void 0, [_w.sent()]).toEqual(seededIds);
273
+ sweep = new SweepMalformedAccessGrants_1.SweepMalformedAccessGrants();
274
+ return [4 /*yield*/, sweep.sweep({ dryRun: true })];
275
+ case 13:
276
+ dry = _w.sent();
277
+ expect(dry.dryRun).toBe(true);
278
+ expect(dry.malformed).toBe(2);
279
+ expect(dry.rows.map(function (row) { return row.id; }).sort()).toEqual([nullPrincipal.id, nullResource.id].sort());
280
+ expect(dry.rows.find(function (row) { return row.id === nullPrincipal.id; })).toMatchObject({
281
+ resourceTable: user_1.tables.User.name,
282
+ accessLevel: 'write',
283
+ });
284
+ expect(dry.rows.every(function (row) { return typeof row.created === 'string' && row.created.length > 0; })).toBe(true);
285
+ _d = expect;
286
+ return [4 /*yield*/, allGrantIds()];
287
+ case 14:
288
+ _d.apply(void 0, [_w.sent()]).toEqual(seededIds);
289
+ expect(RecordingAccessGrantWatcher.deletedIds).toEqual([]);
290
+ return [4 /*yield*/, sweep.sweep({ dryRun: false })];
291
+ case 15:
292
+ real = _w.sent();
293
+ expect(real.dryRun).toBe(false);
294
+ expect(real.malformed).toBe(2);
295
+ _e = expect;
296
+ return [4 /*yield*/, grantById(nullPrincipal.id)];
297
+ case 16:
298
+ _e.apply(void 0, [_w.sent()]).toBeUndefined();
299
+ _f = expect;
300
+ return [4 /*yield*/, grantById(nullResource.id)];
301
+ case 17:
302
+ _f.apply(void 0, [_w.sent()]).toBeUndefined();
303
+ // The after-delete watchers saw precisely the deleted rows — the delete rode the Db layer.
304
+ expect(RecordingAccessGrantWatcher.deletedIds.sort()).toEqual([nullPrincipal.id, nullResource.id].sort());
305
+ // Well-formed rows intact, levels unchanged.
306
+ _g = expect;
307
+ return [4 /*yield*/, grantById(ownerGrant.id)];
308
+ case 18:
309
+ // Well-formed rows intact, levels unchanged.
310
+ _g.apply(void 0, [(_u = (_w.sent())) === null || _u === void 0 ? void 0 : _u.accessLevel]).toBe('owner');
311
+ _h = expect;
312
+ return [4 /*yield*/, grantById(readGrant.id)];
313
+ case 19:
314
+ _h.apply(void 0, [(_v = (_w.sent())) === null || _v === void 0 ? void 0 : _v.accessLevel]).toBe('read');
315
+ // Dangling rows intact — reported below, not deleted.
316
+ _j = expect;
317
+ return [4 /*yield*/, grantById(purgedPrincipal.id)];
318
+ case 20:
319
+ // Dangling rows intact — reported below, not deleted.
320
+ _j.apply(void 0, [_w.sent()]).toBeDefined();
321
+ _k = expect;
322
+ return [4 /*yield*/, grantById(purgedResource.id)];
323
+ case 21:
324
+ _k.apply(void 0, [_w.sent()]).toBeDefined();
325
+ _l = expect;
326
+ return [4 /*yield*/, grantById(unregisteredTable.id)];
327
+ case 22:
328
+ _l.apply(void 0, [_w.sent()]).toBeDefined();
329
+ _m = expect;
330
+ return [4 /*yield*/, allGrantIds()];
331
+ case 23:
332
+ _m.apply(void 0, [_w.sent()]).toEqual([ownerGrant.id, readGrant.id, purgedPrincipal.id, purgedResource.id, unregisteredTable.id].sort());
333
+ return [4 /*yield*/, sweep.reportDangling()];
334
+ case 24:
335
+ dangling = _w.sent();
336
+ expect(dangling.danglingPrincipal).toBe(1);
337
+ expect(dangling.danglingResource).toBe(2);
338
+ expect(dangling.rows.find(function (row) { return row.id === purgedPrincipal.id; })).toMatchObject({
339
+ principal: 'purged-user',
340
+ reason: 'principal missing',
341
+ });
342
+ expect(dangling.rows.find(function (row) { return row.id === purgedResource.id; })).toMatchObject({
343
+ resource: 'purged-row',
344
+ reason: 'resource missing',
345
+ });
346
+ expect(dangling.rows.find(function (row) { return row.id === unregisteredTable.id; })).toMatchObject({
347
+ resourceTable: 'thought',
348
+ reason: 'resource table not registered',
349
+ });
350
+ expect(dangling.rows.map(function (row) { return row.id; })).not.toContain(ownerGrant.id);
351
+ expect(dangling.rows.map(function (row) { return row.id; })).not.toContain(readGrant.id);
352
+ _o = expect;
353
+ return [4 /*yield*/, allGrantIds()];
354
+ case 25:
355
+ _o.apply(void 0, [_w.sent()]).toEqual([ownerGrant.id, readGrant.id, purgedPrincipal.id, purgedResource.id, unregisteredTable.id].sort());
356
+ // ---------- IDEMPOTENCY: a second real run finds nothing, deletes nothing ----------
357
+ RecordingAccessGrantWatcher.deletedIds = [];
358
+ return [4 /*yield*/, sweep.sweep({ dryRun: false })];
359
+ case 26:
360
+ again = _w.sent();
361
+ expect(again.malformed).toBe(0);
362
+ expect(again.rows).toEqual([]);
363
+ expect(RecordingAccessGrantWatcher.deletedIds).toEqual([]);
364
+ _p = expect;
365
+ return [4 /*yield*/, allGrantIds()];
366
+ case 27:
367
+ _p.apply(void 0, [_w.sent()]).toEqual([ownerGrant.id, readGrant.id, purgedPrincipal.id, purgedResource.id, unregisteredTable.id].sort());
368
+ return [2 /*return*/];
369
+ }
370
+ });
371
+ }); }, 120000);
372
+ it('the migration record runs dry-run pass, delete pass, and dangling report; its output carries the rows; a second run is zero', function () { return __awaiter(void 0, void 0, void 0, function () {
373
+ var ownerGrant, nullPrincipal, purgedPrincipal, migration, output, _a, second, _b;
374
+ return __generator(this, function (_c) {
375
+ switch (_c.label) {
376
+ case 0: return [4 /*yield*/, insertGrant({ principalId: owner.id, resourceId: owner.id, accessLevel: 'owner' })];
377
+ case 1:
378
+ ownerGrant = _c.sent();
379
+ return [4 /*yield*/, insertGrant({ principalId: grantee.id, resourceId: owner.id, accessLevel: 'read' })];
380
+ case 2:
381
+ nullPrincipal = _c.sent();
382
+ return [4 /*yield*/, nullOut(nullPrincipal.id, 'principal')];
383
+ case 3:
384
+ _c.sent();
385
+ return [4 /*yield*/, insertGrant({
386
+ principalId: 'purged-user',
387
+ resourceId: owner.id,
388
+ accessLevel: 'read',
389
+ })];
390
+ case 4:
391
+ purgedPrincipal = _c.sent();
392
+ migration = new SweepMalformedAccessGrants_1.SweepMalformedAccessGrants();
393
+ expect(migration.table.name).toBe('migration');
394
+ return [4 /*yield*/, migration.record.run()];
395
+ case 5:
396
+ output = _c.sent();
397
+ expect(output).toMatchObject({
398
+ malformedDryRun: 1,
399
+ malformed: 1,
400
+ danglingPrincipal: 1,
401
+ danglingResource: 0,
402
+ });
403
+ expect(output.malformedRows.map(function (row) { return row.id; })).toEqual([nullPrincipal.id]);
404
+ expect(output.danglingRows.map(function (row) { return row.id; })).toEqual([purgedPrincipal.id]);
405
+ _a = expect;
406
+ return [4 /*yield*/, allGrantIds()];
407
+ case 6:
408
+ _a.apply(void 0, [_c.sent()]).toEqual([ownerGrant.id, purgedPrincipal.id].sort());
409
+ expect(RecordingAccessGrantWatcher.deletedIds).toEqual([nullPrincipal.id]);
410
+ return [4 /*yield*/, migration.record.run()];
411
+ case 7:
412
+ second = _c.sent();
413
+ expect(second).toMatchObject({ malformedDryRun: 0, malformed: 0, danglingPrincipal: 1, danglingResource: 0 });
414
+ expect(second.malformedRows).toEqual([]);
415
+ _b = expect;
416
+ return [4 /*yield*/, allGrantIds()];
417
+ case 8:
418
+ _b.apply(void 0, [_c.sent()]).toEqual([ownerGrant.id, purgedPrincipal.id].sort());
419
+ return [2 /*return*/];
420
+ }
421
+ });
422
+ }); }, 120000);
423
+ });
424
+ //# sourceMappingURL=SweepMalformedAccessGrants.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SweepMalformedAccessGrants.integration.test.js","sourceRoot":"","sources":["../../test/SweepMalformedAccessGrants.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=UserActivityStamp.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserActivityStamp.integration.test.d.ts","sourceRoot":"","sources":["../../test/UserActivityStamp.integration.test.ts"],"names":[],"mappings":""}