@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.
Files changed (303) hide show
  1. package/dist/actions/CLAUDE.md +8 -6
  2. package/dist/actions/action_codegen.d.ts +15 -1
  3. package/dist/actions/action_codegen.d.ts.map +1 -1
  4. package/dist/actions/action_codegen.js +23 -2
  5. package/dist/actions/action_event.d.ts.map +1 -1
  6. package/dist/actions/action_event.js +14 -1
  7. package/dist/actions/perform_action.d.ts +17 -1
  8. package/dist/actions/perform_action.d.ts.map +1 -1
  9. package/dist/actions/perform_action.js +23 -3
  10. package/dist/auth/CLAUDE.md +3 -2
  11. package/dist/auth/account_action_specs.d.ts +12 -0
  12. package/dist/auth/account_action_specs.d.ts.map +1 -1
  13. package/dist/auth/account_action_specs.js +16 -2
  14. package/dist/auth/account_actions.d.ts.map +1 -1
  15. package/dist/auth/account_actions.js +7 -4
  16. package/dist/auth/admin_action_specs.d.ts.map +1 -1
  17. package/dist/auth/admin_action_specs.js +29 -8
  18. package/dist/auth/audit_emitter.d.ts +14 -0
  19. package/dist/auth/audit_emitter.d.ts.map +1 -1
  20. package/dist/auth/audit_emitter.js +5 -1
  21. package/dist/auth/cell_action_specs.d.ts +3 -1
  22. package/dist/auth/cell_action_specs.d.ts.map +1 -1
  23. package/dist/auth/cell_action_specs.js +5 -5
  24. package/dist/auth/cell_actions.d.ts.map +1 -1
  25. package/dist/auth/cell_actions.js +2 -3
  26. package/dist/auth/cell_data_schema.d.ts +1 -1
  27. package/dist/auth/cell_data_schema.js +1 -1
  28. package/dist/auth/cell_field_action_specs.d.ts +4 -3
  29. package/dist/auth/cell_field_action_specs.d.ts.map +1 -1
  30. package/dist/auth/cell_field_action_specs.js +5 -6
  31. package/dist/auth/cell_field_actions.d.ts.map +1 -1
  32. package/dist/auth/cell_field_actions.js +8 -1
  33. package/dist/auth/cell_item_action_specs.d.ts +4 -2
  34. package/dist/auth/cell_item_action_specs.d.ts.map +1 -1
  35. package/dist/auth/cell_item_action_specs.js +5 -5
  36. package/dist/auth/cell_item_actions.d.ts.map +1 -1
  37. package/dist/auth/cell_item_actions.js +8 -1
  38. package/dist/auth/role_grant_offer_action_specs.d.ts +2 -0
  39. package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
  40. package/dist/auth/role_grant_offer_action_specs.js +8 -4
  41. package/dist/http/CLAUDE.md +14 -2
  42. package/dist/http/error_schemas.d.ts +8 -0
  43. package/dist/http/error_schemas.d.ts.map +1 -1
  44. package/dist/http/error_schemas.js +12 -0
  45. package/dist/http/jsonrpc_errors.d.ts +40 -15
  46. package/dist/http/jsonrpc_errors.d.ts.map +1 -1
  47. package/dist/http/jsonrpc_errors.js +90 -35
  48. package/dist/primitive_schemas.d.ts +1 -1
  49. package/dist/primitive_schemas.d.ts.map +1 -1
  50. package/dist/primitive_schemas.js +2 -1
  51. package/dist/schema_meta.d.ts +80 -0
  52. package/dist/schema_meta.d.ts.map +1 -1
  53. package/dist/schema_meta.js +71 -1
  54. package/dist/testing/CLAUDE.md +853 -146
  55. package/dist/testing/admin_integration.d.ts.map +1 -1
  56. package/dist/testing/admin_integration.js +73 -5
  57. package/dist/testing/adversarial_input.d.ts +0 -47
  58. package/dist/testing/adversarial_input.d.ts.map +1 -1
  59. package/dist/testing/adversarial_input.js +4 -340
  60. package/dist/testing/adversarial_input_cases.d.ts +124 -0
  61. package/dist/testing/adversarial_input_cases.d.ts.map +1 -0
  62. package/dist/testing/adversarial_input_cases.js +393 -0
  63. package/dist/testing/audit_completeness.d.ts.map +1 -1
  64. package/dist/testing/audit_completeness.js +24 -20
  65. package/dist/testing/audit_drift_guard.d.ts +30 -3
  66. package/dist/testing/audit_drift_guard.d.ts.map +1 -1
  67. package/dist/testing/audit_drift_guard.js +55 -3
  68. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  69. package/dist/testing/cross_backend/account_lifecycle.js +29 -12
  70. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  71. package/dist/testing/cross_backend/actor_lookup.js +7 -25
  72. package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
  73. package/dist/testing/cross_backend/app_settings.js +4 -6
  74. package/dist/testing/cross_backend/audit_cross_helpers.d.ts +57 -0
  75. package/dist/testing/cross_backend/audit_cross_helpers.d.ts.map +1 -0
  76. package/dist/testing/cross_backend/audit_cross_helpers.js +89 -0
  77. package/dist/testing/cross_backend/backend_config.d.ts +2 -1
  78. package/dist/testing/cross_backend/backend_config.d.ts.map +1 -1
  79. package/dist/testing/cross_backend/body_size.d.ts +6 -0
  80. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  81. package/dist/testing/cross_backend/body_size.js +26 -44
  82. package/dist/testing/cross_backend/body_size_smuggling.d.ts +5 -0
  83. package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
  84. package/dist/testing/cross_backend/body_size_smuggling.js +7 -14
  85. package/dist/testing/cross_backend/build_test_backend_paths.d.ts +3 -1
  86. package/dist/testing/cross_backend/build_test_backend_paths.d.ts.map +1 -1
  87. package/dist/testing/cross_backend/capabilities.d.ts +78 -59
  88. package/dist/testing/cross_backend/capabilities.d.ts.map +1 -1
  89. package/dist/testing/cross_backend/capabilities.js +25 -24
  90. package/dist/testing/cross_backend/cargo_binary.d.ts +70 -0
  91. package/dist/testing/cross_backend/cargo_binary.d.ts.map +1 -0
  92. package/dist/testing/cross_backend/cargo_binary.js +148 -0
  93. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  94. package/dist/testing/cross_backend/cell_crud.js +174 -3
  95. package/dist/testing/cross_backend/cell_gated_create.d.ts +0 -60
  96. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  97. package/dist/testing/cross_backend/cell_gated_create.js +9 -487
  98. package/dist/testing/cross_backend/cell_grant_role.d.ts +14 -2
  99. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  100. package/dist/testing/cross_backend/cell_grant_role.js +22 -12
  101. package/dist/testing/cross_backend/cell_moderate.d.ts +66 -0
  102. package/dist/testing/cross_backend/cell_moderate.d.ts.map +1 -0
  103. package/dist/testing/cross_backend/cell_moderate.js +511 -0
  104. package/dist/testing/cross_backend/cell_ref_admission.d.ts.map +1 -1
  105. package/dist/testing/cross_backend/cell_ref_admission.js +1 -1
  106. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  107. package/dist/testing/cross_backend/cell_relations.js +40 -19
  108. package/dist/testing/cross_backend/conformance_case.d.ts +43 -4
  109. package/dist/testing/cross_backend/conformance_case.d.ts.map +1 -1
  110. package/dist/testing/cross_backend/conformance_case.js +29 -1
  111. package/dist/testing/cross_backend/conformance_rpc_auth.d.ts +93 -0
  112. package/dist/testing/cross_backend/conformance_rpc_auth.d.ts.map +1 -0
  113. package/dist/testing/cross_backend/conformance_rpc_auth.js +125 -0
  114. package/dist/testing/cross_backend/conformance_table.d.ts +144 -4
  115. package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -1
  116. package/dist/testing/cross_backend/conformance_table.js +297 -65
  117. package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
  118. package/dist/testing/cross_backend/cookie_attributes.js +3 -2
  119. package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts +38 -5
  120. package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts.map +1 -1
  121. package/dist/testing/cross_backend/create_cross_backend_global_setup.js +24 -3
  122. package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts +5 -5
  123. package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts.map +1 -1
  124. package/dist/testing/cross_backend/credential_deadline.d.ts +10 -6
  125. package/dist/testing/cross_backend/credential_deadline.d.ts.map +1 -1
  126. package/dist/testing/cross_backend/credential_deadline.js +32 -31
  127. package/dist/testing/cross_backend/credential_header_robustness.d.ts.map +1 -1
  128. package/dist/testing/cross_backend/credential_header_robustness.js +4 -6
  129. package/dist/testing/cross_backend/{cell_cross_helpers.d.ts → cross_rpc.d.ts} +14 -2
  130. package/dist/testing/cross_backend/cross_rpc.d.ts.map +1 -0
  131. package/dist/testing/cross_backend/{cell_cross_helpers.js → cross_rpc.js} +31 -7
  132. package/dist/testing/cross_backend/default_backend_configs.d.ts +58 -61
  133. package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
  134. package/dist/testing/cross_backend/default_backend_configs.js +97 -91
  135. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  136. package/dist/testing/cross_backend/default_spine_surface.js +2 -2
  137. package/dist/testing/cross_backend/differential.d.ts +126 -0
  138. package/dist/testing/cross_backend/differential.d.ts.map +1 -0
  139. package/dist/testing/cross_backend/differential.js +201 -0
  140. package/dist/testing/cross_backend/differential_normalize.d.ts +150 -0
  141. package/dist/testing/cross_backend/differential_normalize.d.ts.map +1 -0
  142. package/dist/testing/cross_backend/differential_normalize.js +153 -0
  143. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  144. package/dist/testing/cross_backend/fact_serving.js +27 -17
  145. package/dist/testing/cross_backend/full_spine_mount.d.ts +15 -0
  146. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
  147. package/dist/testing/cross_backend/full_spine_mount.js +55 -1
  148. package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
  149. package/dist/testing/cross_backend/identity_parity.js +6 -5
  150. package/dist/testing/cross_backend/in_process_setup.d.ts +12 -2
  151. package/dist/testing/cross_backend/in_process_setup.d.ts.map +1 -1
  152. package/dist/testing/cross_backend/in_process_setup.js +10 -7
  153. package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
  154. package/dist/testing/cross_backend/login_security.js +13 -18
  155. package/dist/testing/cross_backend/origin.js +1 -1
  156. package/dist/testing/cross_backend/origin_conformance.js +1 -1
  157. package/dist/testing/cross_backend/origin_scope.d.ts +6 -0
  158. package/dist/testing/cross_backend/origin_scope.d.ts.map +1 -1
  159. package/dist/testing/cross_backend/origin_scope.js +13 -12
  160. package/dist/testing/cross_backend/peer_ping_ws.d.ts +2 -5
  161. package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
  162. package/dist/testing/cross_backend/peer_ping_ws.js +14 -24
  163. package/dist/testing/cross_backend/postgres_database.d.ts +85 -0
  164. package/dist/testing/cross_backend/postgres_database.d.ts.map +1 -0
  165. package/dist/testing/cross_backend/postgres_database.js +140 -0
  166. package/dist/testing/cross_backend/provided_context.d.ts +28 -0
  167. package/dist/testing/cross_backend/provided_context.d.ts.map +1 -0
  168. package/dist/testing/cross_backend/provided_context.js +35 -0
  169. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  170. package/dist/testing/cross_backend/query_shape.js +10 -12
  171. package/dist/testing/cross_backend/ready.js +2 -2
  172. package/dist/testing/cross_backend/revocation_drivers.d.ts +4 -3
  173. package/dist/testing/cross_backend/revocation_drivers.d.ts.map +1 -1
  174. package/dist/testing/cross_backend/revocation_drivers.js +1 -1
  175. package/dist/testing/cross_backend/role_grant_cross_helpers.d.ts +3 -2
  176. package/dist/testing/cross_backend/role_grant_cross_helpers.d.ts.map +1 -1
  177. package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts +13 -0
  178. package/dist/testing/cross_backend/role_grant_offer_lifecycle.d.ts.map +1 -0
  179. package/dist/testing/cross_backend/role_grant_offer_lifecycle.js +203 -0
  180. package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts +2 -5
  181. package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts.map +1 -1
  182. package/dist/testing/cross_backend/role_grant_offer_notification_ws.js +203 -111
  183. package/dist/testing/cross_backend/role_grant_participation.d.ts +13 -0
  184. package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
  185. package/dist/testing/cross_backend/role_grant_participation.js +32 -21
  186. package/dist/testing/cross_backend/role_grant_role_grammar.d.ts.map +1 -1
  187. package/dist/testing/cross_backend/role_grant_role_grammar.js +6 -9
  188. package/dist/testing/cross_backend/rpc_adversarial.d.ts +47 -0
  189. package/dist/testing/cross_backend/rpc_adversarial.d.ts.map +1 -0
  190. package/dist/testing/cross_backend/rpc_adversarial.js +302 -0
  191. package/dist/testing/cross_backend/rpc_success_fixtures.d.ts +24 -0
  192. package/dist/testing/cross_backend/rpc_success_fixtures.d.ts.map +1 -0
  193. package/dist/testing/cross_backend/rpc_success_fixtures.js +124 -0
  194. package/dist/testing/cross_backend/rust_spine_consumer_surface.d.ts +101 -0
  195. package/dist/testing/cross_backend/rust_spine_consumer_surface.d.ts.map +1 -0
  196. package/dist/testing/cross_backend/rust_spine_consumer_surface.js +113 -0
  197. package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts +10 -0
  198. package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
  199. package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +33 -21
  200. package/dist/testing/cross_backend/session_cap.d.ts +9 -8
  201. package/dist/testing/cross_backend/session_cap.d.ts.map +1 -1
  202. package/dist/testing/cross_backend/session_cap.js +9 -4
  203. package/dist/testing/cross_backend/session_cookie_codec.js +1 -1
  204. package/dist/testing/cross_backend/setup.d.ts +58 -56
  205. package/dist/testing/cross_backend/setup.d.ts.map +1 -1
  206. package/dist/testing/cross_backend/setup.js +29 -29
  207. package/dist/testing/cross_backend/simple_request.d.ts.map +1 -1
  208. package/dist/testing/cross_backend/simple_request.js +4 -4
  209. package/dist/testing/cross_backend/spawn_backend.d.ts +59 -10
  210. package/dist/testing/cross_backend/spawn_backend.d.ts.map +1 -1
  211. package/dist/testing/cross_backend/spawn_backend.js +219 -60
  212. package/dist/testing/cross_backend/spine_suites.d.ts +311 -0
  213. package/dist/testing/cross_backend/spine_suites.d.ts.map +1 -0
  214. package/dist/testing/cross_backend/spine_suites.js +897 -0
  215. package/dist/testing/cross_backend/spine_surface_constants.d.ts +44 -0
  216. package/dist/testing/cross_backend/spine_surface_constants.d.ts.map +1 -1
  217. package/dist/testing/cross_backend/spine_surface_constants.js +53 -0
  218. package/dist/testing/cross_backend/sse_round_trip.d.ts.map +1 -1
  219. package/dist/testing/cross_backend/sse_round_trip.js +3 -4
  220. package/dist/testing/cross_backend/standard.d.ts +18 -1
  221. package/dist/testing/cross_backend/standard.d.ts.map +1 -1
  222. package/dist/testing/cross_backend/standard.js +2 -0
  223. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts +24 -0
  224. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
  225. package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +15 -0
  226. package/dist/testing/cross_backend/testing_backdoor.d.ts +29 -12
  227. package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
  228. package/dist/testing/cross_backend/testing_backdoor.js +143 -51
  229. package/dist/testing/cross_backend/testing_reset_actions.d.ts +30 -14
  230. package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
  231. package/dist/testing/cross_backend/testing_reset_actions.js +58 -37
  232. package/dist/testing/cross_backend/testing_server_bun.js +1 -1
  233. package/dist/testing/cross_backend/token_lifetime.js +1 -1
  234. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  235. package/dist/testing/cross_backend/token_scope_surface.js +9 -13
  236. package/dist/testing/cross_backend/transport_composition.d.ts +26 -2
  237. package/dist/testing/cross_backend/transport_composition.d.ts.map +1 -1
  238. package/dist/testing/cross_backend/transport_composition.js +81 -51
  239. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +8 -0
  240. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
  241. package/dist/testing/cross_backend/ts_spine_backend_config.js +23 -13
  242. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts +2 -5
  243. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -1
  244. package/dist/testing/cross_backend/ws_action_rate_limit.js +8 -14
  245. package/dist/testing/cross_backend/ws_connection_cap.d.ts +4 -9
  246. package/dist/testing/cross_backend/ws_connection_cap.d.ts.map +1 -1
  247. package/dist/testing/cross_backend/ws_connection_cap.js +11 -12
  248. package/dist/testing/cross_backend/ws_endpoint.d.ts +52 -0
  249. package/dist/testing/cross_backend/ws_endpoint.d.ts.map +1 -0
  250. package/dist/testing/cross_backend/ws_endpoint.js +54 -0
  251. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts +2 -5
  252. package/dist/testing/cross_backend/ws_inbound_dispatch.d.ts.map +1 -1
  253. package/dist/testing/cross_backend/ws_inbound_dispatch.js +9 -15
  254. package/dist/testing/cross_backend/ws_outbound_overflow.d.ts +2 -7
  255. package/dist/testing/cross_backend/ws_outbound_overflow.d.ts.map +1 -1
  256. package/dist/testing/cross_backend/ws_outbound_overflow.js +5 -9
  257. package/dist/testing/cross_backend/ws_role_gated.d.ts +4 -5
  258. package/dist/testing/cross_backend/ws_role_gated.d.ts.map +1 -1
  259. package/dist/testing/cross_backend/ws_role_gated.js +12 -21
  260. package/dist/testing/cross_backend/ws_round_trip.d.ts +12 -9
  261. package/dist/testing/cross_backend/ws_round_trip.d.ts.map +1 -1
  262. package/dist/testing/cross_backend/ws_round_trip.js +29 -34
  263. package/dist/testing/db_entities.d.ts +16 -3
  264. package/dist/testing/db_entities.d.ts.map +1 -1
  265. package/dist/testing/db_entities.js +28 -5
  266. package/dist/testing/integration_helpers.d.ts +61 -2
  267. package/dist/testing/integration_helpers.d.ts.map +1 -1
  268. package/dist/testing/integration_helpers.js +75 -18
  269. package/dist/testing/round_trip.d.ts +17 -0
  270. package/dist/testing/round_trip.d.ts.map +1 -1
  271. package/dist/testing/round_trip.js +67 -24
  272. package/dist/testing/rpc_attack_surface.d.ts +10 -0
  273. package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
  274. package/dist/testing/rpc_attack_surface.js +27 -140
  275. package/dist/testing/rpc_envelope_cases.d.ts +114 -0
  276. package/dist/testing/rpc_envelope_cases.d.ts.map +1 -0
  277. package/dist/testing/rpc_envelope_cases.js +243 -0
  278. package/dist/testing/rpc_helpers.d.ts +31 -0
  279. package/dist/testing/rpc_helpers.d.ts.map +1 -1
  280. package/dist/testing/rpc_helpers.js +35 -14
  281. package/dist/testing/rpc_round_trip.d.ts +62 -6
  282. package/dist/testing/rpc_round_trip.d.ts.map +1 -1
  283. package/dist/testing/rpc_round_trip.js +151 -39
  284. package/dist/testing/schema_generators.d.ts +99 -2
  285. package/dist/testing/schema_generators.d.ts.map +1 -1
  286. package/dist/testing/schema_generators.js +261 -73
  287. package/dist/testing/standard.d.ts +26 -0
  288. package/dist/testing/standard.d.ts.map +1 -1
  289. package/dist/testing/standard.js +4 -1
  290. package/dist/testing/stubs.d.ts +4 -3
  291. package/dist/testing/stubs.d.ts.map +1 -1
  292. package/dist/testing/stubs.js +6 -4
  293. package/dist/testing/transports/raw_http.d.ts +21 -0
  294. package/dist/testing/transports/raw_http.d.ts.map +1 -1
  295. package/dist/testing/transports/raw_http.js +30 -0
  296. package/dist/zod.d.ts +9 -0
  297. package/dist/zod.d.ts.map +1 -1
  298. package/dist/zod.js +20 -0
  299. package/package.json +6 -4
  300. package/dist/testing/cross_backend/actor_search.d.ts +0 -6
  301. package/dist/testing/cross_backend/actor_search.d.ts.map +0 -1
  302. package/dist/testing/cross_backend/actor_search.js +0 -90
  303. package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +0 -1
