@fuzdev/fuz_app 0.89.0 → 0.91.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/auth/CLAUDE.md +7 -0
- package/dist/auth/account_action_specs.d.ts +1 -1
- package/dist/auth/account_route_schema.d.ts +2 -2
- package/dist/auth/account_schema.d.ts +3 -3
- package/dist/auth/admin_action_specs.d.ts +8 -8
- package/dist/auth/all_cell_actions.d.ts +35 -0
- package/dist/auth/all_cell_actions.d.ts.map +1 -0
- package/dist/auth/all_cell_actions.js +32 -0
- package/dist/auth/audit_log_schema.d.ts +1 -1
- package/dist/auth/invite_schema.d.ts +2 -2
- package/dist/auth/signup_route_schema.d.ts +2 -2
- package/dist/auth/signup_route_schema.d.ts.map +1 -1
- package/dist/auth/signup_route_schema.js +2 -2
- package/dist/primitive_schemas.d.ts +27 -1
- package/dist/primitive_schemas.d.ts.map +1 -1
- package/dist/primitive_schemas.js +55 -2
- package/dist/server/env.d.ts +1 -1
- package/dist/server/env.d.ts.map +1 -1
- package/dist/server/env.js +15 -3
- package/dist/testing/CLAUDE.md +135 -10
- package/dist/testing/app_server.d.ts +16 -5
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/app_server.js +3 -1
- package/dist/testing/cross_backend/action_manifest.d.ts +113 -0
- package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -0
- package/dist/testing/cross_backend/action_manifest.js +89 -0
- package/dist/testing/cross_backend/action_manifest_parity.d.ts +67 -0
- package/dist/testing/cross_backend/action_manifest_parity.d.ts.map +1 -0
- package/dist/testing/cross_backend/action_manifest_parity.js +88 -0
- package/dist/testing/cross_backend/capabilities.d.ts +47 -30
- package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
- package/dist/testing/cross_backend/capabilities.js +19 -4
- package/dist/testing/cross_backend/default_backend_configs.d.ts +31 -15
- package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_backend_configs.js +30 -14
- package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_spine_surface.js +6 -0
- package/dist/testing/cross_backend/full_spine_mount.d.ts +81 -0
- package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -0
- package/dist/testing/cross_backend/full_spine_mount.js +49 -0
- package/dist/testing/cross_backend/identity_parity.d.ts +13 -0
- package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -0
- package/dist/testing/cross_backend/identity_parity.js +465 -0
- package/dist/testing/cross_backend/method_coverage.d.ts +71 -0
- package/dist/testing/cross_backend/method_coverage.d.ts.map +1 -0
- package/dist/testing/cross_backend/method_coverage.js +89 -0
- package/dist/testing/cross_backend/setup.d.ts +21 -0
- package/dist/testing/cross_backend/setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/setup.js +33 -1
- package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_backdoor.js +9 -5
- package/dist/testing/cross_backend/testing_reset_actions.d.ts +76 -2
- package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.js +63 -2
- package/dist/testing/schema_generators.d.ts.map +1 -1
- package/dist/testing/schema_generators.js +7 -0
- package/package.json +2 -2
|
@@ -4,6 +4,7 @@ import type { TestAccount } from '../app_server.js';
|
|
|
4
4
|
import type { BackendCapabilities } from './capabilities.js';
|
|
5
5
|
import { type FetchTransport } from '../transports/fetch_transport.js';
|
|
6
6
|
import type { SchemaSnapshot } from '../schema_introspect.js';
|
|
7
|
+
import { ActionManifest } from './action_manifest.js';
|
|
7
8
|
import type { BackendHandle } from './spawn_backend.js';
|
|
8
9
|
/**
|
|
9
10
|
* Options for `TestFixture.create_account` — mints an additional
|
|
@@ -15,6 +16,15 @@ export interface CreateTestAccountOptions {
|
|
|
15
16
|
readonly username?: string;
|
|
16
17
|
readonly password_value?: string;
|
|
17
18
|
readonly roles?: Array<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Optional email to store on the account, exercising the username-or-email
|
|
21
|
+
* login lookup. Cross-process this rides the production signup body
|
|
22
|
+
* (claimed against the username-scoped invite, which matches regardless of
|
|
23
|
+
* the email); in-process it lands directly on the inserted row. Must be a
|
|
24
|
+
* valid `Email` (the cross-process signup validates it) and unique per test
|
|
25
|
+
* (the `LOWER(email)` partial-unique index rejects collisions).
|
|
26
|
+
*/
|
|
27
|
+
readonly email?: string;
|
|
18
28
|
}
|
|
19
29
|
/**
|
|
20
30
|
* Shape returned by `TestFixture.create_account`. Aliased to the
|
|
@@ -368,6 +378,17 @@ export interface CrossProcessSetupOptions {
|
|
|
368
378
|
export declare const capture_schema_snapshot: (handle: ReconstructedBootstrappedBackendHandle, options?: {
|
|
369
379
|
exclude_tables?: ReadonlyArray<string>;
|
|
370
380
|
}) => Promise<SchemaSnapshot>;
|
|
381
|
+
/**
|
|
382
|
+
* Capture a backend's live RPC action manifest over the
|
|
383
|
+
* `_testing_action_manifest` RPC action (keeper daemon-token channel). The
|
|
384
|
+
* action-surface twin of `capture_schema_snapshot` — pair two calls with
|
|
385
|
+
* `assert_action_manifests_equal` (`testing/cross_backend/action_manifest_parity.ts`)
|
|
386
|
+
* to gate that the TS spine and the Rust `testing_spine_stub` mount the same
|
|
387
|
+
* method set with the same per-method auth shape. Each impl answers from its
|
|
388
|
+
* own live registry (TS via `build_action_manifest`, Rust via the
|
|
389
|
+
* `fuz_testing` mirror); the normalized shapes match by design.
|
|
390
|
+
*/
|
|
391
|
+
export declare const capture_action_manifest: (handle: ReconstructedBootstrappedBackendHandle) => Promise<ActionManifest>;
|
|
371
392
|
/**
|
|
372
393
|
* Backdating offset (seconds) the `mint_expired_session` seam passes to
|
|
373
394
|
* `mint_test_session` / `_testing_mint_session`. A minute in the past is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/setup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0B9B,OAAO,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAK5C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAyB,KAAK,cAAc,EAAC,MAAM,kCAAkC,CAAC;AAC7F,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ import { DAEMON_TOKEN_HEADER } from '../../auth/daemon_token.js';
|
|
|
27
27
|
import { USERNAME_LENGTH_MAX } from '../../primitive_schemas.js';
|
|
28
28
|
import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
|
|
29
29
|
import { create_fetch_transport } from '../transports/fetch_transport.js';
|
|
30
|
+
import { ActionManifest } from './action_manifest.js';
|
|
30
31
|
/**
|
|
31
32
|
* Build an `ExtraAccountFixture` from a seeded `{account, actor,
|
|
32
33
|
* api_token, session_cookie}` bundle and the session cookie name.
|
|
@@ -163,8 +164,26 @@ const rpc_via_transport = async (transport, rpc_path, method, params, backend_na
|
|
|
163
164
|
*/
|
|
164
165
|
export const capture_schema_snapshot = async (handle, options = {}) => {
|
|
165
166
|
const raw = await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, '_testing_schema_snapshot', { exclude_tables: [...(options.exclude_tables ?? [])] }, handle.config.name, { [DAEMON_TOKEN_HEADER]: handle.daemon_token });
|
|
167
|
+
// TODO: cast, not parse — `SchemaSnapshot.parse(raw)` would validate the wire
|
|
168
|
+
// against the schema (the `capture_action_manifest` twin parses + uses a
|
|
169
|
+
// strict object); parsing here may surface a latent schema-model gap to
|
|
170
|
+
// reconcile first, so it's left as a follow-up.
|
|
166
171
|
return raw;
|
|
167
172
|
};
|
|
173
|
+
/**
|
|
174
|
+
* Capture a backend's live RPC action manifest over the
|
|
175
|
+
* `_testing_action_manifest` RPC action (keeper daemon-token channel). The
|
|
176
|
+
* action-surface twin of `capture_schema_snapshot` — pair two calls with
|
|
177
|
+
* `assert_action_manifests_equal` (`testing/cross_backend/action_manifest_parity.ts`)
|
|
178
|
+
* to gate that the TS spine and the Rust `testing_spine_stub` mount the same
|
|
179
|
+
* method set with the same per-method auth shape. Each impl answers from its
|
|
180
|
+
* own live registry (TS via `build_action_manifest`, Rust via the
|
|
181
|
+
* `fuz_testing` mirror); the normalized shapes match by design.
|
|
182
|
+
*/
|
|
183
|
+
export const capture_action_manifest = async (handle) => {
|
|
184
|
+
const raw = await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, '_testing_action_manifest', {}, handle.config.name, { [DAEMON_TOKEN_HEADER]: handle.daemon_token });
|
|
185
|
+
return ActionManifest.parse(raw);
|
|
186
|
+
};
|
|
168
187
|
/**
|
|
169
188
|
* Backdating offset (seconds) the `mint_expired_session` seam passes to
|
|
170
189
|
* `mint_test_session` / `_testing_mint_session`. A minute in the past is
|
|
@@ -279,10 +298,22 @@ const mint_account = async (handle, options) => {
|
|
|
279
298
|
throw new Error(`invite_create(${handle.config.name}, username=${username}) returned unexpected result: ` +
|
|
280
299
|
JSON.stringify(invite_result));
|
|
281
300
|
}
|
|
301
|
+
// Thread the optional email onto the production signup body — the
|
|
302
|
+
// username-scoped invite above matches on username regardless of the
|
|
303
|
+
// email, so the account lands with the email set (exercising the
|
|
304
|
+
// username-or-email login lookup). Guard on `!== undefined` (not truthy)
|
|
305
|
+
// to match the other three email guards (`create_account` here +
|
|
306
|
+
// `app_server.ts`): "requested" is `undefined` vs present, so a
|
|
307
|
+
// caller-supplied value is forwarded verbatim and signup validates it,
|
|
308
|
+
// rather than the truthy form silently dropping an empty string.
|
|
282
309
|
const signup_response = await transport('/api/account/signup', {
|
|
283
310
|
method: 'POST',
|
|
284
311
|
headers: { 'Content-Type': 'application/json' },
|
|
285
|
-
body: JSON.stringify({
|
|
312
|
+
body: JSON.stringify({
|
|
313
|
+
username,
|
|
314
|
+
password,
|
|
315
|
+
...(options.email !== undefined && { email: options.email }),
|
|
316
|
+
}),
|
|
286
317
|
});
|
|
287
318
|
if (!signup_response.ok) {
|
|
288
319
|
const body = await signup_response.text().catch(() => '<unreadable>');
|
|
@@ -422,6 +453,7 @@ export const default_cross_process_setup = (handle, options) => {
|
|
|
422
453
|
...(account_options?.password_value !== undefined && {
|
|
423
454
|
password_value: account_options.password_value,
|
|
424
455
|
}),
|
|
456
|
+
...(account_options?.email !== undefined && { email: account_options.email }),
|
|
425
457
|
});
|
|
426
458
|
if (account_options?.roles && account_options.roles.length > 0) {
|
|
427
459
|
await grant_roles_via_offer_accept(refreshed_handle, other, account_options.roles);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"testing_backdoor.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_backdoor.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,OAAO,KAAK,EAAC,wBAAwB,EAAc,MAAM,YAAY,CAAC;AAkEtE,kEAAkE;AAClE,MAAM,MAAM,+BAA+B,GAAG,wBAAwB,CAAC;AAEvE,eAAO,MAAM,qCAAqC,GACjD,SAAS,+BAA+B,KACtC,IAiCF,CAAC"}
|
|
@@ -4,11 +4,12 @@ import '../assert_dev_env.js';
|
|
|
4
4
|
* actions.
|
|
5
5
|
*
|
|
6
6
|
* `_testing_reset` / `_testing_mint_session` / `_testing_put_fact` /
|
|
7
|
-
* `_testing_schema_snapshot` are privileged
|
|
8
|
-
* production wire never exposes — three direct DB
|
|
9
|
-
* forged session row, raw fact insert) plus
|
|
10
|
-
* (the
|
|
11
|
-
*
|
|
7
|
+
* `_testing_schema_snapshot` / `_testing_action_manifest` are privileged
|
|
8
|
+
* test-binary actions the production wire never exposes — three direct DB
|
|
9
|
+
* writes (full auth wipe, forged session row, raw fact insert) plus two
|
|
10
|
+
* introspection reads (the live schema + the live RPC registry, the highest
|
|
11
|
+
* info-leak of the set were the gate to break). Their only structural fence
|
|
12
|
+
* is the **daemon-token** credential gate on
|
|
12
13
|
* each spec's `auth` axis. A test binary live-mounts them on its RPC
|
|
13
14
|
* endpoint but keeps them off the declared surface — so the spec-derived
|
|
14
15
|
* `describe_rpc_attack_surface_tests` never enumerates them, and nothing
|
|
@@ -66,6 +67,9 @@ const backdoor_methods = [
|
|
|
66
67
|
// The schema-dump read — `exclude_tables` is optional, so `{}` is valid
|
|
67
68
|
// and clears the 400 phase like the writes above.
|
|
68
69
|
{ method: '_testing_schema_snapshot', params: {} },
|
|
70
|
+
// The RPC-registry-dump read — input is an empty strict object, so `{}` is
|
|
71
|
+
// valid and clears the 400 phase, reaching the credential gate like the rest.
|
|
72
|
+
{ method: '_testing_action_manifest', params: {} },
|
|
69
73
|
];
|
|
70
74
|
const principals = [
|
|
71
75
|
{
|
|
@@ -2,13 +2,20 @@ import '../assert_dev_env.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Test-binary RPC actions for cross-process integration tests.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Five daemon-token-authed actions, bundled by `create_testing_actions`:
|
|
6
6
|
* **`_testing_reset`** (DB wipe + keeper re-seed), **`_testing_drain_effects`**
|
|
7
7
|
* (audit barrier), **`_testing_mint_session`** (forge an
|
|
8
8
|
* expired-by-construction server-side session for the expiry conformance
|
|
9
|
-
* cases),
|
|
9
|
+
* cases), **`_testing_put_fact`** (seed an embedded fact for the fact-serving
|
|
10
|
+
* suite), and **`_testing_schema_snapshot`** (introspect the live schema for
|
|
10
11
|
* cross-impl parity diffing against a Rust backend's `fuz_db` snapshot).
|
|
11
12
|
*
|
|
13
|
+
* A sixth daemon-token action, **`_testing_action_manifest`** (dump the live
|
|
14
|
+
* RPC registry for cross-impl method-set + auth-shape parity), lives here too
|
|
15
|
+
* but is **not** bundled by `create_testing_actions` — it must enumerate
|
|
16
|
+
* *every* mounted method, so it's appended at the full-mount layer
|
|
17
|
+
* (`build_full_spine_rpc_actions`) where the complete list exists.
|
|
18
|
+
*
|
|
12
19
|
* `_testing_reset` — full DB wipe + keeper re-seed + optional
|
|
13
20
|
* secondary-account seeding. The
|
|
14
21
|
* handler wipes every auth-namespace row (no keeper-preserve filter),
|
|
@@ -329,6 +336,73 @@ export declare const testing_schema_snapshot_action_spec: {
|
|
|
329
336
|
* `create_testing_actions`; mount directly for in-process use.
|
|
330
337
|
*/
|
|
331
338
|
export declare const create_testing_schema_snapshot_action: () => RpcAction;
|
|
339
|
+
/**
|
|
340
|
+
* `_testing_action_manifest` — dump the backend's live RPC method set as a
|
|
341
|
+
* normalized `ActionManifest` (one entry per method: `{method, side_effects,
|
|
342
|
+
* account, actor, roles, credential_types}`) for cross-impl parity diffing.
|
|
343
|
+
* The action-surface twin of `_testing_schema_snapshot`: where that
|
|
344
|
+
* introspects the live *database*, this introspects the live *RPC registry*.
|
|
345
|
+
* The cross-backend harness calls it on each backend, then
|
|
346
|
+
* `assert_action_manifests_equal`s the results (the Rust mirror is
|
|
347
|
+
* `fuz_testing::create_testing_action_manifest_action_spec`, whose
|
|
348
|
+
* normalization matches by design). Complements the in-repo
|
|
349
|
+
* `spine_method_coverage` gate (mounted ⟹ covered) by proving the TS
|
|
350
|
+
* mount-set ≡ the Rust mount-set, method-for-method and auth-shape-for-shape.
|
|
351
|
+
*
|
|
352
|
+
* Unlike its `_testing_*` siblings this action is **not** bundled by
|
|
353
|
+
* `create_testing_actions` — the manifest must enumerate *every* mounted
|
|
354
|
+
* method, which `create_testing_actions` (one sub-factory among many) can't
|
|
355
|
+
* see. It's appended at the full-mount layer (`build_full_spine_rpc_actions`)
|
|
356
|
+
* via `create_testing_action_manifest_action`, where the complete list exists.
|
|
357
|
+
*
|
|
358
|
+
* `auth` gates on the daemon-token credential, matching `_testing_reset`.
|
|
359
|
+
*/
|
|
360
|
+
export declare const testing_action_manifest_action_spec: {
|
|
361
|
+
readonly method: "_testing_action_manifest";
|
|
362
|
+
readonly kind: "request_response";
|
|
363
|
+
readonly initiator: "frontend";
|
|
364
|
+
readonly auth: {
|
|
365
|
+
readonly account: "required";
|
|
366
|
+
readonly actor: "none";
|
|
367
|
+
readonly credential_types: readonly ["daemon_token"];
|
|
368
|
+
};
|
|
369
|
+
readonly side_effects: false;
|
|
370
|
+
readonly input: z.ZodObject<{}, z.core.$strict>;
|
|
371
|
+
readonly output: z.ZodObject<{
|
|
372
|
+
methods: z.ZodArray<z.ZodObject<{
|
|
373
|
+
method: z.ZodString;
|
|
374
|
+
side_effects: z.ZodBoolean;
|
|
375
|
+
account: z.ZodEnum<{
|
|
376
|
+
optional: "optional";
|
|
377
|
+
none: "none";
|
|
378
|
+
required: "required";
|
|
379
|
+
}>;
|
|
380
|
+
actor: z.ZodEnum<{
|
|
381
|
+
optional: "optional";
|
|
382
|
+
none: "none";
|
|
383
|
+
required: "required";
|
|
384
|
+
}>;
|
|
385
|
+
roles: z.ZodArray<z.ZodString>;
|
|
386
|
+
credential_types: z.ZodArray<z.ZodString>;
|
|
387
|
+
}, z.core.$strict>>;
|
|
388
|
+
}, z.core.$strict>;
|
|
389
|
+
readonly async: true;
|
|
390
|
+
readonly description: string;
|
|
391
|
+
};
|
|
392
|
+
/**
|
|
393
|
+
* Build the `_testing_action_manifest` action over a backend's full live RPC
|
|
394
|
+
* mount. The handler closes over a manifest computed once at assembly time
|
|
395
|
+
* from every `mounted` spec **plus this action's own spec** — the manifest
|
|
396
|
+
* action is itself a live method, so it must appear in the dump it serves.
|
|
397
|
+
* `mounted` excludes it (it's appended to the mount *after* the rest is
|
|
398
|
+
* assembled, in `build_full_spine_rpc_actions`), so its static spec is folded
|
|
399
|
+
* in here; the Rust mirror folds in its own descriptor the same way.
|
|
400
|
+
*
|
|
401
|
+
* Pass the protocol-action-free full mount: the protocol actions
|
|
402
|
+
* (`heartbeat` / `cancel`) are excluded by construction so the cross-impl
|
|
403
|
+
* diff stays apples-to-apples (see `action_manifest.ts` §Scope).
|
|
404
|
+
*/
|
|
405
|
+
export declare const create_testing_action_manifest_action: (mounted: ReadonlyArray<RpcAction>) => RpcAction;
|
|
332
406
|
/** Options for `create_testing_actions`. */
|
|
333
407
|
export interface CreateTestingActionsOptions {
|
|
334
408
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing_reset_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_reset_actions.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B
|
|
1
|
+
{"version":3,"file":"testing_reset_actions.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/testing_reset_actions.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,OAAO,EAAa,KAAK,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAIvE,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,gBAAgB,CAAC;AAgCvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;QAiBpC;;;;;;;;WAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWyC,CAAC;AAE/C;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;;;;CAWA,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;CAwBC,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,QAAO,SACiB,CAAC;AAEzE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;CAeK,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWF,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,QAAO,SAGvD,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYF,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qCAAqC,GACjD,SAAS,aAAa,CAAC,SAAS,CAAC,KAC/B,SAMF,CAAC;AAEF,4CAA4C;AAC5C,MAAM,WAAW,2BAA2B;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD;;;;;OAKG;IACH,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC9C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACxD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,OAAO,EACb,SAAS,2BAA2B,KAClC,KAAK,CAAC,SAAS,CAqIjB,CAAC;AAEF,0FAA0F;AAC1F,eAAO,MAAM,0BAA0B,UAAmC,CAAC"}
|
|
@@ -2,13 +2,20 @@ import '../assert_dev_env.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Test-binary RPC actions for cross-process integration tests.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Five daemon-token-authed actions, bundled by `create_testing_actions`:
|
|
6
6
|
* **`_testing_reset`** (DB wipe + keeper re-seed), **`_testing_drain_effects`**
|
|
7
7
|
* (audit barrier), **`_testing_mint_session`** (forge an
|
|
8
8
|
* expired-by-construction server-side session for the expiry conformance
|
|
9
|
-
* cases),
|
|
9
|
+
* cases), **`_testing_put_fact`** (seed an embedded fact for the fact-serving
|
|
10
|
+
* suite), and **`_testing_schema_snapshot`** (introspect the live schema for
|
|
10
11
|
* cross-impl parity diffing against a Rust backend's `fuz_db` snapshot).
|
|
11
12
|
*
|
|
13
|
+
* A sixth daemon-token action, **`_testing_action_manifest`** (dump the live
|
|
14
|
+
* RPC registry for cross-impl method-set + auth-shape parity), lives here too
|
|
15
|
+
* but is **not** bundled by `create_testing_actions` — it must enumerate
|
|
16
|
+
* *every* mounted method, so it's appended at the full-mount layer
|
|
17
|
+
* (`build_full_spine_rpc_actions`) where the complete list exists.
|
|
18
|
+
*
|
|
12
19
|
* `_testing_reset` — full DB wipe + keeper re-seed + optional
|
|
13
20
|
* secondary-account seeding. The
|
|
14
21
|
* handler wipes every auth-namespace row (no keeper-preserve filter),
|
|
@@ -66,6 +73,7 @@ import { query_put_fact } from '../../db/fact_queries.js';
|
|
|
66
73
|
import { ROLE_ADMIN, ROLE_KEEPER } from '../../auth/role_schema.js';
|
|
67
74
|
import { auth_integration_truncate_tables } from '../db.js';
|
|
68
75
|
import { query_schema_snapshot, SchemaSnapshot } from '../schema_introspect.js';
|
|
76
|
+
import { ActionManifest, build_action_manifest } from './action_manifest.js';
|
|
69
77
|
import { query_create_actor } from '../../auth/account_queries.js';
|
|
70
78
|
import { create_test_account_with_credentials, mint_test_session } from '../app_server.js';
|
|
71
79
|
import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
|
|
@@ -293,6 +301,59 @@ export const testing_schema_snapshot_action_spec = {
|
|
|
293
301
|
* `create_testing_actions`; mount directly for in-process use.
|
|
294
302
|
*/
|
|
295
303
|
export const create_testing_schema_snapshot_action = () => rpc_action(testing_schema_snapshot_action_spec, async (input, ctx) => query_schema_snapshot(ctx.db, { exclude_tables: input.exclude_tables }));
|
|
304
|
+
/**
|
|
305
|
+
* `_testing_action_manifest` — dump the backend's live RPC method set as a
|
|
306
|
+
* normalized `ActionManifest` (one entry per method: `{method, side_effects,
|
|
307
|
+
* account, actor, roles, credential_types}`) for cross-impl parity diffing.
|
|
308
|
+
* The action-surface twin of `_testing_schema_snapshot`: where that
|
|
309
|
+
* introspects the live *database*, this introspects the live *RPC registry*.
|
|
310
|
+
* The cross-backend harness calls it on each backend, then
|
|
311
|
+
* `assert_action_manifests_equal`s the results (the Rust mirror is
|
|
312
|
+
* `fuz_testing::create_testing_action_manifest_action_spec`, whose
|
|
313
|
+
* normalization matches by design). Complements the in-repo
|
|
314
|
+
* `spine_method_coverage` gate (mounted ⟹ covered) by proving the TS
|
|
315
|
+
* mount-set ≡ the Rust mount-set, method-for-method and auth-shape-for-shape.
|
|
316
|
+
*
|
|
317
|
+
* Unlike its `_testing_*` siblings this action is **not** bundled by
|
|
318
|
+
* `create_testing_actions` — the manifest must enumerate *every* mounted
|
|
319
|
+
* method, which `create_testing_actions` (one sub-factory among many) can't
|
|
320
|
+
* see. It's appended at the full-mount layer (`build_full_spine_rpc_actions`)
|
|
321
|
+
* via `create_testing_action_manifest_action`, where the complete list exists.
|
|
322
|
+
*
|
|
323
|
+
* `auth` gates on the daemon-token credential, matching `_testing_reset`.
|
|
324
|
+
*/
|
|
325
|
+
export const testing_action_manifest_action_spec = {
|
|
326
|
+
method: '_testing_action_manifest',
|
|
327
|
+
kind: 'request_response',
|
|
328
|
+
initiator: 'frontend',
|
|
329
|
+
auth: TESTING_ACTION_AUTH,
|
|
330
|
+
side_effects: false,
|
|
331
|
+
input: z.strictObject({}),
|
|
332
|
+
output: ActionManifest,
|
|
333
|
+
async: true,
|
|
334
|
+
description: 'Test-binary only — dump the live RPC registry as a normalized {method, auth, side_effects} ' +
|
|
335
|
+
'manifest for cross-impl method-set + auth-shape parity diffing.',
|
|
336
|
+
};
|
|
337
|
+
/**
|
|
338
|
+
* Build the `_testing_action_manifest` action over a backend's full live RPC
|
|
339
|
+
* mount. The handler closes over a manifest computed once at assembly time
|
|
340
|
+
* from every `mounted` spec **plus this action's own spec** — the manifest
|
|
341
|
+
* action is itself a live method, so it must appear in the dump it serves.
|
|
342
|
+
* `mounted` excludes it (it's appended to the mount *after* the rest is
|
|
343
|
+
* assembled, in `build_full_spine_rpc_actions`), so its static spec is folded
|
|
344
|
+
* in here; the Rust mirror folds in its own descriptor the same way.
|
|
345
|
+
*
|
|
346
|
+
* Pass the protocol-action-free full mount: the protocol actions
|
|
347
|
+
* (`heartbeat` / `cancel`) are excluded by construction so the cross-impl
|
|
348
|
+
* diff stays apples-to-apples (see `action_manifest.ts` §Scope).
|
|
349
|
+
*/
|
|
350
|
+
export const create_testing_action_manifest_action = (mounted) => {
|
|
351
|
+
const manifest = build_action_manifest([
|
|
352
|
+
...mounted.map((action) => action.spec),
|
|
353
|
+
testing_action_manifest_action_spec,
|
|
354
|
+
]);
|
|
355
|
+
return rpc_action(testing_action_manifest_action_spec, async () => manifest);
|
|
356
|
+
};
|
|
296
357
|
/**
|
|
297
358
|
* Build the testing RPC actions for a test binary's registry.
|
|
298
359
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema_generators.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/schema_generators.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAKN,KAAK,YAAY,EACjB,MAAM,yBAAyB,CAAC;AAIjC;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,cAAc,CAAC,CAAC,OAAO,KAAG,MAAM,GAAG,IAkBhE,CAAC;
|
|
1
|
+
{"version":3,"file":"schema_generators.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/schema_generators.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAKN,KAAK,YAAY,EACjB,MAAM,yBAAyB,CAAC;AAIjC;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,cAAc,CAAC,CAAC,OAAO,KAAG,MAAM,GAAG,IAkBhE,CAAC;AAsGF,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,GAAI,OAAO,YAAY,EAAE,cAAc,CAAC,CAAC,OAAO,KAAG,OAgGnF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,gBAAgB,CAAC,CAAC,SAAS,KAAG,MAa9E,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC/B,cAAc,CAAC,CAAC,OAAO,KACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SA6B5B,CAAC"}
|
|
@@ -127,6 +127,13 @@ const generate_valid_string = (field_schema) => {
|
|
|
127
127
|
if (slug !== null && field_schema.safeParse(slug).success)
|
|
128
128
|
return slug;
|
|
129
129
|
}
|
|
130
|
+
// Email-shaped refinement (the `Email` primitive: loose `local@domain.tld`).
|
|
131
|
+
// The base `x`-fill has no `@`, so an email-pattern field needs a shaped
|
|
132
|
+
// candidate — the `z.string().regex()` form exposes a `pattern`, not the
|
|
133
|
+
// `format: 'email'` the `case 'email'` switch arm keys on.
|
|
134
|
+
const as_email = 'test@example.com';
|
|
135
|
+
if (field_schema.safeParse(as_email).success)
|
|
136
|
+
return as_email;
|
|
130
137
|
// Absolute path refinement (e.g. DiskfilePath)
|
|
131
138
|
const with_slash = '/' + base;
|
|
132
139
|
if (field_schema.safeParse(with_slash).success)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fuzdev/fuz_app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.91.0",
|
|
4
4
|
"description": "fullstack app library",
|
|
5
5
|
"glyph": "🗝",
|
|
6
6
|
"logo": "logo.svg",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"test": "gro test",
|
|
17
17
|
"test:cross:ts": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_ts_node --project cross_backend_ts_deno --project cross_backend_ts_bun",
|
|
18
18
|
"test:cross:rust-spine-stub": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_rust_spine_stub",
|
|
19
|
-
"test:cross:
|
|
19
|
+
"test:cross:parity": "FUZ_TEST_CROSS_BACKEND=1 vitest run --project cross_backend_parity",
|
|
20
20
|
"benchmark:cross-impl": "gro run src/benchmarks/cross_impl.bench.ts",
|
|
21
21
|
"preview": "vite preview",
|
|
22
22
|
"deploy": "gro deploy"
|