from rest_framework.test import APITestCase
from rest_framework import status
from datetime import datetime, timedelta
from apps.core.models.area import Area
from apps.core.models.reservation import Reservation
[docs]class ReservationTestCase(APITestCase):
[docs] @classmethod
def setUpClass(cls):
cls.area = Area.objects.create(office_name='test_office_name')
cls.area2 = Area.objects.create(office_name='2test_office_name')
# POST on /reservations
[docs] def test_post_valid_reservation(self):
data = {
'area': self.area.id,
'time_from': datetime.now(),
'time_to': datetime.now()+timedelta(hours=1)
}
response = self.client.post(f"/api/reservations", data=data, fromat='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.data['area'], self.area.id)
[docs] def test_post_invalid_area_id_id_reservation(self):
data = {
'area': 'some_invalid_id',
'time_from': datetime.now(),
'time_to': datetime.now() + timedelta(hours=1)
}
response = self.client.post(f"/api/reservations", data=data, fromat='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
[docs] def test_post_overlapping_reservation(self):
time_to = datetime.now()
time_from = time_to - timedelta(hours=1)
reservation1 = Reservation.objects.create(area_id=self.area.id, time_from=time_from, time_to=time_to)
data = {
'area': self.area.id,
'time_from': time_from + timedelta(minutes=30),
'time_to': time_to + timedelta(minutes=30)
}
response = self.client.post(f"/api/reservations", data=data, fromat='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.data, 'You can not post an overlapping reservation for same area')
[docs] def test_post_two_valid_reservation_for_same_area(self):
time_to = datetime.now()
time_from = time_to - timedelta(hours=1)
reservation1 = Reservation.objects.create(area_id=self.area.id, time_from=time_from, time_to=time_to)
data = {
'area': self.area.id,
'time_from': time_to + timedelta(minutes=10),
'time_to': time_to + timedelta(minutes=70)
}
response = self.client.post(f"/api/reservations", data=data, fromat='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
#@APITestCase.skip("Problem with put method (get reservation)")
# PUT on /reservation/{reservation_id}
[docs] def test_put_valid_reservation(self):
time_from = datetime.now() - timedelta(hours=1)
time_to = time_from + timedelta(hours=1)
reservation = Reservation.objects.create(area_id=self.area2.id, time_from=time_from, time_to=time_to)
data = {
'area': self.area.id,
'time_from': datetime.now(),
'time_to': datetime.now() + timedelta(hours=1)
}
response = self.client.put(f"/api/reservations/{reservation.id}", data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['area'], self.area.id)
[docs] def test_put_invalid_reservation(self):
time_from = datetime.now() - timedelta(hours=1)
time_to = time_from + timedelta(hours=1)
reservation = Reservation.objects.create(area_id=self.area2.id, time_from=time_from, time_to=time_to)
data = {
'area': 'invalid_id',
'time_from': datetime.now(),
'time_to': datetime.now() + timedelta(hours=1)
}
response = self.client.put(f"/api/reservations/{reservation.id}", data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
# Delete on /reservation/{reservation_id}
[docs] def test_delete_reservation(self):
reservation = Reservation.objects.create(area_id=self.area2.id,
time_from=datetime.now() - timedelta(hours=1),
time_to=datetime.now())
response = self.client.delete(f"/api/reservations/{reservation.id}")
self.assertEqual(response.status_code, status.HTTP_200_OK)
[docs] def test_delete_non_existing_reservation(self):
invalid_id = 'invalid_id'
response = self.client.delete(f"/api/reservations/{invalid_id}")
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
[docs] def test_delete_already_deleted_reservation(self):
reservation = Reservation.objects.create(area_id=self.area2.id,
time_from=datetime.now() - timedelta(hours=1),
time_to=datetime.now())
reservation.soft_delete()
response = self.client.delete(f"/api/reservations/{reservation.id}")
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
# Get on /reservation/{area_id}
[docs] def test_get_all_reservations_for_area(self):
time_from = datetime.now() - timedelta(hours=1)
time_to = datetime.now()
reservation = Reservation.objects.create(area_id=self.area2.id,
time_from=time_from,
time_to=time_to)
reservation2 = Reservation.objects.create(area_id=self.area2.id,
time_from=time_to + timedelta(hours=1),
time_to=time_to + timedelta(hours=2))
response = self.client.get(f"/api/reservations/{self.area2.id}")
self.assertEqual(response.status_code, status.HTTP_200_OK)
for reserv in response.data:
self.assertEqual(reserv['area'], self.area2.id)
[docs] def test_get_reservations_for_non_existing_area(self):
time_from = datetime.now() - timedelta(hours=1)
time_to = datetime.now()
reservation = Reservation.objects.create(area_id=self.area2.id,
time_from=time_from,
time_to=time_to)
reservation2 = Reservation.objects.create(area_id=self.area2.id,
time_from=time_to + timedelta(hours=1),
time_to=time_to + timedelta(hours=2))
response = self.client.get(f"/api/reservations/{self.area.id}")
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data, [])
[docs] @classmethod
def tearDownClass(cls):
cls.area.delete()
cls.area2.delete()