diff --git a/src/portable_agent/models/proposal.py b/src/portable_agent/models/proposal.py index ea1d386..84b12c8 100644 --- a/src/portable_agent/models/proposal.py +++ b/src/portable_agent/models/proposal.py @@ -29,8 +29,8 @@ class CalendarEvent(BaseModel): model_config = ConfigDict(extra="forbid") title: str = Field(min_length=1, max_length=200, pattern=r".*\S.*") - start_at: datetime = Field(alias="startAt") - end_at: datetime = Field(alias="endAt") + start_at: str = Field(alias="startAt") + end_at: str = Field(alias="endAt") time_zone: str = Field( alias="timeZone", max_length=100, @@ -48,9 +48,14 @@ def check_date_type(cls, value: object) -> object: @model_validator(mode="after") def check_time(self) -> Self: - if self.start_at.tzinfo is None or self.end_at.tzinfo is None: + try: + start_at = datetime.fromisoformat(self.start_at) + end_at = datetime.fromisoformat(self.end_at) + except ValueError as error: + raise ValueError("startAt and endAt must be valid date-time values") from error + if start_at.tzinfo is None or end_at.tzinfo is None: raise ValueError("startAt and endAt must include an offset") - if self.end_at <= self.start_at: + if end_at <= start_at: raise ValueError("endAt must be after startAt") if len(self.attendees) != len(set(self.attendees)): raise ValueError("attendees must be unique") diff --git a/tests/test_calendar_event.py b/tests/test_calendar_event.py new file mode 100644 index 0000000..aa0d387 --- /dev/null +++ b/tests/test_calendar_event.py @@ -0,0 +1,17 @@ +from portable_agent.models.proposal import CalendarEvent + + +def test_calendar_event_when_offset_is_set_should_keep_original_text() -> None: + start = "2026-09-12T10:00:00+03:00" + end = "2026-09-12T10:30:00+03:00" + + event = CalendarEvent( + title="Compose check", + startAt=start, + endAt=end, + timeZone="Europe/Moscow", + ) + + assert isinstance(event.start_at, str) + assert event.start_at == start + assert event.end_at == end