From fabcd9808be93d11dfb9f46f3c137d2e2ab101b0 Mon Sep 17 00:00:00 2001 From: afabiani Date: Thu, 4 Oct 2018 11:04:02 +0200 Subject: [PATCH] [Closes #3957] Increase "geoserver" tests coverage --- codecov.yml | 67 ++++++++++++------------- geonode/geoserver/helpers.py | 5 +- geonode/geoserver/tests.py | 96 ++++++++++++++++++++++++++++++++++++ geonode/security/tests.py | 53 ++++++++++++++++++++ geonode/tests/integration.py | 47 ++++++++++++++++++ pavement.py | 2 +- 6 files changed, 234 insertions(+), 36 deletions(-) diff --git a/codecov.yml b/codecov.yml index a4b30b37386..dc64c23d768 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,33 +1,34 @@ -codecov: - notify: - require_ci_to_pass: yes - -coverage: - precision: 2 - round: down - range: "70...100" - - status: - project: yes - patch: yes - changes: no - -parsers: - gcov: - branch_detection: - conditional: yes - loop: yes - method: no - macro: no - -comment: - layout: "header, diff" - behavior: default - require_changes: no - -ignore: - - */management/* - - geonode/contrib/* - - */test* - - */wsgi* - - */middleware* +codecov: + notify: + require_ci_to_pass: yes + +coverage: + precision: 2 + round: down + range: "70...100" + + status: + project: yes + patch: yes + changes: no + +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: no + macro: no + +comment: + layout: "header, diff" + behavior: default + require_changes: no + +ignore: + - */management/* + - geonode/contrib/* + - */test* + - */wsgi* + - */middleware* + - geonode/qgis_server/* diff --git a/geonode/geoserver/helpers.py b/geonode/geoserver/helpers.py index 7c9ae977b37..afad65d1622 100755 --- a/geonode/geoserver/helpers.py +++ b/geonode/geoserver/helpers.py @@ -85,10 +85,11 @@ def check_geoserver_is_up(): """Verifies all geoserver is running, this is needed to be able to upload. """ - url = "%sweb/" % ogc_server_settings.LOCATION + url = "%s" % ogc_server_settings.LOCATION resp, content = http_client.request(url, "GET") msg = ('Cannot connect to the GeoServer at %s\nPlease make sure you ' - 'have started it.' % ogc_server_settings.LOCATION) + 'have started it.' % url) + logger.debug(resp) assert resp['status'] == '200', msg diff --git a/geonode/geoserver/tests.py b/geonode/geoserver/tests.py index dd1ec83d4a7..33a4ba921dc 100644 --- a/geonode/geoserver/tests.py +++ b/geonode/geoserver/tests.py @@ -42,6 +42,9 @@ from geonode.layers.populate_layers_data import create_layer_data from geonode.layers.models import Layer +import logging +logger = logging.getLogger(__name__) + san_andres_y_providencia_sld = """ %s' % (wms_url, _link[3])) + self.assertTrue(wms_url in _link[3]) + logger.debug('%s --> %s' % (identifier, _link[3])) + self.assertTrue(identifier in _link[3]) + + # WFS Links + wfs_links = wfs_links(ogc_settings.public_url + 'wfs?', + instance.alternate.encode('utf-8'), + bbox, + srid) + self.assertIsNotNone(wfs_links) + self.assertEquals(len(wfs_links), 6) + wfs_url = urljoin(ogc_settings.PUBLIC_LOCATION, 'wfs') + identifier = urllib.urlencode({'typename': instance.alternate.encode('utf-8')}) + for _link in wfs_links: + logger.debug('%s --> %s' % (wfs_url, _link[3])) + self.assertTrue(wfs_url in _link[3]) + logger.debug('%s --> %s' % (identifier, _link[3])) + self.assertTrue(identifier in _link[3]) + + # WCS Links + wcs_links = wcs_links(ogc_settings.public_url + 'wcs?', + instance.alternate.encode('utf-8'), + bbox, + srid) + self.assertIsNotNone(wcs_links) + self.assertEquals(len(wcs_links), 2) + wcs_url = urljoin(ogc_settings.PUBLIC_LOCATION, 'wcs') + identifier = urllib.urlencode({'coverageid': instance.alternate.encode('utf-8')}) + for _link in wcs_links: + logger.debug('%s --> %s' % (wcs_url, _link[3])) + self.assertTrue(wcs_url in _link[3]) + logger.debug('%s --> %s' % (identifier, _link[3])) + self.assertTrue(identifier in _link[3]) + @on_ogc_backend(geoserver.BACKEND_PACKAGE) def test_importer_configuration(self): """ diff --git a/geonode/security/tests.py b/geonode/security/tests.py index 6b55ecb4ddc..1509fade1c9 100644 --- a/geonode/security/tests.py +++ b/geonode/security/tests.py @@ -600,3 +600,56 @@ def test_map_download(self): response = self.client.get(reverse('map_download', args=(the_map.id,))) self.assertTrue('Could not find downloadable layers for this map' in response.content) + + +class GisBackendSignalsTests(ResourceTestCaseMixin, GeoNodeBaseTestSupport): + + def setUp(self): + super(GisBackendSignalsTests, self).setUp() + if check_ogc_backend(geoserver.BACKEND_PACKAGE): + settings.OGC_SERVER['default']['GEOFENCE_SECURITY_ENABLED'] = True + + self.user = 'admin' + self.passwd = 'admin' + self.list_url = reverse( + 'api_dispatch_list', + kwargs={ + 'api_name': 'api', + 'resource_name': 'layers'}) + self.bulk_perms_url = reverse('bulk_permissions') + all_public() + self.perm_spec = { + "users": {"admin": ["view_resourcebase"]}, "groups": {}} + + def test_save_and_delete_signals(self): + """Test that GeoServer Signals methods work as espected""" + + layers = Layer.objects.all()[:2].values_list('id', flat=True) + test_perm_layer = Layer.objects.get(id=layers[0]) + + self.client.login(username='admin', password='admin') + + if check_ogc_backend(geoserver.BACKEND_PACKAGE): + from geonode.geoserver.signals import (geoserver_pre_delete, + geoserver_post_save, + geoserver_post_save_local) + # Handle Layer Save and Upload Signals + geoserver_post_save(test_perm_layer, sender=Layer) + geoserver_post_save_local(test_perm_layer) + + # Check instance bbox and links + self.assertIsNotNone(test_perm_layer.bbox) + self.assertIsNotNone(test_perm_layer.srid) + self.assertIsNotNone(test_perm_layer.link_set) + self.assertEquals(len(test_perm_layer.link_set.all()), 7) + + # Layer Manipulation + from geonode.geoserver.helpers import check_geoserver_is_up + check_geoserver_is_up() + + # Handle Layer Delete Signals + geoserver_pre_delete(test_perm_layer, sender=Layer) + + # Check instance has been removed from GeoServer also + from geonode.geoserver.views import get_layer_capabilities + self.assertIsNone(get_layer_capabilities(test_perm_layer)) diff --git a/geonode/tests/integration.py b/geonode/tests/integration.py index 78acb77e9b5..6fba7706435 100644 --- a/geonode/tests/integration.py +++ b/geonode/tests/integration.py @@ -82,6 +82,11 @@ logger = logging.getLogger(__name__) + +def _log(msg, *args): + logger.debug(msg, *args) + + # Reconnect post_save signals that is disconnected by populate_test_data reconnect_signals() @@ -186,6 +191,45 @@ def test_layer_upload(self): o = json.loads(r.text) self.assertTrue('long-array-array' in o) self.assertTrue(len(o['long-array-array']) > 0) + + from geonode.geoserver.helpers import (get_sld_for, + fixup_style, + set_layer_style, + get_store, + set_attributes_from_geoserver, + set_styles, + create_gs_thumbnail) + + _log("0. ------------ %s " % saved_layer) + self.assertIsNotNone(saved_layer) + workspace, name = saved_layer.alternate.split(':') + self.assertIsNotNone(workspace) + self.assertIsNotNone(name) + ws = gs_catalog.get_workspace(workspace) + self.assertIsNotNone(ws) + store = get_store(gs_catalog, saved_layer.store, workspace=ws) + _log("1. ------------ %s " % store) + self.assertIsNotNone(store) + + # Save layer attributes + set_attributes_from_geoserver(saved_layer) + + # Save layer styles + set_styles(saved_layer, gs_catalog) + + # set SLD + sld = saved_layer.default_style.sld_body if saved_layer.default_style else None + self.assertIsNotNone(sld) + _log("2. ------------ %s " % sld) + set_layer_style(saved_layer, saved_layer.alternate, sld) + + fixup_style(gs_catalog, saved_layer.alternate, None) + self.assertIsNone(get_sld_for(gs_catalog, saved_layer)) + _log("3. ------------ %s " % get_sld_for(gs_catalog, saved_layer)) + + create_gs_thumbnail(saved_layer, overwrite=True) + _log(saved_layer.get_thumbnail_url()) + _log(saved_layer.has_thumbnail()) try: saved_layer.set_default_permissions() url = reverse('layer_metadata', args=[saved_layer.service_typename]) @@ -194,6 +238,9 @@ def test_layer_upload(self): finally: # Clean up and completely delete the layer saved_layer.delete() + if check_ogc_backend(geoserver.BACKEND_PACKAGE): + from geonode.geoserver.helpers import cleanup + cleanup(saved_layer.name, saved_layer.uuid) @override_settings(SITEURL='http://localhost:8001/') diff --git a/pavement.py b/pavement.py index 3bd6f1d702d..6a7c712e4da 100644 --- a/pavement.py +++ b/pavement.py @@ -905,7 +905,7 @@ def run_tests(options): Executes the entire test suite. """ if options.get('coverage'): - prefix = 'coverage run --branch --source=geonode --omit="*/management/*,geonode/contrib/*,*/test*,*/wsgi*,*/middleware*"' + prefix = 'coverage run --branch --source=geonode --omit="*/management/*,geonode/contrib/*,*/test*,*/wsgi*,*/middleware*,geonode/qgis_server/*"' else: prefix = 'python' local = options.get('local', 'false') # travis uses default to false