"""
Tests for Schema validation - Task 5.2

Tests for ImageGenerationRequest schema validation to ensure:
1. Accepts valid composite IDs (provider/model_key)
2. Rejects invalid formats
3. Does not accept separate provider parameter
"""

import pytest
from pydantic import ValidationError
from src.models.schemas import ImageGenerationRequest
from src.utils.errors import InvalidParameterException


class TestImageGenerationRequestSchemaValidation:
    """Test ImageGenerationRequest schema validation for composite ID format"""
    
    def test_accepts_valid_composite_id(self):
        """测试接受有效的复合 ID 格式"""
        # Test with standard composite ID
        request = ImageGenerationRequest(
            prompt="a beautiful landscape",
            model="dashscope/qwen-image"
        )
        assert request.model == "dashscope/qwen-image"
        assert request.prompt == "a beautiful landscape"
        
        # Test with different provider
        request2 = ImageGenerationRequest(
            prompt="a cat",
            model="modelscope/qwen-image"
        )
        assert request2.model == "modelscope/qwen-image"
        
        # Test with another provider
        request3 = ImageGenerationRequest(
            prompt="a dog",
            model="volcengine/doubao-image"
        )
        assert request3.model == "volcengine/doubao-image"
    
    def test_rejects_invalid_format_no_separator(self):
        """测试拒绝无效格式 - 缺少分隔符"""
        with pytest.raises((ValidationError, InvalidParameterException)) as exc_info:
            ImageGenerationRequest(
                prompt="a cat",
                model="qwen-image"  # Missing provider
            )
        
        # Verify error message mentions the correct format
        if isinstance(exc_info.value, ValidationError):
            errors = exc_info.value.errors()
            assert any("provider/model_key" in str(e.get("ctx", {})) for e in errors)
    
    def test_rejects_invalid_format_multiple_separators(self):
        """测试拒绝无效格式 - 多个分隔符"""
        with pytest.raises((ValidationError, InvalidParameterException)):
            ImageGenerationRequest(
                prompt="a cat",
                model="dash/scope/qwen"  # Too many separators
            )
    
    def test_rejects_invalid_format_empty_provider(self):
        """测试拒绝无效格式 - 空的 provider"""
        with pytest.raises((ValidationError, InvalidParameterException)):
            ImageGenerationRequest(
                prompt="a cat",
                model="/qwen-image"  # Empty provider
            )
    
    def test_rejects_invalid_format_empty_model_key(self):
        """测试拒绝无效格式 - 空的 model_key"""
        with pytest.raises((ValidationError, InvalidParameterException)):
            ImageGenerationRequest(
                prompt="a cat",
                model="dashscope/"  # Empty model_key
            )
    
    def test_does_not_accept_separate_provider_parameter(self):
        """测试不接受单独的 provider 参数"""
        # Create a valid request
        request = ImageGenerationRequest(
            prompt="a cat",
            model="dashscope/qwen-image"
        )
        
        # Verify provider field is not in the schema
        schema_fields = ImageGenerationRequest.model_fields.keys()
        assert "provider" not in schema_fields
        
        # Verify provider is not in the dumped data
        dumped = request.model_dump()
        assert "provider" not in dumped
        
        # Verify provider is not in the dumped data with aliases
        dumped_with_alias = request.model_dump(by_alias=True)
        assert "provider" not in dumped_with_alias
    
    def test_complete_valid_request(self):
        """测试完整的有效请求"""
        request = ImageGenerationRequest(
            prompt="a beautiful sunset over mountains",
            model="dashscope/qwen-image",
            negativePrompt="ugly, blurry",  # Use camelCase alias
            imageInputs=["http://example.com/ref.jpg"],  # Use camelCase alias
            resolution="1080P",
            aspectRatio="16:9",  # Use camelCase alias
            n=2,
            projectId="project-123",  # Use camelCase alias
            source="storyboard",
            sourceId="story-456",  # Use camelCase alias
            extraParams={"style": "anime"}  # Use camelCase alias
        )
        
        assert request.model == "dashscope/qwen-image"
        assert request.prompt == "a beautiful sunset over mountains"
        assert request.negative_prompt == "ugly, blurry"
        assert request.n == 2
        assert request.project_id == "project-123"
        assert "provider" not in request.model_dump()


if __name__ == "__main__":
    pytest.main([__file__, "-v"])
