Source code for geonode.geoserver.createlayer.tests

#########################################################################
#
# Copyright (C) 2017 OSGeo
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################

import os

from django.conf import settings
from django.urls import reverse

from geonode.tests.base import GeoNodeBaseTestSupport
from geonode import geoserver
from geonode import GeoNodeException
from geonode.layers.models import Dataset
from geonode.decorators import on_ogc_backend
from geonode.geoserver.signals import gs_catalog

from .utils import create_dataset


[docs] class CreateLayerCoreTest(GeoNodeBaseTestSupport): """ Test createlayer application. """
[docs] fixtures = ["initial_data.json", "bobby"]
[docs] def setUp(self): super().setUp()
# createlayer must use postgis as a datastore # set temporary settings to use a postgis datastore # DATASTORE_URL = 'postgis://geonode:geonode@localhost:5432/datastore' # postgis_db = dj_database_url.parse(DATASTORE_URL, conn_max_age=0) # settings.DATABASES['datastore'] = postgis_db # settings.OGC_SERVER['default']['DATASTORE'] = 'datastore'
[docs] def tearDown(self): super(GeoNodeBaseTestSupport, self).tearDown()
# move to original settings # settings.OGC_SERVER['default']['DATASTORE'] = '' # del settings.DATABASES['datastore'] # TODO remove stuff from django and geoserver catalog @on_ogc_backend(geoserver.BACKEND_PACKAGE)
[docs] def test_dataset_creation(self): """ Try creating a layer. """ internal_apps_tests = os.environ.get("TEST_RUN_INTERNAL_APPS", None) if not internal_apps_tests: internal_apps_tests = settings.internal_apps_tests else: dataset_name = "point_dataset" dataset_title = "A layer for points" print(settings.DATABASES["datastore"]) print("#######") print(settings.OGC_SERVER["default"]["DATASTORE"]) create_dataset(dataset_name, dataset_title, "bobby", "Point") cat = gs_catalog # Check the layer is in the Django database layer = Dataset.objects.get(name=dataset_name) # check if it is in geoserver gs_dataset = cat.get_layer(dataset_name) try: self.assertIsNotNone(gs_dataset) self.assertEqual(gs_dataset.name, dataset_name) resource = gs_dataset.resource # we must have only one attibute ('the_geom') self.assertEqual(len(resource.attributes), 1) # check layer corrispondence between django and geoserver self.assertEqual(resource.title, dataset_title) self.assertEqual(resource.projection, layer.srid) # check if layer detail page is accessible with client response = self.client.get(reverse("dataset_embed", args=(f"geonode:{dataset_name}",))) self.assertEqual(response.status_code, 200) finally: cat.delete(gs_dataset)
[docs] def test_dataset_creation_with_wrong_geometry_type(self): """ Try creating a layer with uncorrect geometry type. """ with self.assertRaises(GeoNodeException): create_dataset("wrong_geom_dataset", "A layer with wrong geometry", "bobby", "wrong_geometry")
@on_ogc_backend(geoserver.BACKEND_PACKAGE)
[docs] def test_dataset_creation_with_attributes(self): """ Try creating a layer with attributes. """ internal_apps_tests = os.environ.get("TEST_RUN_INTERNAL_APPS", None) if not internal_apps_tests: internal_apps_tests = settings.internal_apps_tests else: attributes = """ { "field_str": "string", "field_int": "integer", "field_date": "date", "field_float": "float" } """ dataset_name = "attributes_dataset" dataset_title = "A layer with attributes" create_dataset(dataset_name, dataset_title, "bobby", "Point", attributes) cat = gs_catalog gs_dataset = cat.get_layer(dataset_name) try: resource = gs_dataset.resource # we must have one attibute for the geometry, and 4 other ones self.assertEqual(len(resource.attributes), 5) finally: cat.delete(gs_dataset)