@@ -28,18 +28,22 @@ import { DEFAULT_TEST_PASSWORD } from '../test_credentials.js';
28
28
  import { create_fetch_transport } from '../transports/fetch_transport.js';
29
29
  import { MigrationTracker } from '../schema_introspect.js';
30
30
  import { ActionManifest } from './action_manifest.js';
31
+ import { SPINE_ACCOUNT_LOGIN_PATH, SPINE_ACCOUNT_SIGNUP_PATH } from './spine_surface_constants.js';
31
32
  /**
32
- * Build an `ExtraAccountFixture` from a seeded `{account, actor,
33
- * api_token, session_cookie}` bundle and the session cookie name.
33
+ * Build a `TestAccount` from a seeded `{account, actor, api_token,
34
+ * session_cookie}` bundle and the session cookie name — the header builders
35
+ * close over its credentials.
34
36
  *
35
- * Same shape produced by either path that seeds bootstrap-time
36
- * secondaries: in-process via `create_test_account_with_credentials`
37
- * against the live backend's DB, or cross-process via the
38
- * `_testing_reset` RPC's `extra_accounts` output. Both call this
39
- * helper so the fixture-side header builders + field plumbing stays
40
- * in one place.
37
+ * Every fixture path that hands out a secondary account builds it here: the
38
+ * bootstrap-time `extra_accounts` (in-process via
39
+ * `create_test_account_with_credentials`, cross-process from the
40
+ * `_testing_reset` output) and the cross-process `fixture.create_account`.
41
+ *
42
+ * @param seeded - the account's identity and credentials
43
+ * @param cookie_name - the backend's session cookie name
44
+ * @returns the account with its header builders
41
45
  */
