from datetime import date, time import pytest from custom_components.room_cal_ha.models import OverrideData, ReservationData # --------------------------------------------------------------------------- # ReservationData — serialization # --------------------------------------------------------------------------- def test_to_dict_serializes_dates_and_times(): res = ReservationData( guest_name="Alice", check_in_date=date(2026, 7, 1), check_in_time=time(14, 0), check_out_date=date(2026, 7, 5), check_out_time=time(12, 0), wifi_key="abc", door_code="1234", ) d = res.to_dict() assert d["guest_name"] == "Alice" assert d["check_in_date"] == "2026-07-01" assert d["check_in_time"] == "14:00:00" assert d["check_out_date"] == "2026-07-05" assert d["check_out_time"] == "12:00:00" assert d["wifi_key"] == "abc" assert d["door_code"] == "1234" def test_to_dict_none_fields_stay_none(): res = ReservationData(guest_name=None, check_in_date=None, wifi_key=None) d = res.to_dict() assert d["guest_name"] is None assert d["check_in_date"] is None assert d["wifi_key"] is None def test_from_dict_deserializes_iso_strings(): d = { "guest_name": "Bob", "check_in_date": "2026-08-01", "check_in_time": "15:00:00", "check_out_date": "2026-08-04", "check_out_time": "11:00:00", "wifi_ssid": "Net", "wifi_key": "xyz", "door_code": "9876", } res = ReservationData.from_dict(d) assert res.guest_name == "Bob" assert res.check_in_date == date(2026, 8, 1) assert res.check_in_time == time(15, 0) assert res.check_out_date == date(2026, 8, 4) assert res.check_out_time == time(11, 0) assert res.wifi_key == "xyz" assert res.door_code == "9876" def test_from_dict_none_fields(): d = { "guest_name": None, "check_in_date": None, "check_in_time": None, "check_out_date": None, "check_out_time": None, "wifi_ssid": None, "wifi_key": None, "door_code": None, } res = ReservationData.from_dict(d) assert res.guest_name is None assert res.check_in_date is None assert res.check_in_time is None def test_round_trip(): original = ReservationData( guest_name="Carol", check_in_date=date(2026, 9, 10), check_in_time=time(14, 30), check_out_date=date(2026, 9, 14), check_out_time=time(11, 0), wifi_ssid="HomeNet", wifi_key="pw", door_code="0000", ) assert ReservationData.from_dict(original.to_dict()) == original # --------------------------------------------------------------------------- # ReservationData — apply_partial # --------------------------------------------------------------------------- SAMPLE = ReservationData( guest_name="Alice", check_in_date=date(2026, 7, 1), check_in_time=time(14, 0), check_out_date=date(2026, 7, 5), check_out_time=time(12, 0), wifi_ssid="4114", wifi_key="stone", door_code="0472", ) def test_apply_partial_overlays_specified_fields(): updated = SAMPLE.apply_partial({"wifi_ssid": "GuestNet", "door_code": "9999"}) assert updated.wifi_ssid == "GuestNet" assert updated.door_code == "9999" def test_apply_partial_leaves_other_fields_unchanged(): updated = SAMPLE.apply_partial({"door_code": "1111"}) assert updated.guest_name == "Alice" assert updated.check_in_date == date(2026, 7, 1) assert updated.wifi_key == "stone" def test_apply_partial_can_clear_a_field_with_none(): updated = SAMPLE.apply_partial({"guest_name": None}) assert updated.guest_name is None def test_apply_partial_ignores_unknown_keys(): updated = SAMPLE.apply_partial({"nonexistent_field": "x"}) assert updated == SAMPLE def test_apply_partial_empty_dict_returns_equivalent(): updated = SAMPLE.apply_partial({}) assert updated == SAMPLE # --------------------------------------------------------------------------- # ReservationData — defaults # --------------------------------------------------------------------------- def test_default_values(): res = ReservationData() assert res.guest_name is None assert res.check_in_date is None assert res.check_in_time is None assert res.check_out_date is None assert res.check_out_time is None assert res.wifi_ssid is None assert res.wifi_key is None assert res.door_code is None # --------------------------------------------------------------------------- # OverrideData # --------------------------------------------------------------------------- _RES_A = ReservationData(guest_name="Alice") _RES_B = ReservationData(guest_name="Bob") def test_override_data_requires_current(): o = OverrideData(current=_RES_A) assert o.current.guest_name == "Alice" def test_override_data_next_defaults_to_none(): o = OverrideData(current=_RES_A) assert o.next is None def test_override_data_with_next(): o = OverrideData(current=_RES_A, next=_RES_B) assert o.current.guest_name == "Alice" assert o.next.guest_name == "Bob"