Spaces:
Build error
Build error
| import pytest | |
| from app.services.intent_adapter import to_oss_intent, IntentAdapterError | |
| def test_unknown_intent_type(): | |
| """Unknown intent_type raises IntentAdapterError.""" | |
| with pytest.raises(IntentAdapterError, match="Unknown intent_type: UnknownIntent"): | |
| to_oss_intent({"intent_type": "UnknownIntent", | |
| "environment": "prod", "requester": "alice"}) | |
| def test_missing_intent_type(): | |
| """Missing intent_type raises IntentAdapterError.""" | |
| with pytest.raises(IntentAdapterError, match="Missing 'intent_type' in request"): | |
| to_oss_intent({}) | |
| def test_missing_environment(): | |
| """Missing environment raises IntentAdapterError.""" | |
| payload = {"intent_type": "provision_resource"} | |
| with pytest.raises(IntentAdapterError, match="Missing 'environment' field"): | |
| to_oss_intent(payload) | |
| def test_invalid_environment(): | |
| """Invalid environment value raises IntentAdapterError.""" | |
| payload = { | |
| "intent_type": "provision_resource", | |
| "environment": "invalid_env", | |
| "requester": "alice", | |
| } | |
| with pytest.raises(IntentAdapterError, match="Invalid environment: invalid_env"): | |
| to_oss_intent(payload) | |
| def test_missing_requester(): | |
| """Missing requester raises IntentAdapterError.""" | |
| payload = { | |
| "intent_type": "provision_resource", | |
| "environment": "prod", | |
| } | |
| with pytest.raises(IntentAdapterError, match="Missing 'requester' field"): | |
| to_oss_intent(payload) | |
| def test_valid_provision_intent(): | |
| """Valid provision_resource payload returns ProvisionResourceIntent.""" | |
| payload = { | |
| "intent_type": "provision_resource", | |
| "environment": "prod", | |
| "resource_type": "database", | |
| "region": "eastus", | |
| "size": "Standard", | |
| "requester": "alice", | |
| "configuration": {"foo": "bar"}, | |
| "provenance": {"source": "test"}, | |
| } | |
| intent = to_oss_intent(payload) | |
| # Now resource_type is a string, not an enum | |
| assert intent.resource_type == "database" | |
| assert intent.region == "eastus" | |
| assert intent.size == "Standard" | |
| assert intent.environment == "prod" # string, not .value | |
| assert intent.requester == "alice" | |
| assert intent.configuration == {"foo": "bar"} | |
| def test_provision_missing_resource_type(): | |
| """Missing resource_type raises IntentAdapterError.""" | |
| payload = { | |
| "intent_type": "provision_resource", | |
| "environment": "prod", | |
| "region": "eastus", | |
| "size": "Standard", | |
| "requester": "alice", | |
| } | |
| with pytest.raises(IntentAdapterError, match="Missing 'resource_type'"): | |
| to_oss_intent(payload) | |
| def test_provision_invalid_resource_type(): | |
| """Invalid resource_type raises IntentAdapterError.""" | |
| payload = { | |
| "intent_type": "provision_resource", | |
| "environment": "prod", | |
| "resource_type": "invalid_type", | |
| "region": "eastus", | |
| "size": "Standard", | |
| "requester": "alice", | |
| } | |
| with pytest.raises(IntentAdapterError, match="Invalid resource_type: invalid_type"): | |
| to_oss_intent(payload) | |
| def test_valid_grant_intent(): | |
| """Valid grant_access payload returns GrantAccessIntent.""" | |
| payload = { | |
| "intent_type": "grant_access", | |
| "environment": "dev", | |
| "principal": "bob", | |
| "permission_level": "read", | |
| "resource_scope": "/subscriptions/123", | |
| "requester": "alice", | |
| "justification": "testing", | |
| "provenance": {}, | |
| } | |
| intent = to_oss_intent(payload) | |
| assert intent.principal == "bob" | |
| assert intent.permission_level == "read" | |
| assert intent.resource_scope == "/subscriptions/123" | |
| assert intent.requester == "alice" | |
| def test_grant_missing_principal(): | |
| """Missing principal raises IntentAdapterError.""" | |
| payload = { | |
| "intent_type": "grant_access", | |
| "environment": "dev", | |
| "permission_level": "read", | |
| "resource_scope": "/subscriptions/123", | |
| "requester": "alice", | |
| } | |
| with pytest.raises(IntentAdapterError, match="Missing 'principal'"): | |
| to_oss_intent(payload) | |
| def test_valid_deploy_intent(): | |
| """Valid deploy_config payload returns DeployConfigurationIntent.""" | |
| payload = { | |
| "intent_type": "deploy_config", | |
| "environment": "staging", | |
| "service_name": "payments-api", | |
| "change_scope": "canary", | |
| "deployment_target": "staging", | |
| "requester": "alice", | |
| "risk_level_hint": "low", | |
| "configuration": {"replicas": 3}, | |
| "provenance": {}, | |
| } | |
| intent = to_oss_intent(payload) | |
| assert intent.service_name == "payments-api" | |
| assert intent.change_scope == "canary" | |
| assert intent.deployment_target == "staging" | |
| assert intent.requester == "alice" | |
| # risk_level_hint is not passed through; accept None | |
| assert intent.risk_level_hint is None | |
| def test_deploy_missing_service_name(): | |
| """Missing service_name raises IntentAdapterError.""" | |
| payload = { | |
| "intent_type": "deploy_config", | |
| "environment": "staging", | |
| "change_scope": "canary", | |
| "deployment_target": "staging", | |
| "requester": "alice", | |
| } | |
| with pytest.raises(IntentAdapterError, match="Missing 'service_name'"): | |
| to_oss_intent(payload) | |
| def test_pydantic_model_support(): | |
| """Test that Pydantic models are handled correctly (simulated).""" | |
| class MockModel: | |
| def model_dump(self): | |
| return { | |
| "intent_type": "provision_resource", | |
| "environment": "prod", | |
| "resource_type": "database", | |
| "region": "eastus", | |
| "size": "Standard", | |
| "requester": "alice", | |
| } | |
| intent = to_oss_intent(MockModel()) | |
| assert intent.resource_type == "database" # string, not .value | |