test_closed.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import pytest
  2. from datetime import date, timedelta
  3. from room_cal.closed import Closed, ClosedData, _build_title, _build_description
  4. def test_build_title_all():
  5. assert _build_title(['airbnb', 'booking']) == 'Closed: All'
  6. def test_build_title_single_airbnb():
  7. assert _build_title(['airbnb']) == 'Closed: AirBnB'
  8. def test_build_title_single_booking():
  9. assert _build_title(['booking']) == 'Closed: Booking.com'
  10. def test_build_description():
  11. assert _build_description(['airbnb', 'booking'], {}) == 'AirBnB: Closed\nBooking.com: Closed'
  12. @pytest.mark.asyncio
  13. async def test_set_and_get_round_trip():
  14. """Find a past open day in CalDAV, block it, read back, then restore."""
  15. closed = Closed()
  16. services = ['airbnb', 'booking']
  17. # Scan the past 30–90 days for a date with no existing Closed event.
  18. # Past dates are safe: stale test data won't affect live bookings.
  19. scan_start = date.today() - timedelta(days=70)
  20. scan_end = date.today() - timedelta(days=50)
  21. existing_closures = await closed.list(scan_start, scan_end)
  22. already_closed = {e.start.date() for e in existing_closures}
  23. target = None
  24. d = scan_start
  25. while d <= scan_end:
  26. if d not in already_closed:
  27. target = d
  28. break
  29. d += timedelta(days=1)
  30. assert target is not None, "No open date found in the past 50–70 days"
  31. try:
  32. await closed.set(target, ClosedData(services=services, source={'domain': 'test', 'name': 'Test => ', 'id': 'test'}))
  33. stored = await closed.get(target)
  34. assert stored is not None, f"No Closed event found after set on {target}"
  35. assert sorted(stored.services) == sorted(services), f"Expected {sorted(services)}, got {sorted(stored.services)}"
  36. # Verify the CalDAV event title
  37. event = await closed._find(target)
  38. assert event is not None
  39. assert event.title == 'Closed: All'
  40. assert event.description == 'AirBnB: Closed\nBooking.com: Closed\nSource: Test => test'
  41. finally:
  42. await closed.set(target, ClosedData(services=[]))
  43. assert await closed.get(target) is None, f"Closed event still present after restore on {target}"