tigrbl_tests 0.3.12.dev6__tar.gz → 0.3.12.dev7__tar.gz

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 (318) hide show
  1. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/PKG-INFO +1 -1
  2. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/pyproject.toml +1 -1
  3. tigrbl_tests-0.3.12.dev7/tests/i9n/test_op_ctx_uvicorn_scopes.py +170 -0
  4. tigrbl_tests-0.3.12.dev7/tests/unit/test_engine_session_database_availability.py +51 -0
  5. tigrbl_tests-0.3.12.dev7/tests/unit/test_op_ctx_custom_target_persist.py +79 -0
  6. tigrbl_tests-0.3.12.dev7/tests/unit/test_op_ctx_parameter_matrix.py +88 -0
  7. tigrbl_tests-0.3.12.dev7/tests/unit/test_openapi_documentation_security_behavior.py +127 -0
  8. tigrbl_tests-0.3.12.dev7/tests/unit/test_openrpc_documentation_security_behavior.py +127 -0
  9. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/LICENSE +0 -0
  10. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/README.md +0 -0
  11. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/__init__.py +0 -0
  12. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_atoms_do_not_depend_on_mapping.py +0 -0
  13. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_import_graph_audit.py +0 -0
  14. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_no_bindings_imports.py +0 -0
  15. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_operation_resolution_parity.py +0 -0
  16. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_runtime_structure.py +0 -0
  17. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_trace_plan_parity.py +0 -0
  18. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_transport_boundaries.py +0 -0
  19. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/architecture/test_transport_dispatch_convergence.py +0 -0
  20. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/conftest.py +0 -0
  21. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness/test_00_appspec_contract.py +0 -0
  22. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness/test_01_kernel_plan_compilation.py +0 -0
  23. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness/test_02_bootstrap_plan.py +0 -0
  24. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness/test_03_appspec_uvicorn_e2e.py +0 -0
  25. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_e2e/test_00_appspec_uvicorn_rest_rpc.py +0 -0
  26. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_e2e/test_01_imperative_uvicorn_rest_rpc.py +0 -0
  27. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/__init__.py +0 -0
  28. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/_support.py +0 -0
  29. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_appspec_prefixes.py +0 -0
  30. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_bootstrap_kernel_compilation.py +0 -0
  31. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_default_opspec_bindings.py +0 -0
  32. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_kernel_plan_routing.py +0 -0
  33. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_mapping_plan_compilation.py +0 -0
  34. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_route_rpc_prebinding.py +0 -0
  35. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/harness_v3/test_uvicorn_e2e_appspec.py +0 -0
  36. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/hooks/test_hook_ctx_phase_validation.py +0 -0
  37. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/__init__.py +0 -0
  38. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_acronym_route_name.py +0 -0
  39. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_allow_anon.py +0 -0
  40. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_apikey_generation.py +0 -0
  41. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_authn_provider_integration.py +0 -0
  42. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_bindings_integration.py +0 -0
  43. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_bindings_modules.py +0 -0
  44. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_bulk_docs_client.py +0 -0
  45. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_core_access.py +0 -0
  46. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_engine_install_uvicorn.py +0 -0
  47. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_engine_resolver_uvicorn.py +0 -0
  48. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_error_mappings.py +0 -0
  49. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_field_spec_effects.py +0 -0
  50. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_header_io_uvicorn.py +0 -0
  51. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_healthz_methodz_hookz.py +0 -0
  52. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_hook_ctx_v3_i9n.py +0 -0
  53. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_hook_lifecycle.py +0 -0
  54. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_iospec_attributes.py +0 -0
  55. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_iospec_integration.py +0 -0
  56. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_jsonrpc_batch_behavior.py +0 -0
  57. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_key_digest_uvicorn.py +0 -0
  58. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_list_filters_optional.py +0 -0
  59. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_mixins.py +0 -0
  60. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_mountable_favicon_uvicorn.py +0 -0
  61. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_mountable_lens_uvicorn.py +0 -0
  62. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_mountable_openapi_uvicorn.py +0 -0
  63. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_mountable_openrpc_uvicorn.py +0 -0
  64. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_mountable_swagger_uvicorn.py +0 -0
  65. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_nested_path_schema_and_rpc.py +0 -0
  66. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_nested_routing_depth.py +0 -0
  67. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_op_ctx_alias_examples.py +0 -0
  68. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_op_ctx_behavior.py +0 -0
  69. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_op_ctx_core_crud_order.py +0 -0
  70. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_openapi_clear_response_schema.py +0 -0
  71. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_openapi_schema_examples_presence.py +0 -0
  72. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_opspec_effects_i9n_test.py +0 -0
  73. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_opspec_pre_tx_deps.py +0 -0
  74. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_owner_tenant_policy.py +0 -0
  75. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_request_extras.py +0 -0
  76. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_request_extras_provider.py +0 -0
  77. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_response_extras_provider.py +0 -0
  78. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_rest_fallback_serialization.py +0 -0
  79. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_rest_row_serialization.py +0 -0
  80. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_rest_rpc_parity_v3.py +0 -0
  81. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_row_result_serialization.py +0 -0
  82. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_schema.py +0 -0
  83. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_schema_ctx_attributes_integration.py +0 -0
  84. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_schema_ctx_op_ctx_integration.py +0 -0
  85. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_schema_ctx_spec_integration.py +0 -0
  86. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_sqlite_attachments.py +0 -0
  87. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_storage_spec_integration.py +0 -0
  88. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_symmetry_parity.py +0 -0
  89. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_api_app_usage_uvicorn.py +0 -0
  90. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_api_usage_uvicorn.py +0 -0
  91. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_api_uvicorn.py +0 -0
  92. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_app_include_api_uvicorn.py +0 -0
  93. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_app_multi_api_uvicorn.py +0 -0
  94. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_app_usage_uvicorn.py +0 -0
  95. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_tigrbl_app_uvicorn.py +0 -0
  96. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_transport_dispatch_parity.py +0 -0
  97. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_types_deprecation_exports.py +0 -0
  98. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_v3_bulk_rest_endpoints.py +0 -0
  99. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_v3_default_rest_ops.py +0 -0
  100. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_v3_default_rpc_ops.py +0 -0
  101. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_v3_opspec_attributes.py +0 -0
  102. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/test_verb_alias_policy.py +0 -0
  103. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/i9n/uvicorn_utils.py +0 -0
  104. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/mount/__init__.py +0 -0
  105. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/mount/test_mount_favico.py +0 -0
  106. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/options/test_rest_options.py +0 -0
  107. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/options/test_rpc_options.py +0 -0
  108. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/parity/__init__.py +0 -0
  109. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/parity/test_hook_runtime_phase_parity.py +0 -0
  110. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/parity/test_stdapi_openapi_docs.py +0 -0
  111. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/parity/test_stdapi_primitives.py +0 -0
  112. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/parity/test_stdapi_routing.py +0 -0
  113. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/perf/__init__.py +0 -0
  114. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/perf/test_collect_caching.py +0 -0
  115. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/perf/test_hookz_performance.py +0 -0
  116. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/perf/test_methodz_performance.py +0 -0
  117. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/request/test_request_asgi_scope_compat.py +0 -0
  118. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/request/test_request_authn_strip.py +0 -0
  119. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/request/test_request_dot_notation.py +0 -0
  120. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/request/test_request_response_conveniences.py +0 -0
  121. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/request/test_request_transport_convenience_dot_notation.py +0 -0
  122. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/requests/test_request_json_modes.py +0 -0
  123. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/response/test_response_dot_notation.py +0 -0
  124. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/response/test_response_transport_convenience_dot_notation.py +0 -0
  125. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/security/test_dot_notation_schemes.py +0 -0
  126. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/security/test_schemes.py +0 -0
  127. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/test_secdeps_execute_in_pre_tx.py +0 -0
  128. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/__init__.py +0 -0
  129. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_alias_ctx_bindings.py +0 -0
  130. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_engine_ctx_bindings.py +0 -0
  131. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_hook_ctx_bindings.py +0 -0
  132. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_op_alias_bindings.py +0 -0
  133. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_op_ctx_bindings.py +0 -0
  134. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_response_ctx_bindings.py +0 -0
  135. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/decorators/test_schema_ctx_bindings.py +0 -0
  136. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/response_utils.py +0 -0
  137. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_emit_paired_post.py +0 -0
  138. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_emit_paired_pre.py +0 -0
  139. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_emit_readtime_alias.py +0 -0
  140. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_out_masking.py +0 -0
  141. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_refresh_demand.py +0 -0
  142. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_resolve_assemble.py +0 -0
  143. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_resolve_paired_gen.py +0 -0
  144. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_route_protocol_detect.py +0 -0
  145. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_schema_collect_in.py +0 -0
  146. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_schema_collect_out.py +0 -0
  147. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_storage_to_stored.py +0 -0
  148. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_wire_build_in.py +0 -0
  149. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_wire_build_out.py +0 -0
  150. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_wire_dump.py +0 -0
  151. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/atoms/test_wire_validate_in.py +0 -0
  152. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_compilation_runtime_behavior.py +0 -0
  153. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_events_phases.py +0 -0
  154. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_events_runtime_behavior.py +0 -0
  155. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_ingress_egress_phase_access.py +0 -0
  156. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_kernel_plan_event_ordering.py +0 -0
  157. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_kernel_plan_full_ordering.py +0 -0
  158. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_kernel_runtime_behavior.py +0 -0
  159. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_ordering_runtime_behavior.py +0 -0
  160. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/runtime/test_payload_select_header_merge.py +0 -0
  161. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_acol_vcol_knobs.py +0 -0
  162. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_alias_ctx_op_alias_attributes.py +0 -0
  163. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_alias_ctx_op_attributes.py +0 -0
  164. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_api_level_set_auth.py +0 -0
  165. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_app_model_defaults.py +0 -0
  166. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_app_reexport.py +0 -0
  167. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_attrdict_vs_simplenamespace.py +0 -0
  168. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_authorize_runtime_secdep.py +0 -0
  169. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_base_columnspec_inheritance.py +0 -0
  170. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_base_facade_initialize.py +0 -0
  171. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_build_list_params_spec_model.py +0 -0
  172. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_bulk_body_annotation.py +0 -0
  173. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_bulk_response_schema.py +0 -0
  174. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_colspec_map_isolation.py +0 -0
  175. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_column_collect_mixins.py +0 -0
  176. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_column_mro_collect_namespace.py +0 -0
  177. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_column_rest_rpc_results.py +0 -0
  178. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_column_table_orm_binding.py +0 -0
  179. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_config_dataclass_none.py +0 -0
  180. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_core_crud_bulk_ops.py +0 -0
  181. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_core_crud_default_ops.py +0 -0
  182. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_core_crud_methods.py +0 -0
  183. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_core_wrap_memoization.py +0 -0
  184. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_db_dependency.py +0 -0
  185. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_decorator_and_collect.py +0 -0
  186. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_default_schema_selection.py +0 -0
  187. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_default_tags.py +0 -0
  188. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_diagnostics_no_compat_module.py +0 -0
  189. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_docs_security_parity.py +0 -0
  190. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_engine_install_api.py +0 -0
  191. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_engine_install_app.py +0 -0
  192. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_engine_install_op.py +0 -0
  193. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_engine_install_table.py +0 -0
  194. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_engine_spec_and_shortcuts.py +0 -0
  195. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_engine_usage_levels.py +0 -0
  196. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_field_spec_attrs.py +0 -0
  197. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_file_response.py +0 -0
  198. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_get_schema.py +0 -0
  199. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_handler_step_qualname.py +0 -0
  200. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_hook_ctx_attributes.py +0 -0
  201. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_hook_ctx_binding.py +0 -0
  202. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_hookz_empty_phase.py +0 -0
  203. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_hybrid_session_run_sync.py +0 -0
  204. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_in_tx.py +0 -0
  205. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_include_model_columns_namespace.py +0 -0
  206. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_include_models_base_prefix.py +0 -0
  207. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_include_tables_base_prefix.py +0 -0
  208. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_initialize_async_task.py +0 -0
  209. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_initialize_cross_ddl.py +0 -0
  210. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_initialize_mixed_engines.py +0 -0
  211. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_initialize_task_schedule.py +0 -0
  212. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_instance_naming_conventions.py +0 -0
  213. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_io_spec_attributes.py +0 -0
  214. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_iospec_attributes.py +0 -0
  215. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_iospec_effects.py +0 -0
  216. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_jsonrpc_id_example.py +0 -0
  217. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_jsonrpc_openrpc.py +0 -0
  218. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_jsonrpc_router_default_tag.py +0 -0
  219. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_kernel_invoke_ctx.py +0 -0
  220. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_kernel_opview_on_demand.py +0 -0
  221. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_kernel_plan_labels.py +0 -0
  222. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_kernelz_endpoint.py +0 -0
  223. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_make_column_shortcuts.py +0 -0
  224. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_mapping_bind_response_export.py +0 -0
  225. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_mapping_plan_precedence.py +0 -0
  226. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_middleware_http_and_cors.py +0 -0
  227. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_mixins_sqlalchemy.py +0 -0
  228. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_alias.py +0 -0
  229. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_class_engine_binding.py +0 -0
  230. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_ctx_arity_paths.py +0 -0
  231. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_ctx_attributes.py +0 -0
  232. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_ctx_core_crud_integration.py +0 -0
  233. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_ctx_dynamic_attach.py +0 -0
  234. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_op_ctx_persist_options.py +0 -0
  235. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_openapi_openrpc_schema_separation.py +0 -0
  236. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_opspec_effects.py +0 -0
  237. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_postgres_engine_errors.py +0 -0
  238. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_postgres_env_vars.py +0 -0
  239. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_relationship_alias_cols.py +0 -0
  240. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_request_body_schema.py +0 -0
  241. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_request_response_examples.py +0 -0
  242. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_resolver_interning_warmup.py +0 -0
  243. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_resolver_precedence.py +0 -0
  244. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_alias_table_rpc.py +0 -0
  245. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_ctx_precedence.py +0 -0
  246. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_diagnostics_kernelz.py +0 -0
  247. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_html_jinja_behavior.py +0 -0
  248. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_parity.py +0 -0
  249. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_rest.py +0 -0
  250. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_rpc.py +0 -0
  251. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_template.py +0 -0
  252. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_response_uuid.py +0 -0
  253. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_all_default_op_verbs.py +0 -0
  254. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_bulk_delete_suppresses_clear.py +0 -0
  255. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_no_schema_jsonable.py +0 -0
  256. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_operation_id_uniqueness.py +0 -0
  257. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_output_serialization_extras.py +0 -0
  258. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_request_mapping_access.py +0 -0
  259. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_rpc_parity_default_ops.py +0 -0
  260. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_rpc_prefixes.py +0 -0
  261. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rest_rpc_symmetry.py +0 -0
  262. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_router_compatibility_shims.py +0 -0
  263. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_router_dependency_execution_blocked.py +0 -0
  264. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rpc_all_default_op_verbs.py +0 -0
  265. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_rpc_default_ops.py +0 -0
  266. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_schema_ctx_attributes.py +0 -0
  267. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_schema_ctx_plain_class.py +0 -0
  268. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_schema_spec_presence.py +0 -0
  269. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_schemas_binding.py +0 -0
  270. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_security_per_route.py +0 -0
  271. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_should_wire_canonical.py +0 -0
  272. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_api.py +0 -0
  273. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_app.py +0 -0
  274. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_column.py +0 -0
  275. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_engine.py +0 -0
  276. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_field.py +0 -0
  277. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_hook.py +0 -0
  278. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_io.py +0 -0
  279. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_op.py +0 -0
  280. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_storage.py +0 -0
  281. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_spec_table.py +0 -0
  282. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sqlite_attachments.py +0 -0
  283. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sqlite_uuid_type.py +0 -0
  284. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_stdapi_request_injection.py +0 -0
  285. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_stdapi_transport_asgi_wsgi.py +0 -0
  286. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_storage_spec_attributes.py +0 -0
  287. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sys_handler_crud.py +0 -0
  288. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sys_run_rollback.py +0 -0
  289. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sys_tx_async_begin.py +0 -0
  290. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sys_tx_begin.py +0 -0
  291. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_sys_tx_commit.py +0 -0
  292. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_system_docs_builders.py +0 -0
  293. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_table_base_exports.py +0 -0
  294. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_table_collect_spec.py +0 -0
  295. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_table_columns_namespace.py +0 -0
  296. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_table_model_attribute_contract.py +0 -0
  297. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_table_namespace_init.py +0 -0
  298. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_table_namespace_isolation.py +0 -0
  299. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_api_app_configuration.py +0 -0
  300. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_api_app_instantiation.py +0 -0
  301. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_api_app_subclass_definition.py +0 -0
  302. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_api_configuration.py +0 -0
  303. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_api_instantiation.py +0 -0
  304. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_api_subclass_definition.py +0 -0
  305. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_app_configuration.py +0 -0
  306. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_app_event_handlers.py +0 -0
  307. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_app_instantiation.py +0 -0
  308. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_app_state.py +0 -0
  309. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_tigrbl_app_subclass_definition.py +0 -0
  310. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_transport_gw_contract.py +0 -0
  311. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_transport_security_runtime_only.py +0 -0
  312. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_v3_favicon_endpoint.py +0 -0
  313. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_v3_healthz_endpoint.py +0 -0
  314. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_v3_op_alias.py +0 -0
  315. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_v3_op_ctx_attributes.py +0 -0
  316. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_v3_schemas_and_decorators.py +0 -0
  317. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_v3_storage_spec_attributes.py +0 -0
  318. {tigrbl_tests-0.3.12.dev6 → tigrbl_tests-0.3.12.dev7}/tests/unit/test_verbosity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tigrbl_tests
