You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
4.0 KiB

from django.contrib.gis.geos import Polygon
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from unittest import mock
from ..models import Provider, ServiceArea
class ServiceAreaUpdateTests(APITestCase):
endpoint_name = 'service-area-detail'
@classmethod
def setUpTestData(cls):
super(ServiceAreaUpdateTests, cls).setUpTestData()
cls.provider = Provider.objects.create(**{
'currency': 'USD',
'email': 'nicolas@email.com',
'language': 'EN',
'name': 'Test',
'phone_number': '+34685061901'
})
cls.another_provider = Provider.objects.create(**{
'currency': 'USD',
'email': 'another@email.com',
'language': 'SP',
'name': 'Test 2',
'phone_number': '+34685061456'
})
cls.service_area = ServiceArea.objects.create(
polygon=Polygon([[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]),
provider_id=cls.provider.id,
price=500.5,
name='Test area'
)
def setUp(self) -> None:
super(ServiceAreaUpdateTests, self).setUp()
self.add_new_polygon_to_cache_mock = mock.patch('apps.providers.views.area.add_new_polygon_to_cache').start()
self.add_new_polygon_to_cache_mock.return_value = True
def tearDown(self) -> None:
super(ServiceAreaUpdateTests, self).tearDown()
self.add_new_polygon_to_cache_mock.reset_mock()
mock.patch.stopall()
# NOTE ---- Failure tests related to serializer validation are done in the create test class and not repeated here
def test_service_area_update_success(self):
endpoint = reverse(self.endpoint_name, kwargs={'pk': self.service_area.id})
payload = {
'name': 'Test area 2',
'price': 12.5,
'provider': self.provider.id,
'polygon': [[50.0, 50.0], [50.0, 100.0], [100.0, 100.0], [100.0, 50.0], [50.0, 50.0]]
}
response = self.client.put(
endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.service_area.refresh_from_db()
self.assertEqual(self.service_area.name, payload['name'])
self.assertEqual(self.service_area.price, payload['price'])
self.assertEqual(self.service_area.provider_id, self.provider.id)
self.add_new_polygon_to_cache_mock.assert_called_once()
def test_service_area_update_failure_provider_does_not_match(self):
endpoint = reverse(self.endpoint_name, kwargs={'pk': self.service_area.id})
payload = {
'name': 'Test area 2',
'price': 12.5,
'provider': self.another_provider.id,
'polygon': [[50.0, 50.0], [50.0, 100.0], [100.0, 100.0], [100.0, 50.0], [50.0, 50.0]]
}
response = self.client.put(
endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response_data = response.json()
self.assertIn('provider', response_data)
self.assertEqual(response_data['provider'][0], 'Provider does not match.')
self.add_new_polygon_to_cache_mock.assert_not_called()
def test_service_area_update_failure_not_found(self):
endpoint = reverse(self.endpoint_name, kwargs={'pk': self.service_area.id + 100})
payload = {
'name': 'Test area 2',
'price': 12.5,
'provider': self.another_provider.id,
'polygon': [[50.0, 50.0], [50.0, 100.0], [100.0, 100.0], [100.0, 50.0], [50.0, 50.0]]
}
response = self.client.put(
endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.add_new_polygon_to_cache_mock.assert_not_called()