@substrat-run/contract-tests 0.143.0 → 0.144.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.
@@ -0,0 +1,507 @@
1
+ /**
2
+ * Contract suite for BINDING invites (#1686) — a `become` link that also binds its claimant to
3
+ * their own record, and the unbind beside it.
4
+ *
5
+ * What it pins, in one sentence: **a link minted by someone holding a binding shape's key on a
6
+ * record, for a record that names nobody, yields its principal exactly once, and in that one
7
+ * transaction the record's column comes to name them and they are given the record's declared
8
+ * shape there; anything that would make that wrong — the record bound meanwhile, gone, the
9
+ * minter no longer holding the key, the shape no longer declared, a fault inside the grant —
10
+ * refuses the exchange and leaves the link unspent; an unbind or an erasure takes it back.**
11
+ *
12
+ * Every refusal is paired with the allow beside it, and checked to have written nothing:
13
+ *
14
+ * 1. **The mint.** Refused, writing nothing, for a type the scope's reconciled registry binds
15
+ * nothing on (another scope, another type), a missing record, a bound record, and a minter
16
+ * lacking the key — scope-wide or on THAT record. The clerk's mint records the action, on the
17
+ * record and on `capability.become-minted`.
18
+ * 2. **The claim.** One exchange: the column names the claimant, the marker and the shape's keys
19
+ * are theirs, `entity.holder-bound` is on the record's history with the capability as actor, and
20
+ * they read their record and no other.
21
+ * 3. **The claim re-judged.** The record bound meanwhile, deleted, the minter's key gone, the shape
22
+ * dropped from the registry: each refuses with the one answer and leaves `uses = 0` and the
23
+ * record as it was; putting it right lets the same link through.
24
+ * 4. **Atomic.** A fault inside the shape grant rolls the use back with the column.
25
+ * 5. **The keys come only from the column.** A direct grant of a binding shape's key on such a
26
+ * record is refused; a key outside the shape is not.
27
+ * 6. **The unbind.** Bounded by the key on the record; it clears the column and tombstones the
28
+ * marker and every key of the shape, a retired one included; the record can be bound again.
29
+ * 7. **The erasure.** Erasing the record or its person releases the binding — after the module's
30
+ * hook has read the rows by the column, and also when the hook deleted the row.
31
+ */
32
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
33
+ import { CAPABILITY_BECOME_MINTED, ENTITY_HOLDER_BOUND, ENTITY_HOLDER_UNBOUND, dataSubjectId, errorCodeOf, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
34
+ import { ulid } from '@substrat-run/kernel';
35
+ import { BIND_DUP_SHAPE, BIND_INVITE, BIND_MEMBER, BIND_OLD, BIND_READ_OWN, BIND_SHAPE, bindMod } from './bind-module.js';
36
+ export function bindingInviteContractSuite(adapterName, makeFixture, raw) {
37
+ describe(`binding invites (#1686): ${adapterName}`, () => {
38
+ let fixture;
39
+ let host;
40
+ const t1 = tenantId.parse(ulid());
41
+ const s1 = scopeId.parse(ulid());
42
+ const s2 = scopeId.parse(ulid()); // provisioned, never reconciled with the shape
43
+ const staff = platformActorId.parse(ulid());
44
+ const p = () => principalId.parse(ulid());
45
+ const clerk = p(); // bind:invite + bind:member scope-wide
46
+ const outsider = p(); // bind:member only
47
+ const node = (scope = s1) => ({ tenantId: t1, scopeId: scope });
48
+ const rec = (id) => ({ entityType: 'brecord', entityId: id });
49
+ const sql = async (q, params = [], scope = s1) => (await host.getScope(clerk, t1, scope)).invoke('bind/sql', { sql: q, params });
50
+ const put = async (q, params = []) => (await host.getScope(clerk, t1, s1)).invoke('bind/put', { sql: q, params });
51
+ const record = async (fate = null) => {
52
+ const id = ulid();
53
+ await put('INSERT INTO bind_records (id, principal, email, fate) VALUES (?, NULL, ?, ?)', [id, `${id}@example.test`, fate]);
54
+ return id;
55
+ };
56
+ const rowOf = async (id) => (await sql('SELECT principal FROM bind_records WHERE id = ?', [id]))[0];
57
+ /** Every tuple on the record: who, what, and whether it is live. */
58
+ const tuplesOn = async (id) => (await sql('SELECT subject, relation, revoked_at IS NULL AS live FROM _substrat_tuples WHERE object = ? ORDER BY subject, relation', [`brecord:${id}`])).map((r) => ({ subject: r.subject, relation: r.relation, live: Number(r.live) === 1 }));
59
+ const outbox = async (type) => (await sql('SELECT actor, entity_type, entity_id, payload FROM _substrat_outbox WHERE type = ? ORDER BY id', [type])).map((r) => ({
60
+ entity_type: r.entity_type,
61
+ entity_id: r.entity_id,
62
+ actor: JSON.parse(String(r.actor)),
63
+ payload: r.payload === null ? null : JSON.parse(String(r.payload)),
64
+ }));
65
+ const records = async (scope = s1) => (await host.admin.listCapabilities(staff, t1, scope, { includeRevoked: true })).entries;
66
+ const capOf = async (id) => (await records()).find((r) => r.id === id);
67
+ /** What a refusal must not have changed: the directory, the spine, and the records' tuples. */
68
+ const snapshot = async () => ({
69
+ caps: (await records()).length,
70
+ events: (await sql('SELECT COUNT(*) AS n FROM _substrat_outbox'))[0].n,
71
+ tuples: (await sql("SELECT COUNT(*) AS n, COUNT(revoked_at) AS dead FROM _substrat_tuples WHERE object LIKE 'brecord:%'"))[0],
72
+ });
73
+ /** A fresh invitee: a principal holding the member role, as an invite grants before it mints. */
74
+ const invitee = async (scope = s1) => {
75
+ const who = p();
76
+ await host.admin.assignRole(staff, { principalId: who, roleKey: 'member', node: node(scope) });
77
+ return who;
78
+ };
79
+ const mint = (caller, principal, entity, scope = s1) => fixture.verbs.mintBecomeCapabilityBounded(t1, scope, caller, { principal, maxUses: 1, label: 'binding invite', bind: { entity } });
80
+ const minted = async (caller, principal, entity) => {
81
+ const out = await mint(caller, principal, entity);
82
+ if (!out.ok)
83
+ throw new Error(`expected a mint, refused: ${JSON.stringify(out)}`);
84
+ return out.minted;
85
+ };
86
+ const exchange = (secret) => host.exchangeCapability(t1, s1, secret, { mode: 'become' });
87
+ const reads = async (who, id) => {
88
+ try {
89
+ await (await host.getScope(who, t1, s1)).invoke('bind/read', { id });
90
+ return true;
91
+ }
92
+ catch (err) {
93
+ if (errorCodeOf(err) === 'permission_denied')
94
+ return false;
95
+ throw err;
96
+ }
97
+ };
98
+ const reconcile = (shapes) => host.admin.reconcileEntityGrantShapes(staff, node(), shapes);
99
+ beforeAll(async () => {
100
+ fixture = await makeFixture();
101
+ host = fixture.host;
102
+ host.registerModule(bindMod);
103
+ await host.admin.createTenant(staff, { id: t1, slug: `bind-${t1.toLowerCase()}`, name: 'Bind' });
104
+ await host.admin.grantEntitlement(staff, t1, 'bind');
105
+ for (const s of [s1, s2]) {
106
+ await host.provisionScope(staff, { tenantId: t1, scopeId: s, vertical: 'bind-vertical' });
107
+ await host.admin.activateScope(staff, t1, s);
108
+ }
109
+ await host.admin.defineRole(staff, t1, { key: 'clerk', permissions: [BIND_INVITE, BIND_MEMBER], source: 'vertical' });
110
+ await host.admin.defineRole(staff, t1, { key: 'member', permissions: [BIND_MEMBER], source: 'vertical' });
111
+ for (const s of [s1, s2])
112
+ await host.admin.assignRole(staff, { principalId: clerk, roleKey: 'clerk', node: node(s) });
113
+ await host.admin.assignRole(staff, { principalId: outsider, roleKey: 'member', node: node() });
114
+ await reconcile([BIND_SHAPE]);
115
+ });
116
+ afterAll(async () => {
117
+ await fixture.cleanup();
118
+ });
119
+ describe('the mint', () => {
120
+ it('is refused, writing nothing, where the reconciled registry binds nothing — another scope, another type', async () => {
121
+ const id = await record();
122
+ const before = await snapshot();
123
+ expect(await mint(clerk, await invitee(s2), rec(id), s2)).toEqual({ ok: false, refused: 'bind-not-declared' });
124
+ expect(await mint(clerk, await invitee(), { entityType: 'other', entityId: id })).toEqual({ ok: false, refused: 'bind-not-declared' });
125
+ expect(await snapshot()).toEqual(before);
126
+ });
127
+ it('is refused for a record that does not exist, or already names someone', async () => {
128
+ const bound = await record();
129
+ await put('UPDATE bind_records SET principal = ? WHERE id = ?', [p(), bound]);
130
+ const before = await snapshot();
131
+ expect(await mint(clerk, await invitee(), rec(ulid()))).toEqual({ ok: false, refused: 'bind-record-missing' });
132
+ expect(await mint(clerk, await invitee(), rec(bound))).toEqual({ ok: false, refused: 'bind-record-bound' });
133
+ expect(await snapshot()).toEqual(before);
134
+ });
135
+ it('is refused, distinctly, for a record someone already holds the shape on with its column empty — until they are unbound', async () => {
136
+ const id = await record();
137
+ // A holder the column never named: given the shape directly, as before the column existed.
138
+ await host.admin.grantEntityShape(staff, { principalId: p(), node: node(), entity: rec(id), permissions: [BIND_READ_OWN], grantedBy: clerk });
139
+ const before = await snapshot();
140
+ expect(await mint(clerk, await invitee(), rec(id))).toEqual({ ok: false, refused: 'bind-record-held' });
141
+ expect(await snapshot()).toEqual(before);
142
+ expect((await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id)))).toMatchObject({ ok: true });
143
+ expect((await mint(clerk, await invitee(), rec(id))).ok).toBe(true);
144
+ });
145
+ it('is refused for a minter without the key, naming it — and the clerk, who holds it, mints', async () => {
146
+ const id = await record();
147
+ const target = await invitee();
148
+ const before = await snapshot();
149
+ expect(await mint(outsider, target, rec(id))).toEqual({ ok: false, coverage: { covered: false, missing: [BIND_INVITE] } });
150
+ expect(await snapshot()).toEqual(before);
151
+ const link = await minted(clerk, target, rec(id));
152
+ expect(await capOf(link.id)).toMatchObject({ mode: 'become', principal: target, action: { kind: 'bind', entity: rec(id) }, uses: 0 });
153
+ const event = (await outbox(CAPABILITY_BECOME_MINTED)).find((e) => e.payload?.capabilityId === link.id);
154
+ expect(event?.payload).toMatchObject({ principal: target, mintedBy: clerk, action: { kind: 'bind', entity: rec(id) } });
155
+ });
156
+ it("stores a bind link's holdings digest so a host from before binding invites cannot match it", async () => {
157
+ // Two targets holding exactly the same: their plain digests are equal.
158
+ const plain = await fixture.verbs.mintBecomeCapabilityBounded(t1, s1, clerk, { principal: await invitee(), maxUses: 1 });
159
+ const bound = await mint(clerk, await invitee(), rec(await record()));
160
+ if (!plain.ok || !bound.ok)
161
+ throw new Error('expected both to mint');
162
+ const digest = async (id) => (await raw(t1, s1, 'SELECT target_digest FROM _substrat_capabilities WHERE id = ?', [id]))[0].target_digest;
163
+ const plainDigest = await digest(plain.minted.id);
164
+ // An old host compares the plain digest of what the target holds with this, and refuses on the mismatch.
165
+ expect(await digest(bound.minted.id)).toBe(`bind:${plainDigest}`);
166
+ expect(plainDigest.startsWith('bind:')).toBe(false);
167
+ });
168
+ it('the key held on ONE record binds that record and no other', async () => {
169
+ const mine = await record();
170
+ const theirs = await record();
171
+ const narrow = p();
172
+ await host.admin.assignRole(staff, { principalId: narrow, roleKey: 'member', node: node() });
173
+ await host.admin.grant(staff, { principalId: narrow, permission: BIND_INVITE, node: node(), entity: rec(mine), grantedBy: clerk });
174
+ expect((await mint(narrow, await invitee(), rec(mine))).ok).toBe(true);
175
+ expect(await mint(narrow, await invitee(), rec(theirs))).toEqual({ ok: false, coverage: { covered: false, missing: [BIND_INVITE] } });
176
+ // And it learns nothing about a record it lacks the key on: a missing one and a bound one
177
+ // answer the same coverage refusal as a free one, never their state.
178
+ const bound = await record();
179
+ await put('UPDATE bind_records SET principal = ? WHERE id = ?', [p(), bound]);
180
+ for (const id of [ulid(), bound]) {
181
+ expect(await mint(narrow, await invitee(), rec(id))).toEqual({ ok: false, coverage: { covered: false, missing: [BIND_INVITE] } });
182
+ }
183
+ });
184
+ });
185
+ describe('the claim', () => {
186
+ it('binds the claimant to the record and gives them its shape, in one exchange', async () => {
187
+ const id = await record();
188
+ const other = await record();
189
+ const target = await invitee();
190
+ const link = await minted(clerk, target, rec(id));
191
+ expect(await reads(target, id)).toBe(false);
192
+ expect(await exchange(link.secret)).toEqual({ kind: 'principal', capabilityId: link.id, principal: target, bound: rec(id) });
193
+ expect((await rowOf(id))?.principal).toBe(target);
194
+ expect(await tuplesOn(id)).toEqual([
195
+ { subject: `principal:${target}`, relation: 'bootstrap', live: true },
196
+ { subject: `principal:${target}`, relation: `granted:${BIND_READ_OWN}`, live: true },
197
+ ]);
198
+ expect((await capOf(link.id))?.uses).toBe(1);
199
+ const bound = (await outbox(ENTITY_HOLDER_BOUND)).filter((e) => e.entity_id === id);
200
+ expect(bound).toEqual([
201
+ {
202
+ actor: { capability: link.id },
203
+ entity_type: 'brecord',
204
+ entity_id: id,
205
+ payload: { entity: rec(id), principal: target, capabilityId: link.id, mintedBy: clerk, granted: [BIND_READ_OWN] },
206
+ },
207
+ ]);
208
+ expect(await reads(target, id)).toBe(true);
209
+ expect(await reads(target, other)).toBe(false);
210
+ // Spent: the second exchange is refused and binds nothing more.
211
+ expect(await exchange(link.secret)).toBeNull();
212
+ });
213
+ /** A minted link whose claim the next step makes wrong; `undo` puts it right again. */
214
+ const refusedThenAllowed = async (spoil, undo) => {
215
+ const id = await record();
216
+ const minter = p();
217
+ await host.admin.assignRole(staff, { principalId: minter, roleKey: 'clerk', node: node() });
218
+ const target = await invitee();
219
+ const link = await minted(minter, target, rec(id));
220
+ await spoil({ id, minter });
221
+ const before = await snapshot();
222
+ const was = await rowOf(id);
223
+ expect(await exchange(link.secret)).toBeNull();
224
+ expect((await capOf(link.id))?.uses).toBe(0);
225
+ expect(await rowOf(id)).toEqual(was);
226
+ expect(await snapshot()).toEqual(before);
227
+ await undo({ id, minter });
228
+ expect((await exchange(link.secret))?.kind).toBe('principal');
229
+ expect((await rowOf(id))?.principal).toBe(target);
230
+ };
231
+ it('is refused, unspent, when the record was bound meanwhile — and goes through once it is free', () => refusedThenAllowed(({ id }) => put('UPDATE bind_records SET principal = ? WHERE id = ?', [p(), id]), ({ id }) => put('UPDATE bind_records SET principal = NULL WHERE id = ?', [id])));
232
+ it('is refused, unspent, when someone came to hold the record’s shape meanwhile — and goes through once they are unbound', () => refusedThenAllowed(({ id }) => host.admin.grantEntityShape(staff, { principalId: p(), node: node(), entity: rec(id), permissions: [BIND_READ_OWN], grantedBy: clerk }), ({ id }) => fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id))));
233
+ it('is refused, unspent, when the record is gone — and goes through once it is back', () => refusedThenAllowed(({ id }) => put('DELETE FROM bind_records WHERE id = ?', [id]), ({ id }) => put('INSERT INTO bind_records (id, principal, email, fate) VALUES (?, NULL, NULL, NULL)', [id])));
234
+ it('is refused, unspent, when its minter has lost the key (or left) — and goes through once they hold it again', () => refusedThenAllowed(({ minter }) => host.admin.unassignRole(staff, { principalId: minter, roleKey: 'clerk', node: node() }), ({ minter }) => host.admin.assignRole(staff, { principalId: minter, roleKey: 'clerk', node: node() })));
235
+ it('is refused, unspent, when the registry keeps the shape but no longer binds with it — and goes through once it does', () => refusedThenAllowed(() => reconcile([{ ...BIND_SHAPE, bind: undefined }]), () => reconcile([BIND_SHAPE])));
236
+ it('is refused, unspent, when the registry declares no shape at all — and goes through once it does', () => refusedThenAllowed(() => reconcile([]), () => reconcile([BIND_SHAPE])));
237
+ it('is atomic: a fault inside the shape grant rolls the use back with the column', async () => {
238
+ const id = await record();
239
+ const target = await invitee();
240
+ const link = await minted(clerk, target, rec(id));
241
+ await raw(t1, s1, `CREATE TRIGGER bind_fault BEFORE INSERT ON _substrat_tuples WHEN NEW.object = 'brecord:${id}' BEGIN SELECT RAISE(ABORT, 'bind fault'); END`);
242
+ try {
243
+ const before = await snapshot();
244
+ await expect(() => exchange(link.secret)).rejects.toThrow();
245
+ expect((await capOf(link.id))?.uses).toBe(0);
246
+ expect((await rowOf(id))?.principal).toBeNull();
247
+ expect(await snapshot()).toEqual(before);
248
+ }
249
+ finally {
250
+ await raw(t1, s1, 'DROP TRIGGER bind_fault');
251
+ }
252
+ // The twin: with the fault gone the same link binds.
253
+ expect((await exchange(link.secret))?.kind).toBe('principal');
254
+ expect((await rowOf(id))?.principal).toBe(target);
255
+ });
256
+ });
257
+ describe('an id column two rows share', () => {
258
+ const dup = (key) => ({ entityType: 'bdup', entityId: key });
259
+ const rowsOf = async (key) => (await sql('SELECT holder FROM bind_dups WHERE key = ? ORDER BY holder', [key])).map((r) => r.holder);
260
+ beforeAll(() => reconcile([BIND_SHAPE, BIND_DUP_SHAPE]));
261
+ afterAll(() => reconcile([BIND_SHAPE]));
262
+ it('a record any of whose rows names someone is bound: refused at mint', async () => {
263
+ const key = ulid();
264
+ await put('INSERT INTO bind_dups (key, holder) VALUES (?, NULL), (?, ?)', [key, key, p()]);
265
+ expect(await mint(clerk, await invitee(), dup(key))).toEqual({ ok: false, refused: 'bind-record-bound' });
266
+ });
267
+ it('two rows naming nobody are no one record: refused at mint, and at the claim when a second row appears', async () => {
268
+ const key = ulid();
269
+ await put('INSERT INTO bind_dups (key, holder) VALUES (?, NULL), (?, NULL)', [key, key]);
270
+ const before = await snapshot();
271
+ expect(await mint(clerk, await invitee(), dup(key))).toEqual({ ok: false, refused: 'bind-record-ambiguous' });
272
+ expect(await snapshot()).toEqual(before);
273
+ // One row at mint, two by the claim: refused with the one answer, the link unspent.
274
+ const one = ulid();
275
+ await put('INSERT INTO bind_dups (key, holder) VALUES (?, NULL)', [one]);
276
+ const link = await minted(clerk, await invitee(), dup(one));
277
+ await put('INSERT INTO bind_dups (key, holder) VALUES (?, NULL)', [one]);
278
+ expect(await exchange(link.secret)).toBeNull();
279
+ expect((await capOf(link.id))?.uses).toBe(0);
280
+ expect(await rowsOf(one)).toEqual([null, null]);
281
+ });
282
+ it('an unbind clears every row carrying the id', async () => {
283
+ const key = ulid();
284
+ await put('INSERT INTO bind_dups (key, holder) VALUES (?, ?), (?, ?)', [key, p(), key, p()]);
285
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, dup(key))).toEqual({ ok: true, unbound: [] });
286
+ expect(await rowsOf(key)).toEqual([null, null]);
287
+ });
288
+ });
289
+ describe('the keys come only from the column', () => {
290
+ it("refuses a direct grant of a binding shape's key on such a record — current or retired — and allows any other key", async () => {
291
+ const id = await record();
292
+ const who = await invitee();
293
+ for (const permission of [BIND_READ_OWN, BIND_OLD]) {
294
+ await expect(() => host.admin.grant(staff, { principalId: who, permission, node: node(), entity: rec(id), grantedBy: clerk })).rejects.toThrow(/given only by the shape grant/);
295
+ }
296
+ await host.admin.grant(staff, { principalId: who, permission: BIND_INVITE, node: node(), entity: rec(id), grantedBy: clerk });
297
+ expect(await tuplesOn(id)).toEqual([{ subject: `principal:${who}`, relation: `granted:${BIND_INVITE}`, live: true }]);
298
+ });
299
+ it('stay refused to direct grants on a type that has bound, even while a version declares no shape for it', async () => {
300
+ // Bind someone first, here, so the case holds whatever ran before it.
301
+ await exchange((await minted(clerk, await invitee(), rec(await record()))).secret);
302
+ const id = await record();
303
+ await reconcile([]);
304
+ try {
305
+ await expect(() => host.admin.grant(staff, { principalId: p(), permission: BIND_READ_OWN, node: node(), entity: rec(id), grantedBy: clerk })).rejects.toThrow(/given only by the shape grant/);
306
+ }
307
+ finally {
308
+ await reconcile([BIND_SHAPE]);
309
+ }
310
+ // So nothing slipped in while the shape was out: the record still mints and binds one person.
311
+ const target = await invitee();
312
+ expect((await exchange((await minted(clerk, target, rec(id))).secret))?.kind).toBe('principal');
313
+ expect((await tuplesOn(id)).filter((t) => t.live).map((t) => t.subject)).toEqual([`principal:${target}`, `principal:${target}`]);
314
+ });
315
+ });
316
+ describe('a binding declared in a scope, never claimed there', () => {
317
+ /** A scope of its own, so nothing another case did there — no claim, no reconcile — counts. */
318
+ const fresh = async () => {
319
+ const scope = scopeId.parse(ulid());
320
+ await host.provisionScope(staff, { tenantId: t1, scopeId: scope, vertical: 'bind-vertical' });
321
+ await host.admin.activateScope(staff, t1, scope);
322
+ await host.admin.assignRole(staff, { principalId: clerk, roleKey: 'clerk', node: node(scope) });
323
+ const id = ulid();
324
+ await (await host.getScope(clerk, t1, scope)).invoke('bind/put', {
325
+ sql: 'INSERT INTO bind_records (id, principal, email, fate) VALUES (?, NULL, NULL, NULL)',
326
+ params: [id],
327
+ });
328
+ return { scope, id, shapes: (shapes) => host.admin.reconcileEntityGrantShapes(staff, node(scope), shapes) };
329
+ };
330
+ it('keeps its keys refused to direct grants after a version removes it — so it cannot later bind a second person', async () => {
331
+ const { scope, id, shapes } = await fresh();
332
+ await shapes([BIND_SHAPE]);
333
+ await shapes([]);
334
+ await expect(() => host.admin.grant(staff, { principalId: p(), permission: BIND_READ_OWN, node: node(scope), entity: rec(id), grantedBy: clerk })).rejects.toThrow(/given only by the shape grant/);
335
+ await shapes([BIND_SHAPE]);
336
+ const target = await invitee(scope);
337
+ const link = await fixture.verbs.mintBecomeCapabilityBounded(t1, scope, clerk, { principal: target, maxUses: 1, bind: { entity: rec(id) } });
338
+ expect(link.ok).toBe(true);
339
+ });
340
+ it('still releases a holder it never bound by a link (given the shape directly) when they are erased after a version removes it', async () => {
341
+ const { scope, id, shapes } = await fresh();
342
+ await shapes([BIND_SHAPE]);
343
+ const legacy = p();
344
+ await host.admin.grantEntityShape(staff, { principalId: legacy, node: node(scope), entity: rec(id), permissions: [BIND_READ_OWN], grantedBy: clerk });
345
+ await shapes([]);
346
+ await host.admin.shredSubject(staff, t1, scope, dataSubjectId.parse(legacy));
347
+ const live = (await (await host.getScope(clerk, t1, scope)).invoke('bind/sql', {
348
+ sql: 'SELECT relation FROM _substrat_tuples WHERE object = ? AND subject = ? AND revoked_at IS NULL',
349
+ params: [`brecord:${id}`, `principal:${legacy}`],
350
+ }));
351
+ expect(live).toEqual([]);
352
+ });
353
+ });
354
+ describe('the unbind', () => {
355
+ const claimed = async () => {
356
+ const id = await record();
357
+ const target = await invitee();
358
+ const link = await minted(clerk, target, rec(id));
359
+ await exchange(link.secret);
360
+ return { id, target };
361
+ };
362
+ it('is refused, writing nothing, for a caller without the key on the record', async () => {
363
+ const { id, target } = await claimed();
364
+ const before = await snapshot();
365
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, outsider, rec(id))).toEqual({
366
+ ok: false,
367
+ coverage: { covered: false, missing: [BIND_INVITE] },
368
+ });
369
+ expect(await snapshot()).toEqual(before);
370
+ expect((await rowOf(id))?.principal).toBe(target);
371
+ expect(await reads(target, id)).toBe(true);
372
+ });
373
+ it('clears the column and takes back the marker and every key of the shape, a retired one included', async () => {
374
+ const { id, target } = await claimed();
375
+ // A retired key left from before the shape dropped it — only the kernel's own writes can put it here now.
376
+ await raw(t1, s1, 'INSERT INTO _substrat_tuples (subject, relation, object) VALUES (?, ?, ?)', [`principal:${target}`, `granted:${BIND_OLD}`, `brecord:${id}`]);
377
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id))).toEqual({ ok: true, unbound: [target] });
378
+ expect((await rowOf(id))?.principal).toBeNull();
379
+ expect(await tuplesOn(id)).toEqual([
380
+ { subject: `principal:${target}`, relation: 'bootstrap', live: false },
381
+ { subject: `principal:${target}`, relation: `granted:${BIND_OLD}`, live: false },
382
+ { subject: `principal:${target}`, relation: `granted:${BIND_READ_OWN}`, live: false },
383
+ ]);
384
+ expect(await reads(target, id)).toBe(false);
385
+ const unbound = (await outbox(ENTITY_HOLDER_UNBOUND)).filter((e) => e.entity_id === id);
386
+ expect(unbound).toEqual([
387
+ { actor: clerk, entity_type: 'brecord', entity_id: id, payload: { entity: rec(id), principal: target, removed: [BIND_OLD, BIND_READ_OWN] } },
388
+ ]);
389
+ // Nothing left to unbind: an answer, and nothing written.
390
+ const before = await snapshot();
391
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id))).toEqual({ ok: true, unbound: [] });
392
+ expect(await snapshot()).toEqual(before);
393
+ // The record is free again: a new invite binds a new person.
394
+ const next = await invitee();
395
+ expect((await exchange((await minted(clerk, next, rec(id))).secret))?.kind).toBe('principal');
396
+ expect(await reads(next, id)).toBe(true);
397
+ expect(await reads(target, id)).toBe(false);
398
+ });
399
+ it('releases from the spine: the person a link bound, though module code has since rewritten the column', async () => {
400
+ const { id, target } = await claimed();
401
+ const other = p();
402
+ await put('UPDATE bind_records SET principal = ? WHERE id = ?', [other, id]);
403
+ // `other` holds no marker here — the column alone is no holding — so only the bound person is released.
404
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id))).toEqual({ ok: true, unbound: [target] });
405
+ expect((await rowOf(id))?.principal).toBeNull();
406
+ expect(await reads(target, id)).toBe(false);
407
+ expect((await tuplesOn(id)).filter((t) => t.live)).toEqual([]);
408
+ });
409
+ it('takes back a key the shape has since dropped without retiring it — everything the holder holds on the record', async () => {
410
+ const kept = { ...BIND_SHAPE, permissions: [BIND_OLD, BIND_READ_OWN], retired: undefined };
411
+ await reconcile([kept]);
412
+ try {
413
+ const { id, target } = await claimed();
414
+ await reconcile([{ ...BIND_SHAPE, retired: undefined }]);
415
+ expect((await tuplesOn(id)).filter((t) => t.live).map((t) => t.relation)).toEqual(['bootstrap', `granted:${BIND_OLD}`, `granted:${BIND_READ_OWN}`]);
416
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id))).toEqual({ ok: true, unbound: [target] });
417
+ expect((await tuplesOn(id)).filter((t) => t.live)).toEqual([]);
418
+ const event = (await outbox(ENTITY_HOLDER_UNBOUND)).find((e) => e.entity_id === id);
419
+ expect(event?.payload).toMatchObject({ removed: [BIND_OLD, BIND_READ_OWN] });
420
+ }
421
+ finally {
422
+ await reconcile([BIND_SHAPE]);
423
+ }
424
+ });
425
+ it('answers bind-not-declared for a type the registry binds nothing on', async () => {
426
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, { entityType: 'other', entityId: ulid() })).toEqual({
427
+ ok: false,
428
+ refused: 'bind-not-declared',
429
+ });
430
+ });
431
+ });
432
+ describe('the erasure', () => {
433
+ const claimed = async (fate = null) => {
434
+ const id = await record(fate);
435
+ const target = await invitee();
436
+ await exchange((await minted(clerk, target, rec(id))).secret);
437
+ return { id, target };
438
+ };
439
+ const live = async (id) => (await tuplesOn(id)).filter((t) => t.live);
440
+ it("erasing the RECORD releases its person: column cleared, shape taken back; another record's binding stays", async () => {
441
+ const { id, target } = await claimed();
442
+ const bystander = await claimed();
443
+ await host.admin.shredSubject(staff, t1, s1, dataSubjectId.parse(id));
444
+ expect((await rowOf(id))?.principal).toBeNull();
445
+ expect(await live(id)).toEqual([]);
446
+ expect(await reads(target, id)).toBe(false);
447
+ expect((await rowOf(bystander.id))?.principal).toBe(bystander.target);
448
+ expect(await reads(bystander.target, bystander.id)).toBe(true);
449
+ });
450
+ it('erasing the PERSON releases them — after the hook has found their record by the column', async () => {
451
+ const { id, target } = await claimed();
452
+ await host.admin.shredSubject(staff, t1, s1, dataSubjectId.parse(target));
453
+ expect(await sql('SELECT record_id FROM bind_seen WHERE subject = ?', [target])).toEqual([{ record_id: id }]);
454
+ expect((await rowOf(id))?.principal).toBeNull();
455
+ expect(await live(id)).toEqual([]);
456
+ });
457
+ it('a version that drops `bind` but keeps the shape: nobody may mint or unbind, and an erasure still releases', async () => {
458
+ const { id, target } = await claimed();
459
+ await reconcile([{ ...BIND_SHAPE, bind: undefined }]);
460
+ try {
461
+ expect(await mint(clerk, await invitee(), rec(await record()))).toEqual({ ok: false, refused: 'bind-not-declared' });
462
+ expect(await fixture.verbs.unbindEntityHolderBounded(t1, s1, clerk, rec(id))).toEqual({ ok: false, refused: 'bind-not-declared' });
463
+ // What was bound stays bound, as a shape holder does when a key is dropped without being retired…
464
+ expect(await reads(target, id)).toBe(true);
465
+ // …and the column still decides: a direct grant of the shape's key is still refused.
466
+ await expect(() => host.admin.grant(staff, { principalId: p(), permission: BIND_READ_OWN, node: node(), entity: rec(id), grantedBy: clerk })).rejects.toThrow(/given only by the shape grant/);
467
+ await host.admin.shredSubject(staff, t1, s1, dataSubjectId.parse(target));
468
+ expect((await rowOf(id))?.principal).toBeNull();
469
+ expect(await live(id)).toEqual([]);
470
+ }
471
+ finally {
472
+ await reconcile([BIND_SHAPE]);
473
+ }
474
+ });
475
+ it('a version that drops the shape: an erasure still releases its holders from the spine, the column left as no holder names it', async () => {
476
+ const { id, target } = await claimed();
477
+ await reconcile([]);
478
+ try {
479
+ await host.admin.shredSubject(staff, t1, s1, dataSubjectId.parse(target));
480
+ expect(await live(id)).toEqual([]);
481
+ expect(await reads(target, id)).toBe(false);
482
+ // The kernel no longer knows which column the shape was held through.
483
+ expect((await rowOf(id))?.principal).toBe(target);
484
+ }
485
+ finally {
486
+ await reconcile([BIND_SHAPE]);
487
+ }
488
+ });
489
+ it('the record of having bound is spine state: module code cannot write it', async () => {
490
+ await expect(() => put("INSERT INTO _substrat_tuples (subject, relation, object) VALUES ('shape:brecord', 'shape-bound', 'bound')")).rejects.toThrow(/cannot write the platform spine/);
491
+ // And it is there, written by a claim, not by any module.
492
+ expect(await sql("SELECT 1 AS one FROM _substrat_tuples WHERE subject = 'shape:brecord' AND relation = 'shape-bound'")).toEqual([{ one: 1 }]);
493
+ });
494
+ it('releases a record the hook deleted, from what was read before it ran', async () => {
495
+ const { id, target } = await claimed('drop');
496
+ await host.admin.shredSubject(staff, t1, s1, dataSubjectId.parse(target));
497
+ expect(await rowOf(id)).toBeUndefined();
498
+ expect(await live(id)).toEqual([]);
499
+ expect(await tuplesOn(id)).toEqual([
500
+ { subject: `principal:${target}`, relation: 'bootstrap', live: false },
501
+ { subject: `principal:${target}`, relation: `granted:${BIND_READ_OWN}`, live: false },
502
+ ]);
503
+ });
504
+ });
505
+ });
506
+ }
507
+ //# sourceMappingURL=binding-invite-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-invite-suite.js","sourceRoot":"","sources":["../src/binding-invite-suite.ts"],"names":[],"mappings":"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"}