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.

180 lines
6.2 KiB

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 ServiceAreaCreateTests(APITestCase):
endpoint = reverse('service-area-list')
@classmethod
def setUpTestData(cls):
super(ServiceAreaCreateTests, cls).setUpTestData()
cls.payload = {
'currency': 'USD',
'email': 'nicolas@email.com',
'language': 'EN',
'name': 'Test',
'phone_number': '+34685061901'
}
cls.provider = Provider.objects.create(**cls.payload)
def setUp(self) -> None:
super(ServiceAreaCreateTests, 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(ServiceAreaCreateTests, self).tearDown()
self.add_new_polygon_to_cache_mock.reset_mock()
mock.patch.stopall()
def test_service_area_create_success(self):
payload = {
'name': 'Test area',
'price': 500.5,
'provider': self.provider.id,
'polygon': [[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]
}
response = self.client.post(
self.endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
service_area_qs = ServiceArea.objects.all()
self.assertEqual(service_area_qs.count(), 1)
service_area_obj = service_area_qs.first()
self.assertEqual(service_area_obj.provider_id, payload['provider'])
self.assertEqual(service_area_obj.name, payload['name'])
self.assertEqual(service_area_obj.price, payload['price'])
self.assertEqual(service_area_obj.polygon.num_points, len(payload['polygon']))
self.add_new_polygon_to_cache_mock.assert_called_once()
# failure tests
def test_service_area_create_failure_missing_required_field_name(self):
payload = {
'price': 500.5,
'provider': self.provider.id,
'polygon': [[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]
}
response = self.client.post(
self.endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response_data = response.json()
self.assertIn('name', response_data)
self.assertEqual(response_data['name'][0], 'This field is required.')
self.add_new_polygon_to_cache_mock.assert_not_called()
def test_service_area_create_failure_missing_required_field_price(self):
payload = {
'name': 'Test area',
'provider': self.provider.id,
'polygon': [[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]
}
response = self.client.post(
self.endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response_data = response.json()
self.assertIn('price', response_data)
self.assertEqual(response_data['price'][0], 'This field is required.')
self.add_new_polygon_to_cache_mock.assert_not_called()
def test_service_area_create_failure_missing_required_field_provider(self):
payload = {
'name': 'Test area',
'price': 500.5,
'polygon': [[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]
}
response = self.client.post(
self.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], 'This field is required.')
self.add_new_polygon_to_cache_mock.assert_not_called()
def test_service_area_create_failure_missing_required_field_polygon(self):
payload = {
'name': 'Test area',
'price': 500.5,
'provider': self.provider.id
}
response = self.client.post(
self.endpoint,
payload,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
response_data = response.json()
self.assertIn('polygon', response_data)
self.assertEqual(response_data['polygon'][0], 'This field is required.')
self.add_new_polygon_to_cache_mock.assert_not_called()
def test_service_area_create_failure_invalid_provider_type(self):
payload = {
'name': 'Test area',
'price': 500.5,
'provider': 'provider',
'polygon': [[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]
}
response = self.client.post(
self.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], 'Incorrect type. Expected pk value, received str.')
self.add_new_polygon_to_cache_mock.assert_not_called()
def test_service_area_create_failure_invalid_provider_id(self):
invalid_id = self.provider.id + 100
payload = {
'name': 'Test area',
'price': 500.5,
'provider': invalid_id,
'polygon': [[0.0, 0.0], [0.0, 50.0], [50.0, 50.0], [50.0, 0.0], [0.0, 0.0]]
}
response = self.client.post(
self.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], f'Invalid pk "{invalid_id}" - object does not exist.')
self.add_new_polygon_to_cache_mock.assert_not_called()