42
- export const build_extra_account_fixture = (seeded, cookie_name) => ({
46
+ export const to_test_account = (seeded, cookie_name) => ({
43
47
  account: seeded.account,
44
48
  actor: seeded.actor,
45
49
  api_token: seeded.api_token,
@@ -326,8 +330,10 @@ const mint_account = async (handle, options) => {
326
330
  // it. The keeper holds `ROLE_ADMIN` from bootstrap (see
327
331
  // `bootstrap_account.ts` — both `ROLE_KEEPER` and `ROLE_ADMIN` grants
328
332
  // are created in the bootstrap transaction), so `invite_create` (admin-
329
- // only) authorizes without any extra grants.
330
- const invite_result = (await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, 'invite_create', { username }, handle.config.name));
333
+ // only) authorizes without any extra grants. It acts as the keeper's
334
+ // bootstrap actor, the one holding those grants, so a keeper seeded with
335
+ // `extra_actors` resolves it too rather than answering `actor_required`.
336
+ const invite_result = (await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, 'invite_create', { username, acting: handle.keeper_actor.id }, handle.config.name));
331
337
  if (!invite_result?.invite?.id) {
332
338
  throw new Error(`invite_create(${handle.config.name}, username=${username}) returned unexpected result: ` +
333
339
  JSON.stringify(invite_result));
@@ -340,7 +346,7 @@ const mint_account = async (handle, options) => {
340
346
  // `app_server.ts`): "requested" is `undefined` vs present, so a
341
347
  // caller-supplied value is forwarded verbatim and signup validates it,
342
348
  // rather than the truthy form silently dropping an empty string.
343
- const signup_response = await transport('/api/account/signup', {
349
+ const signup_response = await transport(options.signup_path, {
344
350
  method: 'POST',
345
351
  headers: { 'Content-Type': 'application/json' },
346
352
  body: JSON.stringify({
@@ -358,7 +364,7 @@ const mint_account = async (handle, options) => {
358
364
  if (!parsed.success) {
359
365
  throw new Error(`signup(${handle.config.name}) returned unexpected body: ${JSON.stringify(signup_raw)} (${parsed.error.message})`);
360
366
  }
361
- const login_response = await transport('/api/account/login', {
367
+ const login_response = await transport(options.login_path, {
362
368
  method: 'POST',
363
369
  headers: { 'Content-Type': 'application/json' },
364
370
  body: JSON.stringify({ username, password })
@@ -401,7 +407,9 @@ const mint_account = async (handle, options) => {
401
407
  */
402
408
  const grant_roles_via_offer_accept = async (handle, minted, roles) => {
403
409
  for (const role of roles) {
404
- const offer_result = (await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, 'role_grant_offer_create', { to_account_id: minted.account.id, role }, `${handle.config.name}, role=${role}`));
410
+ const offer_result = (await rpc_via_transport(handle.keeper_transport, handle.config.rpc_path, 'role_grant_offer_create',
411
+ // as the keeper's bootstrap actor, like `mint_account`'s invite
412
+ { to_account_id: minted.account.id, role, acting: handle.keeper_actor.id }, `${handle.config.name}, role=${role}`));
405
413
  if (!offer_result?.offer?.id) {
406
414
  throw new Error(`role_grant_offer_create(${handle.config.name}, role=${role}) returned unexpected result: ` + JSON.stringify(offer_result));
407
415
  }
@@ -461,6 +469,8 @@ export const default_cross_process_setup = (handle, options) => {
461
469
  const extra_keeper_roles = options?.extra_keeper_roles ?? [];
462
470
  const extra_account_specs = options?.extra_accounts ?? [];
463
471
  const extra_actor_names = options?.extra_actors ?? [];
472
+ const signup_path = options?.signup_path ?? SPINE_ACCOUNT_SIGNUP_PATH;
473
+ const login_path = options?.login_path ?? SPINE_ACCOUNT_LOGIN_PATH;
464
474
  const { cookie_name } = handle.config;
465
475
  return async () => {
466
476
  const { keeper, extra_accounts: seeded_extras, extra_actors } = await fire_testing_reset(handle, {
@@ -501,6 +511,8 @@ export const default_cross_process_setup = (handle, options) => {
501
511
  });
502
512
  const create_account = async (account_options) => {
503
513
  const other = await mint_account(refreshed_handle, {
514
+ signup_path,
515
+ login_path,
504
516
  ...(account_options?.username !== undefined && { username: account_options.username }),
505
517
  ...(account_options?.password_value !== undefined && {
506
518
  password_value: account_options.password_value
@@ -510,20 +522,7 @@ export const default_cross_process_setup = (handle, options) => {
510
522
  if (account_options?.roles && account_options.roles.length > 0) {
511
523
  await grant_roles_via_offer_accept(refreshed_handle, other, account_options.roles);
512
524
  }
513
- return {
514
- account: other.account,
515
- actor: other.actor,
516
- session_cookie: other.session_cookie,
517
- api_token: other.api_token,
518
- create_session_headers: (extra) => ({
519
- cookie: `${cookie_name}=${other.session_cookie}`,
520
- ...extra
521
- }),
522
- create_bearer_headers: (extra) => ({
523
- authorization: `Bearer ${other.api_token}`,
524
- ...extra
525
- })
526
- };
525
+ return to_test_account(other, cookie_name);
527
526
  };
528
527
  const extra_accounts = {};
529
528
  for (let i = 0; i < extra_account_specs.length; i++) {
@@ -531,7 +530,7 @@ export const default_cross_process_setup = (handle, options) => {
531
530
  const seeded = seeded_extras[i];
532
531
  if (!spec || !seeded)
533
532
  continue;
534
- extra_accounts[spec.username] = build_extra_account_fixture(seeded, cookie_name);
533
+ extra_accounts[spec.username] = to_test_account(seeded, cookie_name);
535
534
  }
536
535
  // Per-test transport — fresh jar carrying the new keeper's cookie
537
536
  // so requests authenticate as the keeper without callers having to
@@ -556,6 +555,7 @@ export const default_cross_process_setup = (handle, options) => {
556
555
  create_account,
557
556
  extra_accounts,
558
557
  extra_actors,
558
+ reject_unknown_audit_metadata_keys: options?.reject_unknown_audit_metadata_keys ?? false,
559
559
  // Forge over the wire — the cross-process driver has no keyring,
560
560
  // so `_testing_mint_session` mints the backdated row + signs the
561
561
  // cookie server-side over the keeper's daemon-token channel.
@@ -1 +1 @@
1
- {"version":3,"file":"simple_request.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/simple_request.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6B9B,OAAO,KAAK,EAAE,wBAAwB,EAAe,MAAM,YAAY,CAAC;AAGxE,mDAAmD;AACnD,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC9E,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAaD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IAuHF,CAAC"}
1
+ {"version":3,"file":"simple_request.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/simple_request.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA6B9B,OAAO,KAAK,EAAE,wBAAwB,EAAe,MAAM,YAAY,CAAC;AAOxE,mDAAmD;AACnD,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC9E,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAaD,eAAO,MAAM,mCAAmC,GAC/C,SAAS,6BAA6B,KACpC,IAuHF,CAAC"}
@@ -16,7 +16,7 @@ import '../assert_dev_env.js';
16
16
  *
17
17
  * Runs both legs via the shared `setup_test` protocol: in-process
18
18
  * (`auth/simple_request_parity.db.test.ts`) and cross-process
19
- * (`cross_backend/simple_request.cross.test.ts`). Every spine has the gate,
19
+ * (`cross_backend/spine_suites.cross.test.ts`). Every spine has the gate,
20
20
  * so the suite is ungated.
21
21
  *
22
22
  * @module
@@ -24,7 +24,7 @@ import '../assert_dev_env.js';
24
24
  import { describe, test, assert } from 'vitest';
25
25
  import { account_verify_action_spec } from '../../auth/account_action_specs.js';
26
26
  import { ERROR_UNSUPPORTED_CONTENT_TYPE } from '../../http/error_schemas.js';
27
- import { SPINE_RPC_PATH } from './spine_surface_constants.js';
27
+ import { SPINE_ACCOUNT_LOGIN_PATH, SPINE_ACCOUNT_LOGOUT_PATH, SPINE_RPC_PATH } from './spine_surface_constants.js';
28
28
  /** Build the JSON-RPC envelope body for a nullary `account_verify` call. */
29
29
  const verify_envelope = (id) => JSON.stringify({ jsonrpc: '2.0', method: account_verify_action_spec.method, id });
30
30
  /** Assert a flat `415` content-type refusal. */
@@ -36,8 +36,8 @@ const assert_refused = async (res, label) => {
36
36
  export const describe_simple_request_cross_tests = (options) => {
37
37
  const { setup_test } = options;
38
38
  const rpc_path = options.rpc_path ?? SPINE_RPC_PATH;
39
- const login_path = options.login_path ?? '/api/account/login';
40
- const logout_path = options.logout_path ?? '/api/account/logout';
39
+ const login_path = options.login_path ?? SPINE_ACCOUNT_LOGIN_PATH;
40
+ const logout_path = options.logout_path ?? SPINE_ACCOUNT_LOGOUT_PATH;
41
41
  /** POST a JSON `account_verify` with the fixture's session — 200 while it's valid. */
42
42
  const verify_session = async (fixture, id) => {
43
43
  const res = await fixture.transport(rpc_path, {
@@ -5,18 +5,30 @@ import '../assert_dev_env.js';
5
5
  *
6
6
  * Lifecycle:
7
7
  *
8
- * 1. Write the bootstrap token (`config.bootstrap.token`) to
9
- * `config.bootstrap.token_path` so the binary picks it up at startup.
10
- * 2. `child_process.spawn(...)` the binary with `detached: true` —
8
+ * 1. Refuse when `config.base_url`'s port already accepts a TCP connection —
9
+ * another cross run or a stale backend holds it, and the health probe
10
+ * would otherwise drive that process instead of the one spawned here.
11
+ * 2. Write the bootstrap token (`config.bootstrap.token`) to
12
+ * `config.bootstrap.token_path` so the binary picks it up at startup, and
13
+ * delete any `config.bootstrap.daemon_token_path` a previous run left, so
14
+ * step 5 can only read the token this binary writes.
15
+ * 3. `child_process.spawn(...)` the binary with `detached: true` —
11
16
  * creates a new process group so a `SIGTERM` to the negative PID
12
17
  * tears down any descendants the binary spawned (PTYs, child
13
- * workers). vitest worker death + Ctrl+C handlers also fire the
14
- * group teardown so ports never strand.
15
- * 3. Poll `{base_url}{health_path}` until it returns 2xx or
16
- * `startup_timeout_ms` elapses.
17
- * 4. Read `config.bootstrap.daemon_token_path` to load the binary's
18
+ * workers). vitest worker death + `SIGINT` / `SIGTERM` / `SIGHUP`
19
+ * handlers also fire the group teardown so ports never strand.
20
+ * 4. Poll `{base_url}{health_path}` until it returns 2xx or
21
+ * `startup_timeout_ms` elapses — each probe bounded by its own timeout, so
22
+ * a listener that accepts but never answers can't outlast the deadline.
23
+ * 5. Read `config.bootstrap.daemon_token_path` to load the binary's
18
24
  * deterministic daemon token; thread it onto `BackendHandle` so
19
25
  * `_testing_reset` and other keeper-credential calls can authenticate.
26
+ * 6. Log one line with the time from spawn to step 5 done, so a run shows
27
+ * what each backend costs to bring up.
28
+ *
29
+ * The child's stderr is kept as a bounded tail (`STDERR_TAIL_MAX_BYTES`):
30
+ * a startup failure reports it with the exit code or signal, and an exit
31
+ * after startup that teardown didn't cause is logged with it.
20
32
  *
21
33
  * Bootstrapping (`POST /api/account/bootstrap`) is a separate concern —
22
34
  * the caller composes `bootstrap()` from `testing/transports/bootstrap.ts`
@@ -42,17 +54,54 @@ export interface BackendHandle {
42
54
  */
43
55
  readonly daemon_token: string;
44
56
  /**
45
- * SIGTERM the child's process group, drain stderr, await exit. Idempotent —
46
- * calls after the first are no-ops.
57
+ * SIGTERM the child's process group — even when the child itself has
58
+ * exited, so no descendant outlives it — and await the group's exit,
59
+ * escalating to SIGKILL after a grace window. Idempotent — later calls
60
+ * await the same exit. A descendant that left the group — spawned detached,
61
+ * or one that called `setsid` — is out of reach and survives teardown.
47
62
  */
48
63
  readonly teardown: () => Promise<void>;
49
64
  }
65
+ /**
66
+ * How much of the child's stderr is kept (bytes) — the tail a startup failure
67
+ * or an unexpected exit reports. Bounded so a backend that logs to stderr for
68
+ * a whole suite doesn't grow the runner's memory with it.
69
+ */
70
+ export declare const STDERR_TAIL_MAX_BYTES: number;
71
+ /**
72
+ * Whether something accepts TCP connections at `base_url`'s host and port.
73
+ * A refused connection, an unresolvable host or no answer within
74
+ * `PORT_PROBE_TIMEOUT_MS` all read as free.
75
+ *
76
+ * @param base_url - an `http://` or `https://` URL; a missing port is the scheme's default
77
+ */
78
+ export declare const is_port_accepting: (base_url: string) => Promise<boolean>;
79
+ /**
80
+ * A byte-bounded tail of a stream's output: keeps the last `max_bytes`
81
+ * written, dropping the oldest.
82
+ */
83
+ export interface OutputTail {
84
+ readonly push: (chunk: Buffer) => void;
85
+ /** The kept bytes as UTF-8, prefixed with a marker when older output was dropped. */
86
+ readonly text: () => string;
87
+ }
88
+ /**
89
+ * Create an `OutputTail` keeping at most `max_bytes`.
90
+ *
91
+ * @param max_bytes - how many trailing bytes to keep
92
+ */
93
+ export declare const create_output_tail: (max_bytes: number) => OutputTail;
50
94
  /**
51
95
  * Spawn `config.start_command` and return a handle once the binary is
52
96
  * health-probe-ready and the daemon-token file is readable.
53
97
  *
54
98
  * Errors at any stage SIGTERM the child group before rethrowing — the
55
99
  * caller never sees a half-started backend.
100
+ *
101
+ * @throws Error when `config.base_url`'s port already accepts connections,
102
+ * before anything is spawned; when the child exits before it is healthy
103
+ * (with its exit code or signal and stderr tail); or when the health probe
104
+ * or the daemon-token read times out
56
105
  */
57
106
  export declare const spawn_backend: (config: BackendConfig) => Promise<BackendHandle>;
58
107
  //# sourceMappingURL=spawn_backend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spawn_backend.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/spawn_backend.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AA4ID;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAU,QAAQ,aAAa,KAAG,OAAO,CAAC,aAAa,CAiHhF,CAAC"}
1
+ {"version":3,"file":"spawn_backend.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/spawn_backend.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC7B,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAgBD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAY,CAAC;AAmE/C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,KAAG,OAAO,CAAC,OAAO,CAenE,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,KAAG,UAmBtD,CAAC;AAuFF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GAAU,QAAQ,aAAa,KAAG,OAAO,CAAC,aAAa,CAoMhF,CAAC"}