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.
247 lines
8.9 KiB
247 lines
8.9 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 FindServiceAreaCreateTests(APITestCase):
|
|
endpoint = reverse('find-service-area')
|
|
|
|
@classmethod
|
|
def setUpTestData(cls):
|
|
super(FindServiceAreaCreateTests, 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.last_provider = Provider.objects.create(**{
|
|
'currency': 'USD',
|
|
'email': 'last@email.com',
|
|
'language': 'FR',
|
|
'name': 'Test 3',
|
|
'phone_number': '+34685061776'
|
|
})
|
|
|
|
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'
|
|
)
|
|
cls.another_service_area = ServiceArea.objects.create(
|
|
polygon=Polygon([[50.0, 50.0], [50.0, 100.0], [100.0, 100.0], [100.0, 50.0], [50.0, 50.0]]),
|
|
provider_id=cls.another_provider.id,
|
|
price=85.5,
|
|
name='Test area 2'
|
|
)
|
|
cls.last_service_area = ServiceArea.objects.create(
|
|
polygon=Polygon([[75.0, 50.0], [75.0, 75.0], [100.0, 75.0], [100.0, 50.0], [75.0, 50.0]]),
|
|
provider_id=cls.last_provider.id,
|
|
price=5.2,
|
|
name='Test area 2'
|
|
)
|
|
|
|
def setUp(self) -> None:
|
|
super(FindServiceAreaCreateTests, self).setUp()
|
|
self.get_object_from_cache_mock = mock.patch(
|
|
'apps.providers.views.find_service_area.get_object_from_cache'
|
|
).start()
|
|
self.get_object_from_cache_mock.return_value = True
|
|
|
|
def tearDown(self) -> None:
|
|
super(FindServiceAreaCreateTests, self).tearDown()
|
|
self.get_object_from_cache_mock.reset_mock()
|
|
mock.patch.stopall()
|
|
|
|
def test_find_service_area_case_one_result(self):
|
|
self.get_object_from_cache_mock.return_value = {self.service_area.id}
|
|
|
|
querystring = '?latitude=25.0&longitude=25.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
response_data = response.json()
|
|
|
|
self.assertEqual(response_data['count'], 1)
|
|
self.assertEqual(response_data['results'][0]['id'], self.service_area.id)
|
|
|
|
self.get_object_from_cache_mock.assert_called_once()
|
|
|
|
def test_find_service_area_case_boundary_zero_results(self):
|
|
self.get_object_from_cache_mock.return_value = []
|
|
|
|
querystring = '?latitude=50.0&longitude=50.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
response_data = response.json()
|
|
|
|
self.assertEqual(response_data['count'], 0)
|
|
|
|
self.get_object_from_cache_mock.assert_called_once()
|
|
|
|
def test_find_service_area_case_outside_zero_results(self):
|
|
self.get_object_from_cache_mock.return_value = []
|
|
|
|
querystring = '?latitude=-40.0&longitude=0.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
response_data = response.json()
|
|
|
|
self.assertEqual(response_data['count'], 0)
|
|
|
|
self.get_object_from_cache_mock.assert_called_once()
|
|
|
|
def test_find_service_area_case_inside_two_results(self):
|
|
self.get_object_from_cache_mock.return_value = {self.another_service_area.id, self.last_service_area.id}
|
|
|
|
querystring = '?latitude=80.0&longitude=60.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
response_data = response.json()
|
|
|
|
expected_ids = {self.another_service_area.id, self.last_service_area.id}
|
|
|
|
self.assertEqual(response_data['count'], len(expected_ids))
|
|
|
|
for result in response_data['results']:
|
|
self.assertIn(result['id'], expected_ids)
|
|
|
|
self.get_object_from_cache_mock.assert_called_once()
|
|
|
|
# failure tests
|
|
|
|
def test_find_service_area_failure_missing_latitude(self):
|
|
querystring = '?longitude=25.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('latitude', response_data)
|
|
self.assertEqual(response_data['latitude'], 'Invalid value: None.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_missing_longitude(self):
|
|
querystring = '?latitude=25.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('longitude', response_data)
|
|
self.assertEqual(response_data['longitude'], 'Invalid value: None.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_invalid_value_for_latitude(self):
|
|
invalid_value = 'aa'
|
|
querystring = f'?latitude={invalid_value}&longitude=25.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('latitude', response_data)
|
|
self.assertEqual(response_data['latitude'], f'Invalid value: {invalid_value}.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_invalid_latitude_lower(self):
|
|
invalid_value = -94.1235
|
|
querystring = f'?latitude={invalid_value}&longitude=25.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('latitude', response_data)
|
|
self.assertEqual(response_data['latitude'], f'Invalid value: {invalid_value}.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_invalid_latitude_greater(self):
|
|
invalid_value = 90.1235
|
|
querystring = f'?latitude={invalid_value}&longitude=25.0'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('latitude', response_data)
|
|
self.assertEqual(response_data['latitude'], f'Invalid value: {invalid_value}.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_invalid_value_for_longitude(self):
|
|
invalid_value = 'aa'
|
|
querystring = f'?latitude=25.0&longitude={invalid_value}'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('longitude', response_data)
|
|
self.assertEqual(response_data['longitude'], f'Invalid value: {invalid_value}.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_invalid_longitude_lower(self):
|
|
invalid_value = -200.0123
|
|
querystring = f'?latitude=25.0&longitude={invalid_value}'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('longitude', response_data)
|
|
self.assertEqual(response_data['longitude'], f'Invalid value: {invalid_value}.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|
|
|
|
def test_find_service_area_failure_invalid_longitude_greater(self):
|
|
invalid_value = 190.0123
|
|
querystring = f'?latitude=25.0&longitude={invalid_value}'
|
|
|
|
response = self.client.get(
|
|
self.endpoint + querystring
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
response_data = response.json()
|
|
self.assertIn('longitude', response_data)
|
|
self.assertEqual(response_data['longitude'], f'Invalid value: {invalid_value}.')
|
|
|
|
self.get_object_from_cache_mock.assert_not_called()
|