diff --git a/isic_metadata/metadata.py b/isic_metadata/metadata.py index 6498314..565c1bb 100644 --- a/isic_metadata/metadata.py +++ b/isic_metadata/metadata.py @@ -229,6 +229,7 @@ class MetadataRow(BaseModel): Decimal, BeforeValidator(MelThickMm.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 c6b7d1e..26ffbec 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -98,6 +98,15 @@ def test_mel_thick_mm_invalid() -> None: assert "Unable to parse value as a number" in convert_errors(excinfo.value)[0]["msg"] +@given(mel_thick=st.integers(min_value=-99999, max_value=-1).map(lambda x: Decimal(x) / 100)) +def test_mel_thick_mm_negative(mel_thick: Decimal) -> None: + for value in [mel_thick, str(mel_thick)]: + with pytest.raises(ValidationError) as excinfo: + MetadataRow.model_validate({"diagnosis": "Melanoma Invasive", "mel_thick_mm": value}) + assert len(excinfo.value.errors()) == 1 + assert excinfo.value.errors()[0]["type"] == "greater_than_equal" + + @given( clin_size=st.one_of( # keep max values bounded so they don't generate larger than representable decimals.