tigrbl_tests 0.3.10.dev2__tar.gz → 0.3.11.dev3__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.
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/PKG-INFO +1 -1
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/pyproject.toml +1 -1
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_hook_lifecycle.py +2 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/request/test_request_asgi_scope_compat.py +2 -0
- tigrbl_tests-0.3.11.dev3/tests/request/test_request_authn_strip.py +33 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/request/test_request_transport_convenience_dot_notation.py +17 -0
- tigrbl_tests-0.3.11.dev3/tests/response/test_response_transport_convenience_dot_notation.py +50 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_jsonrpc_openrpc.py +17 -0
- tigrbl_tests-0.3.11.dev3/tests/unit/test_rest_request_mapping_access.py +99 -0
- tigrbl_tests-0.3.10.dev2/tests/response/test_response_transport_convenience_dot_notation.py +0 -27
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/LICENSE +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/README.md +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/__init__.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/conftest.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/hooks/test_hook_ctx_phase_validation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/__init__.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_acronym_route_name.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_allow_anon.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_apikey_generation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_authn_provider_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_bindings_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_bindings_modules.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_bulk_docs_client.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_core_access.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_engine_install_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_engine_resolver_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_error_mappings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_field_spec_effects.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_header_io_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_healthz_methodz_hookz.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_hook_ctx_v3_i9n.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_iospec_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_iospec_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_jsonrpc_batch_behavior.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_key_digest_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_list_filters_optional.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mixins.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_favicon_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_lens_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_openapi_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_openrpc_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_swagger_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_nested_path_schema_and_rpc.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_nested_routing_depth.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_op_ctx_alias_examples.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_op_ctx_behavior.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_op_ctx_core_crud_order.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_openapi_clear_response_schema.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_openapi_schema_examples_presence.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_opspec_effects_i9n_test.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_owner_tenant_policy.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_request_extras.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_request_extras_provider.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_response_extras_provider.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_rest_fallback_serialization.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_rest_row_serialization.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_rest_rpc_parity_v3.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_row_result_serialization.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_schema.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_schema_ctx_attributes_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_schema_ctx_op_ctx_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_schema_ctx_spec_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_sqlite_attachments.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_storage_spec_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_symmetry_parity.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_api_app_usage_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_api_usage_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_api_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_app_include_api_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_app_multi_api_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_app_usage_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_app_uvicorn.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_v3_bulk_rest_endpoints.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_v3_default_rest_ops.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_v3_default_rpc_ops.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_v3_opspec_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_verb_alias_policy.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/uvicorn_utils.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/mount/__init__.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/mount/test_mount_favico.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/parity/__init__.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/parity/test_stdapi_openapi_docs.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/parity/test_stdapi_primitives.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/parity/test_stdapi_routing.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/perf/__init__.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/perf/test_collect_caching.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/perf/test_hookz_performance.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/perf/test_methodz_performance.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/request/test_request_dot_notation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/request/test_request_response_conveniences.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/requests/test_request_json_modes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/response/test_response_dot_notation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/security/test_dot_notation_schemes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/security/test_schemes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/__init__.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_alias_ctx_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_engine_ctx_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_hook_ctx_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_op_alias_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_op_ctx_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_response_ctx_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_schema_ctx_bindings.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/response_utils.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_emit_paired_post.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_emit_paired_pre.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_emit_readtime_alias.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_out_masking.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_refresh_demand.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_resolve_assemble.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_resolve_paired_gen.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_schema_collect_in.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_schema_collect_out.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_storage_to_stored.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_wire_build_in.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_wire_build_out.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_wire_dump.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_wire_validate_in.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/test_events_phases.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_acol_vcol_knobs.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_alias_ctx_op_alias_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_alias_ctx_op_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_api_level_set_auth.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_app_model_defaults.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_app_reexport.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_base_columnspec_inheritance.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_base_facade_initialize.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_build_list_params_spec_model.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_bulk_body_annotation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_bulk_response_schema.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_colspec_map_isolation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_column_collect_mixins.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_column_rest_rpc_results.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_column_table_orm_binding.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_config_dataclass_none.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_core_crud_bulk_ops.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_core_crud_default_ops.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_core_crud_methods.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_core_wrap_memoization.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_db_dependency.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_decorator_and_collect.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_default_tags.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_engine_install_api.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_engine_install_app.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_engine_install_op.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_engine_install_table.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_engine_spec_and_shortcuts.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_engine_usage_levels.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_field_spec_attrs.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_file_response.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_get_schema.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_handler_step_qualname.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_hook_ctx_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_hook_ctx_binding.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_hookz_empty_phase.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_hybrid_session_run_sync.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_in_tx.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_include_model_columns_namespace.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_include_models_base_prefix.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_initialize_async_task.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_initialize_cross_ddl.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_initialize_mixed_engines.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_initialize_task_schedule.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_io_spec_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_iospec_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_iospec_effects.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_jsonrpc_id_example.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_jsonrpc_router_default_tag.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_kernel_invoke_ctx.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_kernel_opview_on_demand.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_kernel_plan_labels.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_kernelz_endpoint.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_make_column_shortcuts.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_middleware_http_and_cors.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_mixins_sqlalchemy.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_alias.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_class_engine_binding.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_ctx_arity_paths.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_ctx_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_ctx_core_crud_integration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_ctx_dynamic_attach.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_op_ctx_persist_options.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_openapi_openrpc_schema_separation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_opspec_effects.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_postgres_engine_errors.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_postgres_env_vars.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_relationship_alias_cols.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_request_body_schema.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_request_response_examples.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_resolver_interning_warmup.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_resolver_precedence.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_alias_table_rpc.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_ctx_precedence.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_diagnostics_kernelz.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_html_jinja_behavior.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_parity.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_rest.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_rpc.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_template.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_response_uuid.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_all_default_op_verbs.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_bulk_delete_suppresses_clear.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_no_schema_jsonable.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_operation_id_uniqueness.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_rpc_parity_default_ops.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_rpc_prefixes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rest_rpc_symmetry.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_router_compatibility_shims.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rpc_all_default_op_verbs.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_rpc_default_ops.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_schema_ctx_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_schema_ctx_plain_class.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_schema_spec_presence.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_schemas_binding.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_security_per_route.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_should_wire_canonical.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_api.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_app.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_column.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_engine.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_field.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_hook.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_io.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_op.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_storage.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_spec_table.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sqlite_attachments.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sqlite_uuid_type.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_stdapi_request_injection.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_stdapi_transport_asgi_wsgi.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_storage_spec_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sys_handler_crud.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sys_run_rollback.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sys_tx_async_begin.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sys_tx_begin.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_sys_tx_commit.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_system_docs_builders.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_table_base_exports.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_table_collect_spec.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_table_columns_namespace.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_table_namespace_init.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_table_namespace_isolation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_api_app_configuration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_api_app_instantiation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_api_app_subclass_definition.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_api_configuration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_api_instantiation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_api_subclass_definition.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_app_configuration.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_app_event_handlers.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_app_instantiation.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_app_state.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_tigrbl_app_subclass_definition.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_v3_favicon_endpoint.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_v3_healthz_endpoint.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_v3_op_alias.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_v3_op_ctx_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_v3_schemas_and_decorators.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_v3_storage_spec_attributes.py +0 -0
- {tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_verbosity.py +0 -0
|
@@ -98,6 +98,7 @@ async def test_hook_phases_execution_order(db_mode):
|
|
|
98
98
|
res = await client.post(
|
|
99
99
|
"/rpc",
|
|
100
100
|
json={
|
|
101
|
+
"id": "hook-order-check",
|
|
101
102
|
"method": "Item.create",
|
|
102
103
|
"params": {"tenant_id": tid, "name": "test-item"},
|
|
103
104
|
},
|
|
@@ -163,6 +164,7 @@ async def test_hook_parity_crud_vs_rpc(db_mode):
|
|
|
163
164
|
await client.post(
|
|
164
165
|
"/rpc",
|
|
165
166
|
json={
|
|
167
|
+
"id": "hook-parity-check",
|
|
166
168
|
"method": "Item.create",
|
|
167
169
|
"params": {"tenant_id": tid, "name": "rpc-item"},
|
|
168
170
|
},
|
|
@@ -26,6 +26,8 @@ def test_request_accepts_scope_with_receive_kwarg_for_compatibility() -> None:
|
|
|
26
26
|
assert request.query == {"a": ["1", "2"], "b": ["3"]}
|
|
27
27
|
assert request.path_params == {"tenant_id": "abc"}
|
|
28
28
|
assert request.headers.authorization == "Bearer test-token"
|
|
29
|
+
assert request.headers.get("Authorization") == "Bearer test-token"
|
|
30
|
+
assert request.headers.get("authorization") == "Bearer test-token"
|
|
29
31
|
assert request.bearer_token == "test-token"
|
|
30
32
|
assert request.client.ip == "198.51.100.77"
|
|
31
33
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tigrbl.requests import Request
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def _make_request(*, headers: dict[str, str]) -> Request:
|
|
7
|
+
return Request(
|
|
8
|
+
method="GET",
|
|
9
|
+
path="/authn",
|
|
10
|
+
headers=headers,
|
|
11
|
+
query={},
|
|
12
|
+
path_params={},
|
|
13
|
+
body=b"",
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def test_request_admin_key_is_stripped() -> None:
|
|
18
|
+
request = _make_request(headers={"X-Admin-Key": " admin-secret "})
|
|
19
|
+
|
|
20
|
+
assert request.admin_key == "admin-secret"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_request_bearer_session_token_is_stripped() -> None:
|
|
24
|
+
request = _make_request(headers={"Authorization": "Bearer public-token "})
|
|
25
|
+
|
|
26
|
+
assert request.bearer_token == "public-token"
|
|
27
|
+
assert request.session_token == "public-token"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_request_cookie_session_token_is_stripped() -> None:
|
|
31
|
+
request = _make_request(headers={"Cookie": "sid= session-cookie-token "})
|
|
32
|
+
|
|
33
|
+
assert request.session_token == "session-cookie-token"
|
|
@@ -32,6 +32,23 @@ def test_request_headers_and_cookies_support_nested_dot_notation_access() -> Non
|
|
|
32
32
|
assert request.headers.cookie.tenant == "acme"
|
|
33
33
|
|
|
34
34
|
|
|
35
|
+
def test_request_cookie_header_supports_many_cookies_with_terse_getters() -> None:
|
|
36
|
+
request = _make_request(
|
|
37
|
+
headers={
|
|
38
|
+
"Cookie": "sid=session-token; tenant=acme; theme=dark; mode=compact",
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
assert request.headers.get("cookie", "")
|
|
43
|
+
assert request.headers.cookie.sid == "session-token"
|
|
44
|
+
assert request.headers.cookie.tenant == "acme"
|
|
45
|
+
assert request.headers.cookie.theme == "dark"
|
|
46
|
+
assert request.cookies.get("sid") == "session-token"
|
|
47
|
+
assert request.cookies.get("tenant") == "acme"
|
|
48
|
+
assert request.cookies.get("theme") == "dark"
|
|
49
|
+
assert request.cookies.get("mode") == "compact"
|
|
50
|
+
|
|
51
|
+
|
|
35
52
|
@pytest.mark.asyncio()
|
|
36
53
|
async def test_request_exposes_json_and_dot_notation_bearer_conveniences() -> None:
|
|
37
54
|
request = _make_request(
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from tigrbl.responses import Response
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_response_supports_instance_json_method_for_body_payload() -> None:
|
|
7
|
+
response = Response(
|
|
8
|
+
status_code=200,
|
|
9
|
+
headers=[("content-type", "application/json; charset=utf-8")],
|
|
10
|
+
body=b'{"ok":true,"count":1}',
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
assert response.json() == {"ok": True, "count": 1}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_response_headers_and_cookies_support_dot_notation() -> None:
|
|
17
|
+
response = Response(
|
|
18
|
+
status_code=200,
|
|
19
|
+
headers=[
|
|
20
|
+
("x-request-id", "req-123"),
|
|
21
|
+
("set-cookie", "sid=session-token; Path=/"),
|
|
22
|
+
],
|
|
23
|
+
body=b"",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
assert response.headers_map.x_request_id == "req-123"
|
|
27
|
+
assert response.headers.get("x-request-id") == "req-123"
|
|
28
|
+
assert "sid" in response.headers.get("set-cookie", "")
|
|
29
|
+
assert response.cookies.sid == "session-token"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_response_set_cookie_supports_many_cookies_and_terse_reads() -> None:
|
|
33
|
+
response = Response(status_code=200, headers=[], body=b"")
|
|
34
|
+
|
|
35
|
+
response.set_cookie("sid", "session-token", path="/")
|
|
36
|
+
response.set_cookie("tenant", "acme", path="/")
|
|
37
|
+
response.set_cookie("theme", "dark", path="/")
|
|
38
|
+
|
|
39
|
+
set_cookie_header = response.headers.get("set-cookie", "")
|
|
40
|
+
assert "sid=session-token" in set_cookie_header
|
|
41
|
+
assert "tenant=acme" in set_cookie_header
|
|
42
|
+
assert "theme=dark" in set_cookie_header
|
|
43
|
+
assert "session-token" in set_cookie_header.get("sid", "")
|
|
44
|
+
assert "acme" in set_cookie_header.get("tenant", "")
|
|
45
|
+
assert "dark" in set_cookie_header.get("theme", "")
|
|
46
|
+
assert set_cookie_header.get("missing") is None
|
|
47
|
+
|
|
48
|
+
assert response.cookies.sid == "session-token"
|
|
49
|
+
assert response.cookies.tenant == "acme"
|
|
50
|
+
assert response.cookies.theme == "dark"
|
|
@@ -92,6 +92,23 @@ def test_jsonrpc_create_accepts_nested_params_mapping() -> None:
|
|
|
92
92
|
assert data["result"]["name"] == "New Widget"
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
def test_jsonrpc_notification_without_id_returns_no_content() -> None:
|
|
96
|
+
app, model = _build_app()
|
|
97
|
+
transport = ASGITransport(app=app)
|
|
98
|
+
|
|
99
|
+
request_payload = {
|
|
100
|
+
"jsonrpc": "2.0",
|
|
101
|
+
"method": f"{model.__name__}.create",
|
|
102
|
+
"params": {"name": "Silent Widget"},
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
with Client(transport=transport, base_url="http://test") as client:
|
|
106
|
+
response = client.post("/rpc", json=request_payload)
|
|
107
|
+
|
|
108
|
+
assert response.status_code == 204
|
|
109
|
+
assert response.content == b""
|
|
110
|
+
|
|
111
|
+
|
|
95
112
|
def test_mount_lens_uses_latest_openrpc_path_by_default() -> None:
|
|
96
113
|
app, _ = _build_app()
|
|
97
114
|
app.mount_openrpc(path="/schema/openrpc.json")
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from collections.abc import Mapping
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from tigrbl.requests import Request
|
|
8
|
+
from tigrbl.responses import Response
|
|
9
|
+
|
|
10
|
+
ADMIN_KEY = "admin-secret"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _json_mapping(response: Response) -> Mapping[str, Any]:
|
|
14
|
+
payload = response.json()
|
|
15
|
+
if not isinstance(payload, Mapping):
|
|
16
|
+
raise TypeError("Expected a mapping JSON payload")
|
|
17
|
+
if isinstance(payload.get("result"), Mapping):
|
|
18
|
+
return payload["result"]
|
|
19
|
+
if isinstance(payload.get("data"), Mapping):
|
|
20
|
+
return payload["data"]
|
|
21
|
+
return payload
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _rest_request(
|
|
25
|
+
method: str,
|
|
26
|
+
path: str,
|
|
27
|
+
payload: dict[str, Any],
|
|
28
|
+
response_payload: Mapping[str, Any],
|
|
29
|
+
) -> tuple[Request, Response, Mapping[str, Any]]:
|
|
30
|
+
request = Request(
|
|
31
|
+
method=method,
|
|
32
|
+
path=path,
|
|
33
|
+
headers={"x-admin-key": ADMIN_KEY, "content-type": "application/json"},
|
|
34
|
+
query={},
|
|
35
|
+
path_params={},
|
|
36
|
+
body=json.dumps(payload).encode("utf-8"),
|
|
37
|
+
)
|
|
38
|
+
response = Response.json(response_payload)
|
|
39
|
+
return request, response, _json_mapping(response)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_rest_request_supports_mapping_access_on_result_payload() -> None:
|
|
43
|
+
request, response, result = _rest_request(
|
|
44
|
+
"POST",
|
|
45
|
+
"/users",
|
|
46
|
+
{"email": "a@b.com"},
|
|
47
|
+
{"ok": True, "result": {"id": "u-1", "email": "a@b.com"}},
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
assert request.headers.get("x-admin-key") == ADMIN_KEY
|
|
51
|
+
assert request.json()["email"] == "a@b.com"
|
|
52
|
+
assert response.status_code == 200
|
|
53
|
+
assert isinstance(result, Mapping)
|
|
54
|
+
assert result["id"] == "u-1"
|
|
55
|
+
assert result.get("email") == "a@b.com"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_rest_request_supports_mapping_access_on_data_payload() -> None:
|
|
59
|
+
request, _, data = _rest_request(
|
|
60
|
+
"POST",
|
|
61
|
+
"/users",
|
|
62
|
+
{"email": "e@f.com"},
|
|
63
|
+
{"ok": True, "data": {"id": "u-3", "email": "e@f.com"}},
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
assert request.headers.get("x-admin-key") == ADMIN_KEY
|
|
67
|
+
assert request.json().get("email") == "e@f.com"
|
|
68
|
+
assert isinstance(data, Mapping)
|
|
69
|
+
assert data["id"] == "u-3"
|
|
70
|
+
assert data.get("email") == "e@f.com"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_rest_request_supports_mapping_access_without_result_envelope() -> None:
|
|
74
|
+
request, _, data = _rest_request(
|
|
75
|
+
"GET",
|
|
76
|
+
"/users/u-2",
|
|
77
|
+
{},
|
|
78
|
+
{"id": "u-2", "email": "c@d.com"},
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
assert request.headers.get("x-admin-key") == ADMIN_KEY
|
|
82
|
+
assert isinstance(data, Mapping)
|
|
83
|
+
assert data["id"] == "u-2"
|
|
84
|
+
assert data.get("email") == "c@d.com"
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def test_response_json_is_mapping_and_supports_data_and_result_access() -> None:
|
|
88
|
+
response = Response.json(
|
|
89
|
+
{
|
|
90
|
+
"ok": True,
|
|
91
|
+
"data": {"id": "d-1", "name": "data-object"},
|
|
92
|
+
"result": {"id": "r-1", "name": "result-object"},
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
payload = response.json()
|
|
97
|
+
assert isinstance(payload, Mapping)
|
|
98
|
+
assert payload["data"]["id"] == "d-1"
|
|
99
|
+
assert payload["result"]["id"] == "r-1"
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
from tigrbl.responses import Response
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def test_response_supports_instance_json_method_for_body_payload() -> None:
|
|
7
|
-
response = Response(
|
|
8
|
-
status_code=200,
|
|
9
|
-
headers=[("content-type", "application/json; charset=utf-8")],
|
|
10
|
-
body=b'{"ok":true,"count":1}',
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
assert response.json() == {"ok": True, "count": 1}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def test_response_headers_and_cookies_support_dot_notation() -> None:
|
|
17
|
-
response = Response(
|
|
18
|
-
status_code=200,
|
|
19
|
-
headers=[
|
|
20
|
-
("x-request-id", "req-123"),
|
|
21
|
-
("set-cookie", "sid=session-token; Path=/"),
|
|
22
|
-
],
|
|
23
|
-
body=b"",
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
assert response.headers_map.x_request_id == "req-123"
|
|
27
|
-
assert response.cookies.sid == "session-token"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/hooks/test_hook_ctx_phase_validation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_authn_provider_integration.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_bindings_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_engine_install_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_engine_resolver_uvicorn.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_healthz_methodz_hookz.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_jsonrpc_batch_behavior.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_list_filters_optional.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_favicon_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_lens_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_openapi_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_openrpc_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_mountable_swagger_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_nested_path_schema_and_rpc.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_nested_routing_depth.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_op_ctx_alias_examples.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_op_ctx_core_crud_order.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_opspec_effects_i9n_test.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_request_extras_provider.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_response_extras_provider.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_rest_fallback_serialization.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_rest_row_serialization.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_row_result_serialization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_schema_ctx_spec_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_storage_spec_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_api_app_usage_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_api_usage_uvicorn.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_app_multi_api_uvicorn.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_tigrbl_app_usage_uvicorn.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_v3_bulk_rest_endpoints.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/i9n/test_v3_opspec_attributes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/parity/test_stdapi_openapi_docs.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/parity/test_stdapi_primitives.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/perf/test_methodz_performance.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/request/test_request_dot_notation.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/requests/test_request_json_modes.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/response/test_response_dot_notation.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/security/test_dot_notation_schemes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/decorators/test_op_ctx_bindings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_out_masking.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_wire_build_in.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/atoms/test_wire_dump.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/runtime/test_events_phases.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_alias_ctx_op_attributes.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_base_columnspec_inheritance.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_base_facade_initialize.py
RENAMED
|
File without changes
|
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_bulk_body_annotation.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_bulk_response_schema.py
RENAMED
|
File without changes
|
{tigrbl_tests-0.3.10.dev2 → tigrbl_tests-0.3.11.dev3}/tests/unit/test_colspec_map_isolation.py
RENAMED
|
File without changes
|