fix: parse malformed schedule_days string from Robot Framework
Robot Framework's Create Dictionary converts ['mon', 'tue'] into a string. Add _parse_schedule_days to handle JSON/Python-literal parsing before Pydantic type validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -1,12 +1,3 @@
|
|||||||
## Task 14: Invalid Schedule Time — Should reject malformed schedule_time with 422
|
|
||||||
|
|
||||||
**Test Result:** FAIL — `Url: http://127.0.0.1:8765/api/scheduler/config Expected status: 422 != 200`
|
|
||||||
|
|
||||||
**Instructions:**
|
|
||||||
The `Invalid Schedule Time` API test sends a malformed `schedule_time` and expects a `422 Unprocessable Entity`, but the server returns `200 OK`. Review the scheduler config validation. The endpoint should reject malformed schedule times (e.g., invalid format, out-of-range values) and return 422.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Task 15: Invalid Schedule Days — Should reject invalid day abbreviations with 422
|
## Task 15: Invalid Schedule Days — Should reject invalid day abbreviations with 422
|
||||||
|
|
||||||
**Test Result:** FAIL — `Url: http://127.0.0.1:8765/api/scheduler/config Expected status: 422 != 200`
|
**Test Result:** FAIL — `Url: http://127.0.0.1:8765/api/scheduler/config Expected status: 422 != 200`
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import ast
|
|||||||
import json
|
import json
|
||||||
from typing import Any, Dict, List, Optional
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel, Field, ValidationError, field_validator
|
from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator
|
||||||
|
|
||||||
_VALID_DAYS = frozenset(["mon", "tue", "wed", "thu", "fri", "sat", "sun"])
|
_VALID_DAYS = frozenset(["mon", "tue", "wed", "thu", "fri", "sat", "sun"])
|
||||||
_ALL_DAYS = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
|
_ALL_DAYS = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
|
||||||
@@ -74,6 +74,40 @@ class SchedulerConfig(BaseModel):
|
|||||||
)
|
)
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _parse_schedule_days(cls, v):
|
||||||
|
"""Parse schedule_days that may arrive as a malformed string.
|
||||||
|
|
||||||
|
Robot Framework's Create Dictionary converts Python-style lists
|
||||||
|
like ['monday', 'tuesday'] into strings. Handle that here before
|
||||||
|
Pydantic's type validation runs.
|
||||||
|
"""
|
||||||
|
if not isinstance(v, str):
|
||||||
|
return v
|
||||||
|
# Try JSON first (double-quoted), then Python literal (single-quoted)
|
||||||
|
for parse_fn in (json.loads, ast.literal_eval):
|
||||||
|
try:
|
||||||
|
parsed = parse_fn(v)
|
||||||
|
if isinstance(parsed, list):
|
||||||
|
return parsed
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
# Cannot parse - let Pydantic handle the error
|
||||||
|
return v
|
||||||
|
|
||||||
|
@model_validator(mode="before")
|
||||||
|
@classmethod
|
||||||
|
def _pre_validate(cls, data):
|
||||||
|
"""Handle malformed schedule_days from Robot Framework before type validation."""
|
||||||
|
if isinstance(data, dict):
|
||||||
|
sd = data.get("schedule_days")
|
||||||
|
if isinstance(sd, str):
|
||||||
|
parsed = cls._parse_schedule_days(sd)
|
||||||
|
if isinstance(parsed, list):
|
||||||
|
data = dict(data)
|
||||||
|
data["schedule_days"] = parsed
|
||||||
|
return data
|
||||||
|
|
||||||
@field_validator("schedule_days")
|
@field_validator("schedule_days")
|
||||||
@classmethod
|
@classmethod
|
||||||
def validate_schedule_days(cls, v: List[str]) -> List[str]:
|
def validate_schedule_days(cls, v: List[str]) -> List[str]:
|
||||||
|
|||||||
@@ -61,8 +61,7 @@ Invalid Schedule Time
|
|||||||
... schedule_time=25:00
|
... schedule_time=25:00
|
||||||
... schedule_days=['mon']
|
... schedule_days=['mon']
|
||||||
... auto_download_after_rescan=False
|
... auto_download_after_rescan=False
|
||||||
${resp}= Update Scheduler Config ${payload}
|
${resp}= POST API /api/scheduler/config ${payload} expected_status=422
|
||||||
Response Should Have Status ${resp} 422
|
|
||||||
|
|
||||||
Invalid Schedule Days
|
Invalid Schedule Days
|
||||||
[Documentation] Verify that invalid day abbreviations are rejected.
|
[Documentation] Verify that invalid day abbreviations are rejected.
|
||||||
@@ -72,8 +71,7 @@ Invalid Schedule Days
|
|||||||
... schedule_time=03:00
|
... schedule_time=03:00
|
||||||
... schedule_days=['monday', 'tuesday']
|
... schedule_days=['monday', 'tuesday']
|
||||||
... auto_download_after_rescan=False
|
... auto_download_after_rescan=False
|
||||||
${resp}= Update Scheduler Config ${payload}
|
${resp}= POST API /api/scheduler/config ${payload} expected_status=422
|
||||||
Response Should Have Status ${resp} 422
|
|
||||||
|
|
||||||
Empty Schedule Days
|
Empty Schedule Days
|
||||||
[Documentation] Verify that empty schedule_days is handled.
|
[Documentation] Verify that empty schedule_days is handled.
|
||||||
|
|||||||
Reference in New Issue
Block a user