| 1 | from __future__ import annotations |
| 2 | |
| 3 | from datetime import datetime, timezone |
| 4 | from uuid import UUID |
| 5 | |
| 6 | from app.research_readiness import ProviderFallbackPolicy, ResearchRequirementStatus |
| 7 | |
| 8 | |
| 9 | INSTRUMENT_ID = UUID("11111111-1111-4111-8111-111111111111") |
| 10 | |
| 11 | |
| 12 | def test_fallback_policy_issues_narrow_serializable_mcp_authorization() -> None: |
| 13 | issued_at = datetime(2026, 9, 11, 10, 0, tzinfo=timezone.utc) |
| 14 | authorization = ProviderFallbackPolicy().authorize_external_tool( |
| 15 | global_instrument_id=INSTRUMENT_ID, |
| 16 | requirement_id="CURRENT_NEWS", |
| 17 | status=ResearchRequirementStatus.MISSING, |
| 18 | confidence=None, |
| 19 | permitted_provider_ids=("FUTURE_INDIA_MCP",), |
| 20 | now=issued_at, |
| 21 | ) |
| 22 | |
| 23 | assert authorization is not None |
| 24 | assert authorization.as_gateway_payload() == { |
| 25 | "authorized": True, |
| 26 | "issuedBy": "ProviderFallbackPolicy", |
| 27 | "globalInstrumentId": str(INSTRUMENT_ID), |
| 28 | "requirementId": "CURRENT_NEWS", |
| 29 | "permittedProviderIds": ["FUTURE_INDIA_MCP"], |
| 30 | "issuedAt": issued_at.isoformat(), |
| 31 | } |
| 32 | |
| 33 | |
| 34 | def test_fallback_policy_does_not_authorize_ready_high_confidence_requirement() -> None: |
| 35 | authorization = ProviderFallbackPolicy().authorize_external_tool( |
| 36 | global_instrument_id=INSTRUMENT_ID, |
| 37 | requirement_id="CURRENT_NEWS", |
| 38 | status=ResearchRequirementStatus.READY_FRESH, |
| 39 | confidence=0.99, |
| 40 | permitted_provider_ids=("FUTURE_INDIA_MCP",), |
| 41 | ) |
| 42 | |
| 43 | assert authorization is None |