3
- Version: 0.3.12.dev6
3
+ Version: 0.3.12.dev7
4
4
  Summary: Test suite and fixtures for the Tigrbl framework.
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tigrbl_tests"
3
- version = "0.3.12.dev6"
3
+ version = "0.3.12.dev7"
4
4
  description = "Test suite and fixtures for the Tigrbl framework."
5
5
  license = "Apache-2.0"
6
6
  readme = "README.md"
@@ -0,0 +1,170 @@
1
+ import uuid
2
+ from itertools import product
3
+
4
+ import httpx
5
+ import pytest
6
+
7
+ from tigrbl import TigrblApp, TigrblRouter, op_ctx
8
+ from tigrbl.orm.mixins import GUIDPk
9
+ from tigrbl.orm.tables import TableBase
10
+ from tigrbl.shortcuts.engine import mem
11
+ from tigrbl.types import BaseModel, Column, String
12
+
13
+ from .uvicorn_utils import run_uvicorn_in_task, stop_uvicorn_server
14
+
15
+
16
+ class TokenInventorySchema(BaseModel):
17
+ access_tokens: int
18
+ refresh_tokens: int
19
+
20
+
21
+ PERSIST_VARIANTS = (
22
+ "default",
23
+ "write",
24
+ "append",
25
+ "prepend",
26
+ "override",
27
+ "skip",
28
+ "none",
29
+ "read",
30
+ )
31
+ ARITY_VARIANTS = ("collection", "member")
32
+ RESPONSE_SCHEMA_VARIANTS = (None, TokenInventorySchema)
33
+ SCOPE_VARIANTS = ("table", "router", "app")
34
+
35
+
36
+ def _op_payload() -> dict[str, int]:
37
+ return {"access_tokens": 3, "refresh_tokens": 1}
38
+
39
+
40
+ def _member_path(resource: str, alias: str) -> str:
41
+ return f"/{resource}/{uuid.uuid4()}/{alias}"
42
+
43
+
44
+ def _collection_path(resource: str, alias: str) -> str:
45
+ return f"/{resource}/{alias}"
46
+
47
+
48
+ def _build_table_app(
49
+ arity: str, response_schema, persist: str
50
+ ) -> tuple[TigrblApp, str]:
51
+ TableBase.metadata.clear()
52
+ schema_tag = "with_schema" if response_schema is not None else "no_schema"
53
+
54
+ class InventoryTable(TableBase, GUIDPk):
55
+ __tablename__ = f"inventory_table_op_ctx_uvicorn_{arity}_{persist}_{schema_tag}"
56
+ __resource__ = "inventory"
57
+ name = Column(String)
58
+
59
+ @op_ctx(
60
+ alias="token_inventory",
61
+ target="custom",
62
+ arity=arity,
63
+ response_schema=response_schema,
64
+ persist=persist,
65
+ )
66
+ def token_inventory(cls, ctx):
67
+ return _op_payload()
68
+
69
+ app = TigrblApp(engine=mem(async_=False))
70
+ app.include_table(InventoryTable, prefix="")
71
+ path = (
72
+ _collection_path("inventory", "token_inventory")
73
+ if arity == "collection"
74
+ else _member_path("inventory", "token_inventory")
75
+ )
76
+ return app, path
77
+
78
+
79
+ async def _build_router_app(
80
+ arity: str, response_schema, persist: str
81
+ ) -> tuple[TigrblApp, str]:
82
+ TableBase.metadata.clear()
83
+ schema_tag = "with_schema" if response_schema is not None else "no_schema"
84
+
85
+ class InventoryTable(TableBase, GUIDPk):
86
+ __tablename__ = (
87
+ f"inventory_router_op_ctx_uvicorn_{arity}_{persist}_{schema_tag}"
88
+ )
89
+ __resource__ = "inventory"
90
+ name = Column(String)
91
+
92
+ @op_ctx(
93
+ alias="token_inventory",
94
+ target="custom",
95
+ arity=arity,
96
+ response_schema=response_schema,
97
+ persist=persist,
98
+ )
99
+ def token_inventory(cls, ctx):
100
+ return _op_payload()
101
+
102
+ router = TigrblRouter(engine=mem(async_=False))
103
+ router.include_table(InventoryTable, prefix="")
104
+ await router.initialize()
105
+
106
+ app = TigrblApp(engine=mem(async_=False))
107
+ app.include_router(router)
108
+ path = (
109
+ _collection_path("inventory", "token_inventory")
110
+ if arity == "collection"
111
+ else _member_path("inventory", "token_inventory")
112
+ )
113
+ return app, path
114
+
115
+
116
+ def _build_app_local_op(
117
+ arity: str, response_schema, persist: str
118
+ ) -> tuple[TigrblApp, str]:
119
+ TableBase.metadata.clear()
120
+
121
+ class InventoryApp(TigrblApp):
122
+ @op_ctx(
123
+ alias="token_inventory",
124
+ target="custom",
125
+ arity=arity,
126
+ response_schema=response_schema,
127
+ persist=persist,
128
+ )
129
+ def token_inventory(cls, ctx):
130
+ return _op_payload()
131
+
132
+ app = InventoryApp(engine=mem(async_=False))
133
+ path = (
134
+ _collection_path("inventoryapp", "token_inventory")
135
+ if arity == "collection"
136
+ else _member_path("inventoryapp", "token_inventory")
137
+ )
138
+ return app, path
139
+
140
+
141
+ @pytest.mark.i9n
142
+ @pytest.mark.asyncio
143
+ @pytest.mark.parametrize(
144
+ "scope,arity,response_schema,persist",
145
+ list(
146
+ product(
147
+ SCOPE_VARIANTS, ARITY_VARIANTS, RESPONSE_SCHEMA_VARIANTS, PERSIST_VARIANTS
148
+ )
149
+ ),
150
+ ids=lambda v: getattr(v, "__name__", str(v)),
151
+ )
152
+ async def test_uvicorn_client_call_with_op_ctx_parameter_combinations(
153
+ scope: str, arity: str, response_schema, persist: str
154
+ ) -> None:
155
+ if scope == "table":
156
+ app, path = _build_table_app(arity, response_schema, persist)
157
+ elif scope == "router":
158
+ app, path = await _build_router_app(arity, response_schema, persist)
159
+ else:
160
+ app, path = _build_app_local_op(arity, response_schema, persist)
161
+
162
+ base_url, server, task = await run_uvicorn_in_task(app)
163
+ try:
164
+ async with httpx.AsyncClient() as client:
165
+ response = await client.post(f"{base_url}{path}", json={})
166
+
167
+ assert response.status_code == 200
168
+ assert response.json() == _op_payload()
169
+ finally:
170
+ await stop_uvicorn_server(server, task)
@@ -0,0 +1,51 @@
1
+ from sqlalchemy import text
2
+
3
+ from tigrbl import TableBase, TigrblApp, resolver
4
+ from tigrbl.orm.mixins import GUIDPk
5
+ from tigrbl.shortcuts.engine import engine, mem
6
+ from tigrbl.types import Column, String
7
+
8
+
9
+ class AvailabilityRecord(TableBase, GUIDPk):
10
+ __tablename__ = "availability_records"
11
+ name = Column(String(100), nullable=False)
12
+
13
+
14
+ def test_engine_availability_via_shortcut():
15
+ eng = engine(mem(async_=False))
16
+ sql_engine, session_factory = eng.raw()
17
+
18
+ assert sql_engine is not None
19
+ assert callable(session_factory)
20
+
21
+
22
+ def test_session_availability_via_engine_context_manager():
23
+ eng = engine(mem(async_=False))
24
+
25
+ with eng.session() as db:
26
+ assert db.execute(text("SELECT 1")).scalar_one() == 1
27
+
28
+
29
+ def test_database_availability_after_app_initialize():
30
+ app = TigrblApp(engine=mem(async_=False))
31
+ app.include_table(AvailabilityRecord)
32
+ app.initialize()
33
+
34
+ provider = resolver.resolve_provider(router=app)
35
+ assert provider is not None
36
+
37
+ _, session_factory = provider.ensure()
38
+
39
+ with session_factory() as db:
40
+ assert db.execute(text("SELECT 1")).scalar_one() == 1
41
+ db.execute(
42
+ text(
43
+ "CREATE TABLE IF NOT EXISTS availability_probe "
44
+ "(id INTEGER PRIMARY KEY, note TEXT)"
45
+ )
46
+ )
47
+ db.commit()
48
+ names = db.execute(
49
+ text("SELECT name FROM sqlite_master WHERE type='table'")
50
+ ).scalars()
51
+ assert "availability_probe" in set(names)
@@ -0,0 +1,79 @@
1
+ from itertools import product
2
+ from types import SimpleNamespace
3
+
4
+ import pytest
5
+
6
+ from tigrbl import op_ctx
7
+ from tigrbl.mapping import handlers
8
+ from tigrbl.mapping.op_mro_collect import mro_collect_decorated_ops
9
+ from tigrbl.types import BaseModel
10
+
11
+
12
+ class TokenInventorySchema(BaseModel):
13
+ access_tokens: int
14
+ refresh_tokens: int
15
+
16
+
17
+ PERSIST_VARIANTS = (
18
+ "default",
19
+ "write",
20
+ "append",
21
+ "prepend",
22
+ "override",
23
+ "skip",
24
+ "none",
25
+ "read",
26
+ )
27
+ ARITY_VARIANTS = ("collection", "member")
28
+ RESPONSE_SCHEMA_VARIANTS = (None, TokenInventorySchema)
29
+
30
+
31
+ def _normalize_persist(persist: str) -> str:
32
+ if persist in {"none", "read", "skip"}:
33
+ return "skip"
34
+ if persist in {"write", "default", "persist"}:
35
+ return "default"
36
+ return persist
37
+
38
+
39
+ def _build_custom_model(arity: str, response_schema, persist: str):
40
+ class Model:
41
+ __name__ = "Model"
42
+
43
+ @op_ctx(
44
+ alias="token_inventory",
45
+ target="custom",
46
+ arity=arity,
47
+ response_schema=response_schema,
48
+ persist=persist,
49
+ )
50
+ def token_inventory(
51
+ cls, ctx
52
+ ): # pragma: no cover - runtime execution not needed
53
+ return TokenInventorySchema(access_tokens=1, refresh_tokens=2)
54
+
55
+ specs = mro_collect_decorated_ops(Model)
56
+ Model.opspecs = SimpleNamespace(all=tuple(specs))
57
+ handlers.build_and_attach(Model, specs)
58
+ return Model, specs[0]
59
+
60
+
61
+ @pytest.mark.parametrize(
62
+ "arity,response_schema,persist",
63
+ list(product(ARITY_VARIANTS, RESPONSE_SCHEMA_VARIANTS, PERSIST_VARIANTS)),
64
+ ids=lambda v: getattr(v, "__name__", str(v)),
65
+ )
66
+ def test_op_ctx_custom_target_parameter_cross_product(
67
+ arity: str, response_schema, persist: str
68
+ ) -> None:
69
+ model, spec = _build_custom_model(arity, response_schema, persist)
70
+
71
+ assert spec.alias == "token_inventory"
72
+ assert spec.target == "custom"
73
+ assert spec.arity == arity
74
+ assert spec.response_model is response_schema
75
+ assert spec.persist == _normalize_persist(persist)
76
+
77
+ # For custom targets, persist controls transaction behavior elsewhere, not handler order.
78
+ handler_names = [fn.__name__ for fn in model.hooks.token_inventory.HANDLER]
79
+ assert handler_names == ["token_inventory"]
@@ -0,0 +1,88 @@
1
+ from itertools import product
2
+
3
+ import pytest
4
+
5
+ from tigrbl import op_ctx
6
+ from tigrbl.mapping.op_mro_collect import mro_collect_decorated_ops
7
+ from tigrbl.types import BaseModel
8
+
9
+
10
+ class StatusSchema(BaseModel):
11
+ ok: bool
12
+
13
+
14
+ TARGET_VARIANTS = ("custom", "create", "read", "update", "delete", "list")
15
+ ARITY_VARIANTS = ("collection", "member")
16
+ RESPONSE_SCHEMA_VARIANTS = (None, StatusSchema)
17
+ PERSIST_VARIANTS = ("default", "append", "prepend", "override", "skip")
18
+
19
+
20
+ def _normalize_persist(persist: str) -> str:
21
+ if persist in {"none", "read", "skip"}:
22
+ return "skip"
23
+ if persist in {"write", "default", "persist"}:
24
+ return "default"
25
+ return persist
26
+
27
+
28
+ @pytest.mark.parametrize(
29
+ "target,arity,response_schema,persist",
30
+ list(
31
+ product(
32
+ TARGET_VARIANTS,
33
+ ARITY_VARIANTS,
34
+ RESPONSE_SCHEMA_VARIANTS,
35
+ PERSIST_VARIANTS,
36
+ )
37
+ ),
38
+ ids=lambda v: getattr(v, "__name__", str(v)),
39
+ )
40
+ def test_op_ctx_parameter_matrix(target, arity, response_schema, persist):
41
+ class MatrixModel:
42
+ @op_ctx(
43
+ alias="probe",
44
+ target=target,
45
+ arity=arity,
46
+ response_schema=response_schema,
47
+ persist=persist,
48
+ )
49
+ def probe(cls, ctx): # pragma: no cover - declaration-only test
50
+ return {"ok": True}
51
+
52
+ spec = mro_collect_decorated_ops(MatrixModel)[0]
53
+
54
+ assert spec.alias == "probe"
55
+ assert spec.target == target
56
+ assert spec.arity == arity
57
+ assert spec.response_model is response_schema
58
+ assert spec.persist == _normalize_persist(persist)
59
+
60
+
61
+ @pytest.mark.parametrize(
62
+ "target, response_schema, persist",
63
+ list(product(TARGET_VARIANTS, RESPONSE_SCHEMA_VARIANTS, PERSIST_VARIANTS)),
64
+ ids=lambda v: getattr(v, "__name__", str(v)),
65
+ )
66
+ def test_op_ctx_parameter_matrix_infers_arity_when_omitted(
67
+ target, response_schema, persist
68
+ ):
69
+ class MatrixModel:
70
+ @op_ctx(
71
+ alias="probe",
72
+ target=target,
73
+ response_schema=response_schema,
74
+ persist=persist,
75
+ )
76
+ def probe(cls, ctx): # pragma: no cover - declaration-only test
77
+ return {"ok": True}
78
+
79
+ spec = mro_collect_decorated_ops(MatrixModel)[0]
80
+
81
+ expected_arity = (
82
+ "collection" if target in {"custom", "create", "list"} else "member"
83
+ )
84
+ assert spec.alias == "probe"
85
+ assert spec.target == target
86
+ assert spec.arity == expected_arity
87
+ assert spec.response_model is response_schema
88
+ assert spec.persist == _normalize_persist(persist)
@@ -0,0 +1,127 @@
1
+ from __future__ import annotations
2
+
3
+ from httpx import ASGITransport, Client
4
+ from sqlalchemy import Column, String
5
+
6
+ from tigrbl import (
7
+ APIKey,
8
+ HTTPBearer,
9
+ MutualTLS,
10
+ OAuth2,
11
+ OpenIdConnect,
12
+ TigrblApp,
13
+ TigrblRouter,
14
+ )
15
+ from tigrbl._spec import OpSpec
16
+ from tigrbl.orm.mixins import GUIDPk
17
+ from tigrbl.orm.tables import TableBase
18
+ from tigrbl.shortcuts.engine import mem
19
+ from tigrbl.types import Security
20
+
21
+
22
+ def _bearer_dep(cred=Security(HTTPBearer(scheme_name="BearerAuth"))):
23
+ return cred
24
+
25
+
26
+ def _api_key_dep(cred=Security(APIKey(scheme_name="ApiKeyAuth", name="X-API-Key"))):
27
+ return cred
28
+
29
+
30
+ def _oauth2_dep(
31
+ cred=Security(
32
+ OAuth2(
33
+ scheme_name="OAuth2Auth",
34
+ flows={"clientCredentials": {"tokenUrl": "https://issuer.example/token"}},
35
+ )
36
+ ),
37
+ ):
38
+ return cred
39
+
40
+
41
+ def _openid_dep(
42
+ cred=Security(
43
+ OpenIdConnect(
44
+ scheme_name="OpenIdAuth",
45
+ openid_connect_url="https://issuer.example/.well-known/openid-configuration",
46
+ )
47
+ ),
48
+ ):
49
+ return cred
50
+
51
+
52
+ def _mtls_dep(cred=Security(MutualTLS(scheme_name="MutualTLSAuth"))):
53
+ return cred
54
+
55
+
56
+ class AppDocsTable(TableBase, GUIDPk):
57
+ __tablename__ = "app_docs_table_openapi"
58
+
59
+ name = Column(String, nullable=False)
60
+ __tigrbl_ops__ = (OpSpec(alias="read", target="read", secdeps=(_bearer_dep,)),)
61
+
62
+
63
+ class RouterDocsTable(TableBase, GUIDPk):
64
+ __tablename__ = "router_docs_table_openapi"
65
+
66
+ name = Column(String, nullable=False)
67
+ __tigrbl_ops__ = (OpSpec(alias="read", target="read", secdeps=(_api_key_dep,)),)
68
+
69
+
70
+ class TableDocsTable(TableBase, GUIDPk):
71
+ __tablename__ = "table_docs_table_openapi"
72
+
73
+ name = Column(String, nullable=False)
74
+ __tigrbl_ops__ = (
75
+ OpSpec(
76
+ alias="read",
77
+ target="read",
78
+ secdeps=(_oauth2_dep, _openid_dep, _mtls_dep),
79
+ ),
80
+ )
81
+
82
+
83
+ def test_openapi_docs_cover_app_router_table_and_all_security_schemes() -> None:
84
+ app = TigrblApp(engine=mem(async_=False))
85
+ app.include_table(AppDocsTable)
86
+
87
+ router = TigrblRouter(engine=mem(async_=False))
88
+ router.include_table(RouterDocsTable)
89
+ router.include_table(TableDocsTable)
90
+ app.include_router(router)
91
+
92
+ app.initialize()
93
+
94
+ transport = ASGITransport(app=app)
95
+ with Client(transport=transport, base_url="http://test") as client:
96
+ openapi = client.get("/openapi.json").json()
97
+
98
+ documented_security = [
99
+ security
100
+ for path_item in openapi["paths"].values()
101
+ for op in path_item.values()
102
+ if isinstance(op, dict)
103
+ for security in op.get("security", [])
104
+ ]
105
+
106
+ assert {"BearerAuth": []} in documented_security
107
+ assert {"ApiKeyAuth": []} in documented_security
108
+ assert {"OAuth2Auth": []} in documented_security
109
+ assert {"OpenIdAuth": []} in documented_security
110
+ assert {"MutualTLSAuth": []} in documented_security
111
+
112
+ security_schemes = openapi["components"].get("securitySchemes", {})
113
+ assert security_schemes == {
114
+ "BearerAuth": {"type": "http", "scheme": "bearer"},
115
+ "ApiKeyAuth": {"type": "apiKey", "name": "X-API-Key", "in": "header"},
116
+ "OAuth2Auth": {
117
+ "type": "oauth2",
118
+ "flows": {
119
+ "clientCredentials": {"tokenUrl": "https://issuer.example/token"}
120
+ },
121
+ },
122
+ "OpenIdAuth": {
123
+ "type": "openIdConnect",
124
+ "openIdConnectUrl": "https://issuer.example/.well-known/openid-configuration",
125
+ },
126
+ "MutualTLSAuth": {"type": "mutualTLS"},
127
+ }
@@ -0,0 +1,127 @@
1
+ from __future__ import annotations
2
+
3
+ from httpx import ASGITransport, Client
4
+ from sqlalchemy import Column, String
5
+
6
+ from tigrbl import (
7
+ APIKey,
8
+ HTTPBearer,
9
+ MutualTLS,
10
+ OAuth2,
11
+ OpenIdConnect,
12
+ TigrblApp,
13
+ TigrblRouter,
14
+ )
15
+ from tigrbl._spec import OpSpec
16
+ from tigrbl.orm.mixins import GUIDPk
17
+ from tigrbl.orm.tables import TableBase
18
+ from tigrbl.shortcuts.engine import mem
19
+ from tigrbl.types import Security
20
+
21
+
22
+ def _bearer_dep(cred=Security(HTTPBearer(scheme_name="BearerAuth"))):
23
+ return cred
24
+
25
+
26
+ def _api_key_dep(cred=Security(APIKey(scheme_name="ApiKeyAuth", name="X-API-Key"))):
27
+ return cred
28
+
29
+
30
+ def _oauth2_dep(
31
+ cred=Security(
32
+ OAuth2(
33
+ scheme_name="OAuth2Auth",
34
+ flows={"clientCredentials": {"tokenUrl": "https://issuer.example/token"}},
35
+ )
36
+ ),
37
+ ):
38
+ return cred
39
+
40
+
41
+ def _openid_dep(
42
+ cred=Security(
43
+ OpenIdConnect(
44
+ scheme_name="OpenIdAuth",
45
+ openid_connect_url="https://issuer.example/.well-known/openid-configuration",
46
+ )
47
+ ),
48
+ ):
49
+ return cred
50
+
51
+
52
+ def _mtls_dep(cred=Security(MutualTLS(scheme_name="MutualTLSAuth"))):
53
+ return cred
54
+
55
+
56
+ class AppDocsTable(TableBase, GUIDPk):
57
+ __tablename__ = "app_docs_table_openrpc"
58
+
59
+ name = Column(String, nullable=False)
60
+ __tigrbl_ops__ = (OpSpec(alias="read", target="read", secdeps=(_bearer_dep,)),)
61
+
62
+
63
+ class RouterDocsTable(TableBase, GUIDPk):
64
+ __tablename__ = "router_docs_table_openrpc"
65
+
66
+ name = Column(String, nullable=False)
67
+ __tigrbl_ops__ = (OpSpec(alias="read", target="read", secdeps=(_api_key_dep,)),)
68
+
69
+
70
+ class TableDocsTable(TableBase, GUIDPk):
71
+ __tablename__ = "table_docs_table_openrpc"
72
+
73
+ name = Column(String, nullable=False)
74
+ __tigrbl_ops__ = (
75
+ OpSpec(
76
+ alias="read",
77
+ target="read",
78
+ secdeps=(_oauth2_dep, _openid_dep, _mtls_dep),
79
+ ),
80
+ )
81
+
82
+
83
+ def test_openrpc_docs_cover_app_router_table_and_all_security_schemes() -> None:
84
+ app = TigrblApp(engine=mem(async_=False))
85
+ app.include_table(AppDocsTable)
86
+
87
+ router = TigrblRouter(engine=mem(async_=False))
88
+ router.include_table(RouterDocsTable)
89
+ router.include_table(TableDocsTable)
90
+ app.include_router(router)
91
+
92
+ app.initialize()
93
+ app.mount_jsonrpc()
94
+ app.mount_openrpc()
95
+
96
+ transport = ASGITransport(app=app)
97
+ with Client(transport=transport, base_url="http://test") as client:
98
+ openrpc = client.get("/openrpc.json").json()
99
+
100
+ method_map = {method["name"]: method for method in openrpc["methods"]}
101
+ assert "AppDocsTable.read" in method_map
102
+ assert "RouterDocsTable.read" in method_map
103
+ assert "TableDocsTable.read" in method_map
104
+
105
+ assert method_map["AppDocsTable.read"]["security"] == [{"BearerAuth": []}]
106
+ assert method_map["RouterDocsTable.read"]["security"] == [{"ApiKeyAuth": []}]
107
+ assert method_map["TableDocsTable.read"]["security"] == [
108
+ {"OAuth2Auth": []},
109
+ {"OpenIdAuth": []},
110
+ {"MutualTLSAuth": []},
111
+ ]
112
+
113
+ assert openrpc["components"]["securitySchemes"] == {
114
+ "BearerAuth": {"type": "http", "scheme": "bearer"},
115
+ "ApiKeyAuth": {"type": "apiKey", "name": "X-API-Key", "in": "header"},
116
+ "OAuth2Auth": {
117
+ "type": "oauth2",
118
+ "flows": {
119
+ "clientCredentials": {"tokenUrl": "https://issuer.example/token"}
120
+ },
121
+ },
122
+ "OpenIdAuth": {
123
+ "type": "openIdConnect",
124
+ "openIdConnectUrl": "https://issuer.example/.well-known/openid-configuration",
125
+ },
126
+ "MutualTLSAuth": {"type": "mutualTLS"},
127
+ }