fix: validate horizon_days before delete + wrapper forwarding tests (NQ-86-001, NQ-86-002)
This commit is contained in:
@@ -1193,6 +1193,79 @@ def test_regenerate_for_child_respects_horizon_days(tmp_path) -> None:
|
||||
_with_db(tmp_path, "regenerate-child-horizon.db")(_body)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [-1, 0, True, False, "5", 1.5])
|
||||
def test_regenerate_for_definition_rejects_invalid_horizon_before_delete(
|
||||
tmp_path, bad
|
||||
) -> None:
|
||||
"""A malformed horizon fails BEFORE any future-instance delete."""
|
||||
async def _body(database):
|
||||
children = ChildrenDao(database)
|
||||
child = await children.create("Ada", NOW)
|
||||
|
||||
today = datetime.date.today()
|
||||
start_iso = today.isoformat()
|
||||
horizon_end = today + datetime.timedelta(days=DEFAULT_HORIZON_DAYS)
|
||||
|
||||
created = await create_quest_definition(
|
||||
database,
|
||||
"Daily chore",
|
||||
ScheduleRule(rule_type=RuleType.DAILY, start_date=start_iso),
|
||||
[child.id],
|
||||
[("morning", "09:00")],
|
||||
)
|
||||
dao = QuestInstancesDao(database)
|
||||
await materialize(database, start_iso, horizon_end.isoformat())
|
||||
|
||||
with pytest.raises(ValueError, match="horizon_days"):
|
||||
await regenerate_for_definition(
|
||||
database, created.definition.id, horizon_days=bad
|
||||
)
|
||||
|
||||
# The refused call deleted nothing: the seeded horizon survives.
|
||||
records = await dao.list_by_date_range(
|
||||
child.id, start_iso, horizon_end.isoformat()
|
||||
)
|
||||
assert len(records) == DEFAULT_HORIZON_DAYS + 1
|
||||
return None
|
||||
|
||||
_with_db(tmp_path, "regenerate-def-horizon-invalid.db")(_body)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [-1, 0, True, False, "5", 1.5])
|
||||
def test_regenerate_for_child_rejects_invalid_horizon_before_delete(
|
||||
tmp_path, bad
|
||||
) -> None:
|
||||
"""A malformed child horizon fails BEFORE any future-instance delete."""
|
||||
async def _body(database):
|
||||
children = ChildrenDao(database)
|
||||
child = await children.create("Ada", NOW)
|
||||
|
||||
today = datetime.date.today()
|
||||
start_iso = today.isoformat()
|
||||
horizon_end = today + datetime.timedelta(days=DEFAULT_HORIZON_DAYS)
|
||||
|
||||
await create_quest_definition(
|
||||
database,
|
||||
"Daily chore",
|
||||
ScheduleRule(rule_type=RuleType.DAILY, start_date=start_iso),
|
||||
[child.id],
|
||||
[("morning", "09:00")],
|
||||
)
|
||||
dao = QuestInstancesDao(database)
|
||||
await materialize(database, start_iso, horizon_end.isoformat())
|
||||
|
||||
with pytest.raises(ValueError, match="horizon_days"):
|
||||
await regenerate_for_child(database, child.id, horizon_days=bad)
|
||||
|
||||
records = await dao.list_by_date_range(
|
||||
child.id, start_iso, horizon_end.isoformat()
|
||||
)
|
||||
assert len(records) == DEFAULT_HORIZON_DAYS + 1
|
||||
return None
|
||||
|
||||
_with_db(tmp_path, "regenerate-child-horizon-invalid.db")(_body)
|
||||
|
||||
|
||||
#: Fixed end-to-end anchor: 2026-06-01 is a Monday AND the 1st of its month,
|
||||
#: so the two-week custody cycle is week-aligned and the yearly rule's
|
||||
#: "1st of the anchor month" is GUARANTEED to fire inside the 28-day window
|
||||
|
||||
Reference in New Issue
Block a user