|
26 | 26 | from unittest.mock import MagicMock, patch, PropertyMock |
27 | 27 | from collections import namedtuple |
28 | 28 |
|
| 29 | +from rest_framework.test import force_authenticate |
| 30 | +from rest_framework import status |
| 31 | + |
29 | 32 | from django.urls import reverse |
30 | 33 | from django.test import TestCase |
31 | 34 | from django.test.client import RequestFactory |
@@ -799,6 +802,109 @@ def test_supports_time_with_raster_subtype_and_invalid_attributes(self, mock_get |
799 | 802 | mock_dataset = Dataset(subtype="raster") |
800 | 803 | self.assertFalse(mock_dataset.supports_time) |
801 | 804 |
|
| 805 | + @patch("geonode.geoserver.helpers.gs_catalog.get_resource") |
| 806 | + @patch("geonode.geoserver.helpers.gs_catalog.get_layer") |
| 807 | + def test_dataset_recalc_bbox_on_geoserver_success(self, mock_get_layer, mock_get_resource): |
| 808 | + """ |
| 809 | + Test recalc_bbox_on_geoserver() without touching real GeoServer. |
| 810 | + """ |
| 811 | + |
| 812 | + # Mock the GeoServer Layer object |
| 813 | + mock_layer = MagicMock() |
| 814 | + mock_layer.resource.store = MagicMock(name="test_store", workspace=MagicMock(name="test_workspace")) |
| 815 | + # Mock recalc_bbox() returning True |
| 816 | + mock_layer.recalc_bbox.return_value = True |
| 817 | + mock_get_layer.return_value = mock_layer |
| 818 | + |
| 819 | + # Mock the resource returned by gs_catalog.get_resource |
| 820 | + mock_resource = MagicMock() |
| 821 | + mock_resource.native_bbox = [0, 10, 0, 10] |
| 822 | + mock_resource.latlon_bbox = [0, 10, 0, 10] |
| 823 | + mock_resource.projection = "EPSG:4326" |
| 824 | + mock_resource.store = mock_layer.resource.store |
| 825 | + mock_get_resource.return_value = mock_resource |
| 826 | + |
| 827 | + # Call the method |
| 828 | + result = self.dataset.recalc_bbox_on_geoserver(force_bbox=[0, 0, 10, 10]) |
| 829 | + |
| 830 | + # Assertions |
| 831 | + self.assertTrue(result) |
| 832 | + mock_layer.recalc_bbox.assert_called_once_with(force_bbox=[0, 0, 10, 10]) |
| 833 | + mock_get_resource.assert_called_once_with( |
| 834 | + name=self.dataset.name, store=mock_layer.resource.store, workspace=mock_layer.resource.workspace |
| 835 | + ) |
| 836 | + |
| 837 | + # Check if bbox and srid are updated correctly |
| 838 | + self.assertEqual(self.dataset.srid, "EPSG:4326") |
| 839 | + # Optionally, check polygons |
| 840 | + self.assertIsNotNone(self.dataset.bbox_polygon) |
| 841 | + self.assertIsNotNone(self.dataset.ll_bbox_polygon) |
| 842 | + |
| 843 | + @patch("geonode.layers.models.Dataset.recalc_bbox_on_geoserver") |
| 844 | + def test_recalc_bbox_view_success(self, mock_recalc_bbox): |
| 845 | + """Test the recalc_bbox view returns 200 when successful.""" |
| 846 | + factory = RequestFactory() |
| 847 | + django_request = factory.put( |
| 848 | + f"/api/v2/datasets/{self.dataset.id}/recalc-bbox/", |
| 849 | + data='{"bbox": [0, 0, 10, 10]}', |
| 850 | + content_type="application/json", |
| 851 | + ) |
| 852 | + force_authenticate(django_request, user=self.admin_user) # authenticate the HttpRequest |
| 853 | + |
| 854 | + mock_recalc_bbox.return_value = True |
| 855 | + |
| 856 | + from geonode.layers.api.views import DatasetViewSet |
| 857 | + |
| 858 | + view = DatasetViewSet.as_view({"put": "recalc_bbox"}) |
| 859 | + response = view(django_request, pk=self.dataset.id) # pass HttpRequest directly |
| 860 | + |
| 861 | + assert response.status_code == status.HTTP_200_OK |
| 862 | + assert response.data == {"success": True} |
| 863 | + mock_recalc_bbox.assert_called_once_with(force_bbox=[0, 0, 10, 10]) |
| 864 | + |
| 865 | + @patch("geonode.layers.models.Dataset.recalc_bbox_on_geoserver") |
| 866 | + def test_recalc_bbox_view_failure(self, mock_recalc_bbox): |
| 867 | + """Test the recalc_bbox view returns 500 when GeoServer update fails.""" |
| 868 | + factory = RequestFactory() |
| 869 | + django_request = factory.put( |
| 870 | + f"/api/v2/datasets/{self.dataset.id}/recalc-bbox/", |
| 871 | + data='{"bbox": [0, 0, 10, 10]}', |
| 872 | + content_type="application/json", |
| 873 | + ) |
| 874 | + force_authenticate(django_request, user=self.admin_user) |
| 875 | + |
| 876 | + mock_recalc_bbox.return_value = False |
| 877 | + |
| 878 | + from geonode.layers.api.views import DatasetViewSet |
| 879 | + |
| 880 | + view = DatasetViewSet.as_view({"put": "recalc_bbox"}) |
| 881 | + response = view(django_request, pk=self.dataset.id) |
| 882 | + |
| 883 | + assert response.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR |
| 884 | + assert response.data == {"success": False} |
| 885 | + mock_recalc_bbox.assert_called_once_with(force_bbox=[0, 0, 10, 10]) |
| 886 | + |
| 887 | + @patch("geonode.layers.models.Dataset.recalc_bbox_on_geoserver") |
| 888 | + def test_recalc_bbox_view_permission_denied(self, mock_recalc_bbox): |
| 889 | + """Test the recalc_bbox view denies access if user lacks edit perms.""" |
| 890 | + factory = RequestFactory() |
| 891 | + django_request = factory.put( |
| 892 | + f"/api/v2/datasets/{self.dataset.id}/recalc-bbox/", |
| 893 | + data='{"bbox": [0, 0, 10, 10]}', |
| 894 | + content_type="application/json", |
| 895 | + ) |
| 896 | + force_authenticate(django_request, user=self.anonymous_user) # no edit perms |
| 897 | + |
| 898 | + from geonode.layers.api.views import DatasetViewSet |
| 899 | + |
| 900 | + view = DatasetViewSet.as_view({"put": "recalc_bbox"}) |
| 901 | + |
| 902 | + response = view(django_request, pk=self.dataset.id) |
| 903 | + |
| 904 | + # DRF converts PermissionDenied to HTTP 403 response |
| 905 | + assert response.status_code == 403 |
| 906 | + mock_recalc_bbox.assert_not_called() |
| 907 | + |
802 | 908 |
|
803 | 909 | class TestLayerDetailMapViewRights(GeoNodeBaseTestSupport): |
804 | 910 | fixtures = ["initial_data.json", "group_test_data.json", "default_oauth_apps.json"] |
|
0 commit comments