Initial commit: Pixel AI comic/video creation platform
- FastAPI backend with SQLModel, Alembic migrations, AgentScope agents - Next.js 15 frontend with React 19, Tailwind, Zustand, React Flow - Multi-provider AI system (DashScope, Kling, MiniMax, Volcengine, OpenAI, etc.) - All HTTP clients migrated from sync requests to async httpx - Admin-managed API keys via environment variables - SSRF vulnerability fixed in ensure_url()
This commit is contained in:
148
backend/tests/test_image_generation_request_schema.py
Normal file
148
backend/tests/test_image_generation_request_schema.py
Normal file
@@ -0,0 +1,148 @@
|
||||
"""
|
||||
Tests for ImageGenerationRequest schema validation.
|
||||
|
||||
Tests the model field format validation to ensure it accepts valid
|
||||
composite IDs (provider/model_key) and rejects invalid formats.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from pydantic import ValidationError
|
||||
from src.models.schemas import ImageGenerationRequest
|
||||
from src.utils.errors import InvalidParameterException
|
||||
|
||||
|
||||
class TestImageGenerationRequestModelValidation:
|
||||
"""Test model field format validation"""
|
||||
|
||||
def test_accepts_valid_composite_id(self):
|
||||
"""Should accept valid composite ID format"""
|
||||
request = ImageGenerationRequest(
|
||||
prompt="a cat",
|
||||
model="dashscope/qwen-image"
|
||||
)
|
||||
assert request.model == "dashscope/qwen-image"
|
||||
|
||||
def test_accepts_different_providers(self):
|
||||
"""Should accept different provider formats"""
|
||||
valid_models = [
|
||||
"dashscope/qwen-image",
|
||||
"modelscope/qwen-image",
|
||||
"volcengine/doubao-image",
|
||||
"openai/dall-e-3"
|
||||
]
|
||||
|
||||
for model in valid_models:
|
||||
request = ImageGenerationRequest(
|
||||
prompt="test",
|
||||
model=model
|
||||
)
|
||||
assert request.model == model
|
||||
|
||||
def test_rejects_model_without_separator(self):
|
||||
"""Should reject model without '/' separator"""
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="a cat",
|
||||
model="qwen-image"
|
||||
)
|
||||
|
||||
def test_rejects_model_with_multiple_separators(self):
|
||||
"""Should reject model with multiple '/' separators"""
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="a cat",
|
||||
model="dash/scope/qwen"
|
||||
)
|
||||
|
||||
def test_rejects_empty_provider(self):
|
||||
"""Should reject model with empty provider"""
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="a cat",
|
||||
model="/qwen-image"
|
||||
)
|
||||
|
||||
def test_rejects_empty_model_key(self):
|
||||
"""Should reject model with empty model_key"""
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="a cat",
|
||||
model="dashscope/"
|
||||
)
|
||||
|
||||
def test_provider_field_removed(self):
|
||||
"""Should not accept provider field (removed)"""
|
||||
# This should work without provider field
|
||||
request = ImageGenerationRequest(
|
||||
prompt="a cat",
|
||||
model="dashscope/qwen-image"
|
||||
)
|
||||
assert not hasattr(request, 'provider') or request.model_dump().get('provider') is None
|
||||
|
||||
def test_complete_request_with_optional_fields(self):
|
||||
"""Should accept complete request with all optional fields"""
|
||||
request = ImageGenerationRequest(
|
||||
prompt="a beautiful cat",
|
||||
model="dashscope/qwen-image",
|
||||
negative_prompt="ugly",
|
||||
image_inputs=["http://example.com/image.jpg"],
|
||||
resolution="2K",
|
||||
aspect_ratio="16:9",
|
||||
n=2,
|
||||
project_id="proj-123",
|
||||
source="storyboard",
|
||||
source_id="story-456",
|
||||
extra_params={"lora": "style1"}
|
||||
)
|
||||
|
||||
assert request.model == "dashscope/qwen-image"
|
||||
assert request.prompt == "a beautiful cat"
|
||||
assert request.n == 2
|
||||
|
||||
|
||||
class TestImageGenerationRequestOtherValidations:
|
||||
"""Test other field validations"""
|
||||
|
||||
def test_prompt_required(self):
|
||||
"""Should require prompt field"""
|
||||
with pytest.raises(ValidationError) as exc_info:
|
||||
ImageGenerationRequest(
|
||||
model="dashscope/qwen-image"
|
||||
)
|
||||
|
||||
errors = exc_info.value.errors()
|
||||
assert any(e["loc"] == ("prompt",) for e in errors)
|
||||
|
||||
def test_prompt_cannot_be_empty(self):
|
||||
"""Should reject empty prompt"""
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="",
|
||||
model="dashscope/qwen-image"
|
||||
)
|
||||
|
||||
def test_n_validation(self):
|
||||
"""Should validate n is between 1 and 10"""
|
||||
# Valid n
|
||||
request = ImageGenerationRequest(
|
||||
prompt="test",
|
||||
model="dashscope/qwen-image",
|
||||
n=5
|
||||
)
|
||||
assert request.n == 5
|
||||
|
||||
# Invalid n (too small)
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="test",
|
||||
model="dashscope/qwen-image",
|
||||
n=0
|
||||
)
|
||||
|
||||
# Invalid n (too large)
|
||||
with pytest.raises((ValidationError, InvalidParameterException)):
|
||||
ImageGenerationRequest(
|
||||
prompt="test",
|
||||
model="dashscope/qwen-image",
|
||||
n=11
|
||||
)
|
||||
Reference in New Issue
Block a user