From af3cbf30c8cdd3d664ef8d28287fd7b836fd10e2 Mon Sep 17 00:00:00 2001 From: Dan LaManna Date: Mon, 14 Sep 2026 07:04:40 -0400 Subject: [PATCH] Require clin_size_long_diam_mm to be non-negative --- isic_metadata/metadata.py | 1 + tests/test_fields.py | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/isic_metadata/metadata.py b/isic_metadata/metadata.py index f77918d..6498314 100644 --- a/isic_metadata/metadata.py +++ b/isic_metadata/metadata.py @@ -215,6 +215,7 @@ class MetadataRow(BaseModel): Decimal, BeforeValidator(ClinSizeLongDiamMm.parse_measurement_str), Field(max_digits=5, decimal_places=2), + Ge(0), ] | None ) = None diff --git a/tests/test_fields.py b/tests/test_fields.py index bc56b04..c6b7d1e 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -117,3 +117,12 @@ def test_clin_size_long_diam_mm_invalid() -> None: MetadataRow.model_validate({"clin_size_long_diam_mm": "foo"}) assert len(excinfo.value.errors()) == 1 assert "Unable to parse value as a number" in convert_errors(excinfo.value)[0]["msg"] + + +@given(clin_size=st.integers(min_value=-9999, max_value=-1).map(lambda x: Decimal(x) / 10)) +def test_clin_size_long_diam_mm_negative(clin_size: Decimal) -> None: + for value in [clin_size, str(clin_size), f"{clin_size} mm"]: + with pytest.raises(ValidationError) as excinfo: + MetadataRow.model_validate({"clin_size_long_diam_mm": value}) + assert len(excinfo.value.errors()) == 1 + assert excinfo.value.errors()[0]["type"] == "greater_than_equal"