Skip to content

Commit

Permalink
Do model validation and add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mwcraig committed Aug 10, 2023
1 parent cd28d0c commit 105041b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 30 deletions.
21 changes: 11 additions & 10 deletions stellarphot/settings/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from astropy import units as un

from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, conint, root_validator

from .autowidgets import CustomBoundedIntTex

Expand All @@ -19,12 +19,13 @@ class ApertureSettings(BaseModel):
outer_annulus : conint(ge=1) = Field(autoui=CustomBoundedIntTex)

class Config:
use_enum_values = True


# @validator('unit')
# @classmethod
# def check_unit(cls, v):
# if not isinstance(v, un.Unit):
# raise TypeError('unit must be an Astropy unit')
# return v
validate_assignment = True
validate_all = True

@root_validator(skip_on_failure=True)
def check_annuli(cls, values):
if values['inner_annulus'] >= values['outer_annulus']:
raise ValueError('inner_annulus must be smaller than outer_annulus')
if values['radius'] >= values['inner_annulus']:
raise ValueError('radius must be smaller than inner_annulus')
return values
52 changes: 32 additions & 20 deletions stellarphot/settings/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,35 @@


def test_create_aperture_settings_correctly():
ap_set = ApertureSettings(
**DEFAULT_APERTURE_SETTINGS,
unit=ApertureUnit.PIXEL)
assert ap_set.radius == 5
assert ap_set.unit == un.pix


def test_create_with_astropy_unit():
ap_set = ApertureSettings(
**DEFAULT_APERTURE_SETTINGS,
unit=un.pix)
assert ap_set.unit == un.pix


@pytest.mark.parametrize('unit', [1, 'pix', un.meter])
def test_create_with_wrong_unit(unit):
with pytest.raises(ValidationError):
ApertureSettings(
**DEFAULT_APERTURE_SETTINGS,
unit=unit)
ap_set = ApertureSettings(**DEFAULT_APERTURE_SETTINGS)
assert ap_set.radius == DEFAULT_APERTURE_SETTINGS['radius']
assert ap_set.inner_annulus == DEFAULT_APERTURE_SETTINGS['inner_annulus']
assert ap_set.outer_annulus == DEFAULT_APERTURE_SETTINGS['outer_annulus']


@pytest.mark.parametrize('bad_one', ['radius', 'inner_annulus', 'outer_annulus'])
def test_create_invalid_values(bad_one):
# Check that individual values that are bad raise an error
bad_settings = DEFAULT_APERTURE_SETTINGS.copy()
bad_settings[bad_one] = -1
with pytest.raises(ValidationError, match=bad_one):
ApertureSettings(**bad_settings)


def test_set_invalid_values():
ap = ApertureSettings(**DEFAULT_APERTURE_SETTINGS)
bad_settings = DEFAULT_APERTURE_SETTINGS.copy()

with pytest.raises(ValidationError, match="radius must be smaller"):
ap.radius = 2 * ap.outer_annulus

with pytest.raises(ValidationError, match="inner_annulus must be smaller"):
ap.inner_annulus = ap.outer_annulus + 1


# @pytest.mark.parametrize('unit', [1, 'pix', un.meter])
# def test_create_with_wrong_unit(unit):
# with pytest.raises(ValidationError):
# ApertureSettings(
# **DEFAULT_APERTURE_SETTINGS,
# unit=unit)

0 comments on commit 105041b

Please sign in to comment.