test_reservation.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import pytest
  2. from datetime import date, timedelta
  3. from room_cal.reservations import Reservation
  4. async def test_add_reservation_round_trip():
  5. res = Reservation()
  6. checkin = date.today() - timedelta(days=30)
  7. checkout = checkin + timedelta(days=1)
  8. data = {
  9. 'guest_name': 'Bob Test',
  10. 'service': 'Test Service',
  11. 'reservation_id': 'A1-B2-C3',
  12. 'checkin_date': checkin,
  13. 'checkout_date': checkout,
  14. }
  15. try:
  16. await res.set(data)
  17. stored = await res.get('A1-B2-C3', checkin, checkout)
  18. assert stored is not None, "Reservation not found after set"
  19. assert stored.guest_name == 'Bob Test'
  20. assert stored.reservation_id == 'A1-B2-C3'
  21. finally:
  22. event = await res._find('A1-B2-C3', checkin, checkout)
  23. if event:
  24. await res.delete(event)
  25. async def _make_reservation(res: Reservation, reservation_id: str, checkin: date, checkout: date):
  26. await res.set({
  27. 'guest_name': 'Patch Test',
  28. 'service': 'Test Service',
  29. 'reservation_id': reservation_id,
  30. 'checkin_date': checkin,
  31. 'checkout_date': checkout,
  32. })
  33. return await res._find(reservation_id, checkin, checkout)
  34. async def test_patch_generic_fields():
  35. res = Reservation()
  36. checkin = date.today() - timedelta(days=31)
  37. checkout = checkin + timedelta(days=1)
  38. reservation_id = 'PATCH-FIELDS-1'
  39. try:
  40. event = await _make_reservation(res, reservation_id, checkin, checkout)
  41. result = await res.patch(event.uid, checkin, fields={'door_code': '4242', 'note': 'left a spare key'})
  42. assert result['door_code'] == '4242'
  43. assert result['note'] == 'left a spare key'
  44. assert result['reservation_id'] == reservation_id # untouched identity field survives
  45. stored = await res._find(reservation_id, checkin, checkout)
  46. from room_cal._utils import safe_json_loads
  47. xd = safe_json_loads(stored.x_data)
  48. assert xd['door_code'] == '4242'
  49. assert xd['note'] == 'left a spare key'
  50. finally:
  51. event = await res._find(reservation_id, checkin, checkout)
  52. if event:
  53. await res.delete(event)
  54. async def test_patch_rejects_protected_fields():
  55. res = Reservation()
  56. checkin = date.today() - timedelta(days=32)
  57. checkout = checkin + timedelta(days=1)
  58. reservation_id = 'PATCH-PROTECTED-1'
  59. try:
  60. event = await _make_reservation(res, reservation_id, checkin, checkout)
  61. with pytest.raises(ValueError):
  62. await res.patch(event.uid, checkin, fields={'reservation_id': 'HIJACKED'})
  63. finally:
  64. event = await res._find(reservation_id, checkin, checkout)
  65. if event:
  66. await res.delete(event)
  67. async def test_patch_checkin_checkout_time():
  68. res = Reservation()
  69. checkin = date.today() - timedelta(days=33)
  70. checkout = checkin + timedelta(days=1)
  71. reservation_id = 'PATCH-TIME-1'
  72. try:
  73. event = await _make_reservation(res, reservation_id, checkin, checkout)
  74. result = await res.patch(event.uid, checkin, checkin_time='17:00', checkout_time='09:30')
  75. assert result['checkin_time'] == '17:00'
  76. assert result['checkout_time'] == '09:30'
  77. assert result['checkin_date'] == checkin.isoformat() # date untouched
  78. assert result['checkout_date'] == checkout.isoformat()
  79. stored = await res._find(reservation_id, checkin, checkout)
  80. assert stored.start.date() == checkin
  81. assert stored.start.hour == 17 and stored.start.minute == 0
  82. assert stored.end.date() == checkout
  83. assert stored.end.hour == 9 and stored.end.minute == 30
  84. finally:
  85. event = await res._find(reservation_id, checkin, checkout)
  86. if event:
  87. await res.delete(event)