@substrat-run/contract-tests 0.146.0 → 0.148.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 (70) hide show
  1. package/dist/bind-module.d.ts +4 -0
  2. package/dist/bind-module.d.ts.map +1 -1
  3. package/dist/capability-expiry-suite.d.ts.map +1 -1
  4. package/dist/capability-expiry-suite.js +6 -4
  5. package/dist/capability-expiry-suite.js.map +1 -1
  6. package/dist/counter-runner.d.ts +22 -0
  7. package/dist/counter-runner.d.ts.map +1 -0
  8. package/dist/counter-runner.js +96 -0
  9. package/dist/counter-runner.js.map +1 -0
  10. package/dist/derived-module.d.ts +4 -0
  11. package/dist/derived-module.d.ts.map +1 -1
  12. package/dist/entity-state-module.d.ts +8 -0
  13. package/dist/entity-state-module.d.ts.map +1 -1
  14. package/dist/entity-trash-module.d.ts +4 -0
  15. package/dist/entity-trash-module.d.ts.map +1 -1
  16. package/dist/erasure-module.d.ts +4 -0
  17. package/dist/erasure-module.d.ts.map +1 -1
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/job-run-suite.d.ts.map +1 -1
  23. package/dist/job-run-suite.js +4 -0
  24. package/dist/job-run-suite.js.map +1 -1
  25. package/dist/modules.d.ts +124 -0
  26. package/dist/modules.d.ts.map +1 -1
  27. package/dist/modules.js +4 -0
  28. package/dist/modules.js.map +1 -1
  29. package/dist/permission-suite.d.ts.map +1 -1
  30. package/dist/permission-suite.js +19 -0
  31. package/dist/permission-suite.js.map +1 -1
  32. package/dist/schedule-suite.d.ts.map +1 -1
  33. package/dist/schedule-suite.js +1 -0
  34. package/dist/schedule-suite.js.map +1 -1
  35. package/dist/scope-host-suite.d.ts.map +1 -1
  36. package/dist/scope-host-suite.js +223 -0
  37. package/dist/scope-host-suite.js.map +1 -1
  38. package/dist/scope-store-runner-suite.d.ts +46 -0
  39. package/dist/scope-store-runner-suite.d.ts.map +1 -0
  40. package/dist/scope-store-runner-suite.js +187 -0
  41. package/dist/scope-store-runner-suite.js.map +1 -0
  42. package/dist/scope-store-suite.d.ts +13 -0
  43. package/dist/scope-store-suite.d.ts.map +1 -0
  44. package/dist/scope-store-suite.js +557 -0
  45. package/dist/scope-store-suite.js.map +1 -0
  46. package/dist/sql-limits-suite.d.ts.map +1 -1
  47. package/dist/sql-limits-suite.js +50 -1
  48. package/dist/sql-limits-suite.js.map +1 -1
  49. package/dist/stamps-module.d.ts +4 -0
  50. package/dist/stamps-module.d.ts.map +1 -1
  51. package/dist/store-kind-release-suite.d.ts +12 -0
  52. package/dist/store-kind-release-suite.d.ts.map +1 -0
  53. package/dist/store-kind-release-suite.js +353 -0
  54. package/dist/store-kind-release-suite.js.map +1 -0
  55. package/dist/subject-erasure-suite.d.ts.map +1 -1
  56. package/dist/subject-erasure-suite.js +15 -0
  57. package/dist/subject-erasure-suite.js.map +1 -1
  58. package/dist/system-switch-suite.js +1 -1
  59. package/dist/system-switch-suite.js.map +1 -1
  60. package/dist/upload-link-module.d.ts +168 -0
  61. package/dist/upload-link-module.d.ts.map +1 -0
  62. package/dist/upload-link-module.js +95 -0
  63. package/dist/upload-link-module.js.map +1 -0
  64. package/dist/upload-link-suite.d.ts +3 -0
  65. package/dist/upload-link-suite.d.ts.map +1 -0
  66. package/dist/upload-link-suite.js +328 -0
  67. package/dist/upload-link-suite.js.map +1 -0
  68. package/dist/vertical-events-suite.d.ts +8 -0
  69. package/dist/vertical-events-suite.d.ts.map +1 -1
  70. package/package.json +3 -3
