| """Image quality validation — message strings are part of the API contract: |
| app/api/predict/route.ts string-matches them to map errors to HTTP 400.""" |
| from ml.inference.postprocess import validate_image_quality |
|
|
|
|
| def test_good_image_passes(green_leaf_image): |
| ok, message, metrics = validate_image_quality(green_leaf_image) |
| assert ok |
| assert message == "" |
| assert metrics["image_quality_ok"] is True |
| assert metrics["width"] == 256 |
| assert metrics["green_ratio"] > 0.03 |
| assert metrics["sharpness"] >= 25.0 |
|
|
|
|
| def test_tiny_image_rejected(tiny_image): |
| ok, message, metrics = validate_image_quality(tiny_image) |
| assert not ok |
| assert message == "Please retake the image with the full leaf clearly visible." |
| assert metrics["image_quality_ok"] is False |
|
|
|
|
| def test_non_plant_image_rejected(gray_image): |
| ok, message, metrics = validate_image_quality(gray_image) |
| assert not ok |
| assert message == "Please retake the image and include a clear plant leaf." |
| assert metrics["green_ratio"] < 0.03 |
|
|
|
|
| def test_blurry_image_rejected(blurry_image): |
| ok, message, metrics = validate_image_quality(blurry_image) |
| assert not ok |
| assert message == "Please retake the image. It appears blurry." |
| assert metrics["sharpness"] < 25.0 |
|
|
|
|
| def test_rgba_image_handled(green_leaf_image): |
| rgba = green_leaf_image.convert("RGBA") |
| ok, _, _ = validate_image_quality(rgba) |
| assert ok |
|
|