]> git.menne-pb.de Git - pinpoint.git/commitdiff
Add tests
authorJörn Menne <jmenne@fedora.de>
Sun, 9 Feb 2025 14:52:10 +0000 (15:52 +0100)
committerJörn Menne <jmenne@fedora.de>
Sun, 9 Feb 2025 14:52:10 +0000 (15:52 +0100)
georeport/forms.py
georeport/models.py
georeport/static/georeport/recurseCategorySelection.js
georeport/static/georeport/retreiveCoordinates.js
georeport/templates/georeport/create.html
georeport/templates/georeport/detail.html
georeport/templates/georeport/index.html
georeport/templatetags/__init__.py [new file with mode: 0644]
georeport/templatetags/georeport_extras.py [new file with mode: 0644]
georeport/tests.py
georeport/views.py

index 5151f6393f6d4bbc50faa7ef8238c90e6e66c4ad..00fd531ebb22538532a39cde7c2b7862eae399f2 100644 (file)
@@ -13,4 +13,4 @@ class ReportForm(ModelForm):
 
     class Meta:
         model = Report
-        fields = ["title", "description", "email", "category"]
+        fields = ["title", "description", "email", "category","latitude", "longitude"]
index 7eac86a5798798c169885f117b8e5b36b32ba313..bf6d52c9e70b4be5f8d4f35a459a8f525addab1f 100644 (file)
@@ -80,6 +80,7 @@ class Report(models.Model):
     # Location
     # NOTE: Latitude is between -90 and 90°, while Longitude is between -180 and 180°
     # Therefore the latitude field is slightly smaller
+    # TODO: Restrict geocoordinates to the values above (or even smaller)
     longitude = models.DecimalField(max_digits=9, decimal_places=6)
     latitude = models.DecimalField(max_digits=8, decimal_places=6)
 
@@ -88,6 +89,4 @@ class Report(models.Model):
         return str(self.title)
 
 
-# TODO: Location
-
 # TODO: Image
index 87d57b039a737ab8393205956cd2e9dc0c3883b5..a9d32a97e9b0bebd00c88457b16b38c6e75ac67a 100644 (file)
@@ -69,6 +69,7 @@ function getsubcats(element) {
           getsubcats(this);
         }
         select.name = "category";
+        select.required = true;
 
         // Create the new options 
         var option = document.createElement("option");
index acb4732d376dcb5cc124f045740bc36c73118f55..eba117fead674f48979784092470a613e778894e 100644 (file)
@@ -15,12 +15,12 @@ let marker = L.marker();
 
 // Add change listener to the input-elements
 lat_element.addEventListener("change", () => {
-    marker.setLatLng([lat_element.value, lng_element.value])
-        .addTo(map);
+  marker.setLatLng([lat_element.value, lng_element.value])
+    .addTo(map);
 });
 lng_element.addEventListener("change", () => {
-    marker.setLatLng([lat_element.value, lng_element.value])
-        .addTo(map);
+  marker.setLatLng([lat_element.value, lng_element.value])
+    .addTo(map);
 });
 
 