@@ -0,0 +1,557 @@
1
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
+ import { errorCodeOf, platformActorId, principalId, scopeId, storeEraseInput, tenantId } from '@substrat-run/contracts';
3
+ import { ulid } from '@substrat-run/kernel';
4
+ import { STORE_CALL_SINK_KEY, tallyStoreCall } from '@substrat-run/kernel/invocation-line';
5
+ import { counterScopeStoreRunner, invalidStoreInput, objectNameOf } from './counter-runner.js';
6
+ /**
7
+ * The trivial kind, with what this suite reads back about the host's calls:
8
+ * `address` (what the host handed in), `erased` (the subjects erased on this object),
9
+ * `wiped` (every object wiped), and `fail-wipe` (`true` makes each later `substrat.wipe`
10
+ * answer 503, until `false`).
11
+ */
12
+ function instrumentedCounterRunner() {
13
+ const counter = counterScopeStoreRunner();
14
+ const erased = new Map();
15
+ const wiped = new Set();
16
+ let failWipe = false;
17
+ return {
18
+ ...counter,
19
+ async invoke(address, request) {
20
+ const id = objectNameOf(address);
21
+ switch (request.operation) {
22
+ case 'address': {
23
+ const { tenantId, vertical, scopeId, binding } = address;
24
+ return { result: { tenantId, vertical, scopeId, binding } };
25
+ }
26
+ case 'erased':
27
+ return { result: [...(erased.get(id) ?? [])] };
28
+ case 'wiped':
29
+ return { result: [...wiped] };
30
+ case 'fail-wipe':
31
+ if (typeof request.input !== 'boolean')
32
+ return invalidStoreInput('fail-wipe takes a boolean');
33
+ failWipe = request.input;
34
+ return { result: failWipe };
35
+ case 'substrat.wipe':
36
+ if (failWipe)
37
+ return { error: { code: 'unavailable', status: 503 } };
38
+ wiped.add(id);
39
+ return counter.invoke(address, request);
40
+ case 'substrat.erase': {
41
+ const answer = await counter.invoke(address, request);
42
+ if ('result' in answer) {
43
+ const { subjectId } = storeEraseInput.parse(request.input);
44
+ erased.set(id, (erased.get(id) ?? new Set()).add(subjectId));
45
+ }
46
+ return answer;
47
+ }
48
+ default:
49
+ return counter.invoke(address, request);
50
+ }
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Scope stores on every adapter (#2213). The fixture is handed the runner, so
56
+ * both hosts answer the same counter. The reserved name is refused by the stub.
57
+ */
58
+ export function scopeStoreContractSuite(adapterName, makeFixture) {
59
+ describe(`scope stores (#2213): ${adapterName}`, () => {
60
+ let fixture;
61
+ let host;
62
+ const staff = platformActorId.parse(ulid());
63
+ const principal = principalId.parse(ulid());
64
+ const tenant = tenantId.parse(ulid());
65
+ const scopeA = scopeId.parse(ulid());
66
+ const scopeB = scopeId.parse(ulid());
67
+ const otherVertical = scopeId.parse(ulid());
68
+ beforeAll(async () => {
69
+ fixture = await makeFixture({ runners: [{ binding: 'GRAPH', runner: instrumentedCounterRunner() }] });
70
+ host = fixture.host;
71
+ await host.admin.createTenant(staff, { id: tenant, slug: `t-${tenant.toLowerCase()}`, name: 'T' });
72
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: scopeA, vertical: 'docs' });
73
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: scopeB, vertical: 'docs' });
74
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: otherVertical, vertical: 'other' });
75
+ await host.admin.activateScope(staff, tenant, scopeA);
76
+ await host.admin.activateScope(staff, tenant, scopeB);
77
+ await host.admin.activateScope(staff, tenant, otherVertical);
78
+ });
79
+ afterAll(async () => {
80
+ await fixture?.cleanup();
81
+ });
82
+ /** A valid table no scope has: present after a restore only if the dump's tables loaded. */
83
+ const PROBE_TABLE = { name: 'restore_probe', ddl: 'CREATE TABLE restore_probe (id TEXT)', columns: ['id'], rows: [['x']] };
84
+ const tableNames = async (scope) => (await host.admin.exportScope(staff, tenant, scope)).tables.map((table) => table.name);
85
+ it('the runner is handed the tenant, the vertical, the scope and the binding', async () => {
86
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
87
+ expect(await store.invoke('address')).toEqual({
88
+ tenantId: tenant,
89
+ vertical: 'docs',
90
+ scopeId: scopeA,
91
+ binding: 'GRAPH',
92
+ });
93
+ });
94
+ it('one runner starts once when the first calls overlap', async () => {
95
+ let started = 0;
96
+ let release = () => undefined;
97
+ const gate = new Promise((resolve) => {
98
+ release = resolve;
99
+ });
100
+ const slow = {
101
+ kind: 'slow',
102
+ async start() {
103
+ started += 1;
104
+ await gate;
105
+ },
106
+ async stop() { },
107
+ async invoke() {
108
+ return { result: started };
109
+ },
110
+ };
111
+ const extra = await makeFixture({
112
+ runners: [
113
+ { binding: 'A', runner: slow },
114
+ { binding: 'B', runner: slow },
115
+ ],
116
+ });
117
+ try {
118
+ const t = tenantId.parse(ulid());
119
+ const scope = scopeId.parse(ulid());
120
+ await extra.host.admin.createTenant(staff, { id: t, slug: `t-${t.toLowerCase()}`, name: 'T' });
121
+ await extra.host.provisionScope(staff, { tenantId: t, scopeId: scope, vertical: 'docs' });
122
+ await extra.host.admin.activateScope(staff, t, scope);
123
+ const pending = Promise.all([
124
+ extra.host.getScopeStore(principal, t, scope, 'A'),
125
+ extra.host.getScopeStore(principal, t, scope, 'B'),
126
+ extra.host.getScopeStore(principal, t, scope, 'A'),
127
+ ]);
128
+ const deadline = Date.now() + 2000;
129
+ while (started === 0 && Date.now() < deadline) {
130
+ await new Promise((resolve) => setTimeout(resolve, 10));
131
+ }
132
+ expect(started).toBe(1);
133
+ release();
134
+ await pending;
135
+ expect(started).toBe(1);
136
+ }
137
+ finally {
138
+ await extra.cleanup();
139
+ }
140
+ });
141
+ it('a declared binding reaches its object', async () => {
142
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
143
+ expect(await store.invoke('increment', { by: 1 })).toBe(1);
144
+ expect(await store.invoke('read')).toBe(1);
145
+ });
146
+ it('an undeclared binding is refused', async () => {
147
+ const refusal = await host.getScopeStore(principal, tenant, scopeA, 'OTHER').then(() => undefined, (err) => err);
148
+ expect(errorCodeOf(refusal)).toBe('not_found');
149
+ });
150
+ it('two scopes never share an object', async () => {
151
+ const store = await host.getScopeStore(principal, tenant, scopeB, 'GRAPH');
152
+ expect(await store.invoke('read')).toBe(0);
153
+ });
154
+ it('two verticals never share an object', async () => {
155
+ const store = await host.getScopeStore(principal, tenant, otherVertical, 'GRAPH');
156
+ expect(await store.invoke('read')).toBe(0);
157
+ expect(await store.invoke('increment', { by: 5 })).toBe(5);
158
+ const docs = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
159
+ expect(await docs.invoke('read')).toBe(1);
160
+ });
161
+ it('an administrator reads the size of each declared store', async () => {
162
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
163
+ const current = await store.invoke('read');
164
+ expect(await host.admin.scopeStoreSizes(staff, tenant, scopeA)).toEqual([
165
+ { binding: 'GRAPH', bytes: current },
166
+ ]);
167
+ const reads = await host.admin.accessLog(staff, { tenantId: tenant, method: 'scopeStoreSizes' });
168
+ expect(reads.some((entry) => entry.scopeId === scopeA)).toBe(true);
169
+ });
170
+ it('an unknown scope is refused before a store is asked', async () => {
171
+ const refusal = await host.admin.scopeStoreSizes(staff, tenant, scopeId.parse(ulid())).then(() => undefined, (err) => err);
172
+ expect(errorCodeOf(refusal)).toBe('not_found');
173
+ });
174
+ it("an erasure reaches the store and takes the subject's part, and a second one counts zero", async () => {
175
+ const subject = ulid();
176
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
177
+ const before = Number(await store.invoke('read'));
178
+ await store.invoke('increment', { by: 2, subjectId: subject });
179
+ const first = await host.admin.shredSubject(staff, tenant, scopeA, subject);
180
+ expect(first.storeErasures).toEqual([{ binding: 'GRAPH', erased: 1 }]);
181
+ expect(await store.invoke('erased')).toEqual([subject]);
182
+ expect(await store.invoke('read')).toBe(before);
183
+ const again = await host.admin.shredSubject(staff, tenant, scopeA, subject);
184
+ expect(again.storeErasures).toEqual([{ binding: 'GRAPH', erased: 0 }]);
185
+ });
186
+ it('a snapshot carries the store, and the fork then diverges', async () => {
187
+ const original = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
188
+ const before = await original.invoke('read');
189
+ const fork = await host.snapshotScope(staff, tenant, scopeA);
190
+ const forked = await host.getScopeStore(principal, tenant, fork, 'GRAPH');
191
+ expect(await forked.invoke('read')).toBe(before);
192
+ await original.invoke('increment', { by: 1 });
193
+ expect(await forked.invoke('read')).toBe(before);
194
+ expect(await original.invoke('read')).toBe(Number(before) + 1);
195
+ });
196
+ it('a restore replaces the store', async () => {
197
+ const store = await host.getScopeStore(principal, tenant, scopeB, 'GRAPH');
198
+ await store.invoke('increment', { by: 4 });
199
+ const dump = await host.admin.exportScope(staff, tenant, scopeB);
200
+ expect(dump.stores).toEqual([
201
+ expect.objectContaining({ binding: 'GRAPH', kind: 'counter' }),
202
+ ]);
203
+ await store.invoke('increment', { by: 1 });
204
+ await host.restoreScope(staff, tenant, scopeB, dump);
205
+ expect(await store.invoke('read')).toBe(4);
206
+ });
207
+ it('a restore that names an unbound store writes nothing', async () => {
208
+ const store = await host.getScopeStore(principal, tenant, scopeB, 'GRAPH');
209
+ // scopeB carries the counter the tests above left behind.
210
+ const before = Number(await store.invoke('read'));
211
+ await store.invoke('increment', { by: 3 });
212
+ const dump = await host.admin.exportScope(staff, tenant, scopeB);
213
+ await store.invoke('increment', { by: 1 });
214
+ const refusal = await host.restoreScope(staff, tenant, scopeB, {
215
+ ...dump,
216
+ tables: [...dump.tables, PROBE_TABLE],
217
+ stores: [...dump.stores, { binding: 'MISSING', kind: 'counter', tables: [] }],
218
+ }).then(() => undefined, (err) => err);
219
+ expect(errorCodeOf(refusal)).toBe('not_found');
220
+ // Neither the restore of the dump's GRAPH (before + 3) nor its tables were written.
221
+ expect(await store.invoke('read')).toBe(before + 4);
222
+ expect(await tableNames(scopeB)).not.toContain(PROBE_TABLE.name);
223
+ });
224
+ // L8: a store of another kind would be handed to this kind's import, and a destination
225
+ // with no vertical has no store object to load into. Both refuse before any write.
226
+ it('a restore whose store is of another kind writes nothing', async () => {
227
+ const store = await host.getScopeStore(principal, tenant, scopeB, 'GRAPH');
228
+ const before = Number(await store.invoke('read'));
229
+ const dump = await host.admin.exportScope(staff, tenant, scopeB);
230
+ await store.invoke('increment', { by: 2 });
231
+ const refusal = await host.restoreScope(staff, tenant, scopeB, {
232
+ ...dump,
233
+ tables: [...dump.tables, PROBE_TABLE],
234
+ stores: dump.stores.map((one) => ({ ...one, kind: 'other' })),
235
+ }).then(() => undefined, (err) => err);
236
+ expect(errorCodeOf(refusal)).toBe('conflict');
237
+ expect(await store.invoke('read')).toBe(before + 2);
238
+ expect(await tableNames(scopeB)).not.toContain(PROBE_TABLE.name);
239
+ });
240
+ // CodeRabbit on #2244: the host does not parse the dump it is handed, so a store with no
241
+ // kind skipped the kind comparison above and was imported.
242
+ it('a restore whose store names no kind writes nothing', async () => {
243
+ const store = await host.getScopeStore(principal, tenant, scopeB, 'GRAPH');
244
+ const before = Number(await store.invoke('read'));
245
+ const dump = await host.admin.exportScope(staff, tenant, scopeB);
246
+ await store.invoke('increment', { by: 2 });
247
+ const refusal = await host.restoreScope(staff, tenant, scopeB, {
248
+ ...dump,
249
+ tables: [...dump.tables, PROBE_TABLE],
250
+ stores: dump.stores.map(({ binding, tables }) => ({ binding, tables })),
251
+ }).then(() => undefined, (err) => err);
252
+ expect(errorCodeOf(refusal)).toBe('validation_failed');
253
+ expect(await store.invoke('read')).toBe(before + 2);
254
+ expect(await tableNames(scopeB)).not.toContain(PROBE_TABLE.name);
255
+ });
256
+ it('a dump carrying stores is refused, not dropped, by a scope with no vertical', async () => {
257
+ const bare = scopeId.parse(ulid());
258
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: bare });
259
+ await host.admin.activateScope(staff, tenant, bare);
260
+ const dump = await host.admin.exportScope(staff, tenant, scopeA);
261
+ expect(dump.stores.length).toBeGreaterThan(0);
262
+ const restored = await host.restoreScope(staff, tenant, bare, { ...dump, tables: [...dump.tables, PROBE_TABLE] }).then(() => undefined, (err) => err);
263
+ expect(errorCodeOf(restored)).toBe('conflict');
264
+ expect(await tableNames(bare)).not.toContain(PROBE_TABLE.name);
265
+ const dest = scopeId.parse(ulid());
266
+ const imported = await host.importScope(staff, { tenantId: tenant, scopeId: dest }, dump).then(() => undefined, (err) => err);
267
+ expect(errorCodeOf(imported)).toBe('conflict');
268
+ expect(await host.admin.getScopeRecord(staff, tenant, dest)).toBeUndefined();
269
+ });
270
+ // The scope's tables load before its stores: a dump whose tables cannot load leaves the
271
+ // store as it was, rather than replaced under tables that never arrived.
272
+ it('a restore whose tables cannot load leaves the store as it was', async () => {
273
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
274
+ const dump = await host.admin.exportScope(staff, tenant, scopeA);
275
+ await store.invoke('increment', { by: 5 });
276
+ const now = Number(await store.invoke('read'));
277
+ const refusal = await host.restoreScope(staff, tenant, scopeA, {
278
+ ...dump,
279
+ tables: [...dump.tables, { name: 'unloadable', ddl: 'CREATE TABLE something_else (id TEXT)', columns: ['id'], rows: [] }],
280
+ }).then(() => undefined, (err) => err);
281
+ expect(refusal).toBeDefined();
282
+ expect(await store.invoke('read')).toBe(now);
283
+ });
284
+ it('a dump that names an unbound store is refused before a scope is created', async () => {
285
+ const dump = await host.admin.exportScope(staff, tenant, scopeA);
286
+ const dest = scopeId.parse(ulid());
287
+ const refusal = await host.importScope(staff, {
288
+ tenantId: tenant,
289
+ scopeId: dest,
290
+ vertical: 'docs',
291
+ }, { ...dump, stores: [...dump.stores, { binding: 'MISSING', kind: 'counter', tables: [] }] }).then(() => undefined, (err) => err);
292
+ expect(errorCodeOf(refusal)).toBe('not_found');
293
+ expect(await host.admin.getScopeRecord(staff, tenant, dest)).toBeUndefined();
294
+ });
295
+ it('deleting a fork whose wipe fails leaves the fork and its storage', async () => {
296
+ const fork = await host.snapshotScope(staff, tenant, scopeA);
297
+ const seeded = await host.admin.exportScope(staff, tenant, fork);
298
+ await host.restoreScope(staff, tenant, fork, { ...seeded, tables: [...seeded.tables, PROBE_TABLE] });
299
+ const store = await host.getScopeStore(principal, tenant, fork, 'GRAPH');
300
+ await store.invoke('fail-wipe', true);
301
+ try {
302
+ const refusal = await host.deleteSnapshot(staff, tenant, fork).then(() => undefined, (err) => err);
303
+ expect(refusal).toBeDefined();
304
+ expect(await host.admin.getScopeRecord(staff, tenant, fork)).toBeDefined();
305
+ expect(await tableNames(fork)).toContain(PROBE_TABLE.name);
306
+ }
307
+ finally {
308
+ await store.invoke('fail-wipe', false);
309
+ }
310
+ await host.deleteSnapshot(staff, tenant, fork);
311
+ });
312
+ it('deleting a fork wipes its store', async () => {
313
+ const fork = await host.snapshotScope(staff, tenant, scopeA);
314
+ await host.deleteSnapshot(staff, tenant, fork);
315
+ const live = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
316
+ const names = await live.invoke('wiped');
317
+ expect(names).toContain(`${tenant}/docs/${fork}/GRAPH`);
318
+ });
319
+ // L7: the wipe runs before the scope's storage goes, so a wipe that fails leaves the
320
+ // scope archived and its data where it was, and the reap converges on a retry.
321
+ it('a reap whose wipe fails leaves the scope archived and its data intact', async () => {
322
+ const doomed = scopeId.parse(ulid());
323
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: doomed, vertical: 'docs' });
324
+ await host.admin.activateScope(staff, tenant, doomed);
325
+ const store = await host.getScopeStore(principal, tenant, doomed, 'GRAPH');
326
+ await store.invoke('increment', { by: 7 });
327
+ // A table in the scope's own storage, so its survival is visible as well as the store's.
328
+ const seeded = await host.admin.exportScope(staff, tenant, doomed);
329
+ await host.restoreScope(staff, tenant, doomed, { ...seeded, tables: [...seeded.tables, PROBE_TABLE] });
330
+ expect(await tableNames(doomed)).toContain(PROBE_TABLE.name);
331
+ await host.admin.archiveScope(staff, tenant, doomed);
332
+ await store.invoke('fail-wipe', true);
333
+ try {
334
+ const refusal = await host.admin.reapScope(staff, tenant, doomed).then(() => undefined, (err) => err);
335
+ expect(refusal).toBeDefined();
336
+ expect((await host.admin.getScopeRecord(staff, tenant, doomed))?.status).toBe('archived');
337
+ const dump = await host.admin.exportScope(staff, tenant, doomed);
338
+ expect(dump.stores.find((one) => one.binding === 'GRAPH')?.tables[0]?.rows).toEqual([[null, 7]]);
339
+ expect(dump.tables.map((table) => table.name)).toContain(PROBE_TABLE.name);
340
+ }
341
+ finally {
342
+ await store.invoke('fail-wipe', false);
343
+ }
344
+ await host.admin.reapScope(staff, tenant, doomed);
345
+ expect((await host.admin.getScopeRecord(staff, tenant, doomed))?.status).toBe('reaped');
346
+ });
347
+ it('reaping a scope wipes its store', async () => {
348
+ await host.admin.archiveScope(staff, tenant, scopeB);
349
+ await host.admin.reapScope(staff, tenant, scopeB);
350
+ const live = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
351
+ const names = await live.invoke('wiped');
352
+ expect(names).toContain(`${tenant}/docs/${scopeB}/GRAPH`);
353
+ });
354
+ it('a store call is reported without its input, and a thrown observer does not fail it', async () => {
355
+ const reports = [];
356
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH', {
357
+ onStoreCall: (report) => reports.push(report),
358
+ });
359
+ const secret = 'store-call-secret-value';
360
+ await store.invoke('increment', { by: 1, note: secret });
361
+ expect(reports).toHaveLength(1);
362
+ expect(reports[0]).toMatchObject({ binding: 'GRAPH', operation: 'increment', outcome: 'ok' });
363
+ expect(reports[0]?.durationMs).toBeGreaterThanOrEqual(0);
364
+ expect(Object.keys(reports[0] ?? {}).sort()).toEqual(['binding', 'durationMs', 'operation', 'outcome']);
365
+ expect(JSON.stringify(reports)).not.toContain(secret);
366
+ const refusal = await store.invoke('missing', { note: secret }).then(() => undefined, (err) => err);
367
+ expect(refusal).toBeDefined();
368
+ expect(reports[1]).toMatchObject({ binding: 'GRAPH', operation: 'missing', outcome: 'error' });
369
+ expect(JSON.stringify(reports)).not.toContain(secret);
370
+ const loud = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH', {
371
+ onStoreCall() {
372
+ throw new Error('observer');
373
+ },
374
+ });
375
+ expect(await loud.invoke('read')).toEqual(expect.any(Number));
376
+ });
377
+ it('with no observer, a call lands on the request now running; a passed one wins (#2245)', async () => {
378
+ // The platform entry installs this slot (vertical-host's `runRecordingStoreCalls`);
379
+ // here a fixed tally stands in for the request's record.
380
+ const key = Symbol.for(STORE_CALL_SINK_KEY);
381
+ const g = globalThis;
382
+ const before = g[key];
383
+ const current = {};
384
+ g[key] = { current: () => (call) => tallyStoreCall(current, call) };
385
+ try {
386
+ const secret = 'store-call-secret-value';
387
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
388
+ await store.invoke('increment', { by: 1, note: secret });
389
+ await store.invoke('missing', { note: secret }).catch(() => undefined);
390
+ expect(current.storeCalls).toEqual([
391
+ { binding: 'GRAPH', operation: 'increment', outcome: 'ok', durationMs: expect.any(Number) },
392
+ { binding: 'GRAPH', operation: 'missing', outcome: 'error', durationMs: expect.any(Number) },
393
+ ]);
394
+ expect(JSON.stringify(current)).not.toContain(secret);
395
+ const heard = [];
396
+ const own = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH', { onStoreCall: (r) => heard.push(r) });
397
+ await own.invoke('read');
398
+ expect(heard.map((r) => r.operation)).toEqual(['read']);
399
+ expect(current.storeCalls).toHaveLength(2);
400
+ }
401
+ finally {
402
+ g[key] = before;
403
+ }
404
+ });
405
+ it('a call outside any request is not logged and does not throw (#2245)', async () => {
406
+ const key = Symbol.for(STORE_CALL_SINK_KEY);
407
+ const g = globalThis;
408
+ const before = g[key];
409
+ try {
410
+ g[key] = undefined;
411
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
412
+ expect(await store.invoke('read')).toEqual(expect.any(Number));
413
+ g[key] = { current: () => undefined };
414
+ expect(await store.invoke('read')).toEqual(expect.any(Number));
415
+ g[key] = {
416
+ current() {
417
+ throw new Error('slot');
418
+ },
419
+ };
420
+ expect(await store.invoke('read')).toEqual(expect.any(Number));
421
+ }
422
+ finally {
423
+ g[key] = before;
424
+ }
425
+ });
426
+ it('an operation name that is not a fixed label is refused before the call, and not reported (#2245)', async () => {
427
+ const reports = [];
428
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH', { onStoreCall: (r) => reports.push(r) });
429
+ const count = await store.invoke('read');
430
+ reports.length = 0;
431
+ for (const name of ['incr:ement', 'incr ement', 'incr@ement', 'i'.repeat(65)]) {
432
+ const refusal = await store.invoke(name).then(() => undefined, (err) => err);
433
+ expect(errorCodeOf(refusal), name).toBe('validation_failed');
434
+ }
435
+ expect(reports).toEqual([]);
436
+ expect(await store.invoke('read')).toBe(count);
437
+ });
438
+ it('a reserved operation is refused through the stub', async () => {
439
+ const store = await host.getScopeStore(principal, tenant, scopeA, 'GRAPH');
440
+ const before = await store.invoke('read');
441
+ const refusal = await store.invoke('substrat.wipe').then(() => undefined, (err) => err);
442
+ expect(errorCodeOf(refusal)).toBe('forbidden');
443
+ expect(await store.invoke('read')).toBe(before);
444
+ });
445
+ /*
446
+ * #2207: a restore re-erases every tombstoned subject. Each case restores into a scope of
447
+ * its own, so the count is exact: one `substrat.erase` per subject on the one binding.
448
+ */
449
+ describe('a restore replays erasures', () => {
450
+ const fresh = async (t = tenant) => {
451
+ const scope = scopeId.parse(ulid());
452
+ await host.provisionScope(staff, { tenantId: t, scopeId: scope, vertical: 'docs' });
453
+ await host.admin.activateScope(staff, t, scope);
454
+ return scope;
455
+ };
456
+ const erasedIn = async (scope, t = tenant) => (await host.getScopeStore(principal, t, scope, 'GRAPH')).invoke('erased');
457
+ it('a scope with no store, on a host with stores, restores as it always did', async () => {
458
+ const plain = scopeId.parse(ulid());
459
+ await host.provisionScope(staff, { tenantId: tenant, scopeId: plain });
460
+ await host.admin.activateScope(staff, tenant, plain);
461
+ await host.admin.shredSubject(staff, tenant, plain, ulid());
462
+ const dump = { ...(await host.admin.exportScope(staff, tenant, plain)), scopeId: scopeId.parse(ulid()) };
463
+ expect(await host.restoreScope(staff, tenant, plain, dump)).toBeUndefined();
464
+ });
465
+ it('with a store, no tombstone and a known source, answers nothing: none had to be replayed', async () => {
466
+ const scope = await fresh();
467
+ const dump = await host.admin.exportScope(staff, tenant, scope);
468
+ expect(await host.restoreScope(staff, tenant, scope, dump)).toBeUndefined();
469
+ });
470
+ it('re-erases a subject tombstoned in the restored scope', async () => {
471
+ const scope = await fresh();
472
+ const dump = await host.admin.exportScope(staff, tenant, scope);
473
+ const subject = ulid();
474
+ await host.admin.shredSubject(staff, tenant, scope, subject);
475
+ expect(await host.restoreScope(staff, tenant, scope, dump)).toEqual({
476
+ storeErasuresReplayed: 1,
477
+ storeErasureIncomplete: false,
478
+ });
479
+ });
480
+ it("onto another scope, re-erases the source's marks and the target's own", async () => {
481
+ const source = await fresh();
482
+ const target = await fresh();
483
+ const fromSource = ulid();
484
+ const fromTarget = ulid();
485
+ await host.admin.shredSubject(staff, tenant, source, fromSource);
486
+ await host.admin.shredSubject(staff, tenant, target, fromTarget);
487
+ const dump = await host.admin.exportScope(staff, tenant, source);
488
+ expect(await host.restoreScope(staff, tenant, target, dump)).toEqual({
489
+ storeErasuresReplayed: 2,
490
+ storeErasureIncomplete: false,
491
+ });
492
+ expect(await erasedIn(target)).toEqual(expect.arrayContaining([fromSource, fromTarget]));
493
+ });
494
+ it('from a source this host does not know, restores and says the replay is incomplete', async () => {
495
+ const target = await fresh();
496
+ const store = await host.getScopeStore(principal, tenant, target, 'GRAPH');
497
+ await store.invoke('increment', { by: 7 });
498
+ const own = ulid();
499
+ await host.admin.shredSubject(staff, tenant, target, own);
500
+ const dump = { ...(await host.admin.exportScope(staff, tenant, target)), scopeId: scopeId.parse(ulid()) };
501
+ await store.invoke('increment', { by: 1 });
502
+ expect(await host.restoreScope(staff, tenant, target, dump)).toEqual({
503
+ storeErasuresReplayed: 1,
504
+ storeErasureIncomplete: true,
505
+ storeErasureSourceUnknown: true,
506
+ });
507
+ // The data landed, and the target's own mark was still replayed.
508
+ expect(await store.invoke('read')).toBe(7);
509
+ expect(await erasedIn(target)).toContain(own);
510
+ });
511
+ it("never reads another tenant's marks: that source is unknown here", async () => {
512
+ const other = tenantId.parse(ulid());
513
+ await host.admin.createTenant(staff, { id: other, slug: `t-${other.toLowerCase()}`, name: 'Other' });
514
+ const elsewhere = await fresh(other);
515
+ const theirs = ulid();
516
+ await host.admin.shredSubject(staff, other, elsewhere, theirs);
517
+ const target = await fresh();
518
+ const dump = { ...(await host.admin.exportScope(staff, tenant, target)), scopeId: elsewhere };
519
+ expect(await host.restoreScope(staff, tenant, target, dump)).toEqual({
520
+ storeErasuresReplayed: 0,
521
+ storeErasureIncomplete: true,
522
+ storeErasureSourceUnknown: true,
523
+ });
524
+ expect(await erasedIn(target)).not.toContain(theirs);
525
+ });
526
+ it('from a reaped source, still replays its marks: a reap keeps the directory row', async () => {
527
+ const source = await fresh();
528
+ const subject = ulid();
529
+ await host.admin.shredSubject(staff, tenant, source, subject);
530
+ const dump = await host.admin.exportScope(staff, tenant, source);
531
+ await host.admin.archiveScope(staff, tenant, source);
532
+ await host.admin.reapScope(staff, tenant, source);
533
+ const target = await fresh();
534
+ expect(await host.restoreScope(staff, tenant, target, dump)).toEqual({
535
+ storeErasuresReplayed: 1,
536
+ storeErasureIncomplete: false,
537
+ });
538
+ expect(await erasedIn(target)).toContain(subject);
539
+ });
540
+ it('from a deleted snapshot, restores and says the replay is incomplete: the row is gone', async () => {
541
+ const fork = await host.snapshotScope(staff, tenant, await fresh());
542
+ const subject = ulid();
543
+ await host.admin.shredSubject(staff, tenant, fork, subject);
544
+ const dump = await host.admin.exportScope(staff, tenant, fork);
545
+ await host.deleteSnapshot(staff, tenant, fork);
546
+ const target = await fresh();
547
+ expect(await host.restoreScope(staff, tenant, target, dump)).toEqual({
548
+ storeErasuresReplayed: 0,
549
+ storeErasureIncomplete: true,
550
+ storeErasureSourceUnknown: true,
551
+ });
552
+ expect(await erasedIn(target)).not.toContain(subject);
553
+ });
554
+ });
555
+ });
556
+ }
557
+ //# sourceMappingURL=scope-store-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-store-suite.js","sourceRoot":"","sources":["../src/scope-store-suite.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-limits-suite.d.ts","sourceRoot":"","sources":["../src/sql-limits-suite.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAwI9D,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAC3C,IAAI,CA6CN"}
1
+ {"version":3,"file":"sql-limits-suite.d.ts","sourceRoot":"","sources":["../src/sql-limits-suite.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA0I9D,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAC3C,IAAI,CAkHN"}