from __future__ import annotations import pytest from mcp_sd15.errors import InvalidRequestError from mcp_sd15.schema import ( ControlMode, GuidedImageRequest, ImageSize, InpaintImageRequest, TextToImageRequest, ) def test_text_request_applies_defaults() -> None: request = TextToImageRequest.create(" a castle ", default_size="landscape_512") assert request.positive_prompt == "a castle" assert request.negative_prompt == "" assert request.size is ImageSize.LANDSCAPE_512 assert request.size.dimensions == (512, 384) @pytest.mark.parametrize("prompt", ["", " ", None, 3]) def test_positive_prompt_is_required(prompt: object) -> None: with pytest.raises(InvalidRequestError, match="positive_prompt"): TextToImageRequest.create(prompt) # type: ignore[arg-type] def test_guided_mode_is_an_enum() -> None: request = GuidedImageRequest.create("cat", "openpose_full", "abc") assert request.control_mode is ControlMode.OPENPOSE_FULL with pytest.raises(InvalidRequestError, match="control_mode"): GuidedImageRequest.create("cat", "canny", "abc") def test_inpaint_requires_both_images() -> None: with pytest.raises(InvalidRequestError, match="mask_image"): InpaintImageRequest.create("repair", "abc", "") def test_arbitrary_dimensions_are_not_accepted() -> None: with pytest.raises(InvalidRequestError, match="size"): TextToImageRequest.create("cat", size="640x480") def test_base_prompts_are_combined_with_user_prompts() -> None: request = TextToImageRequest.create( "a cat", "blurry", base_positive="masterpiece, best quality", base_negative="low quality, watermark", ) assert request.positive_prompt == "masterpiece, best quality, a cat" assert request.negative_prompt == "low quality, watermark\nblurry" def test_base_positive_only_does_not_add_trailing_separator() -> None: request = TextToImageRequest.create( "a cat", base_positive="masterpiece", ) assert request.positive_prompt == "masterpiece, a cat" assert request.negative_prompt == "" def test_base_negative_only_does_not_add_leading_separator() -> None: request = TextToImageRequest.create( "a cat", "blurry", base_negative="low quality", ) assert request.positive_prompt == "a cat" assert request.negative_prompt == "low quality\nblurry" def test_empty_base_prompts_preserve_user_prompts() -> None: request = TextToImageRequest.create("a cat", "blurry") assert request.positive_prompt == "a cat" assert request.negative_prompt == "blurry" def test_guided_request_combines_base_prompts() -> None: request = GuidedImageRequest.create( "a dancer", "openpose", "abc", "deformed", base_positive="masterpiece", base_negative="low quality", ) assert request.positive_prompt == "masterpiece, a dancer" assert request.negative_prompt == "low quality\ndeformed" def test_inpaint_request_combines_base_prompts() -> None: request = InpaintImageRequest.create( "a vase", "abc", "def", "artifacts", base_positive="masterpiece", base_negative="low quality", ) assert request.positive_prompt == "masterpiece, a vase" assert request.negative_prompt == "low quality\nartifacts"