def testMetadata(self): """ Test that metadata is correctly acquired from provider """ endpoint = self.basetestpath + '/metadata_fake_qgis_http_endpoint' with open(sanitize(endpoint, '?f=json'), 'wb') as f: f.write(""" {"currentVersion":10.22,"id":1,"name":"QGIS Test","type":"Feature Layer","description": "QGIS Provider Test Layer","geometryType":"esriGeometryPoint","copyrightText":"not copyright","parentLayer":{"id":2,"name":"QGIS Tests"},"subLayers":[], "minScale":72225,"maxScale":0, "defaultVisibility":true, "extent":{"xmin":-71.123,"ymin":66.33,"xmax":-65.32,"ymax":78.3, "spatialReference":{"wkid":4326,"latestWkid":4326}}, "hasAttachments":false,"htmlPopupType":"esriServerHTMLPopupTypeAsHTMLText", "displayField":"LABEL","typeIdField":null, "fields":[{"name":"OBJECTID","type":"esriFieldTypeOID","alias":"OBJECTID","domain":null}], "relationships":[],"canModifyLayer":false,"canScaleSymbols":false,"hasLabels":false, "capabilities":"Map,Query,Data","maxRecordCount":1000,"supportsStatistics":true, "supportsAdvancedQueries":true,"supportedQueryFormats":"JSON, AMF", "ownershipBasedAccessControlForFeatures":{"allowOthersToQuery":true},"useStandardizedQueries":true}""" .encode('UTF-8')) with open( sanitize( endpoint, '/query?f=json_where=OBJECTID=OBJECTID_returnIdsOnly=true' ), 'wb') as f: f.write(""" { "objectIdFieldName": "OBJECTID", "objectIds": [ 1 ] } """.encode('UTF-8')) # Create test layer vl = QgsVectorLayer("url='http://" + endpoint + "' crs='epsg:4326'", 'test', 'arcgisfeatureserver') self.assertTrue(vl.isValid()) extent = QgsLayerMetadata.Extent() extent1 = QgsLayerMetadata.SpatialExtent() extent1.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(4326) extent1.bounds = QgsBox3d(QgsRectangle(-71.123, 66.33, -65.32, 78.3)) extent.setSpatialExtents([extent1]) self.assertEqual(vl.metadata().extent(), extent) self.assertEqual(vl.metadata().crs(), QgsCoordinateReferenceSystem.fromEpsgId(4326)) self.assertEqual(vl.metadata().identifier(), 'http://' + sanitize(endpoint, '')) self.assertEqual(vl.metadata().parentIdentifier(), 'http://' + self.basetestpath + '/2') self.assertEqual(vl.metadata().type(), 'dataset') self.assertEqual(vl.metadata().abstract(), 'QGIS Provider Test Layer') self.assertEqual(vl.metadata().title(), 'QGIS Test') self.assertEqual(vl.metadata().rights(), ['not copyright']) l = QgsLayerMetadata.Link() l.name = 'Source' l.type = 'WWW:LINK' l.url = 'http://' + sanitize(endpoint, '') self.assertEqual(vl.metadata().links(), [l])
def testToRectangle(self): box = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) rect = box.toRectangle() self.assertEqual(rect, QgsRectangle(5, 6, 11, 13))
def testDimensions(self): box = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) self.assertEqual(box.width(), 6.0) self.assertEqual(box.height(), 7.0) self.assertEqual(box.depth(), 8.0)
def testValidateNative(self): # spellok """ Test validating metadata against QGIS native schema """ m = self.createTestMetadata() v = QgsNativeMetadataValidator() res, list = v.validate(m) self.assertTrue(res) self.assertFalse(list) # corrupt metadata piece by piece... m = self.createTestMetadata() m.setIdentifier('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'identifier') m = self.createTestMetadata() m.setLanguage('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'language') m = self.createTestMetadata() m.setType('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'type') m = self.createTestMetadata() m.setTitle('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'title') m = self.createTestMetadata() m.setAbstract('') res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'abstract') m = self.createTestMetadata() m.setLicenses([]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'license') m = self.createTestMetadata() m.setCrs(QgsCoordinateReferenceSystem()) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'crs') m = self.createTestMetadata() m.setContacts([]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'contacts') m = self.createTestMetadata() m.setLinks([]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') m = self.createTestMetadata() m.setKeywords({'': ['kw1', 'kw2']}) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'keywords') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() m.setKeywords({'AA': []}) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'keywords') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() e = m.extent() se = e.spatialExtents()[0] se.extentCrs = QgsCoordinateReferenceSystem() e.setSpatialExtents([se]) m.setExtent(e) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'extent') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() e = m.extent() se = e.spatialExtents()[0] se.bounds = QgsBox3d(1, 1, 0, 1, 2) e.setSpatialExtents([se]) m.setExtent(e) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'extent') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() c = m.contacts()[0] c.name = '' m.setContacts([c]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'contacts') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() l = m.links()[0] l.name = '' m.setLinks([l]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() l = m.links()[0] l.type = '' m.setLinks([l]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') self.assertEqual(list[0].identifier, 0) m = self.createTestMetadata() l = m.links()[0] l.url = '' m.setLinks([l]) res, list = v.validate(m) self.assertFalse(res) self.assertEqual(list[0].section, 'links') self.assertEqual(list[0].identifier, 0)
def testVolume(self): box = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) self.assertEqual(box.volume(), 336.0)
def createTestMetadata(self): """ Returns a standard metadata which can be tested with checkExpectedMetadata """ m = QgsLayerMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('dataset') m.setTitle('roads') m.setAbstract('my roads') m.setFees('None') m.setConstraints([QgsLayerMetadata.Constraint('None', 'access')]) m.setRights(['Copyright foo 2017']) m.setLicenses(['WTFPL']) m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) m.setEncoding('utf-8') m.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326')) e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') se.bounds = QgsBox3d(-180, -90, 0, 180, 90, 0) e.setSpatialExtents([se]) dates = [ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange(QDateTime(QDate(2010, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) ] e.setTemporalExtents(dates) m.setExtent(e) c = QgsLayerMetadata.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsLayerMetadata.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsLayerMetadata.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsLayerMetadata.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsLayerMetadata.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) return m
def testLayerMode(self): """ Create a fully populated QgsLayerMetadata object, then set it to the widget and re-read back the generated metadata to ensure that no content is lost. """ w = QgsMetadataWidget() m = QgsLayerMetadata() m.setIdentifier('1234') m.setParentIdentifier('xyz') m.setLanguage('en-CA') m.setType('dataset') m.setTitle('roads') m.setAbstract('my roads') m.setFees('None') m.setConstraints([QgsLayerMetadata.Constraint('None', 'access')]) m.setRights(['Copyright foo 2017']) m.setLicenses(['WTFPL']) m.setHistory(['history a', 'history b']) m.setKeywords({ 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'], }) #m.setEncoding('utf-8') m.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326')) e = QgsLayerMetadata.Extent() se = QgsLayerMetadata.SpatialExtent() se.extentCrs = QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:4326') se.bounds = QgsBox3d(-180, -90, 0, 180, 90, 0) e.setSpatialExtents([se]) dates = [ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) ] e.setTemporalExtents(dates) m.setExtent(e) c = QgsLayerMetadata.Contact() c.name = 'John Smith' c.organization = 'ACME' c.position = 'staff' c.voice = '1500 515 555' c.fax = 'xx.xxx.xxx.xxxx' c.email = '*****@*****.**' c.role = 'pointOfContact' address = QgsLayerMetadata.Address() address.type = 'postal' address.address = '123 Main Street' address.city = 'anycity' address.administrativeArea = 'anyprovince' address.postalCode = '90210' address.country = 'Canada' c.addresses = [address] m.setContacts([c]) l = QgsLayerMetadata.Link() l.name = 'geonode:roads' l.type = 'OGC:WMS' l.description = 'my GeoNode road layer' l.url = 'http://example.org/wms' l2 = QgsLayerMetadata.Link() l2.name = 'geonode:roads' l2.type = 'OGC:WFS' l2.description = 'my GeoNode road layer' l2.url = 'http://example.org/wfs' l3 = QgsLayerMetadata.Link() l3.name = 'roads' l3.type = 'WWW:LINK' l3.description = 'full dataset download' l3.url = 'http://example.org/roads.tgz' l3.format = 'ESRI Shapefile' l3.mimeType = 'application/gzip' l3.size = '283676' m.setLinks([l, l2, l3]) # set widget metadata w.setMetadata(m) self.assertEqual(w.mode(), QgsMetadataWidget.LayerMetadata) m = w.metadata() self.assertIsInstance(m, QgsLayerMetadata) self.assertEqual(m.identifier(), '1234') self.assertEqual(m.parentIdentifier(), 'xyz') self.assertEqual(m.language(), 'en-CA') self.assertEqual(m.type(), 'dataset') self.assertEqual(m.title(), 'roads') self.assertEqual(m.abstract(), 'my roads') self.assertEqual(m.fees(), 'None') self.assertEqual(m.constraints()[0].constraint, 'None') self.assertEqual(m.constraints()[0].type, 'access') self.assertEqual(m.rights(), ['Copyright foo 2017']) self.assertEqual(m.licenses(), ['WTFPL']) self.assertEqual(m.history(), ['history a', 'history b']) #self.assertEqual(m.encoding(), 'utf-8') self.assertEqual(m.keywords(), { 'GEMET': ['kw1', 'kw2'], 'gmd:topicCategory': ['natural'] }) self.assertEqual(m.crs().authid(), 'EPSG:4326') extent = m.extent().spatialExtents()[0] self.assertEqual(extent.extentCrs.authid(), 'EPSG:4326') self.assertEqual(extent.bounds.xMinimum(), -180.0) self.assertEqual(extent.bounds.yMinimum(), -90.0) self.assertEqual(extent.bounds.xMaximum(), 180.0) self.assertEqual(extent.bounds.yMaximum(), 90.0) self.assertEqual(m.extent().temporalExtents()[0].begin(), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))) self.assertTrue(m.extent().temporalExtents()[0].isInstant()) self.assertEqual(m.contacts()[0].name, 'John Smith') self.assertEqual(m.contacts()[0].organization, 'ACME') self.assertEqual(m.contacts()[0].position, 'staff') self.assertEqual(m.contacts()[0].voice, '1500 515 555') self.assertEqual(m.contacts()[0].fax, 'xx.xxx.xxx.xxxx') self.assertEqual(m.contacts()[0].email, '*****@*****.**') self.assertEqual(m.contacts()[0].role, 'pointOfContact') self.assertEqual(m.contacts()[0].addresses[0].type, 'postal') self.assertEqual(m.contacts()[0].addresses[0].address, '123 Main Street') self.assertEqual(m.contacts()[0].addresses[0].city, 'anycity') self.assertEqual(m.contacts()[0].addresses[0].administrativeArea, 'anyprovince') self.assertEqual(m.contacts()[0].addresses[0].postalCode, '90210') self.assertEqual(m.contacts()[0].addresses[0].country, 'Canada') self.assertEqual(m.links()[0].name, 'geonode:roads') self.assertEqual(m.links()[0].type, 'OGC:WMS') self.assertEqual(m.links()[0].description, 'my GeoNode road layer') self.assertEqual(m.links()[0].url, 'http://example.org/wms') self.assertEqual(m.links()[1].name, 'geonode:roads') self.assertEqual(m.links()[1].type, 'OGC:WFS') self.assertEqual(m.links()[1].description, 'my GeoNode road layer') self.assertEqual(m.links()[1].url, 'http://example.org/wfs') self.assertEqual(m.links()[2].name, 'roads') self.assertEqual(m.links()[2].type, 'WWW:LINK') self.assertEqual(m.links()[2].description, 'full dataset download') self.assertEqual(m.links()[2].url, 'http://example.org/roads.tgz') self.assertEqual(m.links()[2].format, 'ESRI Shapefile') self.assertEqual(m.links()[2].mimeType, 'application/gzip') self.assertEqual(m.links()[2].size, '283676')
def testCombine(self): m1 = QgsLayerMetadata() m2 = QgsLayerMetadata() # should be retained m1.setIdentifier('i1') m1.combine(m2) self.assertEqual(m1.identifier(), 'i1') # should be overwritten m1.setIdentifier(None) m2.setIdentifier('i2') m1.combine(m2) self.assertEqual(m1.identifier(), 'i2') # should be overwritten m1.setIdentifier('i1') m2.setIdentifier('i2') m1.combine(m2) self.assertEqual(m1.identifier(), 'i2') m1.setParentIdentifier('pi1') m2.setParentIdentifier(None) m1.combine(m2) self.assertEqual(m1.parentIdentifier(), 'pi1') m1.setParentIdentifier(None) m2.setParentIdentifier('pi2') m1.combine(m2) self.assertEqual(m1.parentIdentifier(), 'pi2') m1.setLanguage('l1') m2.setLanguage(None) m1.combine(m2) self.assertEqual(m1.language(), 'l1') m1.setLanguage(None) m2.setLanguage('l2') m1.combine(m2) self.assertEqual(m1.language(), 'l2') m1.setType('ty1') m2.setType(None) m1.combine(m2) self.assertEqual(m1.type(), 'ty1') m1.setType(None) m2.setType('ty2') m1.combine(m2) self.assertEqual(m1.type(), 'ty2') m1.setTitle('t1') m2.setTitle(None) m1.combine(m2) self.assertEqual(m1.title(), 't1') m1.setTitle(None) m2.setTitle('t2') m1.combine(m2) self.assertEqual(m1.title(), 't2') m1.setAbstract('a1') m2.setAbstract(None) m1.combine(m2) self.assertEqual(m1.abstract(), 'a1') m1.setAbstract(None) m2.setAbstract('a2') m1.combine(m2) self.assertEqual(m1.abstract(), 'a2') m1.setHistory(['h1', 'hh1']) m2.setHistory([]) m1.combine(m2) self.assertEqual(m1.history(), ['h1', 'hh1']) m1.setHistory([]) m2.setHistory(['h2', 'hh2']) m1.combine(m2) self.assertEqual(m1.history(), ['h2', 'hh2']) m1.setKeywords({'words': ['k1', 'kk1']}) m2.setKeywords({}) m1.combine(m2) self.assertEqual(m1.keywords(), {'words': ['k1', 'kk1']}) m1.setKeywords({}) m2.setKeywords({'words': ['k2', 'kk2']}) m1.combine(m2) self.assertEqual(m1.keywords(), {'words': ['k2', 'kk2']}) m1.setContacts( [QgsLayerMetadata.Contact('c1'), QgsLayerMetadata.Contact('cc1')]) m2.setContacts([]) m1.combine(m2) self.assertEqual( m1.contacts(), [QgsLayerMetadata.Contact('c1'), QgsLayerMetadata.Contact('cc1')]) m1.setContacts([]) m2.setContacts( [QgsLayerMetadata.Contact('c2'), QgsLayerMetadata.Contact('cc2')]) m1.combine(m2) self.assertEqual( m1.contacts(), [QgsLayerMetadata.Contact('c2'), QgsLayerMetadata.Contact('cc2')]) m1.setLinks( [QgsLayerMetadata.Link('l1'), QgsLayerMetadata.Link('ll1')]) m2.setLinks([]) m1.combine(m2) self.assertEqual( m1.links(), [QgsLayerMetadata.Link('l1'), QgsLayerMetadata.Link('ll1')]) m1.setLinks([]) m2.setLinks( [QgsLayerMetadata.Link('l2'), QgsLayerMetadata.Link('ll2')]) m1.combine(m2) self.assertEqual( m1.links(), [QgsLayerMetadata.Link('l2'), QgsLayerMetadata.Link('ll2')]) m1.setFees('f1') m2.setFees(None) m1.combine(m2) self.assertEqual(m1.fees(), 'f1') m1.setFees(None) m2.setFees('f2') m1.combine(m2) self.assertEqual(m1.fees(), 'f2') m1.setConstraints([ QgsLayerMetadata.Constraint('c1'), QgsLayerMetadata.Constraint('cc1') ]) m2.setConstraints([]) m1.combine(m2) self.assertEqual(m1.constraints(), [ QgsLayerMetadata.Constraint('c1'), QgsLayerMetadata.Constraint('cc1') ]) m1.setConstraints([]) m2.setConstraints([ QgsLayerMetadata.Constraint('c2'), QgsLayerMetadata.Constraint('cc2') ]) m1.combine(m2) self.assertEqual(m1.constraints(), [ QgsLayerMetadata.Constraint('c2'), QgsLayerMetadata.Constraint('cc2') ]) m1.setRights(['r1', 'rr1']) m2.setRights([]) m1.combine(m2) self.assertEqual(m1.rights(), ['r1', 'rr1']) m1.setRights([]) m2.setRights(['r2', 'rr2']) m1.combine(m2) self.assertEqual(m1.rights(), ['r2', 'rr2']) m1.setLicenses(['li1', 'lli1']) m2.setLicenses([]) m1.combine(m2) self.assertEqual(m1.licenses(), ['li1', 'lli1']) m1.setLicenses([]) m2.setLicenses(['li2', 'lli2']) m1.combine(m2) self.assertEqual(m1.licenses(), ['li2', 'lli2']) m1.setEncoding('e1') m2.setEncoding(None) m1.combine(m2) self.assertEqual(m1.encoding(), 'e1') m1.setEncoding(None) m2.setEncoding('e2') m1.combine(m2) self.assertEqual(m1.encoding(), 'e2') m1.setCrs(QgsCoordinateReferenceSystem('EPSG:3111')) m2.setCrs(QgsCoordinateReferenceSystem()) m1.combine(m2) self.assertEqual(m1.crs().authid(), 'EPSG:3111') m1.setCrs(QgsCoordinateReferenceSystem()) m2.setCrs(QgsCoordinateReferenceSystem('EPSG:3113')) m1.combine(m2) self.assertEqual(m1.crs().authid(), 'EPSG:3113') s = QgsLayerMetadata.SpatialExtent() s.bounds = QgsBox3d(1, 2, 3, 4, 5, 6) m1.extent().setSpatialExtents([s]) m2.extent().setSpatialExtents([]) m1.combine(m2) self.assertEqual(m1.extent().spatialExtents()[0].bounds, QgsBox3d(1, 2, 3, 4, 5, 6)) s.bounds = QgsBox3d(11, 12, 13, 14, 15, 16) m1.extent().setSpatialExtents([]) m2.extent().setSpatialExtents([s]) m1.combine(m2) self.assertEqual(m1.extent().spatialExtents()[0].bounds, QgsBox3d(11, 12, 13, 14, 15, 16)) s = QgsDateTimeRange(QDateTime(2020, 1, 1, 0, 0, 0), QDateTime(2020, 2, 1, 0, 0, 0)) m1.extent().setTemporalExtents([s]) m2.extent().setTemporalExtents([]) m1.combine(m2) self.assertEqual(m1.extent().temporalExtents()[0], s) s = QgsDateTimeRange(QDateTime(2021, 1, 1, 0, 0, 0), QDateTime(2021, 2, 1, 0, 0, 0)) m1.extent().setTemporalExtents([]) m2.extent().setTemporalExtents([s]) m1.combine(m2) self.assertEqual(m1.extent().temporalExtents()[0], s)
def testEquality(self): # spatial extent extent = QgsLayerMetadata.SpatialExtent() extent.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) extent2 = QgsLayerMetadata.SpatialExtent() extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) self.assertEqual(extent, extent2) extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) self.assertNotEqual(extent, extent2) extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 16.0) self.assertNotEqual(extent, extent2) # extent extent = QgsLayerMetadata.Extent() extent1 = QgsLayerMetadata.SpatialExtent() extent1.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3111) extent1.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 15.0) extent2 = QgsLayerMetadata.SpatialExtent() extent2.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) extent2.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 16.0) extent.setSpatialExtents([extent1, extent2]) dates = [ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange(QDateTime(QDate(2010, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 47))) ] extent.setTemporalExtents(dates) extent_copy = QgsLayerMetadata.Extent(extent) self.assertEqual(extent, extent_copy) extent_copy.setTemporalExtents([ QgsDateTimeRange(QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47)), QDateTime(QDate(2001, 12, 17), QTime(9, 30, 47))), QgsDateTimeRange(QDateTime(QDate(2010, 12, 17), QTime(9, 30, 48)), QDateTime(QDate(2020, 12, 17), QTime(9, 30, 49))) ]) self.assertNotEqual(extent, extent_copy) extent_copy = QgsLayerMetadata.Extent(extent) extent3 = QgsLayerMetadata.SpatialExtent() extent3.extentCrs = QgsCoordinateReferenceSystem.fromEpsgId(3113) extent3.bounds = QgsBox3d(5.0, 6.0, 7.0, 11.0, 13.0, 19.0) extent_copy.setSpatialExtents([extent1, extent3]) self.assertNotEqual(extent, extent_copy) constraint = QgsLayerMetadata.Constraint('c', 'type1') self.assertEqual(constraint, QgsLayerMetadata.Constraint('c', 'type1')) self.assertNotEqual(constraint, QgsLayerMetadata.Constraint('c2', 'type1')) self.assertNotEqual(constraint, QgsLayerMetadata.Constraint('c', 'type2')) a = QgsLayerMetadata.Address() a.type = 'postal' a.address = '13 north rd' a.city = 'huxleys haven' a.administrativeArea = 'land of the queens' a.postalCode = '4123' a.country = 'straya!' a2 = QgsLayerMetadata.Address(a) self.assertEqual(a, a2) a2.type = 'postal2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.address = 'address2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.city = 'city' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.administrativeArea = 'area2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.postalCode = 'postal2' self.assertNotEqual(a, a2) a2 = QgsLayerMetadata.Address(a) a2.country = 'country2' self.assertNotEqual(a, a2) c = QgsLayerMetadata.Contact() c.name = 'name' c.organization = 'org' c.position = 'pos' c.voice = '1500 515 555' c.fax = 'fax' c.email = 'email' c.role = 'role' a = QgsLayerMetadata.Address() a.type = 'postal' a2 = QgsLayerMetadata.Address() a2.type = 'street' c.addresses = [a, a2] c2 = QgsLayerMetadata.Contact(c) self.assertEqual(c, c2) c2.name = 'name2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.organization = 'org2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.position = 'pos2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.voice = 'voice2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.fax = 'fax2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.email = 'email2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.role = 'role2' self.assertNotEqual(c, c2) c2 = QgsLayerMetadata.Contact(c) c2.addresses = [a2] self.assertNotEqual(c, c2) # link l = QgsLayerMetadata.Link() l.name = 'name' l.type = 'type' l.description = 'desc' l.url = 'url' l.format = 'format' l.mimeType = 'mime' l.size = '112' l2 = QgsLayerMetadata.Link(l) self.assertEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.name = 'name2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.type = 'type2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.description = 'desc2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.url = 'url2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.format = 'format2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.mimeType = 'mime2' self.assertNotEqual(l, l2) l2 = QgsLayerMetadata.Link(l) l2.size = '113' self.assertNotEqual(l, l2)
def testLayerMetadata(self): endpoint = self.__class__.basetestpath + '/fake_qgis_http_endpoint_testLayerMetadata' create_landing_page_api_collection(endpoint) # first items first_items = { "type": "FeatureCollection", "features": [{ "type": "Feature", "id": "feat.1", "properties": { "pk": 1, "cnt": 100 }, "geometry": { "type": "Point", "coordinates": [-70.332, 66.33] } }] } with open( sanitize( endpoint, '/collections/mycollection/items?limit=10&' + ACCEPT_ITEMS), 'wb') as f: f.write(json.dumps(first_items).encode('UTF-8')) # API with open(sanitize(endpoint, '/api?' + ACCEPT_API), 'wb') as f: f.write( json.dumps({ "components": { "parameters": { "limit": { "schema": { "maximum": 1000, "default": 100 } } } }, "info": { "contact": { "name": "contact_name", "email": "contact_email", "url": "contact_url" } } }).encode('UTF-8')) # collection base_collection = { "id": "mycollection", "title": "my title", "description": "my description", "extent": { "spatial": { "bbox": [ [-71.123, 66.33, -65.32, 78.3], None, # invalid [1, 2, 3], # invalid ["invalid", 1, 2, 3], # invalid [2, 49, -100, 3, 50, 100] ] }, "temporal": { "interval": [ [None, None], # invalid ["invalid", "invalid"], "another_invalid", ["1980-01-01T12:34:56.789Z", "2020-01-01T00:00:00Z"], ["1980-01-01T12:34:56.789Z", None], [None, "2020-01-01T00:00:00Z"] ] } }, "links": [{ "href": "href_self", "rel": "self", "type": "application/json", "title": "my self link" }, { "href": "href_parent", "rel": "parent", "title": "my parent link" }, { "href": "http://download.example.org/buildings.gpkg", "rel": "enclosure", "type": "application/geopackage+sqlite3", "title": "Bulk download (GeoPackage)", "length": 123456789012345 }], # STAC specific "keywords": ["keyword_a", "keyword_b"] } collection = copy.deepcopy(base_collection) collection['links'].append({ "href": "https://creativecommons.org/publicdomain/zero/1.0/", "rel": "license", "type": "text/html", "title": "CC0-1.0" }) collection['links'].append({ "href": "https://creativecommons.org/publicdomain/zero/1.0/rdf", "rel": "license", "type": "application/rdf+xml", "title": "CC0-1.0" }) collection['links'].append({ "href": "https://example.com", "rel": "license", "type": "text/html", "title": "Public domain" }) with open( sanitize(endpoint, '/collections/mycollection?' + ACCEPT_COLLECTION), 'wb') as f: f.write(json.dumps(collection).encode('UTF-8')) vl = QgsVectorLayer( "url='http://" + endpoint + "' typename='mycollection' restrictToRequestBBOX=1", 'test', 'OAPIF') self.assertTrue(vl.isValid()) md = vl.metadata() assert md.identifier() == 'href_self' assert md.parentIdentifier() == 'href_parent' assert md.type() == 'dataset' assert md.title() == 'my title' assert md.abstract() == 'my description' contacts = md.contacts() assert len(contacts) == 1 contact = contacts[0] assert contact.name == 'contact_name' assert contact.email == 'contact_email' assert contact.organization == 'contact_url' assert len(md.licenses()) == 2 assert md.licenses()[0] == 'CC0-1.0' assert md.licenses()[1] == 'Public domain' assert 'keywords' in md.keywords() assert md.keywords()['keywords'] == ["keyword_a", "keyword_b"] assert md.crs().isValid() assert md.crs().isGeographic() assert not md.crs().hasAxisInverted() links = md.links() assert len(links) == 6, len(links) assert links[0].type == 'WWW:LINK' assert links[0].url == 'href_self' assert links[0].name == 'self' assert links[0].mimeType == 'application/json' assert links[0].description == 'my self link' assert links[0].size == '' assert links[2].size == '123456789012345' extent = md.extent() assert len(extent.spatialExtents()) == 2 spatialExtent = extent.spatialExtents()[0] assert spatialExtent.extentCrs.isValid() assert spatialExtent.extentCrs.isGeographic() assert not spatialExtent.extentCrs.hasAxisInverted() assert spatialExtent.bounds == QgsBox3d(-71.123, 66.33, 0, -65.32, 78.3, 0) spatialExtent = extent.spatialExtents()[1] assert spatialExtent.bounds == QgsBox3d(2, 49, -100, 3, 50, 100) temporalExtents = extent.temporalExtents() assert len(temporalExtents) == 3 assert temporalExtents[0].begin() == QDateTime.fromString( "1980-01-01T12:34:56.789Z", Qt.ISODateWithMs), temporalExtents[0].begin() assert temporalExtents[0].end() == QDateTime.fromString( "2020-01-01T00:00:00Z", Qt.ISODateWithMs), temporalExtents[0].end() assert temporalExtents[1].begin().isValid() assert not temporalExtents[1].end().isValid() assert not temporalExtents[2].begin().isValid() assert temporalExtents[2].end().isValid() # Variant using STAC license collection = copy.deepcopy(base_collection) collection['license'] = 'STAC license' with open( sanitize(endpoint, '/collections/mycollection?' + ACCEPT_COLLECTION), 'wb') as f: f.write(json.dumps(collection).encode('UTF-8')) vl = QgsVectorLayer( "url='http://" + endpoint + "' typename='mycollection' restrictToRequestBBOX=1", 'test', 'OAPIF') self.assertTrue(vl.isValid()) md = vl.metadata() assert len(md.licenses()) == 1 assert md.licenses()[0] == 'STAC license' # Variant using STAC license=various collection = copy.deepcopy(base_collection) collection['license'] = 'various' collection['links'].append({ "href": "https://creativecommons.org/publicdomain/zero/1.0/", "rel": "license", "type": "text/html", "title": "CC0-1.0" }) with open( sanitize(endpoint, '/collections/mycollection?' + ACCEPT_COLLECTION), 'wb') as f: f.write(json.dumps(collection).encode('UTF-8')) vl = QgsVectorLayer( "url='http://" + endpoint + "' typename='mycollection' restrictToRequestBBOX=1", 'test', 'OAPIF') self.assertTrue(vl.isValid()) md = vl.metadata() assert len(md.licenses()) == 1 assert md.licenses()[0] == 'CC0-1.0' # Variant using STAC license=proprietary collection = copy.deepcopy(base_collection) collection['license'] = 'proprietary' collection['links'].append({ "href": "https://example.com", "rel": "license", "type": "text/html", "title": "my proprietary license" }) with open( sanitize(endpoint, '/collections/mycollection?' + ACCEPT_COLLECTION), 'wb') as f: f.write(json.dumps(collection).encode('UTF-8')) vl = QgsVectorLayer( "url='http://" + endpoint + "' typename='mycollection' restrictToRequestBBOX=1", 'test', 'OAPIF') self.assertTrue(vl.isValid()) md = vl.metadata() assert len(md.licenses()) == 1 assert md.licenses()[0] == 'my proprietary license' # Variant using STAC license=proprietary (non conformant: missing a rel=license link) collection = copy.deepcopy(base_collection) collection['license'] = 'proprietary' with open( sanitize(endpoint, '/collections/mycollection?' + ACCEPT_COLLECTION), 'wb') as f: f.write(json.dumps(collection).encode('UTF-8')) vl = QgsVectorLayer( "url='http://" + endpoint + "' typename='mycollection' restrictToRequestBBOX=1", 'test', 'OAPIF') self.assertTrue(vl.isValid()) md = vl.metadata() assert len(md.licenses()) == 1 assert md.licenses()[0] == 'proprietary'