Commit 395d4fb6 authored by Jan Reimes's avatar Jan Reimes
Browse files

fix(tdocs): normalize status values to lowercase in TDocMetadata

* Updated status field in TDocMetadata to accept lowercase values.
* Adjusted sample TDoc metadata in tests to reflect new status normalization.
* Ensured consistency across test cases for status values.
parent e277d273
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ from enum import StrEnum
from typing import Any

import requests
from pydantic import BaseModel, Field, field_validator
from pydantic import BaseModel, Field, field_serializer, field_validator

from tdoc_crawler.logging import get_logger
from tdoc_crawler.models.base import (
@@ -95,7 +95,7 @@ class TDocMetadata(BaseModel):
    for_purpose: str = Field("unknown", description="Purpose of the contribution (agreement, information, etc.)")
    agenda_item_nbr: Decimal = Field(..., max_digits=3, decimal_places=1, description="Associated agenda item (numerical identifier)")
    agenda_item_text: str = Field("Unknown", description="Associated agenda item (text identifier)")
    status: TDocStatus | None = Field(None, description="Document status as reported by the portal")
    status: str | None = Field(None, description="Document status as reported by the portal")

    @property
    def is_valid(self) -> bool:
@@ -166,16 +166,26 @@ class TDocMetadata(BaseModel):

        return is_accessible

    @classmethod
    @field_serializer("status")
    def _serialize_status(cls, value: TDocStatus | str | None) -> str | None:
        """Serialize TDocStatus enum to string for database storage."""
        if value is None:
            return None
        if isinstance(value, TDocStatus):
            return value.value
        return value

    @field_validator("status", mode="before")
    @classmethod
    def _validate_status(cls, value: str | TDocStatus | None) -> TDocStatus | None:
    def _validate_status(cls, value: str | TDocStatus | None) -> str | None:
        """Validate and normalize status value against TDocStatus enum.

        Args:
            value: Status string or enum value

        Returns:
            TDocStatus enum value or None
            Normalized status string (lowercase) or None

        Raises:
            ValueError: If status value is not in TDocStatus enum
@@ -184,10 +194,10 @@ class TDocMetadata(BaseModel):
            return None

        if isinstance(value, TDocStatus):
            return value
            return value.value

        # Let TDocStatus._missing_ handle validation and case-insensitive lookup
        return TDocStatus(value)
        return TDocStatus(value).value

    @field_validator("tdoc_id")
    @classmethod
+3 −3
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ def sample_tdocs() -> list[TDocMetadata]:
            for_purpose="Discussion",
            agenda_item_nbr=Decimal("7.1"),
            agenda_item_text="Test agenda item",
            status="Approved",
            status="approved",
            is_revision_of=None,
            date_created=datetime(2023, 1, 15, tzinfo=UTC),
            date_retrieved=datetime(2023, 1, 16, tzinfo=UTC),
@@ -86,7 +86,7 @@ def sample_tdocs() -> list[TDocMetadata]:
            for_purpose="Discussion",
            agenda_item_nbr=Decimal("8.1"),
            agenda_item_text="Test agenda item",
            status="Approved",
            status="approved",
            is_revision_of=None,
            date_created=datetime(2023, 1, 15, tzinfo=UTC),
            date_retrieved=datetime(2023, 1, 16, tzinfo=UTC),
@@ -105,7 +105,7 @@ def sample_tdocs() -> list[TDocMetadata]:
            for_purpose="Discussion",
            agenda_item_nbr=Decimal("9.1"),
            agenda_item_text="Test agenda item",
            status="Approved",
            status="approved",
            is_revision_of=None,
            date_created=datetime(2023, 1, 15, tzinfo=UTC),
            date_retrieved=datetime(2023, 1, 16, tzinfo=UTC),
+4 −4
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ def sample_tdoc_metadata() -> TDocMetadata:
        for_purpose="Test Purpose",
        agenda_item_nbr=Decimal("1.0"),
        agenda_item_text="Test Agenda Item",
        status="Test Status",
        status="available",
        meeting_name="Test Meeting",
        is_revision_of=None,
        file_size=None,
@@ -64,7 +64,7 @@ class TestGetCheckoutPath:
            for_purpose="Test Purpose",
            agenda_item_nbr=Decimal("1.0"),
            agenda_item_text="Test Agenda Item",
            status="Test Status",
            status="available",
            meeting_name="Test Meeting",
            is_revision_of=None,
            file_size=None,
@@ -89,7 +89,7 @@ class TestGetCheckoutPath:
            for_purpose="Test Purpose",
            agenda_item_nbr=Decimal("1.0"),
            agenda_item_text="Test Agenda Item",
            status="Test Status",
            status="available",
            meeting_name="Test Meeting",
            is_revision_of=None,
            file_size=None,
@@ -185,7 +185,7 @@ class TestCheckoutTDoc:
            for_purpose="Test Purpose",
            agenda_item_nbr=Decimal("1.0"),
            agenda_item_text="Test Agenda Item",
            status="Test Status",
            status="available",
            meeting_name="Test Meeting",
            is_revision_of=None,
            file_size=None,
+1 −1
Original line number Diff line number Diff line
@@ -168,7 +168,7 @@ class TestTDocDatabase:
                for_purpose="Updated Purpose",
                agenda_item_nbr=Decimal("7.2"),
                agenda_item_text="Updated agenda",
                status="Updated",
                status="revised",
                is_revision_of=None,
                date_created=None,
                date_retrieved=datetime(2023, 1, 17),