refactor: parameterize e2e tests and add CLI stdout assertions
This commit is contained in:
parent
4ff83c36ef
commit
a763181b74
1 changed files with 21 additions and 73 deletions
|
|
@ -40,23 +40,28 @@ def test_e2e_root_serves_html_with_title_and_dropzone():
|
|||
assert "drop-zone" in html_lower or "dropzone" in html_lower
|
||||
|
||||
|
||||
def test_e2e_api_clean_end_to_end():
|
||||
"""Test FastAPI POST /api/clean end-to-end with high-res image and Lanczos restoration."""
|
||||
import pytest
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"orig_dims,model_dims,prompt,cost,color",
|
||||
[
|
||||
((1200, 1600), (600, 800), "Soft warm beige studio background, evenly lit, no shadows, no props.", 0.0125, "navy"),
|
||||
((1500, 2000), (750, 1000), "Minimalist bright studio setting with directional softbox lighting.", 0.015, "darkgreen"),
|
||||
],
|
||||
)
|
||||
def test_e2e_api_clean_end_to_end(orig_dims, model_dims, prompt, cost, color):
|
||||
"""Test FastAPI POST /api/clean end-to-end with high-res images, Lanczos restoration, and custom prompts."""
|
||||
client = TestClient(app)
|
||||
orig_width, orig_height = orig_dims
|
||||
model_width, model_height = model_dims
|
||||
|
||||
orig_width, orig_height = 1200, 1600
|
||||
model_width, model_height = 600, 800
|
||||
|
||||
# Create high-resolution synthetic image (1200x1600)
|
||||
high_res_bytes = _create_synthetic_image(orig_width, orig_height, color="navy")
|
||||
|
||||
# Create lower-resolution synthetic image representing model output (600x800)
|
||||
high_res_bytes = _create_synthetic_image(orig_width, orig_height, color=color)
|
||||
low_res_bytes = _create_synthetic_image(model_width, model_height, color="beige")
|
||||
b64_low_res = base64.b64encode(low_res_bytes).decode()
|
||||
|
||||
mock_openrouter_response = {
|
||||
"data": [{"b64_json": b64_low_res, "media_type": "image/jpeg"}],
|
||||
"usage": {"cost": 0.0125},
|
||||
"usage": {"cost": cost},
|
||||
}
|
||||
|
||||
class MockResponse:
|
||||
|
|
@ -65,71 +70,13 @@ def test_e2e_api_clean_end_to_end():
|
|||
def json(self):
|
||||
return mock_openrouter_response
|
||||
|
||||
files = {"file": ("high_res_garment.jpg", high_res_bytes, "image/jpeg")}
|
||||
files = {"file": ("garment.jpg", high_res_bytes, "image/jpeg")}
|
||||
form_data = {
|
||||
"prompt": "Soft warm beige studio background, evenly lit, no shadows, no props.",
|
||||
"prompt": prompt,
|
||||
"api_key": "sk-or-v1-fake-e2e-key",
|
||||
"restore_res": "true",
|
||||
}
|
||||
|
||||
with patch("cleaner.requests.post", return_value=MockResponse()) as mock_post:
|
||||
response = client.post("/api/clean", files=files, data=form_data)
|
||||
|
||||
assert response.status_code == 200
|
||||
mock_post.assert_called_once()
|
||||
|
||||
payload = response.json()
|
||||
|
||||
# Verify was_rescaled is True
|
||||
assert payload["was_rescaled"] is True
|
||||
# Verify original_dimensions and model_dimensions match expectations
|
||||
assert payload["original_dimensions"] == [orig_width, orig_height]
|
||||
assert payload["model_dimensions"] == [model_width, model_height]
|
||||
assert payload["width"] == orig_width
|
||||
assert payload["height"] == orig_height
|
||||
# Verify cost is reported
|
||||
assert payload["cost"] == 0.0125
|
||||
|
||||
# Verify decoded output image matches exact source dimensions thanks to Lanczos restoration
|
||||
image_data_uri = payload["image"]
|
||||
assert image_data_uri.startswith("data:image/jpeg;base64,")
|
||||
encoded_data = image_data_uri.split(",", 1)[1]
|
||||
decoded_bytes = base64.b64decode(encoded_data)
|
||||
|
||||
with Image.open(io.BytesIO(decoded_bytes)) as result_img:
|
||||
assert result_img.size == (orig_width, orig_height)
|
||||
|
||||
|
||||
def test_e2e_api_clean_with_custom_prompt_and_1500x2000():
|
||||
"""Test FastAPI POST /api/clean with custom prompt and 1500x2000 dimensions."""
|
||||
client = TestClient(app)
|
||||
|
||||
orig_width, orig_height = 1500, 2000
|
||||
model_width, model_height = 750, 1000
|
||||
|
||||
high_res_bytes = _create_synthetic_image(orig_width, orig_height, color="darkgreen")
|
||||
low_res_bytes = _create_synthetic_image(model_width, model_height, color="white")
|
||||
b64_low_res = base64.b64encode(low_res_bytes).decode()
|
||||
|
||||
mock_openrouter_response = {
|
||||
"data": [{"b64_json": b64_low_res, "media_type": "image/jpeg"}],
|
||||
"usage": {"cost": 0.015},
|
||||
}
|
||||
|
||||
class MockResponse:
|
||||
status_code = 200
|
||||
|
||||
def json(self):
|
||||
return mock_openrouter_response
|
||||
|
||||
files = {"file": ("catalog_garment.jpg", high_res_bytes, "image/jpeg")}
|
||||
custom_prompt = "Minimalist bright studio setting with directional softbox lighting."
|
||||
form_data = {
|
||||
"prompt": custom_prompt,
|
||||
"api_key": "sk-or-v1-custom-prompt-key",
|
||||
"restore_res": "true",
|
||||
}
|
||||
|
||||
with patch("cleaner.requests.post", return_value=MockResponse()) as mock_post:
|
||||
response = client.post("/api/clean", files=files, data=form_data)
|
||||
|
||||
|
|
@ -142,14 +89,13 @@ def test_e2e_api_clean_with_custom_prompt_and_1500x2000():
|
|||
assert payload["model_dimensions"] == [model_width, model_height]
|
||||
assert payload["width"] == orig_width
|
||||
assert payload["height"] == orig_height
|
||||
assert payload["cost"] == 0.015
|
||||
assert payload["cost"] == cost
|
||||
|
||||
encoded_data = payload["image"].split(",", 1)[1]
|
||||
decoded_bytes = base64.b64decode(encoded_data)
|
||||
with Image.open(io.BytesIO(decoded_bytes)) as result_img:
|
||||
assert result_img.size == (orig_width, orig_height)
|
||||
|
||||
|
||||
def test_e2e_cli_subprocess_end_to_end(tmp_path):
|
||||
"""Test CLI unwrap_clothes.py end-to-end via subprocess with mocked OpenRouter."""
|
||||
orig_width, orig_height = 1200, 1600
|
||||
|
|
@ -215,8 +161,10 @@ def test_e2e_cli_subprocess_end_to_end(tmp_path):
|
|||
|
||||
# Verify exit code 0
|
||||
assert proc.returncode == 0, f"CLI failed with stderr: {proc.stderr}\nstdout: {proc.stdout}"
|
||||
assert "Restored resolution" in proc.stdout
|
||||
assert "cost $0.02" in proc.stdout
|
||||
assert "Saved:" in proc.stdout
|
||||
|
||||
# Verify output file <image_path>_clean.jpg is created with exact source dimensions
|
||||
assert expected_clean_path.is_file(), f"Output file {expected_clean_path} was not created"
|
||||
with Image.open(expected_clean_path) as out_img:
|
||||
assert out_img.size == (orig_width, orig_height)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue