test_models.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. from datetime import date, datetime, time, timezone
  2. import pytest
  3. from custom_components.room_cal_ha.models import ApiStatusData, ReservationData
  4. # ---------------------------------------------------------------------------
  5. # ReservationData — serialization
  6. # ---------------------------------------------------------------------------
  7. def test_to_dict_serializes_dates_and_times():
  8. res = ReservationData(
  9. guest_name="Alice",
  10. check_in_date=date(2026, 7, 1),
  11. check_in_time=time(14, 0),
  12. check_out_date=date(2026, 7, 5),
  13. check_out_time=time(12, 0),
  14. wifi_key="abc",
  15. door_code="1234",
  16. )
  17. d = res.to_dict()
  18. assert d["guest_name"] == "Alice"
  19. assert d["check_in_date"] == "2026-07-01"
  20. assert d["check_in_time"] == "14:00:00"
  21. assert d["check_out_date"] == "2026-07-05"
  22. assert d["check_out_time"] == "12:00:00"
  23. assert d["wifi_key"] == "abc"
  24. assert d["door_code"] == "1234"
  25. def test_to_dict_none_fields_stay_none():
  26. res = ReservationData(guest_name=None, check_in_date=None, wifi_key=None)
  27. d = res.to_dict()
  28. assert d["guest_name"] is None
  29. assert d["check_in_date"] is None
  30. assert d["wifi_key"] is None
  31. def test_from_dict_deserializes_iso_strings():
  32. d = {
  33. "guest_name": "Bob",
  34. "check_in_date": "2026-08-01",
  35. "check_in_time": "15:00:00",
  36. "check_out_date": "2026-08-04",
  37. "check_out_time": "11:00:00",
  38. "wifi_ssid": "Net",
  39. "wifi_key": "xyz",
  40. "door_code": "9876",
  41. }
  42. res = ReservationData.from_dict(d)
  43. assert res.guest_name == "Bob"
  44. assert res.check_in_date == date(2026, 8, 1)
  45. assert res.check_in_time == time(15, 0)
  46. assert res.check_out_date == date(2026, 8, 4)
  47. assert res.check_out_time == time(11, 0)
  48. assert res.wifi_key == "xyz"
  49. assert res.door_code == "9876"
  50. def test_from_dict_none_fields():
  51. d = {
  52. "guest_name": None,
  53. "check_in_date": None,
  54. "check_in_time": None,
  55. "check_out_date": None,
  56. "check_out_time": None,
  57. "wifi_ssid": None,
  58. "wifi_key": None,
  59. "door_code": None,
  60. }
  61. res = ReservationData.from_dict(d)
  62. assert res.guest_name is None
  63. assert res.check_in_date is None
  64. assert res.check_in_time is None
  65. def test_round_trip():
  66. original = ReservationData(
  67. guest_name="Carol",
  68. check_in_date=date(2026, 9, 10),
  69. check_in_time=time(14, 30),
  70. check_out_date=date(2026, 9, 14),
  71. check_out_time=time(11, 0),
  72. wifi_ssid="HomeNet",
  73. wifi_key="pw",
  74. door_code="0000",
  75. )
  76. assert ReservationData.from_dict(original.to_dict()) == original
  77. # ---------------------------------------------------------------------------
  78. # ReservationData — apply_partial
  79. # ---------------------------------------------------------------------------
  80. SAMPLE = ReservationData(
  81. guest_name="Alice",
  82. check_in_date=date(2026, 7, 1),
  83. check_in_time=time(14, 0),
  84. check_out_date=date(2026, 7, 5),
  85. check_out_time=time(12, 0),
  86. wifi_ssid="4114",
  87. wifi_key="stone",
  88. door_code="0472",
  89. )
  90. def test_apply_partial_overlays_specified_fields():
  91. updated = SAMPLE.apply_partial({"wifi_ssid": "GuestNet", "door_code": "9999"})
  92. assert updated.wifi_ssid == "GuestNet"
  93. assert updated.door_code == "9999"
  94. def test_apply_partial_leaves_other_fields_unchanged():
  95. updated = SAMPLE.apply_partial({"door_code": "1111"})
  96. assert updated.guest_name == "Alice"
  97. assert updated.check_in_date == date(2026, 7, 1)
  98. assert updated.wifi_key == "stone"
  99. def test_apply_partial_can_clear_a_field_with_none():
  100. updated = SAMPLE.apply_partial({"guest_name": None})
  101. assert updated.guest_name is None
  102. def test_apply_partial_ignores_unknown_keys():
  103. updated = SAMPLE.apply_partial({"nonexistent_field": "x"})
  104. assert updated == SAMPLE
  105. def test_apply_partial_empty_dict_returns_equivalent():
  106. updated = SAMPLE.apply_partial({})
  107. assert updated == SAMPLE
  108. # ---------------------------------------------------------------------------
  109. # ReservationData — defaults
  110. # ---------------------------------------------------------------------------
  111. def test_default_values():
  112. res = ReservationData()
  113. assert res.guest_name is None
  114. assert res.check_in_date is None
  115. assert res.check_in_time is None
  116. assert res.check_out_date is None
  117. assert res.check_out_time is None
  118. assert res.wifi_ssid is None
  119. assert res.wifi_key is None
  120. assert res.door_code is None
  121. # ---------------------------------------------------------------------------
  122. # ApiStatusData — defaults
  123. # ---------------------------------------------------------------------------
  124. def test_api_status_defaults():
  125. s = ApiStatusData()
  126. assert s.status == "unknown"
  127. assert s.checks == {}
  128. assert s.checked_at is None
  129. assert s.stale is False
  130. def test_api_status_with_data():
  131. ts = datetime(2026, 6, 22, 10, 0, tzinfo=timezone.utc)
  132. s = ApiStatusData(
  133. status="ok",
  134. checks={"caldav_connection": {"ok": True}},
  135. checked_at=ts,
  136. stale=False,
  137. )
  138. assert s.status == "ok"
  139. assert s.checks["caldav_connection"]["ok"] is True
  140. assert s.checked_at == ts