Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1from django.test import TestCase 

2from datetime import datetime 

3from django.utils import timezone 

4from policorp.models import Availability, Booking 

5from policorp.tests import aux 

6import json 

7 

8class TestBooking(TestCase): 

9 

10 fixtures = ['testsdata.json'] 

11 

12 def test_book_availability_user(self): 

13 """ Booking an availability registers who boooked it """ 

14 availability = Availability.objects.get(pk=1) 

15 user = aux.createUser("foo", "foo@example.com", "example") 

16 b = Booking.objects.book(availability, user) 

17 self.assertEqual(len(Booking.objects.filter(availability=availability)), 1) 

18 self.assertEqual(Booking.objects.filter(availability=availability)[0].user, user) 

19 

20 def test_book_availability_is_booked(self): 

21 """ Booking an availability marks it as booked """ 

22 availability = Availability.objects.get(pk=1) 

23 user = aux.createUser("foo", "foo@example.com", "example") 

24 b = Booking.objects.book(availability, user) 

25 availability = Availability.objects.get(pk=1) 

26 self.assertTrue(availability.booked) 

27 

28 def test_booking_serialize_json(self): 

29 """ GIVEN a booking; WHEN requesting json serialization; THEN it should be returned in json format """ 

30 availability = Availability.objects.get(pk=1) 

31 user = aux.createUser("foo", "foo@example.com", "example") 

32 booking = Booking.objects.book(availability, user) 

33 

34 expected_json = {'id': 1, 'availability': availability.json(), 'username': user.username } 

35 

36 self.assertEqual(booking.json()["availability"] , expected_json["availability"]) 

37 self.assertEqual(booking.json()["username"], expected_json["username"]) 

38 

39 def test_booking_get_my_bookings(self): 

40 """ GIVEN 2 bookings, 1 for user foo and 1 for user juan; WHEN requesting user bookings for foo; THEN 1 booking with user foo should be returned """ 

41 availability1 = Availability.objects.get(pk=1) 

42 user1 = aux.createUser("foo", "foo@example.com", "example") 

43 b1 = Booking.objects.book(availability1, user1) 

44 availability2 = Availability.objects.get(pk=2) 

45 user2 = aux.createUser("juan", "juan@example.com", "example") 

46 b2 = Booking.objects.book(availability2, user2) 

47 bookingsforfoo = Booking.objects.get_by_user(user1) 

48 

49 self.assertEqual(len(bookingsforfoo), 1) 

50 self.assertEqual(bookingsforfoo[0].user, user1) 

51 

52 def test_booking_get_my_bookings_ordered(self): 

53 """ GIVEN 2 bookings for user foo; WHEN requesting bookings for user foo; THEN 2 bookings should be returned ordered by ascending availability date """ 

54 user1 = aux.createUser("foo", "foo@example.com", "example") 

55 availability1 = Availability.objects.get(pk=2) 

56 b1 = Booking.objects.book(availability1, user1) 

57 availability2 = Availability.objects.get(pk=1) 

58 b2 = Booking.objects.book(availability2, user1) 

59 bookingsforfoo = Booking.objects.get_by_user(user1) 

60 

61 self.assertEqual(len(bookingsforfoo), 2) 

62 self.assertTrue(bookingsforfoo[0].availability.when < bookingsforfoo[1].availability.when) 

63 

64 def test_booking_get_my_bookings_ordered_2(self): 

65 """ GIVEN 2 bookings for user foo; WHEN requesting bookings for user foo; THEN 2 bookings should be returned ordered by ascending availability date """ 

66 user1 = aux.createUser("foo", "foo@example.com", "example") 

67 availability1 = Availability.objects.get(pk=1) 

68 b1 = Booking.objects.book(availability1, user1) 

69 availability2 = Availability.objects.get(pk=2) 

70 b2 = Booking.objects.book(availability2, user1) 

71 bookingsforfoo = Booking.objects.get_by_user(user1) 

72 

73 self.assertEqual(len(bookingsforfoo), 2) 

74 self.assertTrue(bookingsforfoo[0].availability.when < bookingsforfoo[1].availability.when) 

75 

76 def test_booking_get_my_bookings_not_cancelled(self): 

77 """ GIVEN 2 bookings for user foo, 1 cancelled; WHEN requesting bookings for user foo; THEN 1 bookings not cancelled should be returned """ 

78 user1 = aux.createUser("foo", "foo@example.com", "example") 

79 availability1 = Availability.objects.get(pk=1) 

80 b1 = Booking.objects.book(availability1, user1) 

81 availability2 = Availability.objects.get(pk=2) 

82 b2 = Booking.objects.book(availability2, user1) 

