From 88f040efe2468e4e263c4d942c244c14aa067366 Mon Sep 17 00:00:00 2001 From: Terence Tuhinanshu Date: Wed, 2 Nov 2022 13:18:06 -0400 Subject: [PATCH] Refactor tests, update reference image tests The previous reference image tests did not send a file, which is now required by the API. This adds the file to the test payloads so that they work correctly. Also refactors the tests into separate files under the tests/ directory, as has been done for models/, views/, and serializers/. --- src/django/api/tests/__init__.py | 2 + src/django/api/{tests.py => tests/base.py} | 90 +++--------------- .../api/tests/data/raleigh_sanborn_map.jpg | Bin 0 -> 58889 bytes .../test_shapes.py => tests/data/shapes.py} | 0 src/django/api/tests/reference_image.py | 88 +++++++++++++++++ 5 files changed, 103 insertions(+), 77 deletions(-) create mode 100644 src/django/api/tests/__init__.py rename src/django/api/{tests.py => tests/base.py} (70%) create mode 100644 src/django/api/tests/data/raleigh_sanborn_map.jpg rename src/django/api/{management/test_shapes.py => tests/data/shapes.py} (100%) create mode 100644 src/django/api/tests/reference_image.py diff --git a/src/django/api/tests/__init__.py b/src/django/api/tests/__init__.py new file mode 100644 index 00000000..bf1afb98 --- /dev/null +++ b/src/django/api/tests/__init__.py @@ -0,0 +1,2 @@ +# flake8: noqa: F401 +from .reference_image import ReferenceImageViewTests diff --git a/src/django/api/tests.py b/src/django/api/tests/base.py similarity index 70% rename from src/django/api/tests.py rename to src/django/api/tests/base.py index 7f4b6c74..b64bcb37 100644 --- a/src/django/api/tests.py +++ b/src/django/api/tests/base.py @@ -1,20 +1,23 @@ from datetime import datetime, timezone from django.test import TestCase -from django.utils.log import request_logger -from django.urls import reverse -from rest_framework import status from rest_framework.test import APIClient -from api.models import Utility, User -from api.models.boundary import Boundary -from api.models.user import Roles, State -from api.models.reference_image import ReferenceImage -from api.models.submission import Approval, Submission, Review, Annotation - +from api.models import ( + Annotation, + Approval, + Boundary, + ReferenceImage, + Review, + Roles, + State, + Submission, + Utility, + User, +) -from .management.test_shapes import ( +from .data.shapes import ( RALEIGH_FAKE_RECTANGLE, RALEIGH_FAKE_TRIANGLE, RALEIGH_FAKE_ZIGZAG, @@ -233,70 +236,3 @@ def setUpTestData(cls): def setUp(self): self.client = APIClient() self.client.force_login(self.contributor) - - -class ReferenceImageViewTests(BoundarySyncAPITestCase): - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.new_image = { - "filename": "test_file.jpg", - "is_visible": True, - "distortion": {}, - "opacity": 100, - "uploaded_by": cls.contributor.pk, - } - cls.updated_image = {**cls.new_image, "is_visible": False} - - def test_no_image_list_endpoint(self): - url = reverse("upload_image", args=[1]) - with self.assertLogs(request_logger, "WARNING"): - response = self.client.get(url) - - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - - # Contributor actions - def test_contributor_upload_and_update_image(self): - url = reverse("upload_image", args=[2]) - response = self.client.post(url, self.new_image, format="json") - - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(ReferenceImage.objects.filter(boundary__pk=2).count(), 1) - - update_url = reverse("update_image", args=[2, 1]) - # Attempt to alter the uploaded_by field, which is illegitimate. - updated_image_illegitimate = { - **self.updated_image, - "uploaded_by": self.administrator.pk, - } - - response = self.client.put( - update_url, updated_image_illegitimate, format="json" - ) - - self.assertEqual(response.status_code, status.HTTP_200_OK) - ri = ReferenceImage.objects.filter(boundary__pk=2).first() - self.assertIs(ri.is_visible, False) - self.assertEqual(ri.uploaded_by.pk, self.contributor.pk) - - def test_contributor_cannot_upload_for_invalid_boundary(self): - url = reverse("upload_image", args=[2400]) - with self.assertLogs(request_logger, "WARNING"): - response = self.client.post(url, self.new_image, format="json") - - self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - - # Validator actions - def test_validator_cannot_upload_or_update_image(self): - self.client.force_login(self.validator) - url = reverse("upload_image", args=[1]) - with self.assertLogs(request_logger, "WARNING"): - response = self.client.post(url, self.new_image, format="json") - - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - url = reverse("update_image", args=[1, 1]) - with self.assertLogs(request_logger, "WARNING"): - response = self.client.put(url, self.updated_image, format="json") - - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) diff --git a/src/django/api/tests/data/raleigh_sanborn_map.jpg b/src/django/api/tests/data/raleigh_sanborn_map.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5baa88cf2cd21280fb8bb0cd486ca42754f67c33 GIT binary patch literal 58889 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/%gNXA`HF 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 literal 0 HcmV?d00001 diff --git a/src/django/api/management/test_shapes.py b/src/django/api/tests/data/shapes.py similarity index 100% rename from src/django/api/management/test_shapes.py rename to src/django/api/tests/data/shapes.py diff --git a/src/django/api/tests/reference_image.py b/src/django/api/tests/reference_image.py new file mode 100644 index 00000000..542dde97 --- /dev/null +++ b/src/django/api/tests/reference_image.py @@ -0,0 +1,88 @@ +from django.urls import reverse +from django.utils.log import request_logger + +from rest_framework import status + +from api.models import ReferenceImage + +from .base import BoundarySyncAPITestCase + + +class ReferenceImageViewTests(BoundarySyncAPITestCase): + def setUp(self): + super().setUp() + self.test_image = open("api/tests/data/raleigh_sanborn_map.jpg", "rb") + + def tearDown(self): + super().tearDown() + self.test_image.close() + + def get_create_payload(self): + return { + "file": self.test_image, + "filename": self.test_image.name, + "is_visible": True, + "opacity": 100, + "uploaded_by": self.contributor.pk, + } + + def get_update_payload(self): + return { + "filename": self.test_image.name, + "is_visible": False, + "distortion": {}, + "opacity": 100, + } + + def test_no_image_list_endpoint(self): + url = reverse("upload_image", args=[1]) + with self.assertLogs(request_logger, "WARNING"): + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + + # Contributor actions + def test_contributor_upload_and_update_image(self): + url = reverse("upload_image", args=[2]) + response = self.client.post(url, self.get_create_payload()) + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(ReferenceImage.objects.filter(boundary__pk=2).count(), 1) + + update_url = reverse("update_image", args=[2, 1]) + # Attempt to alter the uploaded_by field, which is illegitimate. + updated_image_illegitimate = { + **self.get_update_payload(), + "uploaded_by": self.administrator.pk, + } + + response = self.client.put( + update_url, updated_image_illegitimate, format="json" + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + ri = ReferenceImage.objects.filter(boundary__pk=2).first() + self.assertIs(ri.is_visible, False) + self.assertEqual(ri.uploaded_by.pk, self.contributor.pk) + + def test_contributor_cannot_upload_for_invalid_boundary(self): + url = reverse("upload_image", args=[2400]) + with self.assertLogs(request_logger, "WARNING"): + response = self.client.post(url, self.get_create_payload()) + + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + # Validator actions + def test_validator_cannot_upload_or_update_image(self): + self.client.force_login(self.validator) + url = reverse("upload_image", args=[1]) + with self.assertLogs(request_logger, "WARNING"): + response = self.client.post(url, self.get_create_payload()) + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + url = reverse("update_image", args=[1, 1]) + with self.assertLogs(request_logger, "WARNING"): + response = self.client.put(url, self.get_update_payload(), format="json") + + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)