def test_booking_get_by_location_and_date_no_results(self): """ 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 """ availability1 = Availability.objects.get(pk=1) user1 = aux.createUser("foo", "*****@*****.**", "example") b1 = Booking.objects.book(availability1, user1) availability2 = Availability.objects.get(pk=2) user2 = aux.createUser("juan", "*****@*****.**", "example") b2 = Booking.objects.book(availability2, user2) result = Booking.objects.get_by_location_and_date(availability1.where, datetime(2021,1,10, 0, 0, 0, 0, timezone.utc) ) self.assertEqual(len(result), 0)
def test_view_cancelbooking_only_user_in_booking_allowed(self): """ GIVEN a booking for user foo; WHEN POST /policorp/cancelbooking/1 logged in with user zoe; THEN code 401 (unauthorized) should be returned """ user1 = aux.createUser("foo", "*****@*****.**", "example") availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) user2 = aux.createUser("zoe", "*****@*****.**", "example") request = self.factory.post( reverse('policorp:cancelbooking', kwargs={'bookingid': 1})) request.user = user2 response = cancelbooking(request, 1) self.assertEqual(response.status_code, 401)
def test_booking_get_my_bookings(self): """ 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 """ availability1 = Availability.objects.get(pk=1) user1 = aux.createUser("foo", "*****@*****.**", "example") b1 = Booking.objects.book(availability1, user1) availability2 = Availability.objects.get(pk=2) user2 = aux.createUser("juan", "*****@*****.**", "example") b2 = Booking.objects.book(availability2, user2) bookingsforfoo = Booking.objects.get_by_user(user1) self.assertEqual(len(bookingsforfoo), 1) self.assertEqual(bookingsforfoo[0].user, user1)
def test_get_schedule_sorted_json_2(self): l = Location.objects.create_location('Córdoba') t = Task.objects.get(pk=2) new_availability = Availability.objects.create_availability( Availability.objects.get(pk=4).when, l, t) availabilities = [ Availability.objects.get(pk=5), Availability.objects.get(pk=6) ] user = aux.createUser("foo", "*****@*****.**", "example") bookings = [Booking.objects.book(Availability.objects.get(pk=4), user)] sch = Schedule(date.today(), l, availabilities, bookings) expected_json = { 'date': sch.date, 'location': sch.location.json(), 'schedule': [{ 'booking': bookings[0].json() }, { 'availability': availabilities[0].json() }, { 'availability': availabilities[1].json() }] } self.assertJSONEqual( json.dumps(sch.json()), json.dumps(expected_json, cls=aux.DateTimeEncoder))
def test_myschedule_view_return_200(self): """*** My Schedule view get request needs to be with response 200, logged in ***""" c = Client() u = aux.createUser('foo', '*****@*****.**', 'example') c.login(username='******', password='******') response = c.get(reverse('policorp:myschedule')) self.assertEqual(response.status_code, 200)
def test_booking_initially_not_cancelled(self): """ GIVEN a booking, WHEN ; THEN it is initially not marked as cancelled """ availability = Availability.objects.get(pk=1) user = aux.createUser("foo", "*****@*****.**", "example") booking = Booking.objects.book(availability, user) self.assertFalse(booking.cancelled)
def test_view_locationschedule_return_full_schedule(self): """ GIVEN 3 availabilities for 2021-01-04 at location 2, 1 booked; WHEN requesting schedule for 2021-01-04 at location 2; 1 booking and 2 availabilities should be returned """ request = self.factory.get( reverse('policorp:locationschedule', kwargs={ 'locationid': 2, 'date': '20210104' })) user = User.objects.create_supervisor('foo', '*****@*****.**', 'example') request.user = user location = Location.objects.get(pk=2) location.assign_supervisor(user) booker4 = aux.createUser('bar', '*****@*****.**', 'example') booking4 = Booking.objects.book(Availability.objects.get(pk=4), booker4) expected_data = { 'date': '2021-01-04', 'location': location.json(), 'schedule': [{ "booking": Booking.objects.get(id=booking4.id).json() }, { "availability": Availability.objects.get(pk=5).json() }, { "availability": Availability.objects.get(pk=6).json() }] } response = locationschedule(request, 2, '20210104') logging.debug(str(response.content, encoding='utf8')) self.assertJSONEqual(str(response.content, encoding='utf8'), expected_data)
def test_book_availability_is_booked(self): """ Booking an availability marks it as booked """ availability = Availability.objects.get(pk=1) user = aux.createUser("foo", "*****@*****.**", "example") b = Booking.objects.book(availability, user) availability = Availability.objects.get(pk=1) self.assertTrue(availability.booked)
def test_book_availability_user(self): """ Booking an availability registers who boooked it """ availability = Availability.objects.get(pk=1) user = aux.createUser("foo", "*****@*****.**", "example") b = Booking.objects.book(availability, user) self.assertEqual(Booking.objects.get(pk=1).user, user) self.assertEqual(Booking.objects.get(pk=1).availability, availability)
def test_view_book(self): """ GIVEN ; WHEN POST /policorp/book/1 ; THEN code 201 is returned """ request = self.factory.post( reverse('policorp:book', kwargs={'availabilityid': 1})) request.user = aux.createUser("foo", "*****@*****.**", "example") response = book(request, 1) self.assertEqual(response.status_code, 201)
def test_view_createavailabilities_only_logged_in_supervisor_requests_allowed( self): """ GIVEN ; WHEN POST /policorp/createavailabilities logged in with non supervisor user; THEN code 401 (unauthorized) should be returned """ request = self.factory.post(reverse('policorp:createavailabilities')) request.user = aux.createUser('foo', '*****@*****.**', 'example') response = createavailabilities(request) self.assertEqual(response.status_code, 401)
def test_view_locationschedule_return_1_booking_2(self): """ GIVEN 2 booking for 2021-01-02 and 2021-01-03 at location 3; WHEN requesting schedule for 2021-01-02 at location 1; 1 json object is returned """ request = self.factory.get( reverse('policorp:locationschedule', kwargs={ 'locationid': 3, 'date': '20210102' })) user = User.objects.create_supervisor('foo', '*****@*****.**', 'example') request.user = user location = Location.objects.get(pk=3) location.assign_supervisor(user) booker = aux.createUser('bar', '*****@*****.**', 'example') booking3 = Booking.objects.book(Availability.objects.get(pk=3), booker) booking2 = Booking.objects.book(Availability.objects.get(pk=2), booker) response = locationschedule(request, 3, '20210102') expected_data = { 'date': '2021-01-02', 'location': location.json(), 'schedule': [ { "booking": Booking.objects.get(id=booking3.id).json() }, ] } self.assertJSONEqual(str(response.content, encoding='utf8'), expected_data)
def test_view_mysupervisedlocations_only_logged_in_supervisors_requests_allowed( self): """ GIVEN ; WHEN GET /mysupervisedlocations logged in with a consumer user; THEN code 401 (unauthorized) should be returned """ request = self.factory.get(reverse('policorp:mysupervisedlocations')) request.user = aux.createUser('foo', '*****@*****.**', 'example') response = mysupervisedlocations(request) self.assertEqual(response.status_code, 401)
def test_view_locationschedule_return_1_booking_ordered_ascending(self): """ GIVEN 3 booking for 2021-01-04 at location 2; WHEN requesting schedule for 2021-01-04 at location 2; 3 json objects are returned in ascending order """ request = self.factory.get( reverse('policorp:locationschedule', kwargs={ 'locationid': 2, 'date': '20210104' })) user = User.objects.create_supervisor('foo', '*****@*****.**', 'example') request.user = user location = Location.objects.get(pk=2) location.assign_supervisor(user) booker4 = aux.createUser('bar', '*****@*****.**', 'example') booker5 = aux.createUser('zoe', '*****@*****.**', 'example') booker6 = aux.createUser('kari', '*****@*****.**', 'example') booking5 = Booking.objects.book(Availability.objects.get(pk=5), booker5) booking6 = Booking.objects.book(Availability.objects.get(pk=6), booker6) booking4 = Booking.objects.book(Availability.objects.get(pk=4), booker4) response = locationschedule(request, 2, '20210104') expected_data = [ Booking.objects.get(id=booking4.id).json(), Booking.objects.get(id=booking5.id).json(), Booking.objects.get(id=booking6.id).json() ] expected_data = { 'date': '2021-01-04', 'location': location.json(), 'schedule': [ { "booking": Booking.objects.get(id=booking4.id).json() }, { "booking": Booking.objects.get(id=booking5.id).json() }, { "booking": Booking.objects.get(id=booking6.id).json() }, ] } self.assertJSONEqual(str(response.content, encoding='utf8'), expected_data)
def test_booking_cancel(self): """ GIVEN a booking, WHEN it is cancelled; THEN it's availability is freed """ availability = Availability.objects.get(pk=1) user = aux.createUser("foo", "*****@*****.**", "example") booking = Booking.objects.book(availability, user) booking = booking.cancel() self.assertFalse(booking.availability.booked)
def test_book_view_return_201(self): """*** Booking an availability with a post request should return 201 ****""" c = Client() u = aux.createUser('foo', '*****@*****.**', 'example') c.login(username='******', password='******') response = c.post( reverse('policorp:book', kwargs={'availabilityid': 1})) self.assertEqual(response.status_code, 201)
def test_booking_serialize_json(self): """ GIVEN a booking; WHEN requesting json serialization; THEN it should be returned in json format """ availability = Availability.objects.get(pk=1) user = aux.createUser("foo", "*****@*****.**", "example") booking = Booking.objects.book(availability, user) expected_json = {'id': 1, 'availability': availability.json(), 'username': user.username} self.assertJSONEqual(json.dumps(booking.json()), json.dumps(expected_json))
def test_cancelbooking_view_return_201(self): """*** Cancelling a booking with a post request should return 201 ****""" user1 = aux.createUser('foo', '*****@*****.**', 'example') availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) c = Client() c.login(username='******', password='******') response = c.post( reverse('policorp:cancelbooking', kwargs={'bookingid': 1})) self.assertEqual(response.status_code, 201)
def test_view_cancelbooking(self): """ GIVEN a booking for user foo; WHEN POST /policorp/cancelbooking/1 ; THEN code 201 is returned """ user1 = aux.createUser("foo", "*****@*****.**", "example") availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) request = self.factory.post( reverse('policorp:cancelbooking', kwargs={'bookingid': 1})) request.user = user1 response = cancelbooking(request, 1) self.assertEqual(response.status_code, 201)
def test_view_book_returns_booking_json(self): """ GIVEN ; WHEN POST /policorp/book/1 ; THEN code 201 is returned """ request = self.factory.post( reverse('policorp:book', kwargs={'availabilityid': 1})) request.user = aux.createUser("foo", "*****@*****.**", "example") response = book(request, 1) expected_json = Booking.objects.get(pk=1).json() self.assertJSONEqual(str(response.content, encoding='utf8'), expected_json)
def test_booking_get_my_bookings_ordered_2(self): """ GIVEN 2 bookings for user foo; WHEN requesting bookings for user foo; THEN 2 bookings should be returned ordered by ascending availability date """ user1 = aux.createUser("foo", "*****@*****.**", "example") availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) availability2 = Availability.objects.get(pk=2) b2 = Booking.objects.book(availability2, user1) bookingsforfoo = Booking.objects.get_by_user(user1) self.assertEqual(len(bookingsforfoo), 2) self.assertTrue(bookingsforfoo[0].availability.when < bookingsforfoo[1].availability.when)
def test_view_locationschedule_only_logged_in_rolepervisor_requests_allowed( self): """ GIVEN ; WHEN GET /locationschedule/1/20210102 logged in with a non supervisor user; THEN code 401 (unauthorized) should be returned """ request = self.factory.get( reverse('policorp:locationschedule', kwargs={ 'locationid': 1, 'date': '20210102' })) request.user = aux.createUser('foo', '*****@*****.**', 'example') response = locationschedule(request, 1, '20210102') self.assertEqual(response.status_code, 401)
def test_booking_get_my_bookings_not_cancelled(self): """ GIVEN 2 bookings for user foo, 1 cancelled; WHEN requesting bookings for user foo; THEN 1 bookings not cancelled should be returned """ user1 = aux.createUser("foo", "*****@*****.**", "example") availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) availability2 = Availability.objects.get(pk=2) b2 = Booking.objects.book(availability2, user1) b1 = b1.cancel() bookingsforfoo = Booking.objects.get_by_user(user1) self.assertEqual(len(bookingsforfoo), 1) self.assertFalse(bookingsforfoo[0].cancelled)
def test_view_cancelbooking_returns_cancelled_booking(self): """ GIVEN a booking for user foo; WHEN POST /cancelbooking with user foo; THEN json with 2 bookings should be returned""" user1 = aux.createUser("foo", "*****@*****.**", "example") availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) request = self.factory.post( reverse('policorp:cancelbooking', kwargs={'bookingid': 1})) request.user = user1 response = cancelbooking(request, 1) expected_json = Booking.objects.get(pk=1).json() self.assertJSONEqual(str(response.content, encoding='utf8'), expected_json)
def test_view_myschedule_returns_caller_bookings(self): """ GIVEN 2 bookings for user foo; WHEN GET /myschedule with user foo; THEN json with 2 bookings should be returned""" user1 = aux.createUser("foo", "*****@*****.**", "example") availability1 = Availability.objects.get(pk=1) b1 = Booking.objects.book(availability1, user1) availability2 = Availability.objects.get(pk=2) b2 = Booking.objects.book(availability2, user1) request = self.factory.get(reverse('policorp:myschedule')) request.user = user1 response = myschedule(request) expected_json = [b1.json(), b2.json()] self.assertJSONEqual(str(response.content, encoding='utf8'), expected_json)
def test_get_schedule_sorted_array_1(self): """ GIVEN a schedule; WHEN it is requested; THEN it is a sorted ascending array by date """ l = Location.objects.create_location('Córdoba') availabilities = [ Availability.objects.get(pk=4), Availability.objects.get(pk=6) ] bookings = [ Booking.objects.book( Availability.objects.get(pk=5), aux.createUser("foo", "*****@*****.**", "example")) ] sch = Schedule(date.today(), l, availabilities, bookings) expected_array = [availabilities[0], bookings[0], availabilities[1]] self.assertEqual(sch.toSortedScheduleArray(), expected_array)
def test_create_schedule_date_and_location_and_availabilities_and_bookings( self): """ A schedule should contain a date, a location, an array of availabilities and an array of bookings """ l = Location.objects.create_location('Córdoba') availabilities = [ Availability.objects.get(pk=4), Availability.objects.get(pk=6) ] bookings = [ Booking.objects.book( Availability.objects.get(pk=5), aux.createUser("foo", "*****@*****.**", "example")) ] sch = Schedule(date.today(), l, availabilities, bookings) self.assertEqual(sch.date, date.today()) self.assertEqual(sch.location, l) self.assertEqual(sch.availabilities, availabilities) self.assertEqual(sch.bookings, bookings)
def test_get_schedule_sorted_array_two_equal_bookings(self): """ GIVEN a schedule; WHEN it is requested; THEN it is a sorted ascending array by date """ l = Location.objects.create_location('Córdoba') t = Task.objects.get(pk=2) new_availability = Availability.objects.create_availability( Availability.objects.get(pk=4).when, l, t) availabilities = [ Availability.objects.get(pk=6), Availability.objects.get(pk=5) ] user = aux.createUser("foo", "*****@*****.**", "example") bookings = [ Booking.objects.book(Availability.objects.get(pk=4), user), Booking.objects.book(new_availability, user), ] sch = Schedule(date.today(), l, availabilities, bookings) expected_array = [ bookings[0], bookings[1], availabilities[1], availabilities[0] ] self.assertEqual(sch.toSortedScheduleArray(), expected_array)
def test_view_myschedule_returns_200(self): """ GIVEN ; WHEN GET /myschedule ; THEN code 200 is returned """ request = self.factory.get(reverse('policorp:myschedule')) request.user = aux.createUser('foo', '*****@*****.**', 'example') response = myschedule(request) self.assertEqual(response.status_code, 200)
def test_location_supervisor_user_is_not_supervisor_error(self): """ GIVEN 1 location; WHEN assigning a consumer user; THEN a ValidationError is raised """ l1 = Location.objects.get(pk=1) u = aux.createUser("foo", "*****@*****.**", "example") with self.assertRaises(ValidationError): l1.assign_supervisor(u)