From 73222759cb31c1f618cbfc28c4687cc2b0ddba2b Mon Sep 17 00:00:00 2001 From: Dan LaManna Date: Tue, 28 Jun 2022 16:55:20 -0400 Subject: [PATCH] Round and require positive clinical sizes --- isic_metadata/fields.py | 5 ++++- tests/test_fields.py | 23 +++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/isic_metadata/fields.py b/isic_metadata/fields.py index 0197ded..8b7d232 100644 --- a/isic_metadata/fields.py +++ b/isic_metadata/fields.py @@ -33,13 +33,16 @@ def validate(cls, value) -> float | None: float_value, units = match.groups() float_value = float(float_value) + if float_value <= 0: + raise ValueError(f'Invalid clinical size of {value}.') + # Convert to mm if units == 'um': float_value *= 1e-3 elif units == 'cm': float_value *= 1e1 - return float_value + return round(float_value, ndigits=1) class Age(BaseStr): diff --git a/tests/test_fields.py b/tests/test_fields.py index 644fe46..ef95fe4 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -33,17 +33,12 @@ def test_age_special_case(): assert MetadataRow(age='85+').age == 85 -# test that non numeric strings fail, this should capture negative values -# @given(age=st.text().filter(lambda s: not s.isnumeric() and s != '')) -# def test_age_fuzz(age): -# print(age) -# with pytest.raises(ValidationError) as excinfo: -# MetadataRow(age=age) - - -# assert 'foo' == excinfo.value -# except ValidationError as e: -# breakpoint() -# assert len(e.errors()) == 1 -# assert e.errors()[0]['loc'][0] == 'age' -# print(e.errors()) +@given( + clin_size=st.one_of(st.floats(min_value=0, exclude_min=True), st.integers(min_value=1)).map( + lambda x: f'{x} mm' + ) +) +def test_clin_size_long_diam_mm_always_rounded(clin_size): + metadata = MetadataRow(clin_size_long_diam_mm=clin_size) + assert isinstance(metadata.clin_size_long_diam_mm, float) + assert metadata.clin_size_long_diam_mm == round(metadata.clin_size_long_diam_mm, ndigits=1)