From 6d48f433b7c906e95eec31530ee04ee284eb8c8d Mon Sep 17 00:00:00 2001 From: Joshua King Date: Tue, 15 Sep 2026 17:58:51 -0400 Subject: [PATCH] Review fix: validate engine keys as child ids; every-day three-child walk Review round 1 (Codex gpt-5.6-terra, 2 LOW): engine snapshot keys now pass _validate_child_id (True/1.0 compare equal to 1 and would be accepted then behave differently on lookup); the always-present test now walks all 28 days asserting all three children's expected verdicts instead of sampling every third day. Suite: 985 passed. --- custom_components/nestquest/presence.py | 4 ++++ tests/test_presence.py | 22 ++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/custom_components/nestquest/presence.py b/custom_components/nestquest/presence.py index 797081c..907ad8d 100644 --- a/custom_components/nestquest/presence.py +++ b/custom_components/nestquest/presence.py @@ -339,6 +339,10 @@ class PresenceEngine: f"{schedules!r}" ) for child_id, schedule in schedules.items(): + # Validate the KEY as a model child id too: True and 1.0 + # compare equal to 1, so {True: schedule(1)} would be + # accepted and then behave differently on lookup. + _validate_child_id(child_id) if not isinstance(schedule, PresenceSchedule): raise ValueError( f"schedules[{child_id!r}] must be a PresenceSchedule, " diff --git a/tests/test_presence.py b/tests/test_presence.py index fd2570e..b38727e 100644 --- a/tests/test_presence.py +++ b/tests/test_presence.py @@ -393,11 +393,21 @@ def _three_child_engine() -> PresenceEngine: def test_engine_child_without_schedule_is_always_present() -> None: + """Every day of the four-week span, all three children get the + expected verdict: Chloe (no schedule) always present; the two + rotation children complementary per the anchor pattern.""" engine = _three_child_engine() - # Chloe has no schedule: present every day, including weekends. - for offset in range(0, 28, 3): - day = datetime.date(2026, 1, 5) + datetime.timedelta(days=offset) - assert engine.is_present(3, day) is True, f"offset {offset}" + anchor = datetime.date(2026, 1, 5) + for offset in range(28): + day = anchor + datetime.timedelta(days=offset) + week = ((day - anchor).days // 7) % 2 + assert engine.is_present(3, day) is True, f"offset {offset}: Chloe" + assert engine.is_present(1, day) is (week == 0), ( + f"offset {offset}: Declan should follow week {week}" + ) + assert engine.is_present(2, day) is (week == 1), ( + f"offset {offset}: Jordyn should follow week {week}" + ) def test_engine_alternating_children_are_complementary_for_four_weeks() -> None: @@ -449,6 +459,10 @@ def test_engine_rejects_bad_construction_and_inputs() -> None: PresenceEngine({1: "not-a-schedule"}) with pytest.raises(ValueError, match="holds the schedule"): PresenceEngine({2: schedule}) + with pytest.raises(ValueError, match="child_id must be an integer"): + PresenceEngine({True: schedule}) + with pytest.raises(ValueError, match="child_id must be an integer"): + PresenceEngine({1.0: PresenceSchedule(1, 1, ANCHOR, {0: {0}})}) engine = PresenceEngine({1: schedule}) with pytest.raises(ValueError, match="child_id must be an integer"): engine.is_present(True, ANCHOR)