def test_ogc_specific_layer(self): """Test we can use QGIS Server API for a layer. For now, we are just checking we can call these views without any exceptions. We should improve this test by checking the result. """ filename = os.path.join(gisdata.GOOD_DATA, 'raster/test_grid.tif') uploaded = file_upload(filename) filename = os.path.join( gisdata.GOOD_DATA, 'vector/san_andres_y_providencia_administrative.shp') vector_layer = file_upload(filename) params = {'layername': uploaded.name} # Zip response = self.client.get( reverse('qgis_server:download-zip', kwargs=params)) self.assertEqual(response.status_code, 200) try: f = StringIO.StringIO(response.content) zipped_file = zipfile.ZipFile(f, 'r') for one_file in zipped_file.namelist(): # We shoudn't get any QGIS project self.assertFalse(one_file.endswith('.qgs')) self.assertIsNone(zipped_file.testzip()) finally: zipped_file.close() f.close() # Legend response = self.client.get( reverse('qgis_server:legend', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') # Tile coordinates = {'z': '11', 'x': '1576', 'y': '1054'} coordinates.update(params) response = self.client.get( reverse('qgis_server:tile', kwargs=coordinates)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') # Tile 404 response = self.client.get( reverse('qgis_server:tile', kwargs=params)) self.assertEqual(response.status_code, 404) self.assertEqual( response.get('Content-Type'), 'text/html; charset=utf-8') # Geotiff response = self.client.get( reverse('qgis_server:geotiff', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/tiff') self.assertEqual(what('', h=response.content), 'tiff') # Layer is already on the database # checking the Link links = uploaded.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_RASTER) # checks signals.py for the hardcoded names in QLR and QGS qlr_link = links.get(name='QGIS layer file (.qlr)') self.assertIn("download-qlr", qlr_link.url) qgs_link = links.get(name='QGIS project file (.qgs)') self.assertIn("download-qgs", qgs_link.url) # QLR response = self.client.get( reverse('qgis_server:download-qlr', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual( response.get('Content-Type'), 'application/x-qgis-layer-definition') # check file name's extension file_name = response.get('Content-Disposition').split('filename=') file_ext = file_name[1].split('.') self.assertEqual(file_ext[1], "qlr") # QGS response = self.client.get( reverse('qgis_server:download-qgs', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual( response.get('Content-Type'), 'application/x-qgis-project') # check file name's extension file_name = response.get('Content-Disposition').split('filename=') file_ext = file_name[1].split('.') self.assertEqual(file_ext[1], "qgs") response = self.client.get( reverse('qgis_server:geotiff', kwargs={ 'layername': vector_layer.name })) self.assertEqual(response.status_code, 404) # QML Styles # Request list of styles response = self.client.get( reverse('qgis_server:download-qml', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'application/json') # Should return a default style list actual_result = json.loads(response.content) actual_result = [s['name'] for s in actual_result] expected_result = ['default'] self.assertEqual(set(expected_result), set(actual_result)) # Get single styles response = self.client.get( reverse('qgis_server:download-qml', kwargs={ 'layername': params['layername'], 'style_name': 'default' })) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'text/xml') # Set thumbnail from viewed bbox response = self.client.get( reverse('qgis_server:set-thumbnail', kwargs=params)) self.assertEqual(response.status_code, 400) data = { 'bbox': '-5.54025,96.9406,-5.2820,97.1250' } response = self.client.post( reverse('qgis_server:set-thumbnail', kwargs=params), data=data) # User dont have permission self.assertEqual(response.status_code, 403) # Should log in self.client.login(username='******', password='******') response = self.client.post( reverse('qgis_server:set-thumbnail', kwargs=params), data=data) self.assertEqual(response.status_code, 200) retval = json.loads(response.content) expected_retval = { 'success': True } self.assertEqual(retval, expected_retval) # OGC Server specific for THE layer query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetLegendGraphics', 'FORMAT': 'image/png', 'LAYERS': uploaded.name, } response = self.client.get( reverse('qgis_server:layer-request', kwargs=params), query_string) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') # OGC Server for the Geonode instance # GetLegendGraphics is a shortcut when using the main OGC server. query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetLegendGraphics', 'FORMAT': 'image/png', 'LAYERS': uploaded.name, } response = self.client.get( reverse('qgis_server:request'), query_string) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') # WMS GetCapabilities query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetCapabilities' } response = self.client.get( reverse('qgis_server:request'), query_string) self.assertEqual(response.status_code, 200, response.content) self.assertEqual( response.content, 'GetCapabilities is not supported yet.') query_string['LAYERS'] = uploaded.name response = self.client.get( reverse('qgis_server:request'), query_string) get_capabilities_content = response.content # Check xml content self.assertEqual(response.status_code, 200, response.content) root = etree.fromstring(response.content) layer_xml = root.xpath( 'wms:Capability/wms:Layer/wms:Layer/wms:Name', namespaces={'wms': 'http://www.opengis.net/wms'}) self.assertEqual(len(layer_xml), 1) self.assertEqual(layer_xml[0].text, uploaded.name) # GetLegendGraphic request returned must be valid layer_xml = root.xpath( 'wms:Capability/wms:Layer/' 'wms:Layer/wms:Style/wms:LegendURL/wms:OnlineResource', namespaces={ 'xlink': 'http://www.w3.org/1999/xlink', 'wms': 'http://www.opengis.net/wms' }) legend_url = layer_xml[0].attrib[ '{http://www.w3.org/1999/xlink}href'] response = self.client.get(legend_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=response.content), 'png') # Check get capabilities using helper returns the same thing response = requests.get(wms_get_capabilities_url( uploaded, internal=False)) self.assertEqual(response.status_code, 200) self.assertEqual(get_capabilities_content, response.content) # WMS GetMap query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'FORMAT': 'image/png', 'LAYERS': uploaded.name, 'HEIGHT': 250, 'WIDTH': 250, 'SRS': 'EPSG:4326', 'BBOX': '-5.54025,96.9406,-5.2820,97.1250', } response = self.client.get( reverse('qgis_server:request'), query_string) self.assertEqual(response.status_code, 200, response.content) self.assertEqual( response.get('Content-Type'), 'image/png', response.content) self.assertEqual(what('', h=response.content), 'png') # End of the test, we should remove every files related to the test. uploaded.delete() vector_layer.delete()
def test_ogc_specific_layer(self): """Test we can use QGIS Server API for a layer. For now, we are just checking we can call these views without any exceptions. We should improve this test by checking the result. """ filename = os.path.join(gisdata.GOOD_DATA, 'raster/test_grid.tif') uploaded = file_upload(filename) filename = os.path.join( gisdata.GOOD_DATA, 'vector/san_andres_y_providencia_administrative.shp') vector_layer = file_upload(filename) params = {'layername': uploaded.name} # Zip response = self.client.get( reverse('qgis_server:download-zip', kwargs=params)) self.assertEqual(response.status_code, 200) try: f = io.StringIO(ensure_string(response.content)) zipped_file = zipfile.ZipFile(f, 'r') for one_file in zipped_file.namelist(): # We shoudn't get any QGIS project self.assertFalse(one_file.endswith('.qgs')) self.assertIsNone(zipped_file.testzip()) finally: zipped_file.close() f.close() # Legend response = self.client.get( reverse('qgis_server:legend', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=ensure_string(response.content)), 'png') # Tile coordinates = {'z': '11', 'x': '1576', 'y': '1054'} coordinates.update(params) response = self.client.get( reverse('qgis_server:tile', kwargs=coordinates)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=ensure_string(response.content)), 'png') # Tile 404 response = self.client.get( reverse('qgis_server:tile', kwargs=params)) self.assertEqual(response.status_code, 404) self.assertEqual( response.get('Content-Type'), 'text/html; charset=utf-8') # Geotiff response = self.client.get( reverse('qgis_server:geotiff', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/tiff') self.assertEqual(what('', h=ensure_string(response.content)), 'tiff') # Layer is already on the database # checking the Link links = uploaded.link_set.download().filter( name__in=settings.DOWNLOAD_FORMATS_RASTER) # checks signals.py for the hardcoded names in QLR and QGS qlr_link = links.get(name='QGIS layer file (.qlr)') self.assertIn("download-qlr", qlr_link.url) qgs_link = links.get(name='QGIS project file (.qgs)') self.assertIn("download-qgs", qgs_link.url) # QLR response = self.client.get( reverse('qgis_server:download-qlr', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual( response.get('Content-Type'), 'application/x-qgis-layer-definition') # check file name's extension file_name = response.get('Content-Disposition').split('filename=') file_ext = file_name[1].split('.') self.assertEqual(file_ext[1], "qlr") # QGS response = self.client.get( reverse('qgis_server:download-qgs', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual( response.get('Content-Type'), 'application/x-qgis-project') # check file name's extension file_name = response.get('Content-Disposition').split('filename=') file_ext = file_name[1].split('.') self.assertEqual(file_ext[1], "qgs") response = self.client.get( reverse('qgis_server:geotiff', kwargs={ 'layername': vector_layer.name })) self.assertEqual(response.status_code, 404) # QML Styles # Request list of styles response = self.client.get( reverse('qgis_server:download-qml', kwargs=params)) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'application/json') # Should return a default style list content = ensure_string(response.content) if isinstance(content, bytes): content = content.decode('UTF-8') actual_result = json.loads(content) actual_result = [s['name'] for s in actual_result] expected_result = ['default'] self.assertEqual(set(expected_result), set(actual_result)) # Get single styles response = self.client.get( reverse('qgis_server:download-qml', kwargs={ 'layername': params['layername'], 'style_name': 'default' })) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'text/xml') # Set thumbnail from viewed bbox response = self.client.get( reverse('qgis_server:set-thumbnail', kwargs=params)) self.assertEqual(response.status_code, 400) data = { 'bbox': '-5.54025,96.9406,-5.2820,97.1250' } response = self.client.post( reverse('qgis_server:set-thumbnail', kwargs=params), data=data) # User dont have permission self.assertEqual(response.status_code, 403) # Should log in self.client.login(username='******', password='******') response = self.client.post( reverse('qgis_server:set-thumbnail', kwargs=params), data=data) self.assertEqual(response.status_code, 200) content = ensure_string(response.content) if isinstance(content, bytes): content = content.decode('UTF-8') retval = json.loads(content) expected_retval = { 'success': True } self.assertEqual(retval, expected_retval) # OGC Server specific for THE layer query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetLegendGraphics', 'FORMAT': 'image/png', 'LAYERS': uploaded.name, } response = self.client.get( reverse('qgis_server:layer-request', kwargs=params), query_string) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=ensure_string(response.content)), 'png') # OGC Server for the Geonode instance # GetLegendGraphics is a shortcut when using the main OGC server. query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetLegendGraphics', 'FORMAT': 'image/png', 'LAYERS': uploaded.name, } response = self.client.get( reverse('qgis_server:request'), query_string) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=ensure_string(response.content)), 'png') # WMS GetCapabilities query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetCapabilities' } response = self.client.get( reverse('qgis_server:request'), query_string) self.assertEqual(response.status_code, 200, ensure_string(response.content)) self.assertEqual( ensure_string(response.content), 'GetCapabilities is not supported yet.') query_string['LAYERS'] = uploaded.name response = self.client.get( reverse('qgis_server:request'), query_string) get_capabilities_content = ensure_string(response.content) # Check xml content self.assertEqual(response.status_code, 200, ensure_string(response.content)) root = dlxml.fromstring(ensure_string(response.content)) layer_xml = root.xpath( 'wms:Capability/wms:Layer/wms:Layer/wms:Name', namespaces={'wms': 'http://www.opengis.net/wms'}) self.assertEqual(len(layer_xml), 1) self.assertEqual(layer_xml[0].text, uploaded.name) # GetLegendGraphic request returned must be valid layer_xml = root.xpath( 'wms:Capability/wms:Layer/' 'wms:Layer/wms:Style/wms:LegendURL/wms:OnlineResource', namespaces={ 'xlink': 'http://www.w3.org/1999/xlink', 'wms': 'http://www.opengis.net/wms' }) legend_url = layer_xml[0].attrib[ '{http://www.w3.org/1999/xlink}href'] response = self.client.get(legend_url) self.assertEqual(response.status_code, 200) self.assertEqual(response.get('Content-Type'), 'image/png') self.assertEqual(what('', h=ensure_string(response.content)), 'png') # Check get capabilities using helper returns the same thing response = requests.get(wms_get_capabilities_url( uploaded, internal=False)) self.assertEqual(response.status_code, 200) self.assertEqual(get_capabilities_content, ensure_string(response.content)) # WMS GetMap query_string = { 'SERVICE': 'WMS', 'VERSION': '1.3.0', 'REQUEST': 'GetMap', 'FORMAT': 'image/png', 'LAYERS': uploaded.name, 'HEIGHT': 250, 'WIDTH': 250, 'SRS': 'EPSG:4326', 'BBOX': '-5.54025,96.9406,-5.2820,97.1250', } response = self.client.get( reverse('qgis_server:request'), query_string) self.assertEqual(response.status_code, 200, ensure_string(response.content)) self.assertEqual( response.get('Content-Type'), 'image/png', ensure_string(response.content)) self.assertEqual(what('', h=ensure_string(response.content)), 'png') # End of the test, we should remove every files related to the test. uploaded.delete() vector_layer.delete()