@fuzdev/fuz_app 0.147.0 → 0.149.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/actions/CLAUDE.md +8 -6
- package/dist/actions/action_codegen.d.ts +15 -1
- package/dist/actions/action_codegen.d.ts.map +1 -1
- package/dist/actions/action_codegen.js +23 -2
- package/dist/actions/action_event.d.ts.map +1 -1
- package/dist/actions/action_event.js +14 -1
- package/dist/actions/perform_action.d.ts +17 -1
- package/dist/actions/perform_action.d.ts.map +1 -1
- package/dist/actions/perform_action.js +23 -3
- package/dist/auth/CLAUDE.md +3 -2
- package/dist/auth/account_action_specs.d.ts +12 -0
- package/dist/auth/account_action_specs.d.ts.map +1 -1
- package/dist/auth/account_action_specs.js +16 -2
- package/dist/auth/account_actions.d.ts.map +1 -1
- package/dist/auth/account_actions.js +7 -4
- package/dist/auth/admin_action_specs.d.ts.map +1 -1
- package/dist/auth/admin_action_specs.js +29 -8
- package/dist/auth/audit_emitter.d.ts +14 -0
- package/dist/auth/audit_emitter.d.ts.map +1 -1
- package/dist/auth/audit_emitter.js +5 -1
- package/dist/auth/cell_action_specs.d.ts +3 -1
- package/dist/auth/cell_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_action_specs.js +5 -5
- package/dist/auth/cell_actions.d.ts.map +1 -1
- package/dist/auth/cell_actions.js +2 -3
- package/dist/auth/cell_data_schema.d.ts +1 -1
- package/dist/auth/cell_data_schema.js +1 -1
- package/dist/auth/cell_field_action_specs.d.ts +4 -3
- package/dist/auth/cell_field_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_field_action_specs.js +5 -6
- package/dist/auth/cell_field_actions.d.ts.map +1 -1
- package/dist/auth/cell_field_actions.js +8 -1
- package/dist/auth/cell_item_action_specs.d.ts +4 -2
- package/dist/auth/cell_item_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_item_action_specs.js +5 -5
- package/dist/auth/cell_item_actions.d.ts.map +1 -1
- package/dist/auth/cell_item_actions.js +8 -1
- package/dist/auth/role_grant_offer_action_specs.d.ts +2 -0
- package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_action_specs.js +8 -4
- package/dist/http/CLAUDE.md +14 -2
- package/dist/http/error_schemas.d.ts +8 -0
- package/dist/http/error_schemas.d.ts.map +1 -1
- package/dist/http/error_schemas.js +12 -0
- package/dist/http/jsonrpc_errors.d.ts +40 -15
- package/dist/http/jsonrpc_errors.d.ts.map +1 -1
- package/dist/http/jsonrpc_errors.js +90 -35
- package/dist/primitive_schemas.d.ts +1 -1
- package/dist/primitive_schemas.d.ts.map +1 -1
- package/dist/primitive_schemas.js +2 -1
- package/dist/schema_meta.d.ts +80 -0
- package/dist/schema_meta.d.ts.map +1 -1
- package/dist/schema_meta.js +71 -1
- package/dist/testing/CLAUDE.md +853 -146
- package/dist/testing/admin_integration.d.ts.map +1 -1
- package/dist/testing/admin_integration.js +73 -5
- package/dist/testing/adversarial_input.d.ts +0 -47
- package/dist/testing/adversarial_input.d.ts.map +1 -1
- package/dist/testing/adversarial_input.js +4 -340
- package/dist/testing/adversarial_input_cases.d.ts +124 -0
- package/dist/testing/adversarial_input_cases.d.ts.map +1 -0
- package/dist/testing/adversarial_input_cases.js +393 -0
- package/dist/testing/audit_completeness.d.ts.map +1 -1
- package/dist/testing/audit_completeness.js +24 -20
- package/dist/testing/audit_drift_guard.d.ts +30 -3
- package/dist/testing/audit_drift_guard.d.ts.map +1 -1
- package/dist/testing/audit_drift_guard.js +55 -3
- package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
- package/dist/testing/cross_backend/account_lifecycle.js +29 -12
- package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.js +7 -25
- package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
- package/dist/testing/cross_backend/app_settings.js +4 -6
- package/dist/testing/cross_backend/audit_cross_helpers.d.ts +57 -0
- package/dist/testing/cross_backend/audit_cross_helpers.d.ts.map +1 -0
- package/dist/testing/cross_backend/audit_cross_helpers.js +89 -0
- package/dist/testing/cross_backend/backend_config.d.ts +2 -1
- package/dist/testing/cross_backend/backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/body_size.d.ts +6 -0
- package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
- package/dist/testing/cross_backend/body_size.js +26 -44
- package/dist/testing/cross_backend/body_size_smuggling.d.ts +5 -0
- package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
- package/dist/testing/cross_backend/body_size_smuggling.js +7 -14
- package/dist/testing/cross_backend/build_test_backend_paths.d.ts +3 -1
- package/dist/testing/cross_backend/build_test_backend_paths.d.ts.map +1 -1
- package/dist/testing/cross_backend/capabilities.d.ts +78 -59
- package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
- package/dist/testing/cross_backend/capabilities.js +25 -24
- package/dist/testing/cross_backend/cargo_binary.d.ts +70 -0
- package/dist/testing/cross_backend/cargo_binary.d.ts.map +1 -0
- package/dist/testing/cross_backend/cargo_binary.js +148 -0
- package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_crud.js +174 -3
- package/dist/testing/cross_backend/cell_gated_create.d.ts +0 -60
- package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_gated_create.js +9 -487
- package/dist/testing/cross_backend/cell_grant_role.d.ts +14 -2
- package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_grant_role.js +22 -12
- package/dist/testing/cross_backend/cell_moderate.d.ts +66 -0
- package/dist/testing/cross_backend/cell_moderate.d.ts.map +1 -0
- package/dist/testing/cross_backend/cell_moderate.js +511 -0
- package/dist/testing/cross_backend/cell_ref_admission.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_ref_admission.js +1 -1
- package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_relations.js +40 -19
- package/dist/testing/cross_backend/conformance_case.d.ts +43 -4
- package/dist/testing/cross_backend/conformance_case.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_case.js +29 -1
- package/dist/testing/cross_backend/conformance_rpc_auth.d.ts +93 -0
- package/dist/testing/cross_backend/conformance_rpc_auth.d.ts.map +1 -0
- package/dist/testing/cross_backend/conformance_rpc_auth.js +125 -0
- package/dist/testing/cross_backend/conformance_table.d.ts +144 -4
- package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_table.js +297 -65
- package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
- package/dist/testing/cross_backend/cookie_attributes.js +3 -2
- package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts +38 -5
- package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/create_cross_backend_global_setup.js +24 -3
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts +5 -5
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/credential_deadline.d.ts +10 -6
- package/dist/testing/cross_backend/credential_deadline.d.ts.map +1 -1
- package/dist/testing/cross_backend/credential_deadline.js +32 -31
- package/dist/testing/cross_backend/credential_header_robustness.d.ts.map +1 -1
- package/dist/testing/cross_backend/credential_header_robustness.js +4 -6
- package/dist/testing/cross_backend/{cell_cross_helpers.d.ts → cross_rpc.d.ts} +14 -2
- package/dist/testing/cross_backend/cross_rpc.d.ts.map +1 -0
- package/dist/testing/cross_backend/{cell_cross_helpers.js → cross_rpc.js} +31 -7
- package/dist/testing/cross_backend/default_backend_configs.d.ts +58 -61
- package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_backend_configs.js +97 -91
- package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_spine_surface.js +2 -2
- package/dist/testing/cross_backend/differential.d.ts +126 -0
- package/dist/testing/cross_backend/differential.d.ts.map +1 -0
- package/dist/testing/cross_backend/differential.js +201 -0
- package/dist/testing/cross_backend/differential_normalize.d.ts +150 -0
- package/dist/testing/cross_backend/differential_normalize.d.ts.map +1 -0
- package/dist/testing/cross_backend/differential_normalize.js +153 -0
- package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
- package/dist/testing/cross_backend/fact_serving.js +27 -17
- package/dist/testing/cross_backend/full_spine_mount.d.ts +15 -0
- package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
- package/dist/testing/cross_backend/full_spine_mount.js +55 -1
- package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
- package/dist/testing/cross_backend/identity_parity.js +6 -5
- package/dist/testing/cross_backend/in_process_setup.d.ts +12 -2
- package/dist/testing/cross_backend/in_process_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/in_process_setup.js +10 -7
- package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
- package/dist/testing/cross_backend/login_security.js +13 -18
- package/dist/testing/cross_backend/origin.js +1 -1
- package/dist/testing/cross_backend/origin_conformance.js +1 -1
- package/dist/testing/cross_backend/origin_scope.d.ts +6 -0
- package/dist/testing/cross_backend/origin_scope.d.ts.map +1 -1
- package/dist/testing/cross_backend/origin_scope.js +13 -12
- package/dist/testing/cross_backend/peer_ping_ws.d.ts +2 -5
- package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
- package/dist/testing/cross_backend/peer_ping_ws.js +14 -24
- package/dist/testing/cross_backend/postgres_database.d.ts +85 -0
- package/dist/testing/cross_backend/postgres_database.d.ts.map +1 -0
- package/dist/testing/cross_backend/postgres_database.js +140 -0
- package/dist/testing/cross_backend/provided_context.d.ts +28 -0
- package/dist/testing/cross_backend/provided_context.d.ts.map +1 -0
- package/dist/testing/cross_backend/provided_context.js +35 -0
- package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
- package/dist/testing/cross_backend/query_shape.js +10 -12
- package/dist/testing/cross_backend/ready.js +2 -2
- package/dist/testing/cross_backend/revocation_drivers.d.ts +4 -3
- package/dist/testing/cross_backend/revocation_drivers.d.ts.map +1 -1
- package/dist/testing/cross_backend/revocation_drivers.js +1 -1
- package/dist/testing/cross_backend/role_grant_cross_helpers.d.ts +3 -2
- package/dist/testing/cross_backend/role_grant_cross_helpers.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts +13 -0
- package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts.map +1 -0
- package/dist/testing/cross_backend/role_grant_offer_lifecycle.js +203 -0
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts +2 -5
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.js +203 -111
- package/dist/testing/cross_backend/role_grant_participation.d.ts +13 -0
- package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_participation.js +32 -21
- package/dist/testing/cross_backend/role_grant_role_grammar.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_role_grammar.js +6 -9
- package/dist/testing/cross_backend/rpc_adversarial.d.ts +47 -0
- package/dist/testing/cross_backend/rpc_adversarial.d.ts.map +1 -0
- package/dist/testing/cross_backend/rpc_adversarial.js +302 -0
- package/dist/testing/cross_backend/rpc_success_fixtures.d.ts +24 -0
- package/dist/testing/cross_backend/rpc_success_fixtures.d.ts.map +1 -0
- package/dist/testing/cross_backend/rpc_success_fixtures.js +124 -0
- package/dist/testing/cross_backend/rust_spine_consumer_surface.d.ts +101 -0
- package/dist/testing/cross_backend/rust_spine_consumer_surface.d.ts.map +1 -0
- package/dist/testing/cross_backend/rust_spine_consumer_surface.js +113 -0
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts +10 -0
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +33 -21
- package/dist/testing/cross_backend/session_cap.d.ts +9 -8
- package/dist/testing/cross_backend/session_cap.d.ts.map +1 -1
- package/dist/testing/cross_backend/session_cap.js +9 -4
- package/dist/testing/cross_backend/session_cookie_codec.js +1 -1
- package/dist/testing/cross_backend/setup.d.ts +58 -56
- package/dist/testing/cross_backend/setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/setup.js +29 -29
- package/dist/testing/cross_backend/simple_request.d.ts.map +1 -1
- package/dist/testing/cross_backend/simple_request.js +4 -4
- package/dist/testing/cross_backend/spawn_backend.d.ts +59 -10
- package/dist/testing/cross_backend/spawn_backend.d.ts.map +1 -1
- package/dist/testing/cross_backend/spawn_backend.js +219 -60
- package/dist/testing/cross_backend/spine_suites.d.ts +311 -0
- package/dist/testing/cross_backend/spine_suites.d.ts.map +1 -0
- package/dist/testing/cross_backend/spine_suites.js +897 -0
- package/dist/testing/cross_backend/spine_surface_constants.d.ts +44 -0
- package/dist/testing/cross_backend/spine_surface_constants.d.ts.map +1 -1
- package/dist/testing/cross_backend/spine_surface_constants.js +53 -0
- package/dist/testing/cross_backend/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/cross_backend/sse_round_trip.js +3 -4
- package/dist/testing/cross_backend/standard.d.ts +18 -1
- package/dist/testing/cross_backend/standard.d.ts.map +1 -1
- package/dist/testing/cross_backend/standard.js +2 -0
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts +24 -0
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
- package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +15 -0
- package/dist/testing/cross_backend/testing_backdoor.d.ts +29 -12
- package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_backdoor.js +143 -51
- package/dist/testing/cross_backend/testing_reset_actions.d.ts +30 -14
- package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.js +58 -37
- package/dist/testing/cross_backend/testing_server_bun.js +1 -1
- package/dist/testing/cross_backend/token_lifetime.js +1 -1
- package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
- package/dist/testing/cross_backend/token_scope_surface.js +9 -13
- package/dist/testing/cross_backend/transport_composition.d.ts +26 -2
- package/dist/testing/cross_backend/transport_composition.d.ts.map +1 -1
- package/dist/testing/cross_backend/transport_composition.js +81 -51
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +8 -0
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/ts_spine_backend_config.js +23 -13
- package/dist/testing/cross_backend/ws_action_rate_limit.d.ts +2 -5
- package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_action_rate_limit.js +8 -14
- package/dist/testing/cross_backend/ws_connection_cap.d.ts +4 -9
- package/dist/testing/cross_backend/ws_connection_cap.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_connection_cap.js +11 -12
- package/dist/testing/cross_backend/ws_endpoint.d.ts +52 -0
- package/dist/testing/cross_backend/ws_endpoint.d.ts.map +1 -0
- package/dist/testing/cross_backend/ws_endpoint.js +54 -0
- package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts +2 -5
- package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_inbound_dispatch.js +9 -15
- package/dist/testing/cross_backend/ws_outbound_overflow.d.ts +2 -7
- package/dist/testing/cross_backend/ws_outbound_overflow.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_outbound_overflow.js +5 -9
- package/dist/testing/cross_backend/ws_role_gated.d.ts +4 -5
- package/dist/testing/cross_backend/ws_role_gated.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_role_gated.js +12 -21
- package/dist/testing/cross_backend/ws_round_trip.d.ts +12 -9
- package/dist/testing/cross_backend/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_round_trip.js +29 -34
- package/dist/testing/db_entities.d.ts +16 -3
- package/dist/testing/db_entities.d.ts.map +1 -1
- package/dist/testing/db_entities.js +28 -5
- package/dist/testing/integration_helpers.d.ts +61 -2
- package/dist/testing/integration_helpers.d.ts.map +1 -1
- package/dist/testing/integration_helpers.js +75 -18
- package/dist/testing/round_trip.d.ts +17 -0
- package/dist/testing/round_trip.d.ts.map +1 -1
- package/dist/testing/round_trip.js +67 -24
- package/dist/testing/rpc_attack_surface.d.ts +10 -0
- package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
- package/dist/testing/rpc_attack_surface.js +27 -140
- package/dist/testing/rpc_envelope_cases.d.ts +114 -0
- package/dist/testing/rpc_envelope_cases.d.ts.map +1 -0
- package/dist/testing/rpc_envelope_cases.js +243 -0
- package/dist/testing/rpc_helpers.d.ts +31 -0
- package/dist/testing/rpc_helpers.d.ts.map +1 -1
- package/dist/testing/rpc_helpers.js +35 -14
- package/dist/testing/rpc_round_trip.d.ts +62 -6
- package/dist/testing/rpc_round_trip.d.ts.map +1 -1
- package/dist/testing/rpc_round_trip.js +151 -39
- package/dist/testing/schema_generators.d.ts +99 -2
- package/dist/testing/schema_generators.d.ts.map +1 -1
- package/dist/testing/schema_generators.js +261 -73
- package/dist/testing/standard.d.ts +26 -0
- package/dist/testing/standard.d.ts.map +1 -1
- package/dist/testing/standard.js +4 -1
- package/dist/testing/stubs.d.ts +4 -3
- package/dist/testing/stubs.d.ts.map +1 -1
- package/dist/testing/stubs.js +6 -4
- package/dist/testing/transports/raw_http.d.ts +21 -0
- package/dist/testing/transports/raw_http.d.ts.map +1 -1
- package/dist/testing/transports/raw_http.js +30 -0
- package/dist/zod.d.ts +9 -0
- package/dist/zod.d.ts.map +1 -1
- package/dist/zod.js +20 -0
- package/package.json +6 -4
- package/dist/testing/cross_backend/actor_search.d.ts +0 -6
- package/dist/testing/cross_backend/actor_search.d.ts.map +0 -1
- package/dist/testing/cross_backend/actor_search.js +0 -90
- package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +0 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import '../assert_dev_env.js';
|
|
2
|
+
import { is_protocol_action_method } from '../../actions/action_codegen.js';
|
|
3
|
+
import { account_status_route_shape, create_account_route_shapes } from '../../auth/account_route_schema.js';
|
|
4
|
+
import { create_signup_route_shape } from '../../auth/signup_route_schema.js';
|
|
5
|
+
import { create_standard_rpc_actions } from '../../auth/standard_rpc_actions.js';
|
|
6
|
+
import { create_health_route_spec } from '../../http/common_routes.js';
|
|
7
|
+
import { prefix_route_specs } from '../../http/route_spec.js';
|
|
8
|
+
import { create_test_app_surface_spec, stub_handler, stub_mw } from '../stubs.js';
|
|
9
|
+
import { SPINE_ACCOUNT_PATH_PREFIX, SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
10
|
+
/**
|
|
11
|
+
* The routes `fuz_auth::account_router` mounts, relative to `/api/account`. An
|
|
12
|
+
* allowlist rather than every account route shape: `/verify` is a TS-only
|
|
13
|
+
* route the Rust router doesn't serve, so declaring it would have the suites
|
|
14
|
+
* probe a 404. A shape fuz_app renames or drops fails the surface build; one
|
|
15
|
+
* it adds stays off the surface until the Rust router mounts it and this list
|
|
16
|
+
* names it.
|
|
17
|
+
*/
|
|
18
|
+
export const ACCOUNT_ROUTER_PATHS = ['/status', '/login', '/logout', '/password'];
|
|
19
|
+
/** Surface generation never invokes handlers — see the module doc. */
|
|
20
|
+
const noop_action_handler = (async () => undefined);
|
|
21
|
+
const to_route_spec = (shape) => ({
|
|
22
|
+
...shape,
|
|
23
|
+
handler: stub_handler
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* The RPC endpoints a Rust spine consumer mounts: the standard admin /
|
|
27
|
+
* role-grant-offer / account actions, the extra families, then the domain
|
|
28
|
+
* specs — what `describe_spine_cross_suites` takes as `rpc_endpoints`.
|
|
29
|
+
*
|
|
30
|
+
* @param options - the consumer's action specs, extras and roles
|
|
31
|
+
* @returns the endpoints, as a factory of the stub context
|
|
32
|
+
* @throws Error when an `exclude_methods` entry names no domain spec
|
|
33
|
+
*/
|
|
34
|
+
export const create_rust_spine_consumer_rpc_endpoints = (options) => {
|
|
35
|
+
const { domain_action_specs, extra_rpc_actions, roles, exclude_methods = [], rpc_path = SPINE_RPC_PATH } = options;
|
|
36
|
+
const excluded = new Set(exclude_methods);
|
|
37
|
+
for (const method of excluded) {
|
|
38
|
+
if (!domain_action_specs.some((spec) => spec.method === method)) {
|
|
39
|
+
throw new Error(`create_rust_spine_consumer_rpc_endpoints: exclude_methods names '${method}', ` +
|
|
40
|
+
'which is not among the domain action specs');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const domain_actions = domain_action_specs
|
|
44
|
+
.filter((spec) => spec.kind === 'request_response')
|
|
45
|
+
.filter((spec) => !is_protocol_action_method(spec.method) && !excluded.has(spec.method))
|
|
46
|
+
.map((spec) => ({ spec, handler: noop_action_handler }));
|
|
47
|
+
return (ctx) => [
|
|
48
|
+
{
|
|
49
|
+
path: rpc_path,
|
|
50
|
+
actions: [
|
|
51
|
+
...create_standard_rpc_actions(ctx.deps, roles ? { roles } : {}),
|
|
52
|
+
...(extra_rpc_actions?.(ctx) ?? []),
|
|
53
|
+
...domain_actions
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* The spine routes a Rust spine consumer serves, outside the RPC endpoint:
|
|
60
|
+
* `/health`, the `ACCOUNT_ROUTER_PATHS` under `/api/account`, and signup
|
|
61
|
+
* beside them (bootstrap is added by `create_test_app_surface_spec`).
|
|
62
|
+
*/
|
|
63
|
+
const create_spine_consumer_route_specs = (ctx) => {
|
|
64
|
+
const shapes = [
|
|
65
|
+
account_status_route_shape,
|
|
66
|
+
...create_account_route_shapes({
|
|
67
|
+
login_account_rate_limited: ctx.login_account_rate_limiter !== null
|
|
68
|
+
})
|
|
69
|
+
];
|
|
70
|
+
const account_router_shapes = ACCOUNT_ROUTER_PATHS.map((path) => {
|
|
71
|
+
const shape = shapes.find((candidate) => candidate.path === path);
|
|
72
|
+
if (!shape)
|
|
73
|
+
throw new Error(`fuz_app's account route shapes have no '${path}'`);
|
|
74
|
+
return shape;
|
|
75
|
+
});
|
|
76
|
+
return [
|
|
77
|
+
create_health_route_spec(),
|
|
78
|
+
...prefix_route_specs(SPINE_ACCOUNT_PATH_PREFIX, [
|
|
79
|
+
...account_router_shapes,
|
|
80
|
+
create_signup_route_shape({
|
|
81
|
+
signup_account_rate_limited: ctx.signup_account_rate_limiter !== null
|
|
82
|
+
})
|
|
83
|
+
].map(to_route_spec))
|
|
84
|
+
];
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Build the declared surface of a Rust spine consumer for its cross suites,
|
|
88
|
+
* on `create_test_app_surface_spec`: the spine routes (health, the account
|
|
89
|
+
* router's paths, signup, and bootstrap as a `surface_only` shape), the RPC
|
|
90
|
+
* endpoint from `create_rust_spine_consumer_rpc_endpoints`, the daemon-token
|
|
91
|
+
* layer every consumer test binary wires, and — with `host_gate` — the
|
|
92
|
+
* `host_validation` layer at the head of the middleware list.
|
|
93
|
+
*
|
|
94
|
+
* @param options - the consumer's session config, action specs, extras and roles
|
|
95
|
+
* @returns the surface spec, for `describe_spine_cross_suites`'s `surface_source`
|
|
96
|
+
* @throws Error when an account route shape the Rust router mounts is missing,
|
|
97
|
+
* or an `exclude_methods` entry names no domain spec
|
|
98
|
+
*/
|
|
99
|
+
export const create_rust_spine_consumer_surface_spec = (options) => create_test_app_surface_spec({
|
|
100
|
+
session_options: options.session_options,
|
|
101
|
+
create_route_specs: create_spine_consumer_route_specs,
|
|
102
|
+
rpc_endpoints: create_rust_spine_consumer_rpc_endpoints(options),
|
|
103
|
+
// the binaries mount `bootstrap_router`; `surface_only` declares its shape
|
|
104
|
+
bootstrap: { mode: 'surface_only' },
|
|
105
|
+
// consumer test binaries wire a daemon-token state (production ones don't)
|
|
106
|
+
daemon_token: true,
|
|
107
|
+
transform_middleware: options.host_gate
|
|
108
|
+
? (specs) => [
|
|
109
|
+
{ name: 'host_validation', path: '*', handler: stub_mw },
|
|
110
|
+
...specs
|
|
111
|
+
]
|
|
112
|
+
: undefined
|
|
113
|
+
});
|
|
@@ -18,6 +18,8 @@ export declare const RUST_SPINE_STUB_DATABASE_URL_ENV = "FUZ_TESTING_RUST_SPINE_
|
|
|
18
18
|
export declare const RUST_SPINE_STUB_EXPECTED_SCHEMA_PATH_ENV = "FUZ_RUST_SPINE_STUB_EXPECTED_SCHEMA_PATH";
|
|
19
19
|
/** Default listening port — slots beside zzz's 1175/1176; matches the binary's `DEFAULT_PORT`. */
|
|
20
20
|
export declare const RUST_SPINE_STUB_DEFAULT_PORT = 1177;
|
|
21
|
+
/** The preset's default backend name — its spawn label and temp directory. */
|
|
22
|
+
export declare const RUST_SPINE_STUB_DEFAULT_NAME = "spine_stub";
|
|
21
23
|
/** Default Postgres database — real PG (PGlite isn't reachable from `tokio-postgres`). */
|
|
22
24
|
export declare const RUST_SPINE_STUB_DEFAULT_DATABASE_URL = "postgres://localhost/fuz_app_test_rust_spine_stub";
|
|
23
25
|
export interface SpineStubBackendConfigOptions {
|
|
@@ -28,6 +30,14 @@ export interface SpineStubBackendConfigOptions {
|
|
|
28
30
|
* then `RUST_SPINE_STUB_DEFAULT_DATABASE_URL`.
|
|
29
31
|
*/
|
|
30
32
|
readonly database_url?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Backend name — labels the spawn in errors and logs, and names its
|
|
35
|
+
* directory under `os.tmpdir()` (`build_test_backend_paths`), which holds
|
|
36
|
+
* the bootstrap token, the daemon token and the fact store. Default
|
|
37
|
+
* `RUST_SPINE_STUB_DEFAULT_NAME`. Give each stub spawned alongside another its own name, so
|
|
38
|
+
* those files don't collide.
|
|
39
|
+
*/
|
|
40
|
+
readonly name?: string;
|
|
31
41
|
/**
|
|
32
42
|
* Prebuilt binary path. Overrides the `FUZ_TESTING_RUST_SPINE_STUB_BIN` env
|
|
33
43
|
* var. When neither is set the preset throws.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rust_spine_stub_backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/rust_spine_stub_backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"rust_spine_stub_backend_config.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/rust_spine_stub_backend_config.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAwC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAczD,uGAAuG;AACvG,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,6CAA6C,CAAC;AAE3F;;;;;GAKG;AACH,eAAO,MAAM,wCAAwC,6CAA6C,CAAC;AAoCnG,kGAAkG;AAClG,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,8EAA8E;AAC9E,eAAO,MAAM,4BAA4B,eAAe,CAAC;AAEzD,0FAA0F;AAC1F,eAAO,MAAM,oCAAoC,sDACG,CAAC;AAErD,MAAM,WAAW,6BAA6B;IAC7C,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAC5C;;;;;OAKG;IACH,QAAQ,CAAC,8BAA8B,CAAC,EAAE,MAAM,CAAC;CACjD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,8BAA8B,GAC1C,UAAS,6BAAkC,KACzC,aAmDF,CAAC"}
|
|
@@ -13,17 +13,15 @@ import '../assert_dev_env.js';
|
|
|
13
13
|
* path in. `FUZ_TESTING_RUST_SPINE_STUB_BIN` (or the `binary_path` option) must
|
|
14
14
|
* point at a prebuilt binary; the preset throws a clear error when neither
|
|
15
15
|
* is set rather than guessing. Build once with
|
|
16
|
-
* `cargo build -p testing_spine_stub --
|
|
17
|
-
*
|
|
18
|
-
* the
|
|
16
|
+
* `cargo build -p testing_spine_stub --profile cross-test` (the workspace's
|
|
17
|
+
* non-LTO test profile; `--release` works too, slower to rebuild) and point
|
|
18
|
+
* the env var at the resulting `target/cross-test/testing_spine_stub`;
|
|
19
|
+
* operators / CI cache the binary across runs for fast spawns.
|
|
19
20
|
*
|
|
20
21
|
* **Operator setup** — the target Postgres database must exist before the
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* ```bash
|
|
25
|
-
* createdb fuz_app_test_rust_spine_stub 2>/dev/null || true
|
|
26
|
-
* ```
|
|
22
|
+
* stub boots. The harness creates it only when a setup asks
|
|
23
|
+
* (`ensure_database_for_url`, or `create_cross_backend_global_setup`'s
|
|
24
|
+
* `ensure_databases`), so a test role needs no `CREATEDB` grant otherwise.
|
|
27
25
|
*
|
|
28
26
|
* `FUZ_TESTING_RUST_SPINE_STUB_DATABASE_URL` points the stub at another
|
|
29
27
|
* server (e.g. a scratch cluster on a spare port).
|
|
@@ -38,7 +36,7 @@ import '../assert_dev_env.js';
|
|
|
38
36
|
*/
|
|
39
37
|
import { fileURLToPath } from 'node:url';
|
|
40
38
|
import { build_test_backend_paths } from './build_test_backend_paths.js';
|
|
41
|
-
import { LOGIN_RATE_LIMIT_ENABLED_ENV, SPINE_EXPECTED_SCHEMA_URL } from './spine_surface_constants.js';
|
|
39
|
+
import { LOGIN_RATE_LIMIT_ENABLED_ENV, SPINE_EXPECTED_SCHEMA_URL, TESTING_BACKDOOR_METHODS } from './spine_surface_constants.js';
|
|
42
40
|
import { action_rate_limit_env, make_default_rust_backend_config, rust_default_capabilities } from './default_backend_configs.js';
|
|
43
41
|
/** Env var naming the prebuilt `testing_spine_stub` binary. Required when `binary_path` is omitted. */
|
|
44
42
|
export const RUST_SPINE_STUB_BIN_ENV = 'FUZ_TESTING_RUST_SPINE_STUB_BIN';
|
|
@@ -58,26 +56,41 @@ export const RUST_SPINE_STUB_DATABASE_URL_ENV = 'FUZ_TESTING_RUST_SPINE_STUB_DAT
|
|
|
58
56
|
export const RUST_SPINE_STUB_EXPECTED_SCHEMA_PATH_ENV = 'FUZ_RUST_SPINE_STUB_EXPECTED_SCHEMA_PATH';
|
|
59
57
|
/**
|
|
60
58
|
* Capabilities for the Rust `testing_spine_stub` — `rust_default_capabilities`
|
|
61
|
-
*
|
|
59
|
+
* with every `MountFlag` stated, all `true`: `ws` (it mounts `/api/ws`), `peer_request` (its registry carries
|
|
60
|
+
* `peer/ping` on both transports), `cell_crud` + `cell_relations` (it mounts the
|
|
61
|
+
* full cell surface over the `fuz_cell` namespace), `fact_serving` (the
|
|
62
|
+
* cell-gated serve route, the `fuz_facts` namespace and `_testing_put_fact`),
|
|
63
|
+
* `fact_serving_admin_hash` (the admin bare-hash route), `sse` (the stub serves `GET /api/admin/audit/stream` over the spine
|
|
62
64
|
* `fuz_realtime::SseRegistry` + audit listener), `ready` (it live-mounts
|
|
63
65
|
* `/ready` over the env-supplied fixture path), `ws_account_actions` (it
|
|
64
66
|
* serves one action registry on `/api/rpc` and `/api/ws`), `cell_gated_create`
|
|
65
67
|
* (it mounts the `TestCellGatedCreateAuthorize` policy on its cell layer), and
|
|
66
68
|
* `ws_role_gated` (it mounts the role-gated WS endpoint at
|
|
67
|
-
* `SPINE_ROLE_GATED_WS_PATH`, sharing its connection registry)
|
|
69
|
+
* `SPINE_ROLE_GATED_WS_PATH`, sharing its connection registry), and every
|
|
70
|
+
* `TESTING_BACKDOOR_METHODS` entry as `testing_backdoors` (it mounts them all,
|
|
71
|
+
* on one registry for both transports). Named
|
|
68
72
|
* (not inline) so every spine preset is greppable, mirroring
|
|
69
73
|
* `ts_spine_capabilities`.
|
|
70
74
|
*/
|
|
71
75
|
const rust_spine_stub_capabilities = Object.freeze({
|
|
72
76
|
...rust_default_capabilities,
|
|
77
|
+
ws: true,
|
|
78
|
+
peer_request: true,
|
|
73
79
|
sse: true,
|
|
80
|
+
cell_crud: true,
|
|
81
|
+
cell_relations: true,
|
|
82
|
+
fact_serving: true,
|
|
83
|
+
fact_serving_admin_hash: true,
|
|
74
84
|
ready: true,
|
|
75
85
|
ws_account_actions: true,
|
|
76
86
|
cell_gated_create: true,
|
|
77
|
-
ws_role_gated: true
|
|
87
|
+
ws_role_gated: true,
|
|
88
|
+
testing_backdoors: TESTING_BACKDOOR_METHODS
|
|
78
89
|
});
|
|
79
90
|
/** Default listening port — slots beside zzz's 1175/1176; matches the binary's `DEFAULT_PORT`. */
|
|
80
91
|
export const RUST_SPINE_STUB_DEFAULT_PORT = 1177;
|
|
92
|
+
/** The preset's default backend name — its spawn label and temp directory. */
|
|
93
|
+
export const RUST_SPINE_STUB_DEFAULT_NAME = 'spine_stub';
|
|
81
94
|
/** Default Postgres database — real PG (PGlite isn't reachable from `tokio-postgres`). */
|
|
82
95
|
export const RUST_SPINE_STUB_DEFAULT_DATABASE_URL = 'postgres://localhost/fuz_app_test_rust_spine_stub';
|
|
83
96
|
/**
|
|
@@ -93,13 +106,12 @@ export const RUST_SPINE_STUB_DEFAULT_DATABASE_URL = 'postgres://localhost/fuz_ap
|
|
|
93
106
|
*/
|
|
94
107
|
export const rust_spine_stub_backend_config = (options = {}) => {
|
|
95
108
|
const { port = RUST_SPINE_STUB_DEFAULT_PORT, database_url = process.env[RUST_SPINE_STUB_DATABASE_URL_ENV] ||
|
|
96
|
-
RUST_SPINE_STUB_DEFAULT_DATABASE_URL, binary_path = process.env[RUST_SPINE_STUB_BIN_ENV], enable_login_rate_limit, trusted_proxies } = options;
|
|
109
|
+
RUST_SPINE_STUB_DEFAULT_DATABASE_URL, binary_path = process.env[RUST_SPINE_STUB_BIN_ENV], enable_login_rate_limit, trusted_proxies, name = RUST_SPINE_STUB_DEFAULT_NAME } = options;
|
|
97
110
|
if (!binary_path) {
|
|
98
111
|
throw new Error(`rust_spine_stub_backend_config: no binary path — set ${RUST_SPINE_STUB_BIN_ENV} to a prebuilt ` +
|
|
99
|
-
'`testing_spine_stub` binary (build it with `cargo build -p testing_spine_stub --
|
|
112
|
+
'`testing_spine_stub` binary (build it with `cargo build -p testing_spine_stub --profile cross-test`) ' +
|
|
100
113
|
'or pass `binary_path`.');
|
|
101
114
|
}
|
|
102
|
-
const name = 'spine_stub';
|
|
103
115
|
const paths = build_test_backend_paths(name);
|
|
104
116
|
return make_default_rust_backend_config({
|
|
105
117
|
name,
|
|
@@ -113,12 +125,12 @@ export const rust_spine_stub_backend_config = (options = {}) => {
|
|
|
113
125
|
port_env_var: 'FUZ_RUST_SPINE_STUB_PORT',
|
|
114
126
|
rust_log: 'info,testing_spine_stub=info',
|
|
115
127
|
paths,
|
|
128
|
+
// The binary writes its daemon-token JSON to
|
|
129
|
+
// `{FUZ_RUST_SPINE_STUB_DIR}/run/daemon_token`; the builder anchors the
|
|
130
|
+
// dir to `paths.root`, which makes that `paths.daemon_token_path`, the
|
|
131
|
+
// file `spawn_backend` reads after the health probe.
|
|
132
|
+
daemon_token_dir_env: 'FUZ_RUST_SPINE_STUB_DIR',
|
|
116
133
|
extra_env: {
|
|
117
|
-
// The binary writes its daemon-token JSON to
|
|
118
|
-
// `{FUZ_RUST_SPINE_STUB_DIR}/run/daemon_token`; anchoring the dir to
|
|
119
|
-
// `paths.root` makes that equal `paths.daemon_token_path`, which
|
|
120
|
-
// `spawn_backend` reads after the health probe.
|
|
121
|
-
FUZ_RUST_SPINE_STUB_DIR: paths.root,
|
|
122
134
|
// Absolute path to the committed spine `expected_schema.json` — the
|
|
123
135
|
// stub's `/ready` gate introspects the live DB against it. The SAME
|
|
124
136
|
// file the TS spine reads, so the two backends share one cross-impl
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import '../assert_dev_env.js';
|
|
2
2
|
import type { SetupTest } from './setup.js';
|
|
3
|
+
import type { WsEndpointTarget } from './ws_endpoint.js';
|
|
3
4
|
/** Options for the session-cap parity suite. */
|
|
4
5
|
export interface SessionCapCrossTestOptions {
|
|
5
6
|
/** Per-test fixture producer (cross-process only — see the module doc). */
|
|
@@ -19,14 +20,14 @@ export interface SessionCapCrossTestOptions {
|
|
|
19
20
|
* session's socket is closed. Pass it when the backend has a WS transport
|
|
20
21
|
* (`capabilities.ws`); omitted, that case is skipped.
|
|
21
22
|
*/
|
|
22
|
-
readonly ws?:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
readonly ws?: WsEndpointTarget;
|
|
24
|
+
/**
|
|
25
|
+
* The roles the account whose socket the `ws` case watches is created with, for a
|
|
26
|
+
* backend whose WS upgrade requires a role (an admin-gated `/api/ws`
|
|
27
|
+
* refuses a roleless account's upgrade). Each must be admin-grantable — the
|
|
28
|
+
* fixture offers it. Default none.
|
|
29
|
+
*/
|
|
30
|
+
readonly ws_account_roles?: ReadonlyArray<string>;
|
|
30
31
|
}
|
|
31
32
|
export declare const describe_session_cap_cross_tests: (options: SessionCapCrossTestOptions) => void;
|
|
32
33
|
//# sourceMappingURL=session_cap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session_cap.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/session_cap.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,gDAAgD;AAChD,MAAM,WAAW,0BAA0B;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE
|
|
1
|
+
{"version":3,"file":"session_cap.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/session_cap.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA0D9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,gDAAgD;AAChD,MAAM,WAAW,0BAA0B;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,qEAAqE;IACrE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,eAAO,MAAM,gCAAgC,GAAI,SAAS,0BAA0B,KAAG,IAgGtF,CAAC"}
|
|
@@ -52,11 +52,12 @@ import { DEFAULT_MAX_SESSIONS } from '../../auth/account_route_schema.js';
|
|
|
52
52
|
import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
|
|
53
53
|
import { create_ws_transport } from '../transports/ws_transport.js';
|
|
54
54
|
import { test_if } from './capabilities.js';
|
|
55
|
+
import { SPINE_ACCOUNT_LOGIN_PATH, SPINE_ACCOUNT_STATUS_PATH } from './spine_surface_constants.js';
|
|
55
56
|
export const describe_session_cap_cross_tests = (options) => {
|
|
56
|
-
const { setup_test, ws } = options;
|
|
57
|
+
const { setup_test, ws, ws_account_roles = [] } = options;
|
|
57
58
|
const max_sessions = options.max_sessions ?? DEFAULT_MAX_SESSIONS;
|
|
58
|
-
const login_path = options.login_path ??
|
|
59
|
-
const status_path = options.status_path ??
|
|
59
|
+
const login_path = options.login_path ?? SPINE_ACCOUNT_LOGIN_PATH;
|
|
60
|
+
const status_path = options.status_path ?? SPINE_ACCOUNT_STATUS_PATH;
|
|
60
61
|
// Fresh-keeper-per-test wipes the DB between tests, so a literal username
|
|
61
62
|
// never collides (see `setup.ts`).
|
|
62
63
|
const username = 'session_cap_user';
|
|
@@ -100,7 +101,11 @@ export const describe_session_cap_cross_tests = (options) => {
|
|
|
100
101
|
// held before it (`create_account` seeds one on some cradles).
|
|
101
102
|
test_if(ws !== undefined, 'a session the cap evicts has its open socket closed', async () => {
|
|
102
103
|
const fixture = await setup_test();
|
|
103
|
-
await fixture.create_account({
|
|
104
|
+
await fixture.create_account({
|
|
105
|
+
username,
|
|
106
|
+
password_value: DEFAULT_TEST_PASSWORD,
|
|
107
|
+
roles: [...ws_account_roles]
|
|
108
|
+
});
|
|
104
109
|
const victim = await login(fixture, 'the login whose socket is watched');
|
|
105
110
|
const client = await create_ws_transport({
|
|
106
111
|
base_url: ws.base_url,
|
|
@@ -28,7 +28,7 @@ import '../assert_dev_env.js';
|
|
|
28
28
|
import { describe, test, assert } from 'vitest';
|
|
29
29
|
import { create_keyring } from '../../auth/keyring.js';
|
|
30
30
|
import { ERROR_AUTHENTICATION_REQUIRED } from '../../http/error_schemas.js';
|
|
31
|
-
import { cross_rpc_call, error_reason } from './
|
|
31
|
+
import { cross_rpc_call, error_reason } from './cross_rpc.js';
|
|
32
32
|
import { SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
33
33
|
/** The base64 alphabet, in index order. */
|
|
34
34
|
const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
@@ -26,14 +26,6 @@ export interface CreateTestAccountOptions {
|
|
|
26
26
|
*/
|
|
27
27
|
readonly email?: string;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
30
|
-
* Shape returned by `TestFixture.create_account`. Aliased to the
|
|
31
|
-
* existing `TestAccount` interface from `testing/app_server.ts` — same shape,
|
|
32
|
-
* stable name on the cross-backend testing surface so call sites read
|
|
33
|
-
* `fixture.create_account(...)` returning `TestAccountFixture` without
|
|
34
|
-
* crossing module boundaries.
|
|
35
|
-
*/
|
|
36
|
-
export type TestAccountFixture = TestAccount;
|
|
37
29
|
/**
|
|
38
30
|
* Spec for a bootstrap-time secondary account seeded alongside the
|
|
39
31
|
* keeper by `_testing_reset` (cross-process) or `create_test_app`
|
|
@@ -52,32 +44,21 @@ export interface ExtraAccountSpec {
|
|
|
52
44
|
readonly password_value?: string;
|
|
53
45
|
readonly roles: ReadonlyArray<string>;
|
|
54
46
|
}
|
|
55
|
-
/** Bootstrap-time-seeded secondary account exposed on the fixture. */
|
|
56
|
-
export interface ExtraAccountFixture {
|
|
57
|
-
readonly account: {
|
|
58
|
-
readonly id: Uuid;
|
|
59
|
-
readonly username: string;
|
|
60
|
-
};
|
|
61
|
-
readonly actor: {
|
|
62
|
-
readonly id: Uuid;
|
|
63
|
-
};
|
|
64
|
-
readonly api_token: string;
|
|
65
|
-
readonly session_cookie: string;
|
|
66
|
-
readonly create_session_headers: (extra?: Record<string, string>) => Record<string, string>;
|
|
67
|
-
readonly create_bearer_headers: (extra?: Record<string, string>) => Record<string, string>;
|
|
68
|
-
}
|
|
69
47
|
/**
|
|
70
|
-
* Build
|
|
71
|
-
*
|
|
48
|
+
* Build a `TestAccount` from a seeded `{account, actor, api_token,
|
|
49
|
+
* session_cookie}` bundle and the session cookie name — the header builders
|
|
50
|
+
* close over its credentials.
|
|
51
|
+
*
|
|
52
|
+
* Every fixture path that hands out a secondary account builds it here: the
|
|
53
|
+
* bootstrap-time `extra_accounts` (in-process via
|
|
54
|
+
* `create_test_account_with_credentials`, cross-process from the
|
|
55
|
+
* `_testing_reset` output) and the cross-process `fixture.create_account`.
|
|
72
56
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* `_testing_reset` RPC's `extra_accounts` output. Both call this
|
|
77
|
-
* helper so the fixture-side header builders + field plumbing stays
|
|
78
|
-
* in one place.
|
|
57
|
+
* @param seeded - the account's identity and credentials
|
|
58
|
+
* @param cookie_name - the backend's session cookie name
|
|
59
|
+
* @returns the account with its header builders
|
|
79
60
|
*/
|
|
80
|
-
export declare const
|
|
61
|
+
export declare const to_test_account: (seeded: {
|
|
81
62
|
account: {
|
|
82
63
|
id: Uuid;
|
|
83
64
|
username: string;
|
|
@@ -87,10 +68,18 @@ export declare const build_extra_account_fixture: (seeded: {
|
|
|
87
68
|
};
|
|
88
69
|
api_token: string;
|
|
89
70
|
session_cookie: string;
|
|
90
|
-
}, cookie_name: string) =>
|
|
71
|
+
}, cookie_name: string) => TestAccount;
|
|
91
72
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
73
|
+
* The per-test bundle returned by `SetupTest`. Every Tier 1 suite body
|
|
74
|
+
* reads exclusively from this shape — no `test_app.backend.*` reads remain
|
|
75
|
+
* in the suite bodies.
|
|
76
|
+
*
|
|
77
|
+
* Transport-agnostic: in-process and cross-process producers return the
|
|
78
|
+
* same shape. Behaviors that once needed raw backend access (keyring for
|
|
79
|
+
* forging cookies) are reached through wire-shaped seams instead —
|
|
80
|
+
* `mint_expired_session()` mints over the `_testing_mint_session` channel
|
|
81
|
+
* cross-process and directly in-process, so suite bodies never branch on
|
|
82
|
+
* the transport.
|
|
94
83
|
*
|
|
95
84
|
* **Keeper ≠ admin.** `fixture.account` / `fixture.actor` refer to the
|
|
96
85
|
* **fresh keeper** seeded per test. The keeper account holds
|
|
@@ -102,7 +91,7 @@ export declare const build_extra_account_fixture: (seeded: {
|
|
|
102
91
|
* via `extra_accounts: [{username, roles: [ROLE_KEEPER]}]` and read it
|
|
103
92
|
* from `fixture.extra_accounts[username]`.
|
|
104
93
|
*/
|
|
105
|
-
export interface
|
|
94
|
+
export interface TestFixture {
|
|
106
95
|
/**
|
|
107
96
|
* Transport for this test's HTTP requests. Typed as `FetchTransport`
|
|
108
97
|
* so cross-process tests can call `transport.cookies()` for WS upgrade
|
|
@@ -159,14 +148,14 @@ export interface TestFixtureBase {
|
|
|
159
148
|
* cross-process: goes through the consumer-supplied DB-admin
|
|
160
149
|
* channel.
|
|
161
150
|
*/
|
|
162
|
-
readonly create_account: (options?: CreateTestAccountOptions) => Promise<
|
|
151
|
+
readonly create_account: (options?: CreateTestAccountOptions) => Promise<TestAccount>;
|
|
163
152
|
/**
|
|
164
153
|
* Bootstrap-time-seeded secondaries, keyed by their declared
|
|
165
154
|
* `username`. Populated from the `extra_accounts` option passed to
|
|
166
155
|
* `default_in_process_setup` / `default_cross_process_setup`. Empty
|
|
167
156
|
* for suites that don't declare any.
|
|
168
157
|
*/
|
|
169
|
-
readonly extra_accounts: Readonly<Record<string,
|
|
158
|
+
readonly extra_accounts: Readonly<Record<string, TestAccount>>;
|
|
170
159
|
/**
|
|
171
160
|
* Additional actors seeded on the **keeper** account (beyond its single
|
|
172
161
|
* bootstrap `actor`), in declaration order. Populated from the
|
|
@@ -192,23 +181,18 @@ export interface TestFixtureBase {
|
|
|
192
181
|
* RPC over the keeper's daemon-token channel (the driver has no keyring).
|
|
193
182
|
*/
|
|
194
183
|
readonly mint_expired_session: () => Promise<string>;
|
|
184
|
+
/**
|
|
185
|
+
* Whether the suites' audit reads refuse metadata keys an event type
|
|
186
|
+
* doesn't declare — the setup's `reject_unknown_audit_metadata_keys`.
|
|
187
|
+
* `list_audit_events` and the admin suite's readers pass it to
|
|
188
|
+
* `assert_audit_event_metadata`.
|
|
189
|
+
*/
|
|
190
|
+
readonly reject_unknown_audit_metadata_keys?: boolean;
|
|
195
191
|
}
|
|
196
192
|
/**
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
* in
|
|
200
|
-
*
|
|
201
|
-
* Transport-agnostic: in-process and cross-process producers return the
|
|
202
|
-
* same shape. Behaviors that once needed raw backend access (keyring for
|
|
203
|
-
* forging cookies) are reached through wire-shaped seams instead —
|
|
204
|
-
* `mint_expired_session()` mints over the `_testing_mint_session` channel
|
|
205
|
-
* cross-process and directly in-process, so suite bodies never branch on
|
|
206
|
-
* the transport.
|
|
207
|
-
*/
|
|
208
|
-
export type TestFixture = TestFixtureBase;
|
|
209
|
-
/**
|
|
210
|
-
* Per-test fixture-producing function. Invoked once inside every
|
|
211
|
-
* `test()` body. The implementation captures factory inputs (in-process)
|
|
193
|
+
* Fixture-producing function. Invoked once inside every `test()` body by
|
|
194
|
+
* default; a suite whose cases share no state past the reset may call it once
|
|
195
|
+
* in `beforeAll` instead. The implementation captures factory inputs (in-process)
|
|
212
196
|
* or a long-running backend handle (cross-process) and creates
|
|
213
197
|
* a fresh per-test bundle on each call.
|
|
214
198
|
*/
|
|
@@ -244,8 +228,8 @@ export interface CapabilityGatedCrossSuiteOptions extends CrossSuiteOptions {
|
|
|
244
228
|
/**
|
|
245
229
|
* `CrossSuiteOptions` plus the RPC endpoint path the suite dispatches
|
|
246
230
|
* against — the shape every JSON-RPC-driven imperative suite takes (cell
|
|
247
|
-
* verbs, origin, body-size, actor lookup
|
|
248
|
-
* settings
|
|
231
|
+
* verbs, origin, body-size, actor lookup, account lifecycle, app
|
|
232
|
+
* settings). Suites alias this under a self-documenting
|
|
249
233
|
* per-suite name (e.g. `OriginCrossTestOptions = RpcPathCrossSuiteOptions`).
|
|
250
234
|
*/
|
|
251
235
|
export interface RpcPathCrossSuiteOptions extends CrossSuiteOptions {
|
|
@@ -257,7 +241,7 @@ export interface RpcPathCrossSuiteOptions extends CrossSuiteOptions {
|
|
|
257
241
|
* of `RpcPathCrossSuiteOptions` and `CapabilityGatedCrossSuiteOptions`, and
|
|
258
242
|
* the most common option shape among the imperative cross suites (every
|
|
259
243
|
* `cell_*` suite, `query_shape`, `token_scope_surface`, `fact_serving`,
|
|
260
|
-
* `account_lifecycle`).
|
|
244
|
+
* `account_lifecycle`, `testing_backdoor`).
|
|
261
245
|
*/
|
|
262
246
|
export interface RpcPathCapabilityGatedCrossSuiteOptions extends RpcPathCrossSuiteOptions, CapabilityGatedCrossSuiteOptions {
|
|
263
247
|
}
|
|
@@ -396,9 +380,27 @@ export interface CrossProcessSetupOptions {
|
|
|
396
380
|
* single bootstrap actor — exposed on `fixture.extra_actors`. Declare
|
|
397
381
|
* to put the keeper into a multi-actor state so the `actor_required` /
|
|
398
382
|
* explicit-`acting` branches are reachable cross-process. See
|
|
399
|
-
* `
|
|
383
|
+
* `TestFixture.extra_actors`.
|
|
400
384
|
*/
|
|
401
385
|
readonly extra_actors?: ReadonlyArray<string>;
|
|
386
|
+
/**
|
|
387
|
+
* Hold every audit row the fixture's readers parse to a closed world:
|
|
388
|
+
* metadata keys its event type doesn't declare are refused, not just
|
|
389
|
+
* mistyped or missing ones (`assert_audit_event_metadata`'s
|
|
390
|
+
* `reject_unknown_keys`). Off by default, since the builtin schemas are
|
|
391
|
+
* open for consumer-added fields; a backend's own spine suite turns it on
|
|
392
|
+
* so neither spine can add an undeclared key. Exposed on
|
|
393
|
+
* `fixture.reject_unknown_audit_metadata_keys`.
|
|
394
|
+
*/
|
|
395
|
+
readonly reject_unknown_audit_metadata_keys?: boolean;
|
|
396
|
+
/**
|
|
397
|
+
* REST signup route `fixture.create_account` mints through. Default
|
|
398
|
+
* `SPINE_ACCOUNT_SIGNUP_PATH`; set it for a backend mounting the account
|
|
399
|
+
* routes under another prefix.
|
|
400
|
+
*/
|
|
401
|
+
readonly signup_path?: string;
|
|
402
|
+
/** REST login route `fixture.create_account` logs in through. Default `SPINE_ACCOUNT_LOGIN_PATH`. */
|
|
403
|
+
readonly login_path?: string;
|
|
402
404
|
}
|
|
403
405
|
/**
|
|
404
406
|
* Capture a backend's schema snapshot over the `_testing_schema_snapshot`
|
|
@@ -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,EAAE,IAAI,EAAuB,MAAM,4BAA4B,CAAC;AAIvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,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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"}
|