@@ -31,9 +31,11 @@ lng_element.addEventListener("change", () => {
  * The precirsion is accorcding to https://en.wikipedia.org/wiki/Decimal_degrees
  */
 function onMapClick(e, decimal_precision = 6) {
-    marker.setLatLng(e.latlng).addTo(map);
+  marker.setLatLng(e.latlng).addTo(map);
 
-    lat_element.value = e.latlng.lat.toFixed(decimal_precision);
-    lng_element.value = e.latlng.lng.toFixed(decimal_precision);
+  lat_element.value = e.latlng.lat.toFixed(decimal_precision);
+  lng_element.value = e.latlng.lng.toFixed(decimal_precision);
 
 }
+
+map.on("click", onMapClick);
index 159986ce18cdce0ccbd2faea27d35c8b44dac7d8..6b84be8570edc39f7e27b58414b945eb261da920 100644 (file)
@@ -44,7 +44,7 @@ GNU General Public License v3.0 (see LICSENE or https://www.gnu.org/license/gpl-
 </div>
 <div class="detail">
 <!-- TODO better URLS -->
-<a href="/georeport">Cancel</a>
+<a href="{% url 'georeport:index' %}">Cancel</a>
 </div>
 {% endblock %}
 
index ef89bd633cafc55d43b994b5f6bec667957c8539..cac8ebc3e89c1360b67dca0b933985ed3c6e8274 100644 (file)
@@ -17,7 +17,7 @@ GNU General Public License v3.0 (see LICSENE or https://www.gnu.org/license/gpl-
     <p id="p-lng" data-lng="{{ report.longitude }}">Longitude: {{ report.longitude }}</p>
     <p>Status: {{ report.get_state_display }} </p>
     <p>Kategorie: {{ report.category }} </p>
-    <a href="{% url 'index' %}">Back</a>
+    <a href="{% url 'georeport:index' %}">Back</a>
     <script src="{% static 'georeport/addMarker.js' %}"></script>
 <!--    <img src="{{report.image.url}}" alt="Kein Bild vorhanden" scale=0.25>-->
     {% for img in report.images.all %}
index a03ceb9bc4f17a19e36e56e6d74aebcdd2c8f135..481dd542d8b028d3aa7ee25fc68aa29d7354a0f0 100644 (file)
@@ -14,7 +14,7 @@ GNU General Public License v3.0 (see LICSENE or https://www.gnu.org/license/gpl-
             <!-- List with published reports -->
             {% for report in report_list %}
                 {% if report.published %}
-                    <li><a href="{{ report.id }}">{{ report.title }}</a></li>
+                    <li><a href="{% url 'georeport:report' report.id%}">{{ report.title }}</a></li>
                     <script>
                         let marker{{report.id}} = L.marker([{{report.latitude}},{{report.longitude}}]);
                         marker{{report.id}}.addTo(map);
@@ -27,7 +27,7 @@ GNU General Public License v3.0 (see LICSENE or https://www.gnu.org/license/gpl-
         <h2>Categories</h2>
         <ul>
             {% for category in category_list %}
-            <li><a href="category/{{ category.id }}">{{ category.name }}</a></li>
+              <li><a href="{% url 'georeport:category' category.id  %}">{{ category.name }}</a></li>
             {% endfor %}
         </ul>
     </div>
diff --git a/georeport/templatetags/__init__.py b/georeport/templatetags/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/georeport/templatetags/georeport_extras.py b/georeport/templatetags/georeport_extras.py
new file mode 100644 (file)
index 0000000..19b8b0d
--- /dev/null
@@ -0,0 +1,10 @@
+from django import template
+
+register = template.Library()
+
+
+def key(value, arg):
+    return value[arg]
+
+
+register.filter("key", key)
index 9600f86f3d9e39b3afc2c65243fccea386781137..b879195b51aff0bafb79d03214969faf1700d4df 100644 (file)
@@ -8,28 +8,80 @@ from .models import Category, Report
 
 
 class ReportTestCase(TestCase):
-    def setUp(self):
-        Category.objects.create(name="Cat1")  # type:ignore Attribute object is unknown
-        Report.objects.create(  # type:ignore Attribute object is unknown
-            title="Test",
-            email="test@test.de",
-            category=Category.objects.first(),  # type:ignore Attribute object is unknown
-            latitude=0,
-            longitude=0,
-        )
-
-    def test_unpulished_as_default(self):
-        report = Report.objects.get(title="Test")  # type:ignore Attribute object is unknown
-        self.assertEqual(report.published, False)
+    @classmethod
+    def setUpTestData(cls):
+        cls.cat = Category.objects.create(name="Cat1")  # type:ignore Attribute object is unknown
 
+    def test_create_report_get(self):
+        """
+        Test the create report view if get is called
+        """
+        url = reverse("georeport:create")
+        response = self.client.get(url)
 
-# TODO: Test latlng
+        # Test create view
+        self.assertEqual(response.status_code, 200)  # type:ignore Attribute status_code unknown
+        self.assertTemplateUsed(response, "georeport/create.html")
+        # Check if category is in context of request
+        self.assertIn(self.cat.id, response.context)  # type:ignore
 
+    def test_create_report_post(self):
+        """
+        Test create_report_view with a post call
+        """
+        # Testcase setup
+        post_data = {
+            "title": "Test",
+            "description": "description",
+            "category": self.cat.id,
+            "email": "test@example.de",
+            "longitude": 8.741698,
+            "latitude": 51.715841,
+        }
+        url = reverse("georeport:create")
+        response = self.client.post(url, post_data)
+
+        # check response
+        self.assertEqual(response.status_code, 302)  # type: ignore
+        self.assertEqual(response.url, reverse("georeport:index"))  # type:ignore
+
+        report = Report.objects.get(pk=1, title=post_data["title"])  # type: ignore
+        self.assertEqual(report.description, post_data["description"])
+        self.assertEqual(report.category.id, post_data["category"])
+        self.assertEqual(report.email, post_data["email"])
+        self.assertEqual(float(report.latitude), float(post_data["latitude"]))
+        self.assertEqual(float(report.longitude), float(post_data["longitude"]))
+        self.assertFalse(report.published)
+        self.assertEqual(report.state, 0)
+
+    def test_detail_view(self):
+        self.assertTrue(True)
+        url = reverse("georeport:report", kwargs={"id": 1})
+        # Test report not existsing
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, 404)  # type:ignore
+        report = Report.objects.create(  # type:ignore
+            title="Test",
+            category=self.cat,
+            email="test@pinpoint.de",
+            longitude=8.741698,
+            latitude=51.715841,
+        )
+        # Test unpulished report
+        self.assertFalse(report.published)
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, 403)  # type:ignore
 
-# TODO: Test get_categories
+        report.published = True
+        report.save()
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, 200)  # type: ignore
+        self.assertContains(response, f"Title: {report.title}", status_code=200)
+        self.assertTemplateUsed(response, "georeport/detail.html")
+        # TODO: test if response contains title
 
 
-class CategoryViewTests(TestCase):
+class GetCategoryViewTests(TestCase):
     @classmethod
     def setUpTestData(cls):
         """
index b32454e324d6d7f6142d8aaadff298c97fd08d3e..fcf1f76e613a4387ca7d12e88a8d7ebf356afcaa 100644 (file)
@@ -9,9 +9,8 @@ A view takes a request and creates a respond for the request.
 
 from django.core.exceptions import PermissionDenied
 from django.http import HttpResponse, HttpResponseForbidden, JsonResponse
-from django.shortcuts import get_object_or_404, render
+from django.shortcuts import get_object_or_404, render, redirect
 from django.views.decorators.http import require_GET, require_safe, require_http_methods
-
 from .models import Category, Report
 
 from .forms import ReportForm
@@ -60,9 +59,6 @@ def get_categories(request, id=None) -> JsonResponse:
     return JsonResponse(data)
 
 
-# TODO: Category-Detail
-
-
 @require_safe
 def category_detail_view(request, id) -> HttpResponse:
     """
@@ -89,6 +85,7 @@ def category_detail_view(request, id) -> HttpResponse:
         if user in group.user_set.all():
             allowed = True
 
+    # If User is allowd to view the category provice it, otherwise rise 403- PermissionDenied
     if allowed:
         return render(request, "georeport/category.html", context={"categroy": cat})
 
@@ -97,7 +94,6 @@ def category_detail_view(request, id) -> HttpResponse:
 
 
 # TODO: Report-List
-# TODO: Create-Report
 
 
 @require_http_methods(["GET", "POST"])
@@ -111,10 +107,17 @@ def create_report_view(request):
         report["description"] = post["description"]
         report["category"] = post["category"]
         report["email"] = post["email"]
-
-        reportform = ReportForm(report)
-
-        # TODO: Location
+        report["longitude"] = post["longitude"]
+        report["latitude"] = post["latitude"]
+        reportForm = ReportForm(report)
+        # TODO: Check if category is a leaf
+        # NOTE: Currently not implemented, since it is assumed, that
+        # reports are created with the website, and there every category-selection is required
+        if reportForm.is_valid():
+            reportForm.save()
+
+        # TODO: Send confirmation-Mails
+        return redirect("georeport:index")
 
     return render(
         request,
@@ -128,10 +131,12 @@ def report_detail_view(request, id):
     """
     Returns the detail-view page of a single report
     """
-    report = get_object_or_404(Report, pd=id)
+    report = get_object_or_404(Report, pk=id)
 
     if report.published:
         return render(request, "georeport/detail.html", context={"report": report})
 
+    raise PermissionDenied
+
 
 # TODO: Finish Link