83 b1 = b1.cancel() 

84 bookingsforfoo = Booking.objects.get_by_user(user1) 

85 

86 self.assertEqual(len(bookingsforfoo), 1) 

87 self.assertFalse(bookingsforfoo[0].cancelled) 

88 

89 def test_booking_cancel_1(self): 

90 """ GIVEN a booking, WHEN it is cancelled; THEN it is marked as cancelled """ 

91 availability = Availability.objects.get(pk=1) 

92 user = aux.createUser("foo", "foo@example.com", "example") 

93 booking = Booking.objects.book(availability, user) 

94 booking = booking.cancel() 

95 

96 self.assertTrue(booking.cancelled) 

97 

98 def test_booking_initially_not_cancelled(self): 

99 """ GIVEN a booking, WHEN ; THEN it is initially not marked as cancelled """ 

100 availability = Availability.objects.get(pk=1) 

101 user = aux.createUser("foo", "foo@example.com", "example") 

102 booking = Booking.objects.book(availability, user) 

103 

104 self.assertFalse(booking.cancelled) 

105 

106 def test_booking_cancel_2(self): 

107 """ GIVEN a booking, WHEN it is cancelled; THEN it's availability is freed """ 

108 availability = Availability.objects.get(pk=1) 

109 user = aux.createUser("foo", "foo@example.com", "example") 

110 booking = Booking.objects.book(availability, user) 

111 booking = booking.cancel() 

112 

113 self.assertFalse(booking.availability.booked) 

114 

115 def test_booking_get_by_location_and_date(self): 

116 """ GIVEN 2 bookings, 1 for user foo and 1 for user juan; WHEN requesting user bookings for Buenos Aires on the 2th of January 2020; THEN 1 booking with user foo should be returned """ 

117 availability1 = Availability.objects.get(pk=1) 

118 user1 = aux.createUser("foo", "foo@example.com", "example") 

119 b1 = Booking.objects.book(availability1, user1) 

120 availability2 = Availability.objects.get(pk=2) 

121 user2 = aux.createUser("juan", "juan@example.com", "example") 

122 b2 = Booking.objects.book(availability2, user2) 

123 result = Booking.objects.get_by_location_and_date(availability1.where, datetime(2021,1,2, 0, 0, 0, 0, timezone.utc) ) 

124 

125 self.assertEqual(len(result), 1) 

126 self.assertEqual(result[0].user, user1) 

127 self.assertEqual(result[0].availability, availability1) 

128 

129 def test_booking_get_by_location_and_date_no_results(self): 

130 """ GIVEN 2 bookings, 1 for user foo and 1 for user juan; WHEN requesting user bookings for Buenos Aires on the 10th of January 2020; THEN 1 booking with user foo should be returned """ 

131 availability1 = Availability.objects.get(pk=1) 

132 user1 = aux.createUser("foo", "foo@example.com", "example") 

133 b1 = Booking.objects.book(availability1, user1) 

134 availability2 = Availability.objects.get(pk=2) 

135 user2 = aux.createUser("juan", "juan@example.com", "example") 

136 b2 = Booking.objects.book(availability2, user2) 

137 result = Booking.objects.get_by_location_and_date(availability1.where, datetime(2021,1,10, 0, 0, 0, 0, timezone.utc) ) 

138 

139 self.assertEqual(len(result), 0) 

140 

141 def test_book_availability_with_notes(self): 

142 """ Booking an availability with notes, saves those notes """ 

143 availability = Availability.objects.get(pk=1) 

144 user = aux.createUser("foo", "foo@example.com", "example") 

145 note = "Patient: Wilfredo" 

146 b = Booking.objects.book(availability, user, note) 

147 self.assertEqual(len(Booking.objects.filter(availability=availability)), 1) 

148 self.assertEqual(Booking.objects.filter(availability=availability)[0].user, user) 

149 self.assertEqual(Booking.objects.filter(availability=availability)[0].note, note) 

150 

151 def test_booking_serialize_json_with_note(self): 

152 """ GIVEN a booking; WHEN requesting json serialization; THEN it should be returned in json format """ 

153 availability = Availability.objects.get(pk=1) 

154 user = aux.createUser("foo", "foo@example.com", "example") 

155 note = "Patient: Wilfredo" 

156 booking = Booking.objects.book(availability, user, note) 

157 

158 expected_json = {'id': 1, 'availability': availability.json(), 'username': user.username, 'note': note } 

159 

160 self.assertEqual(booking.json()["availability"] , expected_json["availability"]) 

161 self.assertEqual(booking.json()["username"], expected_json["username"]) 

162 self.assertEqual(booking.json()["note"], expected_json["note"])