def test_get_invalid(self, deleted_record=False): if self.client and self.detail_view_name: response = self.client.get( reverse(self.detail_view_name, kwargs=self.get_kwargs(valid=deleted_record))) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND, response.data) else: APITestCase.skipTest(self, 'Lack of data')
def test_get_obj_data(self, obj=None, msg=None): if self.client and self.detail_view_name and self.serializer: response = self.client.get(reverse(self.detail_view_name, kwargs=self.get_kwargs(obj))) self.assertJSONEqual( json.dumps(response.data), self.serializer(instance=(obj or self.obj), context=self.context).data, (f"{msg}: " if msg else "") + f"{response.data}") else: APITestCase.skipTest(self, 'Lack of data')
def test_get_list_data(self): if self.client and self.list_view_name and self.model and self.list_serializer: response = self.client.get(reverse(self.list_view_name)) self.assertJSONEqual( json.dumps(response.data), self.list_serializer(instance=self.model.objects.all(), many=True, context=self.context).data, response.data) else: APITestCase.skipTest(self, 'Lack of data')
def test_del_invalid_data(self): if self.client and self.detail_view_name: response = self.client.delete( reverse(self.detail_view_name, kwargs=self.get_kwargs(valid=False))) self.assertEqual( response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED if self.delete_forbidden else status.HTTP_404_NOT_FOUND, response.data) else: APITestCase.skipTest(self, 'Lack of data')
def test_patch_invalid_data_payload_raw(self, base_obj=None, payload_data=None): if self.client and self.detail_view_name: for msg, data in (payload_data or self.invalid_partial_data).items(): with APITestCase.subTest(self, msg): response = self.client.patch( reverse(self.detail_view_name, kwargs=self.get_kwargs(base_obj)), data=data) self.assertEqual( response.status_code, status.HTTP_400_BAD_REQUEST, f"{response.data}") # check if self.obj was not changed self.test_get_obj_data(obj=base_obj, msg=msg) else: APITestCase.skipTest(self, 'Lack of data')
def test_post_invalid_data_payload_raw(self, payload_data=None): if self.client and self.list_view_name: records = [_.pk for _ in self.model.objects.all()] for msg, data in (payload_data or self.invalid_post_data_payload).items(): with APITestCase.subTest(self, msg): response = self.client.post(reverse(self.list_view_name), data=data) self.assertEqual( response.status_code, status.HTTP_400_BAD_REQUEST, f"{response.data}") # double check records' pks self.assertEqual(records, [_.pk for _ in self.model.objects.all()]) else: APITestCase.skipTest(self, 'Lack of data')
def test_put_invalid_data_payload_json(self, base_obj=None, payload_data=None): if self.client and self.detail_view_name: for msg, data in (payload_data or self.invalid_put_data_payload).items(): with APITestCase.subTest(self, msg): response = self.client.put( reverse(self.detail_view_name, kwargs=self.get_kwargs(base_obj)), data=json.dumps(data), content_type='application/json') self.assertEqual( response.status_code, status.HTTP_400_BAD_REQUEST, f"{response.data}") # check if self.obj was not changed self.test_get_obj_data(obj=base_obj, msg=msg) else: APITestCase.skipTest(self, 'Lack of data')
def test_del_data(self, obj=None): if self.client and self.detail_view_name: response = self.client.delete( reverse(self.detail_view_name, kwargs=self.get_kwargs(obj))) self.assertEqual( response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED if self.delete_forbidden else status.HTTP_204_NO_CONTENT, response.data) # check if record has/hasn't been deleted if self.delete_forbidden: self.test_get_obj_code(obj) else: self.test_get_invalid(deleted_record=True) else: APITestCase.skipTest(self, 'Lack of data')
def test_post_data_payload_raw(self, payload_data=None): if self.client and self.list_view_name: for msg, data in (payload_data or self.valid_post_data_payload).items(): with APITestCase.subTest(self, msg): response = self.client.post(reverse(self.list_view_name), data=data) self.assertEqual(response.status_code, status.HTTP_201_CREATED, f"{response.data}") # try to get created model instance obj = self.get_obj(data) self.assertIsNotNone(obj) # check response code with get method self.test_get_obj_code(obj=obj, msg=msg) # check data integrity of data sent and serialized instance self.assertJSONEqual( json.dumps(response.data), self.serializer(instance=obj, context=self.context).data) else: APITestCase.skipTest(self, 'Lack of data')
def test_patch_data_payload_raw(self, base_obj=None, payload_data=None): if self.client and self.detail_view_name: obj = base_obj for msg, data in (payload_data or self.valid_partial_data).items(): with APITestCase.subTest(self, msg): response = self.client.patch( reverse(self.detail_view_name, kwargs=self.get_kwargs(obj)), data=data) self.assertEqual(response.status_code, status.HTTP_200_OK, f"{response.data}") # try to get updated model instance obj = self.get_obj_by_pk(self.obj.pk) self.assertIsNotNone(obj) # check response code with get method self.test_get_obj_code(obj=obj, msg=msg) # check data integrity of data sent and serialized instance if self.serializer: self.assertJSONEqual( json.dumps(response.data), self.serializer(instance=obj, context=self.context).data) else: APITestCase.skipTest(self, 'Lack of data')
def test_get_obj_code(self, obj=None, msg=None): if self.client and self.detail_view_name: response = self.client.get(reverse(self.detail_view_name, kwargs=self.get_kwargs(obj))) self.assertEqual(response.status_code, status.HTTP_200_OK, (f"{msg}: " if msg else "") + f"{response.data}") else: APITestCase.skipTest(self, 'Lack of data')
def test_get_list_code(self): if self.client and self.list_view_name: response = self.client.get(reverse(self.list_view_name)) self.assertEqual(response.status_code, status.HTTP_200_OK, response.data) else: APITestCase.skipTest(self, 'Lack of data')