qonto-assistant/tests
tegwick 1f0f979e36 QONTO-WP-0004-T04: live flex-auth + tenant-engine authorization gate
Replaces the config-only QONTO_ASSISTANT_ENFORCE_SCOPE cached-claim
check with two live-checked facts, per docs/SecurityPractice.md #4:

1. flex-auth POST /v1/check on finance.qonto.read for the calling
   actor/tenant (FlexAuthCheckClient, modeled on tenant-engine's own
   client for the same API). Registration lives in the flex-auth repo
   (examples/qonto-assistant/) -- rules + embedded tests verified with
   flex-auth test-policy/load-registry/check, and a live flex-auth
   serve hit by this exact client over real HTTP (not a mock).
2. tenant-engine's live capability-role lookup
   (GET /tenants/{id}/roles/live), denying unless the tenant currently
   holds one of QONTO_TENANT_ENGINE_REQUIRED_ROLES (default VEN,CUS) --
   optional and additive to the flex-auth check.

Both clients fail closed by construction (unreachable/malformed/non-2xx
all deny, never grant), matching FlexAuthCheckClient's existing
fail-closed philosophy elsewhere in the fleet. LiveAuthorizationGate
combines both and is wired into CapabilityService._execute ahead of
the internal policy kernel; off by default (no QONTO_FLEX_AUTH_URL
set) so existing deployments are unaffected until configured.

Verified beyond mocked unit tests: ran a real `flex-auth serve` loaded
with the registered policy, and a real tenant-engine instance seeded
with a VEN grant for tenant:friendly:binky, and exercised this repo's
actual FlexAuthCheckClient/TenantEngineClient/LiveAuthorizationGate
against both live processes over real HTTP -- allow for the correct
tenant, live_authz_denied for a mismatched tenant.

28 new unit tests (flex_auth_client, tenant_engine_client,
live_authorization_gate + CapabilityService integration). Full suite
-> 80 passed; REST/MCP smokes and compileall still clean.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:19:04 +02:00
..
fixtures/qonto Complete Phase 1: policy kernel, REST service, and local smoke tooling 2026-07-22 21:21:05 +02:00
test_api.py QONTO-WP-0004-T04: live flex-auth + tenant-engine authorization gate 2026-07-24 00:19:04 +02:00
test_audit.py Complete Phase 1: policy kernel, REST service, and local smoke tooling 2026-07-22 21:21:05 +02:00
test_audit_parity.py QONTO-WP-0003-T05: pin REST/MCP audit-schema parity with a test 2026-07-23 11:01:16 +02:00
test_deny_escalation.py Add SecurityPractice.md, Security Genome record, and deny-escalation lockout 2026-07-23 22:59:06 +02:00
test_fixture_client.py Complete Phase 1: policy kernel, REST service, and local smoke tooling 2026-07-22 21:21:05 +02:00
test_flex_auth_client.py QONTO-WP-0004-T04: live flex-auth + tenant-engine authorization gate 2026-07-24 00:19:04 +02:00
test_key_cape_auth.py QONTO-WP-0004-T04: live flex-auth + tenant-engine authorization gate 2026-07-24 00:19:04 +02:00
test_live_authorization_gate.py QONTO-WP-0004-T04: live flex-auth + tenant-engine authorization gate 2026-07-24 00:19:04 +02:00
test_mcp_auth.py QONTO-WP-0003-T03: MCP client auth + shared multi-harness config snippet 2026-07-23 09:41:25 +02:00
test_mcp_server.py QONTO-WP-0003-T02: MCP tool catalog on the shared capability core 2026-07-22 21:48:09 +02:00
test_policy.py QONTO-WP-0003-T01: MCP adapter skeleton on shared capability core 2026-07-22 21:41:24 +02:00
test_qonto_client.py Complete Phase 1: policy kernel, REST service, and local smoke tooling 2026-07-22 21:21:05 +02:00
test_snapshot_semantics.py Complete Phase 1: policy kernel, REST service, and local smoke tooling 2026-07-22 21:21:05 +02:00
test_tenant_engine_client.py QONTO-WP-0004-T04: live flex-auth + tenant-engine authorization gate 2026-07-24 00:19:04 +02:00