From 85e11072b4371ed90e7dea71b5a67f2a6f33cf07 Mon Sep 17 00:00:00 2001 From: Jake Howard Date: Fri, 26 Apr 2024 10:13:37 +0100 Subject: [PATCH] Ensure calendar slugs are unique --- calmerge/config.py | 12 ++++++++++++ tests/test_config.py | 9 +++++++++ 2 files changed, 21 insertions(+) diff --git a/calmerge/config.py b/calmerge/config.py index e6858a7..4a9c53a 100644 --- a/calmerge/config.py +++ b/calmerge/config.py @@ -80,6 +80,18 @@ def validate_offset_days(cls, offset_days: list[int]) -> list[int]: class Config(BaseModel): calendars: list[CalendarConfig] = Field(alias="calendar", default_factory=list) + @field_validator("calendars") + @classmethod + def validate_unique_calendar_slugs( + cls, calendars: list[CalendarConfig] + ) -> list[CalendarConfig]: + calendar_slugs = {calendar.slug for calendar in calendars} + + if len(calendar_slugs) != len(calendars): + raise PydanticCustomError("calendar_slugs", "Calendar slugs must be unique") + + return calendars + @classmethod def from_file(cls, path: Path) -> "Config": with path.open(mode="rb") as f: diff --git a/tests/test_config.py b/tests/test_config.py index c164378..9e2c825 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -42,6 +42,15 @@ def test_invalid_offset_days() -> None: ) +def test_duplicate_calendar_slug() -> None: + calendar_config = CalendarConfig(slug="test", urls=["https://example.com"]) # type: ignore [list-item] + + with pytest.raises(ValidationError) as e: + Config(calendar=[calendar_config] * 5) + + assert e.value.errors()[0]["msg"] == "Calendar slugs must be unique" + + def test_urls_expand_env_var(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setenv("FOO", "BAR")