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, RequestFactory 

2from django.urls import reverse 

3from rest_framework import status 

4from rest_framework.test import APIRequestFactory, force_authenticate 

5from datetime import datetime, timezone, timedelta 

6from policorp.classViews.availabilityView import AvailabilityView 

7from policorp.models import Availability, Location, Task, User, Booking 

8 

9class TestAvailabilityView(TestCase): 

10 

11 fixtures = ['testsdata.json'] 

12 

13 task1 = {'id': 1, 'name': 'Device Installation', 'duration': 120} 

14 task2 = {'id': 2, 'name': 'Repair', 'duration': 60} 

15 

16 maxDiff = None 

17 

18 def setUp(self): 

19 # Every test needs access to the request factory. 

20 self.factory = APIRequestFactory() 

21 

22 def test_availabilityView_GET_return_405(self): 

23 """ GIVEN ; WHEN GET /policorp/availability/1 ; THEN code 405 should be returned """ 

24 # Create an instance of a GET request. 

25 availabilityid = 1 

26 request = self.factory.get(reverse('policorp:availability', kwargs={'availabilityid': availabilityid})) 

27 response = AvailabilityView.as_view()(request, availabilityid) 

28 self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) 

29 

30 def test_availabilityView_unauthenticated_delete_request_forbidden(self): 

31 """ GIVEN ; WHEN DELETE /policorp/availability/1 unauthenticated ; THEN code 403 should be returned """ 

32 availabilityid = 1 

33 request = self.factory.delete(reverse('policorp:availability', kwargs={'availabilityid': availabilityid})) 

34 response = AvailabilityView.as_view()(request, availabilityid) 

35 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) 

36 

37 def test_availabilityView_supervisor_cant_delete_availability(self): 

38 """ GIVEN an availability at a not supervised location; WHEN DELETE /policorp/availability/1 ; THEN code 403 should be returned """ 

39 

40 now = datetime.now(timezone.utc) 

41 l1 = Location.objects.get(pk=1) 

42 task_name = "Device Installation for Trucks" 

43 t1 = Task.objects.create_task(task_name, 120) 

44 a1 = Availability.objects.create_availability(now + timedelta(minutes = 60), l1, t1) 

45 u1 = User.objects.create_supervisor('foo', 'foo@example.com', 'example') 

46 

47 availabilityid = a1.id 

48 request = self.factory.delete(reverse('policorp:availability', kwargs={'availabilityid': availabilityid})) 

49 force_authenticate(request, user=u1) 

50 response = AvailabilityView.as_view()(request, availabilityid) 

51 self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) 

52 

53 def test_availabilityView_supervisor_deletes_availability(self): 

54 """ GIVEN an availability in a supervised location; WHEN DELETE /policorp/availability/1 ; THEN code 204 should be returned """ 

55 

56 now = datetime.now(timezone.utc) 

57 l1 = Location.objects.get(pk=1) 

58 task_name = "Device Installation for Trucks" 

59 t1 = Task.objects.create_task(task_name, 120) 

60 a1 = Availability.objects.create_availability(now + timedelta(minutes = 60), l1, t1) 

61 u1 = User.objects.create_supervisor('foo', 'foo@example.com', 'example') 

62 l1.assign_supervisor(u1) 

63 

64 availabilityid = a1.id 

65 request = self.factory.delete(reverse('policorp:availability', kwargs={'availabilityid': availabilityid})) 

66 force_authenticate(request, user=u1) 

67 response = AvailabilityView.as_view()(request, availabilityid) 

68 self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) 

69 

70 def test_availabilityView_cant_delete_if_booked(self): 

71 """ GIVEN a booked availability; WHEN DELETE /policorp/availability/1 ; THEN code 409 should be returned """ 

72 

73 now = datetime.now(timezone.utc) 

74 l1 = Location.objects.get(pk=1) 

75 task_name = "Device Installation for Trucks" 

76 t1 = Task.objects.create_task(task_name, 120) 

77 a1 = Availability.objects.create_availability(now + timedelta(minutes = 60), l1, t1) 

78 u1 = User.objects.create_supervisor('foo', 'foo@example.com', 'example') 

79 l1.assign_supervisor(u1) 

80 booking = Booking.objects.book(a1, u1) 

81 

82 availabilityid = a1.id 

83 request = self.factory.delete(reverse('policorp:availability', kwargs={'availabilityid': availabilityid})) 

84 force_authenticate(request, user=u1) 

85 response = AvailabilityView.as_view()(request, availabilityid) 

86 self.assertEqual(response.status_code, status.HTTP_409_CONFLICT) 

87 response.render() 

88 self.assertJSONEqual(str(response.content, encoding='utf8'), {"detail": "Availability is already booked."})