@substrat-run/contract-tests 0.159.0 → 0.161.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.
- package/dist/attachment-bytes-suite.d.ts +9 -0
- package/dist/attachment-bytes-suite.d.ts.map +1 -0
- package/dist/attachment-bytes-suite.js +97 -0
- package/dist/attachment-bytes-suite.js.map +1 -0
- package/dist/connector-fixture.d.ts +2 -2
- package/dist/connector-fixture.d.ts.map +1 -1
- package/dist/directory-audit-suite.d.ts +23 -0
- package/dist/directory-audit-suite.d.ts.map +1 -0
- package/dist/directory-audit-suite.js +560 -0
- package/dist/directory-audit-suite.js.map +1 -0
- package/dist/directory-restore-suite.d.ts.map +1 -1
- package/dist/directory-restore-suite.js +99 -0
- package/dist/directory-restore-suite.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/introspection-reads-suite.d.ts +35 -0
- package/dist/introspection-reads-suite.d.ts.map +1 -0
- package/dist/introspection-reads-suite.js +114 -0
- package/dist/introspection-reads-suite.js.map +1 -0
- package/dist/many-migrations-suite.d.ts +9 -0
- package/dist/many-migrations-suite.d.ts.map +1 -0
- package/dist/many-migrations-suite.js +76 -0
- package/dist/many-migrations-suite.js.map +1 -0
- package/dist/many-migrations.d.ts +16 -0
- package/dist/many-migrations.d.ts.map +1 -0
- package/dist/many-migrations.js +50 -0
- package/dist/many-migrations.js.map +1 -0
- package/dist/membership-executor-suite.d.ts.map +1 -1
- package/dist/membership-executor-suite.js +8 -5
- package/dist/membership-executor-suite.js.map +1 -1
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +10 -0
- package/dist/modules.js.map +1 -1
- package/dist/reserved-role-suite.d.ts +6 -0
- package/dist/reserved-role-suite.d.ts.map +1 -1
- package/dist/reserved-role-suite.js +176 -8
- package/dist/reserved-role-suite.js.map +1 -1
- package/dist/restore-role-suite.d.ts +17 -0
- package/dist/restore-role-suite.d.ts.map +1 -0
- package/dist/restore-role-suite.js +107 -0
- package/dist/restore-role-suite.js.map +1 -0
- package/dist/role-state-suite.d.ts +17 -0
- package/dist/role-state-suite.d.ts.map +1 -0
- package/dist/role-state-suite.js +80 -0
- package/dist/role-state-suite.js.map +1 -0
- package/dist/schedule-platform-requests-suite.d.ts +7 -1
- package/dist/schedule-platform-requests-suite.d.ts.map +1 -1
- package/dist/schedule-platform-requests-suite.js +349 -2
- package/dist/schedule-platform-requests-suite.js.map +1 -1
- package/dist/schedule-purge-request-module.d.ts +88 -0
- package/dist/schedule-purge-request-module.d.ts.map +1 -0
- package/dist/schedule-purge-request-module.js +114 -0
- package/dist/schedule-purge-request-module.js.map +1 -0
- package/dist/schedule-purge-two-module.d.ts +141 -0
- package/dist/schedule-purge-two-module.d.ts.map +1 -0
- package/dist/schedule-purge-two-module.js +153 -0
- package/dist/schedule-purge-two-module.js.map +1 -0
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +1329 -8
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/size-reads-suite.d.ts +20 -0
- package/dist/size-reads-suite.d.ts.map +1 -0
- package/dist/size-reads-suite.js +77 -0
- package/dist/size-reads-suite.js.map +1 -0
- package/dist/stored-vertical-copy-suite.d.ts +15 -0
- package/dist/stored-vertical-copy-suite.d.ts.map +1 -0
- package/dist/stored-vertical-copy-suite.js +68 -0
- package/dist/stored-vertical-copy-suite.js.map +1 -0
- package/dist/unreadable-scope-row-suite.d.ts +16 -0
- package/dist/unreadable-scope-row-suite.d.ts.map +1 -0
- package/dist/unreadable-scope-row-suite.js +152 -0
- package/dist/unreadable-scope-row-suite.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { errorCodeOf, platformActorId, scopeId, tenantId } from '@substrat-run/contracts';
|
|
3
|
+
import { ulid } from '@substrat-run/kernel';
|
|
4
|
+
import { heldMigrations } from './held-migrations.js';
|
|
5
|
+
/** A trigger refusing one admin action's row, or one kind of write to a directory table. */
|
|
6
|
+
function refusal(name, on, when = '') {
|
|
7
|
+
return {
|
|
8
|
+
create: `CREATE TRIGGER ${name} BEFORE ${on} ${when}
|
|
9
|
+
BEGIN SELECT RAISE(ABORT, 'refused by ${name} (test fault)'); END`,
|
|
10
|
+
drop: `DROP TRIGGER IF EXISTS ${name}`,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const slugOf = () => `audit-${ulid().toLowerCase()}`;
|
|
14
|
+
const newTenant = async (host, staff, name = 'Audit directory test') => {
|
|
15
|
+
const t = tenantId.parse(ulid());
|
|
16
|
+
await host.admin.createTenant(staff, { id: t, slug: slugOf(), name });
|
|
17
|
+
return t;
|
|
18
|
+
};
|
|
19
|
+
const newVertical = async (host, staff) => {
|
|
20
|
+
const slug = slugOf();
|
|
21
|
+
await host.admin.registerVertical(staff, { slug, name: 'Audit directory test', source: 'builtin' });
|
|
22
|
+
return slug;
|
|
23
|
+
};
|
|
24
|
+
const publish = async (host, staff, slug) => {
|
|
25
|
+
const id = ulid();
|
|
26
|
+
await host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
|
|
27
|
+
manifestDigest: 'm', permissionDigest: 'p', migrationDigest: 'g', deploymentRef: null });
|
|
28
|
+
return id;
|
|
29
|
+
};
|
|
30
|
+
const verticalOf = async (host, staff, slug) => (await host.admin.listVerticals(staff)).find((v) => v.slug === slug);
|
|
31
|
+
/** #2501: how many of the slug's ownership periods are open (at most one). */
|
|
32
|
+
const openPeriodsOf = async (host, staff, slug) => (await host.admin.listVerticalOwners(staff, slug)).filter((p) => p.until === null).length;
|
|
33
|
+
/** One vertical flag flipped by staff: the case is the same shape for each. */
|
|
34
|
+
const flagCase = (action, field) => ({
|
|
35
|
+
action,
|
|
36
|
+
write: { table: 'verticals', verb: 'UPDATE' },
|
|
37
|
+
arrange: async (host, staff) => {
|
|
38
|
+
const slug = await newVertical(host, staff);
|
|
39
|
+
return {
|
|
40
|
+
call: () => host.admin[action](staff, slug, true),
|
|
41
|
+
state: async () => (await verticalOf(host, staff, slug))?.[field],
|
|
42
|
+
changed: true,
|
|
43
|
+
row: { before: { [field]: false }, after: { [field]: true } },
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
const CASES = [
|
|
48
|
+
{
|
|
49
|
+
action: 'createTenant',
|
|
50
|
+
write: { table: 'tenants', verb: 'INSERT' },
|
|
51
|
+
arrange: async (host, staff) => {
|
|
52
|
+
const t = tenantId.parse(ulid());
|
|
53
|
+
const slug = slugOf();
|
|
54
|
+
return {
|
|
55
|
+
call: () => host.admin.createTenant(staff, { id: t, slug, name: 'Created' }),
|
|
56
|
+
state: async () => (await host.admin.getTenant(staff, t))?.status ?? null,
|
|
57
|
+
changed: 'active',
|
|
58
|
+
row: { before: null, after: expect.objectContaining({ id: t, slug, name: 'Created', status: 'active' }) },
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
action: 'setTenantStatus',
|
|
64
|
+
write: { table: 'tenants', verb: 'UPDATE' },
|
|
65
|
+
arrange: async (host, staff) => {
|
|
66
|
+
const t = await newTenant(host, staff);
|
|
67
|
+
return {
|
|
68
|
+
call: () => host.admin.setTenantStatus(staff, t, 'suspended'),
|
|
69
|
+
state: async () => (await host.admin.getTenant(staff, t))?.status,
|
|
70
|
+
changed: 'suspended',
|
|
71
|
+
row: { before: { status: 'active' }, after: { status: 'suspended' } },
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
action: 'setTenantName',
|
|
77
|
+
write: { table: 'tenants', verb: 'UPDATE' },
|
|
78
|
+
arrange: async (host, staff) => {
|
|
79
|
+
const t = await newTenant(host, staff, 'Before');
|
|
80
|
+
return {
|
|
81
|
+
call: () => host.admin.setTenantName(staff, t, 'After'),
|
|
82
|
+
state: async () => (await host.admin.getTenant(staff, t))?.name,
|
|
83
|
+
changed: 'After',
|
|
84
|
+
row: { before: { name: 'Before' }, after: { name: 'After' } },
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
action: 'reapTenant',
|
|
90
|
+
write: { table: 'tenants', verb: 'UPDATE' },
|
|
91
|
+
arrange: async (host, staff) => {
|
|
92
|
+
const t = await newTenant(host, staff);
|
|
93
|
+
await host.admin.grantEntitlement(staff, t, 'audit-entitlement');
|
|
94
|
+
await host.admin.setTenantStatus(staff, t, 'deleting');
|
|
95
|
+
return {
|
|
96
|
+
call: () => host.admin.reapTenant(staff, t),
|
|
97
|
+
// The rows a reap clears go back with the flip: the entitlement is the witness.
|
|
98
|
+
state: async () => [(await host.admin.getTenant(staff, t))?.status, (await host.admin.listEntitlements(staff, t)).length],
|
|
99
|
+
changed: ['reaped', 0],
|
|
100
|
+
row: { before: { status: 'deleting' }, after: { status: 'reaped' } },
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
action: 'registerVertical',
|
|
106
|
+
write: { table: 'verticals', verb: 'INSERT' },
|
|
107
|
+
arrange: async (host, staff) => {
|
|
108
|
+
const slug = slugOf();
|
|
109
|
+
return {
|
|
110
|
+
call: () => host.admin.registerVertical(staff, { slug, name: 'Registered', source: 'builtin' }),
|
|
111
|
+
// #2501: the ownership period opens in the same unit as the row and its admin entry.
|
|
112
|
+
state: async () => [(await verticalOf(host, staff, slug))?.name ?? null, await openPeriodsOf(host, staff, slug)],
|
|
113
|
+
changed: ['Registered', 1],
|
|
114
|
+
row: { before: null, after: expect.objectContaining({ slug, name: 'Registered', source: 'builtin' }) },
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
action: 'publishVersion',
|
|
120
|
+
write: { table: 'vertical_versions', verb: 'INSERT' },
|
|
121
|
+
arrange: async (host, staff) => {
|
|
122
|
+
const slug = await newVertical(host, staff);
|
|
123
|
+
const id = ulid();
|
|
124
|
+
return {
|
|
125
|
+
call: () => host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
|
|
126
|
+
manifestDigest: 'm', permissionDigest: 'p', migrationDigest: 'g', deploymentRef: null }),
|
|
127
|
+
state: async () => (await host.admin.getVersion(staff, id))?.admission ?? null,
|
|
128
|
+
changed: 'pending',
|
|
129
|
+
row: { before: null, after: expect.objectContaining({ id, verticalSlug: slug, admission: 'pending' }) },
|
|
130
|
+
};
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
flagCase('setVerticalListed', 'listed'),
|
|
134
|
+
{
|
|
135
|
+
action: 'requestPublish',
|
|
136
|
+
write: { table: 'verticals', verb: 'UPDATE' },
|
|
137
|
+
arrange: async (host, staff) => {
|
|
138
|
+
const slug = await newVertical(host, staff);
|
|
139
|
+
return {
|
|
140
|
+
call: () => host.admin.requestPublish(staff, slug),
|
|
141
|
+
state: async () => (await verticalOf(host, staff, slug))?.publishRequestedAt != null,
|
|
142
|
+
changed: true,
|
|
143
|
+
row: { before: null, after: { slug } },
|
|
144
|
+
};
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
flagCase('setVerticalInstallsBlocked', 'installsBlocked'),
|
|
148
|
+
flagCase('setVerticalTenantProvisioner', 'tenantProvisioner'),
|
|
149
|
+
flagCase('setVerticalEmailSender', 'emailSender'),
|
|
150
|
+
{
|
|
151
|
+
action: 'deleteVertical',
|
|
152
|
+
write: { table: 'verticals', verb: 'DELETE' },
|
|
153
|
+
arrange: async (host, staff) => {
|
|
154
|
+
const slug = await newVertical(host, staff);
|
|
155
|
+
const version = await publish(host, staff, slug);
|
|
156
|
+
return {
|
|
157
|
+
call: () => host.admin.deleteVertical(staff, slug),
|
|
158
|
+
// The versions it deletes first go back with the row, and so does the closing of its
|
|
159
|
+
// ownership period (#2501).
|
|
160
|
+
state: async () => [
|
|
161
|
+
(await verticalOf(host, staff, slug)) !== undefined,
|
|
162
|
+
(await host.admin.getVersion(staff, version)) !== undefined,
|
|
163
|
+
await openPeriodsOf(host, staff, slug),
|
|
164
|
+
],
|
|
165
|
+
changed: [false, false, 0],
|
|
166
|
+
row: { before: { slug, source: 'builtin', ownerTenant: null }, after: null },
|
|
167
|
+
};
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
action: 'admitVersion',
|
|
172
|
+
write: { table: 'vertical_versions', verb: 'UPDATE' },
|
|
173
|
+
arrange: async (host, staff) => {
|
|
174
|
+
const version = await publish(host, staff, await newVertical(host, staff));
|
|
175
|
+
return {
|
|
176
|
+
call: () => host.admin.admitVersion(staff, version),
|
|
177
|
+
state: async () => (await host.admin.getVersion(staff, version))?.admission,
|
|
178
|
+
changed: 'admitted',
|
|
179
|
+
row: { before: { admission: 'pending' }, after: { admission: 'admitted' } },
|
|
180
|
+
};
|
|
181
|
+
},
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
action: 'rejectVersion',
|
|
185
|
+
write: { table: 'vertical_versions', verb: 'UPDATE' },
|
|
186
|
+
arrange: async (host, staff) => {
|
|
187
|
+
const version = await publish(host, staff, await newVertical(host, staff));
|
|
188
|
+
return {
|
|
189
|
+
call: () => host.admin.rejectVersion(staff, version, 'not this one'),
|
|
190
|
+
state: async () => (await host.admin.getVersion(staff, version))?.admission,
|
|
191
|
+
changed: 'rejected',
|
|
192
|
+
row: { before: { admission: 'pending' }, after: { admission: 'rejected', note: 'not this one' } },
|
|
193
|
+
};
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
action: 'promoteVersion',
|
|
198
|
+
write: { table: 'vertical_channels', verb: 'INSERT' },
|
|
199
|
+
arrange: async (host, staff) => {
|
|
200
|
+
const slug = await newVertical(host, staff);
|
|
201
|
+
const version = await publish(host, staff, slug);
|
|
202
|
+
await host.admin.admitVersion(staff, version);
|
|
203
|
+
return {
|
|
204
|
+
call: () => host.admin.promoteVersion(staff, slug, 'prod', version),
|
|
205
|
+
state: async () => (await host.admin.listChannels(staff, slug))[0]?.versionId ?? null,
|
|
206
|
+
changed: version,
|
|
207
|
+
row: { before: null, after: expect.objectContaining({ channel: 'prod', versionId: version }) },
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
action: 'setVerticalServing',
|
|
213
|
+
write: { table: 'verticals', verb: 'UPDATE' },
|
|
214
|
+
arrange: async (host, staff) => {
|
|
215
|
+
const slug = await newVertical(host, staff);
|
|
216
|
+
const version = await publish(host, staff, slug);
|
|
217
|
+
const ref = `serving-${ulid().toLowerCase()}`;
|
|
218
|
+
return {
|
|
219
|
+
call: () => host.admin.setVerticalServing(staff, slug, { ref, versionId: version, doClasses: [], migrationTag: 'g' }),
|
|
220
|
+
state: async () => (await host.admin.verticalServing(staff, slug))?.versionId ?? null,
|
|
221
|
+
changed: version,
|
|
222
|
+
row: { before: null, after: { vertical: slug, ref, versionId: version } },
|
|
223
|
+
};
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
// RFC wire-signing §7 (Q8): the capability record of one upload.
|
|
228
|
+
action: 'recordWireAuth',
|
|
229
|
+
write: { table: 'vertical_wire_auth', verb: 'INSERT' },
|
|
230
|
+
arrange: async (host, staff) => {
|
|
231
|
+
// A record is written only beside its vertical's registration.
|
|
232
|
+
const slug = await newVertical(host, staff);
|
|
233
|
+
const deploymentRef = `${slug}-serving`;
|
|
234
|
+
const record = {
|
|
235
|
+
envelope: 1, entrySkipped: null, state: 'dual', audience: deploymentRef,
|
|
236
|
+
routerKids: ['If4x36FUomE'], platformKids: ['OfcT0KZEJT8'], withheld: null,
|
|
237
|
+
};
|
|
238
|
+
return {
|
|
239
|
+
call: () => host.admin.recordWireAuth(staff, { deploymentRef, verticalSlug: slug, versionId: 'v1', record, recordedAt: '2026-10-24T10:00:00.000Z' }),
|
|
240
|
+
state: async () => (await host.admin.listWireAuth(staff, { reach: { fleet: true }, limit: 1, verticalSlug: slug }))[0]?.record ?? null,
|
|
241
|
+
changed: record,
|
|
242
|
+
row: { before: null, after: { vertical: slug, deploymentRef, versionId: 'v1', record } },
|
|
243
|
+
};
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
];
|
|
247
|
+
/**
|
|
248
|
+
* #2479: every tenant and vertical directory write commits with its admin row. A fault in the
|
|
249
|
+
* audit insert leaves the state as it was and no row; a fault in the state write leaves no row;
|
|
250
|
+
* the retry writes the state and exactly one row, fields as the adapters have always written them.
|
|
251
|
+
*/
|
|
252
|
+
export function directoryAdminAuditTransactionSuite(adapterName, makeFixture) {
|
|
253
|
+
describe(`HostAdmin tenant and vertical directory audit transaction: ${adapterName}`, () => {
|
|
254
|
+
const run = async (c, fault) => {
|
|
255
|
+
const fixture = await makeFixture();
|
|
256
|
+
const { host } = fixture;
|
|
257
|
+
const staff = platformActorId.parse(ulid());
|
|
258
|
+
const tag = `${c.action.toLowerCase()}_${ulid().toLowerCase()}`;
|
|
259
|
+
const trigger = fault === 'audit'
|
|
260
|
+
? refusal(`test_refuse_audit_${tag}`, 'INSERT ON _substrat_admin_log', `WHEN NEW.action = '${c.action}'`)
|
|
261
|
+
: refusal(`test_refuse_write_${tag}`, `${c.write.verb} ON ${c.write.table}`);
|
|
262
|
+
let lifted = true;
|
|
263
|
+
try {
|
|
264
|
+
const { call, state, changed, row } = await c.arrange(host, staff);
|
|
265
|
+
const since = new Date().toISOString();
|
|
266
|
+
const rows = () => host.admin.auditLog(staff, { action: [c.action], since });
|
|
267
|
+
const before = await state();
|
|
268
|
+
expect(before).not.toEqual(changed);
|
|
269
|
+
await fixture.directorySql(trigger.create);
|
|
270
|
+
lifted = false;
|
|
271
|
+
await expect(call()).rejects.toThrow(/test fault/);
|
|
272
|
+
expect(await state()).toEqual(before);
|
|
273
|
+
expect(await rows()).toEqual([]);
|
|
274
|
+
await fixture.directorySql(trigger.drop);
|
|
275
|
+
lifted = true;
|
|
276
|
+
await call();
|
|
277
|
+
expect(await state()).toEqual(changed);
|
|
278
|
+
expect((await rows()).map((r) => ({ before: r.before, after: r.after }))).toEqual([row]);
|
|
279
|
+
}
|
|
280
|
+
finally {
|
|
281
|
+
if (!lifted)
|
|
282
|
+
await fixture.directorySql(trigger.drop);
|
|
283
|
+
await fixture.cleanup();
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
it.each(CASES.map((c) => [c.action, c]))('%s rolls back when its audit row is refused, and writes one on retry', async (_, c) => {
|
|
287
|
+
await run(c, 'audit');
|
|
288
|
+
});
|
|
289
|
+
it.each(CASES.map((c) => [c.action, c]))('%s records no audit row when its state write is refused', async (_, c) => {
|
|
290
|
+
await run(c, 'write');
|
|
291
|
+
});
|
|
292
|
+
it('a no-op rename records nothing, and the rename before it one row', async () => {
|
|
293
|
+
const fixture = await makeFixture();
|
|
294
|
+
const { host } = fixture;
|
|
295
|
+
const staff = platformActorId.parse(ulid());
|
|
296
|
+
try {
|
|
297
|
+
const t = await newTenant(host, staff, 'Before');
|
|
298
|
+
await host.admin.setTenantName(staff, t, 'After');
|
|
299
|
+
await host.admin.setTenantName(staff, t, 'After');
|
|
300
|
+
expect((await host.admin.auditLog(staff, { tenantId: t, action: ['setTenantName'] })).map((r) => r.after))
|
|
301
|
+
.toEqual([{ name: 'After' }]);
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
await fixture.cleanup();
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
// The promote's own row commits with the channel move, so it lands ahead of the rebinds a
|
|
308
|
+
// private promote makes afterwards, each of which records its own row.
|
|
309
|
+
it('a private promote records its own row before the scope rebinds it causes', async () => {
|
|
310
|
+
const fixture = await makeFixture();
|
|
311
|
+
const { host } = fixture;
|
|
312
|
+
const staff = platformActorId.parse(ulid());
|
|
313
|
+
try {
|
|
314
|
+
const owner = await newTenant(host, staff);
|
|
315
|
+
const scope = scopeId.parse(ulid());
|
|
316
|
+
const slug = `tenant-a/${slugOf()}`;
|
|
317
|
+
await host.admin.registerVertical(staff, { slug, name: 'Audit promote order', source: 'cli', ownerTenant: owner });
|
|
318
|
+
const release = async () => {
|
|
319
|
+
const id = ulid();
|
|
320
|
+
await host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
|
|
321
|
+
manifestDigest: 'm', permissionDigest: 'p', ...(await heldMigrations('g')), deploymentRef: null });
|
|
322
|
+
return id;
|
|
323
|
+
};
|
|
324
|
+
const first = await release();
|
|
325
|
+
const second = await release();
|
|
326
|
+
await host.provisionScope(staff, { tenantId: owner, scopeId: scope, vertical: slug });
|
|
327
|
+
await host.admin.activateScope(staff, owner, scope);
|
|
328
|
+
await host.admin.bindScopeVersion(staff, owner, scope, first);
|
|
329
|
+
await host.admin.promoteVersion(staff, slug, 'prod', first);
|
|
330
|
+
await host.admin.promoteVersion(staff, slug, 'prod', second);
|
|
331
|
+
// In id order, which is the order they were written.
|
|
332
|
+
const rows = (await host.admin.auditLog(staff, { action: ['promoteVersion', 'bindScopeVersion'] }))
|
|
333
|
+
.filter((r) => (r.vertical === slug || r.scopeId === scope) && r.after.versionId === second);
|
|
334
|
+
expect(rows.map((r) => [r.action, r.after.versionId])).toEqual([
|
|
335
|
+
['promoteVersion', second],
|
|
336
|
+
['bindScopeVersion', second],
|
|
337
|
+
]);
|
|
338
|
+
expect((await host.admin.getScopeRecord(staff, owner, scope))?.verticalVersionId).toBe(second);
|
|
339
|
+
}
|
|
340
|
+
finally {
|
|
341
|
+
await fixture.cleanup();
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
describe('#2528: the row and the guard are read in the unit that writes', () => {
|
|
345
|
+
const withFixture = async (body) => {
|
|
346
|
+
const fixture = await makeFixture();
|
|
347
|
+
try {
|
|
348
|
+
await body(fixture, fixture.host, platformActorId.parse(ulid()));
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
await fixture.cleanup();
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
const refusalOf = async (p) => {
|
|
355
|
+
try {
|
|
356
|
+
await p;
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
return err;
|
|
360
|
+
}
|
|
361
|
+
throw new Error('expected the call to be refused');
|
|
362
|
+
};
|
|
363
|
+
const rowsSince = async (host, staff, action, since) => (await host.admin.auditLog(staff, { action: [action], since })).map((r) => ({ before: r.before, after: r.after }));
|
|
364
|
+
/** A private vertical (tenant-owned, not listed), whose versions self-admit. */
|
|
365
|
+
const privateVertical = async (host, staff) => {
|
|
366
|
+
const owner = await newTenant(host, staff);
|
|
367
|
+
const slug = `tenant-a/${slugOf()}`;
|
|
368
|
+
await host.admin.registerVertical(staff, { slug, name: 'Audit private', source: 'cli', ownerTenant: owner });
|
|
369
|
+
const release = async () => {
|
|
370
|
+
const id = ulid();
|
|
371
|
+
await host.admin.publishVersion(staff, { id, verticalSlug: slug, version: `1.0.${id.toLowerCase()}`,
|
|
372
|
+
manifestDigest: 'm', permissionDigest: 'p', ...(await heldMigrations('g')), deploymentRef: null });
|
|
373
|
+
return id;
|
|
374
|
+
};
|
|
375
|
+
return { slug, release };
|
|
376
|
+
};
|
|
377
|
+
const FLAGS = [
|
|
378
|
+
['setVerticalListed', 'listed', 'listed'],
|
|
379
|
+
['setVerticalInstallsBlocked', 'installsBlocked', 'installs_blocked'],
|
|
380
|
+
['setVerticalTenantProvisioner', 'tenantProvisioner', 'tenant_provisioner'],
|
|
381
|
+
['setVerticalEmailSender', 'emailSender', 'email_sender'],
|
|
382
|
+
];
|
|
383
|
+
it.each(FLAGS)('%s records the before its own unit read', async (action, field, column) => {
|
|
384
|
+
await withFixture(async (fixture, host, staff) => {
|
|
385
|
+
const slug = await newVertical(host, staff);
|
|
386
|
+
const since = new Date().toISOString();
|
|
387
|
+
fixture.interleave(`UPDATE verticals SET ${column} = 1 WHERE slug = '${slug}'`);
|
|
388
|
+
await host.admin[action](staff, slug, false);
|
|
389
|
+
expect((await verticalOf(host, staff, slug))?.[field]).toBe(false);
|
|
390
|
+
expect(await rowsSince(host, staff, action, since)).toEqual([{ before: { [field]: true }, after: { [field]: false } }]);
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
it('listing refuses an auto-admitted prod version a promote moved the channel to', async () => {
|
|
394
|
+
await withFixture(async (fixture, host, staff) => {
|
|
395
|
+
const { slug, release } = await privateVertical(host, staff);
|
|
396
|
+
const vouched = await release();
|
|
397
|
+
await host.admin.admitVersion(staff, vouched);
|
|
398
|
+
await host.admin.promoteVersion(staff, slug, 'prod', vouched);
|
|
399
|
+
const auto = await release();
|
|
400
|
+
const since = new Date().toISOString();
|
|
401
|
+
fixture.interleave(`UPDATE vertical_channels SET version_id = '${auto}' WHERE vertical_slug = '${slug}' AND channel = 'prod'`);
|
|
402
|
+
const refused = await refusalOf(host.admin.setVerticalListed(staff, slug, true));
|
|
403
|
+
expect(errorCodeOf(refused)).toBe('conflict');
|
|
404
|
+
expect(refused.message).toContain(`prod version ${auto} is auto-admitted`);
|
|
405
|
+
expect((await verticalOf(host, staff, slug))?.listed).toBe(false);
|
|
406
|
+
expect(await rowsSince(host, staff, 'setVerticalListed', since)).toEqual([]);
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
it('and lists when the channel moved from an auto-admitted version to a vouched one', async () => {
|
|
410
|
+
await withFixture(async (fixture, host, staff) => {
|
|
411
|
+
const { slug, release } = await privateVertical(host, staff);
|
|
412
|
+
const vouched = await release();
|
|
413
|
+
await host.admin.admitVersion(staff, vouched);
|
|
414
|
+
const auto = await release();
|
|
415
|
+
await host.admin.promoteVersion(staff, slug, 'prod', auto);
|
|
416
|
+
const since = new Date().toISOString();
|
|
417
|
+
fixture.interleave(`UPDATE vertical_channels SET version_id = '${vouched}' WHERE vertical_slug = '${slug}' AND channel = 'prod'`);
|
|
418
|
+
await host.admin.setVerticalListed(staff, slug, true);
|
|
419
|
+
expect((await verticalOf(host, staff, slug))?.listed).toBe(true);
|
|
420
|
+
expect(await rowsSince(host, staff, 'setVerticalListed', since)).toEqual([{ before: { listed: false }, after: { listed: true } }]);
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
it('admitVersion refuses a version rejected since it was read', async () => {
|
|
424
|
+
await withFixture(async (fixture, host, staff) => {
|
|
425
|
+
const version = await publish(host, staff, await newVertical(host, staff));
|
|
426
|
+
const since = new Date().toISOString();
|
|
427
|
+
fixture.interleave(`UPDATE vertical_versions SET admission = 'rejected', admission_note = 'interleaved' WHERE id = '${version}'`);
|
|
428
|
+
const refused = await refusalOf(host.admin.admitVersion(staff, version));
|
|
429
|
+
expect(errorCodeOf(refused)).toBe('conflict');
|
|
430
|
+
expect(refused.message).toBe(`version ${version} was rejected — publish a new one`);
|
|
431
|
+
expect((await host.admin.getVersion(staff, version))?.admission).toBe('rejected');
|
|
432
|
+
expect(await rowsSince(host, staff, 'admitVersion', since)).toEqual([]);
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
it('rejectVersion refuses a version admitted since it was read', async () => {
|
|
436
|
+
await withFixture(async (fixture, host, staff) => {
|
|
437
|
+
const version = await publish(host, staff, await newVertical(host, staff));
|
|
438
|
+
const since = new Date().toISOString();
|
|
439
|
+
fixture.interleave(`UPDATE vertical_versions SET admission = 'admitted' WHERE id = '${version}'`);
|
|
440
|
+
const refused = await refusalOf(host.admin.rejectVersion(staff, version, 'not this one'));
|
|
441
|
+
expect(errorCodeOf(refused)).toBe('conflict');
|
|
442
|
+
expect(refused.message).toBe(`version ${version} is already admitted — it may be bound`);
|
|
443
|
+
expect((await host.admin.getVersion(staff, version))?.admission).toBe('admitted');
|
|
444
|
+
expect(await rowsSince(host, staff, 'rejectVersion', since)).toEqual([]);
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
it('admitVersion of an auto-admitted version another admit already vouched for records nothing', async () => {
|
|
448
|
+
await withFixture(async (fixture, host, staff) => {
|
|
449
|
+
const { release } = await privateVertical(host, staff);
|
|
450
|
+
const auto = await release();
|
|
451
|
+
const since = new Date().toISOString();
|
|
452
|
+
fixture.interleave(`UPDATE vertical_versions SET admission_note = NULL WHERE id = '${auto}'`);
|
|
453
|
+
await host.admin.admitVersion(staff, auto);
|
|
454
|
+
expect((await host.admin.getVersion(staff, auto))?.admissionNote).toBeNull();
|
|
455
|
+
expect(await rowsSince(host, staff, 'admitVersion', since)).toEqual([]);
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
it('deleteVertical refuses a vertical a scope was bound to since it was read', async () => {
|
|
459
|
+
await withFixture(async (fixture, host, staff) => {
|
|
460
|
+
const slug = await newVertical(host, staff);
|
|
461
|
+
const other = await newVertical(host, staff);
|
|
462
|
+
const t = await newTenant(host, staff);
|
|
463
|
+
const s = scopeId.parse(ulid());
|
|
464
|
+
await host.provisionScope(staff, { tenantId: t, scopeId: s, vertical: other });
|
|
465
|
+
const since = new Date().toISOString();
|
|
466
|
+
fixture.interleave(`UPDATE scopes SET vertical = '${slug}' WHERE scope_id = '${s}'`);
|
|
467
|
+
const refused = await refusalOf(host.admin.deleteVertical(staff, slug));
|
|
468
|
+
expect(errorCodeOf(refused)).toBe('conflict');
|
|
469
|
+
expect(refused.message).toBe(`vertical '${slug}' still backs 1 scope(s) — delete or rebind them first`);
|
|
470
|
+
expect(await verticalOf(host, staff, slug)).toBeDefined();
|
|
471
|
+
expect(await rowsSince(host, staff, 'deleteVertical', since)).toEqual([]);
|
|
472
|
+
});
|
|
473
|
+
});
|
|
474
|
+
it('publishVersion does not self-admit on a vertical listed since it was read', async () => {
|
|
475
|
+
await withFixture(async (fixture, host, staff) => {
|
|
476
|
+
const { slug, release } = await privateVertical(host, staff);
|
|
477
|
+
const since = new Date().toISOString();
|
|
478
|
+
fixture.interleave(`UPDATE verticals SET listed = 1 WHERE slug = '${slug}'`);
|
|
479
|
+
const version = await release();
|
|
480
|
+
expect(await host.admin.getVersion(staff, version)).toMatchObject({ admission: 'pending', admissionNote: null });
|
|
481
|
+
expect((await rowsSince(host, staff, 'publishVersion', since)).map((r) => r.after.admission))
|
|
482
|
+
.toEqual(['pending']);
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
it('and self-admits on a vertical unlisted since it was read', async () => {
|
|
486
|
+
await withFixture(async (fixture, host, staff) => {
|
|
487
|
+
const { slug, release } = await privateVertical(host, staff);
|
|
488
|
+
await fixture.directorySql(`UPDATE verticals SET listed = 1 WHERE slug = '${slug}'`);
|
|
489
|
+
const since = new Date().toISOString();
|
|
490
|
+
fixture.interleave(`UPDATE verticals SET listed = 0 WHERE slug = '${slug}'`);
|
|
491
|
+
const version = await release();
|
|
492
|
+
expect(await host.admin.getVersion(staff, version)).toMatchObject({ admission: 'admitted', admissionNote: expect.any(String) });
|
|
493
|
+
expect((await rowsSince(host, staff, 'publishVersion', since)).map((r) => r.after.admission))
|
|
494
|
+
.toEqual(['admitted']);
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
it('setVerticalServing refuses a serve whose serving version moved, and a retry after reading it again lands', async () => {
|
|
498
|
+
await withFixture(async (fixture, host, staff) => {
|
|
499
|
+
const slug = await newVertical(host, staff);
|
|
500
|
+
const [first, second, third] = [await publish(host, staff, slug), await publish(host, staff, slug), await publish(host, staff, slug)];
|
|
501
|
+
const serve = (versionId, ref) => host.admin.setVerticalServing(staff, slug, { ref, versionId, doClasses: [], migrationTag: 'g' });
|
|
502
|
+
const rows = async () => (await host.admin.auditLog(staff, { action: ['setVerticalServing'] }))
|
|
503
|
+
.filter((r) => r.after.vertical === slug)
|
|
504
|
+
.map((r) => ({ before: r.before, after: r.after }));
|
|
505
|
+
await serve(first, 'serving-a');
|
|
506
|
+
fixture.interleave(`UPDATE verticals SET serving_ref = 'serving-b', serving_version_id = '${second}' WHERE slug = '${slug}'`);
|
|
507
|
+
const lost = await refusalOf(serve(third, 'serving-c'));
|
|
508
|
+
expect(errorCodeOf(lost)).toBe('precondition_failed');
|
|
509
|
+
expect(lost.message).toContain('moved while this serve was being judged');
|
|
510
|
+
expect((await host.admin.verticalServing(staff, slug))?.versionId).toBe(second);
|
|
511
|
+
expect(await rows()).toHaveLength(1);
|
|
512
|
+
await serve(third, 'serving-c');
|
|
513
|
+
expect((await host.admin.verticalServing(staff, slug))?.versionId).toBe(third);
|
|
514
|
+
expect(await rows()).toEqual([
|
|
515
|
+
{ before: null, after: { vertical: slug, ref: 'serving-a', versionId: first } },
|
|
516
|
+
{ before: { ref: 'serving-b', versionId: second }, after: { vertical: slug, ref: 'serving-c', versionId: third } },
|
|
517
|
+
]);
|
|
518
|
+
});
|
|
519
|
+
});
|
|
520
|
+
it('setVerticalServing refuses a serve whose serving ref moved while its version stayed', async () => {
|
|
521
|
+
await withFixture(async (fixture, host, staff) => {
|
|
522
|
+
const slug = await newVertical(host, staff);
|
|
523
|
+
const [first, second] = [await publish(host, staff, slug), await publish(host, staff, slug)];
|
|
524
|
+
const serve = (versionId, ref) => host.admin.setVerticalServing(staff, slug, { ref, versionId, doClasses: [], migrationTag: 'g' });
|
|
525
|
+
await serve(first, 'serving-a');
|
|
526
|
+
fixture.interleave(`UPDATE verticals SET serving_ref = 'serving-b' WHERE slug = '${slug}'`);
|
|
527
|
+
const lost = await refusalOf(serve(second, 'serving-c'));
|
|
528
|
+
expect(errorCodeOf(lost)).toBe('precondition_failed');
|
|
529
|
+
expect(await host.admin.verticalServing(staff, slug)).toMatchObject({ ref: 'serving-b', versionId: first });
|
|
530
|
+
// Only the first serve's row: the refused one recorded none.
|
|
531
|
+
expect((await host.admin.auditLog(staff, { action: ['setVerticalServing'] }))
|
|
532
|
+
.filter((r) => r.after.vertical === slug)
|
|
533
|
+
.map((r) => r.after.ref)).toEqual(['serving-a']);
|
|
534
|
+
});
|
|
535
|
+
});
|
|
536
|
+
it('setTenantStatus records the status its own unit read', async () => {
|
|
537
|
+
await withFixture(async (fixture, host, staff) => {
|
|
538
|
+
const t = await newTenant(host, staff);
|
|
539
|
+
fixture.interleave(`UPDATE tenants SET status = 'suspended' WHERE tenant_id = '${t}'`);
|
|
540
|
+
await host.admin.setTenantStatus(staff, t, 'active');
|
|
541
|
+
expect((await host.admin.auditLog(staff, { tenantId: t, action: ['setTenantStatus'] })).map((r) => [r.before, r.after]))
|
|
542
|
+
.toEqual([[{ status: 'suspended' }, { status: 'active' }]]);
|
|
543
|
+
});
|
|
544
|
+
});
|
|
545
|
+
it('setTenantName records the name its own unit read, and nothing when that is already the name', async () => {
|
|
546
|
+
await withFixture(async (fixture, host, staff) => {
|
|
547
|
+
const t = await newTenant(host, staff, 'Before');
|
|
548
|
+
fixture.interleave(`UPDATE tenants SET name = 'Middle' WHERE tenant_id = '${t}'`);
|
|
549
|
+
await host.admin.setTenantName(staff, t, 'After');
|
|
550
|
+
fixture.interleave(`UPDATE tenants SET name = 'Last' WHERE tenant_id = '${t}'`);
|
|
551
|
+
await host.admin.setTenantName(staff, t, 'Last');
|
|
552
|
+
expect((await host.admin.getTenant(staff, t))?.name).toBe('Last');
|
|
553
|
+
expect((await host.admin.auditLog(staff, { tenantId: t, action: ['setTenantName'] })).map((r) => [r.before, r.after]))
|
|
554
|
+
.toEqual([[{ name: 'Middle' }, { name: 'After' }]]);
|
|
555
|
+
});
|
|
556
|
+
});
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=directory-audit-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-audit-suite.js","sourceRoot":"","sources":["../src/directory-audit-suite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directory-restore-suite.d.ts","sourceRoot":"","sources":["../src/directory-restore-suite.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG/E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,uCAAuC;IACvC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,2FAA2F;IAC3F,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,+FAA+F;IAC/F,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtC;AA8FD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"directory-restore-suite.d.ts","sourceRoot":"","sources":["../src/directory-restore-suite.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG/E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACtC,uCAAuC;IACvC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,2FAA2F;IAC3F,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,+FAA+F;IAC/F,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,IAAI,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACtC;AA8FD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAge1F"}
|