Skip to content

Commit aa376c2

Browse files
committedMay 25, 2017
Split ProviderTestCase into provider/source tests
There's now a FeatureSourceTestCase base class which handles testing QgsFeatureSources for conformance. These tests consist mostly of tests which where previously in ProviderTestCase. ProviderTestCase now subclasses FeatureSourceTestCase + adds tests which are specific to QgsVectorDataProviders.
1 parent df3a43f commit aa376c2

13 files changed

+749
-572
lines changed
 

‎tests/src/python/featuresourcetestbase.py

Lines changed: 599 additions & 0 deletions
Large diffs are not rendered by default.

‎tests/src/python/providertestbase.py

Lines changed: 62 additions & 542 deletions
Large diffs are not rendered by default.

‎tests/src/python/test_provider_db2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def setUpClass(cls):
3939
# Create test layer
4040
cls.vl = QgsVectorLayer(cls.dbconn + ' srid=4326 type=Point table="QGIS_TEST"."SOMEDATA" (GEOM) sql=', 'test', 'DB2')
4141
assert(cls.vl.isValid())
42-
cls.provider = cls.vl.dataProvider()
42+
cls.source = cls.vl.dataProvider()
4343
cls.poly_vl = QgsVectorLayer(
4444
cls.dbconn + ' srid=4326 type=POLYGON table="QGIS_TEST"."SOME_POLY_DATA" (geom) sql=', 'test', 'DB2')
4545
assert(cls.poly_vl.isValid())

‎tests/src/python/test_provider_memory.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def setUpClass(cls):
8383
# Create test layer
8484
cls.vl = cls.createLayer()
8585
assert (cls.vl.isValid())
86-
cls.provider = cls.vl.dataProvider()
86+
cls.source = cls.vl.dataProvider()
8787

8888
# poly layer
8989
cls.poly_vl = QgsVectorLayer('Polygon?crs=epsg:4326&field=pk:integer&key=pk',
@@ -415,7 +415,7 @@ def setUpClass(cls):
415415
cls.vl = QgsVectorLayer('Point?crs=epsg:4326&index=yes&field=pk:integer&field=cnt:int8&field=name:string(0)&field=name2:string(0)&field=num_char:string&key=pk',
416416
'test', 'memory')
417417
assert (cls.vl.isValid())
418-
cls.provider = cls.vl.dataProvider()
418+
cls.source = cls.vl.dataProvider()
419419

420420
f1 = QgsFeature()
421421
f1.setAttributes([5, -200, NULL, 'NuLl', '5'])
@@ -436,7 +436,7 @@ def setUpClass(cls):
436436
f5.setAttributes([4, 400, 'Honey', 'Honey', '4'])
437437
f5.setGeometry(QgsGeometry.fromWkt('Point (-65.32 78.3)'))
438438

439-
cls.provider.addFeatures([f1, f2, f3, f4, f5])
439+
cls.source.addFeatures([f1, f2, f3, f4, f5])
440440

441441
# poly layer
442442
cls.poly_vl = QgsVectorLayer('Polygon?crs=epsg:4326&index=yes&field=pk:integer&key=pk',

‎tests/src/python/test_provider_mssql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def setUpClass(cls):
4040
cls.vl = QgsVectorLayer(
4141
cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POINT table="qgis_test"."someData" (geom) sql=', 'test', 'mssql')
4242
assert(cls.vl.isValid())
43-
cls.provider = cls.vl.dataProvider()
43+
cls.source = cls.vl.dataProvider()
4444
cls.poly_vl = QgsVectorLayer(
4545
cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data" (geom) sql=', 'test', 'mssql')
4646
assert(cls.poly_vl.isValid())

‎tests/src/python/test_provider_oracle.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def setUpClass(cls):
4040
cls.vl = QgsVectorLayer(
4141
cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POINT table="QGIS"."SOME_DATA" (GEOM) sql=', 'test', 'oracle')
4242
assert(cls.vl.isValid())
43-
cls.provider = cls.vl.dataProvider()
43+
cls.source = cls.vl.dataProvider()
4444
cls.poly_vl = QgsVectorLayer(
4545
cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="QGIS"."SOME_POLY_DATA" (GEOM) sql=', 'test', 'oracle')
4646
assert(cls.poly_vl.isValid())
@@ -151,8 +151,8 @@ def testDateTimeTypes(self):
151151
QDate(2004, 3, 4), QTime(13, 41, 52)))
152152

153153
def testDefaultValue(self):
154-
self.assertEqual(self.provider.defaultValue(1), NULL)
155-
self.assertEqual(self.provider.defaultValue(2), "'qgis'")
154+
self.assertEqual(self.source.defaultValue(1), NULL)
155+
self.assertEqual(self.source.defaultValue(2), "'qgis'")
156156

157157

158158
if __name__ == '__main__':

‎tests/src/python/test_provider_postgres.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def setUpClass(cls):
5151
# Create test layers
5252
cls.vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POINT table="qgis_test"."someData" (geom) sql=', 'test', 'postgres')
5353
assert cls.vl.isValid()
54-
cls.provider = cls.vl.dataProvider()
54+
cls.source = cls.vl.dataProvider()
5555
cls.poly_vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'pk\' srid=4326 type=POLYGON table="qgis_test"."some_poly_data" (geom) sql=', 'test', 'postgres')
5656
assert cls.poly_vl.isValid()
5757
cls.poly_provider = cls.poly_vl.dataProvider()
@@ -70,7 +70,7 @@ def execSQLCommand(self, sql):
7070
cur.close()
7171
self.con.commit()
7272

73-
def getEditableLayer(self):
73+
def getSource(self):
7474
# create temporary table for edit tests
7575
self.execSQLCommand('DROP TABLE IF EXISTS qgis_test."editData" CASCADE')
7676
self.execSQLCommand('CREATE TABLE qgis_test."editData" ( pk SERIAL NOT NULL PRIMARY KEY, cnt integer, name text, name2 text, num_char text, geom public.geometry(Point, 4326))')
@@ -85,6 +85,9 @@ def getEditableLayer(self):
8585
'test', 'postgres')
8686
return vl
8787

88+
def getEditableLayer(self):
89+
return self.getSource()
90+
8891
def enableCompiler(self):
8992
QgsSettings().setValue('/qgis/compileExpressions', True)
9093

@@ -99,17 +102,17 @@ def partiallyCompiledFilters(self):
99102

100103
# HERE GO THE PROVIDER SPECIFIC TESTS
101104
def testDefaultValue(self):
102-
self.provider.setProviderProperty(QgsDataProvider.EvaluateDefaultValues, True)
103-
self.assertIsInstance(self.provider.defaultValue(0), int)
104-
self.assertEqual(self.provider.defaultValue(1), NULL)
105-
self.assertEqual(self.provider.defaultValue(2), 'qgis')
106-
self.provider.setProviderProperty(QgsDataProvider.EvaluateDefaultValues, False)
105+
self.source.setProviderProperty(QgsDataProvider.EvaluateDefaultValues, True)
106+
self.assertIsInstance(self.source.defaultValue(0), int)
107+
self.assertEqual(self.source.defaultValue(1), NULL)
108+
self.assertEqual(self.source.defaultValue(2), 'qgis')
109+
self.source.setProviderProperty(QgsDataProvider.EvaluateDefaultValues, False)
107110

108111
def testDefaultValueClause(self):
109-
self.provider.setProviderProperty(QgsDataProvider.EvaluateDefaultValues, False)
110-
self.assertEqual(self.provider.defaultValueClause(0), 'nextval(\'qgis_test."someData_pk_seq"\'::regclass)')
111-
self.assertFalse(self.provider.defaultValueClause(1))
112-
self.assertEqual(self.provider.defaultValueClause(2), '\'qgis\'::text')
112+
self.source.setProviderProperty(QgsDataProvider.EvaluateDefaultValues, False)
113+
self.assertEqual(self.source.defaultValueClause(0), 'nextval(\'qgis_test."someData_pk_seq"\'::regclass)')
114+
self.assertFalse(self.source.defaultValueClause(1))
115+
self.assertEqual(self.source.defaultValueClause(2), '\'qgis\'::text')
113116

114117
def testDateTimeTypes(self):
115118
vl = QgsVectorLayer('%s table="qgis_test"."date_times" sql=' % (self.dbconn), "testdatetimes", "postgres")
@@ -727,7 +730,7 @@ def setUpClass(cls):
727730
# Create test layers
728731
cls.vl = QgsVectorLayer(cls.dbconn + ' sslmode=disable key=\'"key1","key2"\' srid=4326 type=POINT table="qgis_test"."someDataCompound" (geom) sql=', 'test', 'postgres')
729732
assert cls.vl.isValid()
730-
cls.provider = cls.vl.dataProvider()
733+
cls.source = cls.vl.dataProvider()
731734

732735
@classmethod
733736
def tearDownClass(cls):

‎tests/src/python/test_provider_shapefile.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def setUpClass(cls):
6363
cls.basetestpolyfile = os.path.join(cls.basetestpath, 'shapefile_poly.shp')
6464
cls.vl = QgsVectorLayer('{}|layerid=0'.format(cls.basetestfile), 'test', 'ogr')
6565
assert(cls.vl.isValid())
66-
cls.provider = cls.vl.dataProvider()
66+
cls.source = cls.vl.dataProvider()
6767
cls.vl_poly = QgsVectorLayer('{}|layerid=0'.format(cls.basetestpolyfile), 'test', 'ogr')
6868
assert (cls.vl_poly.isValid())
6969
cls.poly_provider = cls.vl_poly.dataProvider()
@@ -76,7 +76,7 @@ def tearDownClass(cls):
7676
for dirname in cls.dirs_to_cleanup:
7777
shutil.rmtree(dirname, True)
7878

79-
def getEditableLayer(self):
79+
def getSource(self):
8080
tmpdir = tempfile.mkdtemp()
8181
self.dirs_to_cleanup.append(tmpdir)
8282
srcpath = os.path.join(TEST_DATA_DIR, 'provider')
@@ -87,6 +87,9 @@ def getEditableLayer(self):
8787
vl = QgsVectorLayer('{}|layerid=0'.format(datasource), 'test', 'ogr')
8888
return vl
8989

90+
def getEditableLayer(self):
91+
return self.getSource()
92+
9093
def enableCompiler(self):
9194
QgsSettings().setValue('/qgis/compileExpressions', True)
9295

‎tests/src/python/test_provider_spatialite.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def setUpClass(cls):
6464
# setup provider for base tests
6565
cls.vl = QgsVectorLayer('dbname=\'{}/provider/spatialite.db\' table="somedata" (geom) sql='.format(TEST_DATA_DIR), 'test', 'spatialite')
6666
assert(cls.vl.isValid())
67-
cls.provider = cls.vl.dataProvider()
67+
cls.source = cls.vl.dataProvider()
6868

6969
cls.vl_poly = QgsVectorLayer('dbname=\'{}/provider/spatialite.db\' table="somepolydata" (geom) sql='.format(TEST_DATA_DIR), 'test', 'spatialite')
7070
assert(cls.vl_poly.isValid())
@@ -165,7 +165,7 @@ def tearDownClass(cls):
165165
for dirname in cls.dirs_to_cleanup:
166166
shutil.rmtree(dirname, True)
167167

168-
def getEditableLayer(self):
168+
def getSource(self):
169169
tmpdir = tempfile.mkdtemp()
170170
self.dirs_to_cleanup.append(tmpdir)
171171
srcpath = os.path.join(TEST_DATA_DIR, 'provider')
@@ -177,6 +177,9 @@ def getEditableLayer(self):
177177
'spatialite')
178178
return vl
179179

180+
def getEditableLayer(self):
181+
return self.getSource()
182+
180183
def setUp(self):
181184
"""Run before each test."""
182185
pass

‎tests/src/python/test_provider_virtual.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def setUpClass(cls):
5858
d.setUid("pk")
5959
cls.vl = QgsVectorLayer(d.toString(), 'test', 'virtual')
6060
assert (cls.vl.isValid())
61-
cls.provider = cls.vl.dataProvider()
61+
cls.source = cls.vl.dataProvider()
6262

6363
shp_poly = os.path.join(TEST_DATA_DIR, 'provider/shapefile_poly.shp')
6464
d = QgsVirtualLayerDefinition()

‎tests/src/python/test_provider_wfs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ def setUpClass(cls):
130130
# Create test layer
131131
cls.vl = QgsVectorLayer("url='http://" + endpoint + "' typename='my:typename'", 'test', 'WFS')
132132
assert (cls.vl.isValid())
133-
cls.provider = cls.vl.dataProvider()
133+
cls.source = cls.vl.dataProvider()
134134

135135
with open(sanitize(endpoint, '?SERVICE=WFS&REQUEST=GetFeature&VERSION=2.0.0&TYPENAMES=my:typename&SRSNAME=urn:ogc:def:crs:EPSG::4326'), 'wb') as f:
136136
f.write("""

‎tests/src/python/test_qgsdelimitedtextprovider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def setUpClass(cls):
149149

150150
cls.vl = QgsVectorLayer(url.toString(), 'test', 'delimitedtext')
151151
assert cls.vl.isValid(), "{} is invalid".format(cls.basetestfile)
152-
cls.provider = cls.vl.dataProvider()
152+
cls.source = cls.vl.dataProvider()
153153

154154
@classmethod
155155
def tearDownClass(cls):
@@ -175,7 +175,7 @@ def setUpClass(cls):
175175

176176
cls.vl = QgsVectorLayer(url.toString(), 'test', 'delimitedtext')
177177
assert cls.vl.isValid(), "{} is invalid".format(cls.basetestfile)
178-
cls.provider = cls.vl.dataProvider()
178+
cls.source = cls.vl.dataProvider()
179179

180180
cls.basetestpolyfile = os.path.join(srcpath, 'delimited_wkt_poly.csv')
181181

‎tests/src/python/test_qgsvectorlayer.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@
5151
QgsVectorLayerSimpleLabeling,
5252
QgsSingleCategoryDiagramRenderer,
5353
QgsDiagramLayerSettings,
54-
QgsTextFormat)
54+
QgsTextFormat,
55+
NULL)
5556
from qgis.testing import start_app, unittest
57+
from featuresourcetestbase import FeatureSourceTestCase
5658
from utilities import unitTestDataPath
5759
start_app()
5860

@@ -172,7 +174,54 @@ def dumpEditBuffer(layer):
172174
print(("%d | %s" % (f.id(), f.geometry().exportToWkt())))
173175

174176

175-
class TestQgsVectorLayer(unittest.TestCase):
177+
class TestQgsVectorLayer(unittest.TestCase, FeatureSourceTestCase):
178+
179+
@classmethod
180+
def getSource(cls):
181+
vl = QgsVectorLayer(
182+
'Point?crs=epsg:4326&field=pk:integer&field=cnt:integer&field=name:string(0)&field=name2:string(0)&field=num_char:string&key=pk',
183+
'test', 'memory')
184+
assert (vl.isValid())
185+
186+
f1 = QgsFeature()
187+
f1.setAttributes([5, -200, NULL, 'NuLl', '5'])
188+
f1.setGeometry(QgsGeometry.fromWkt('Point (-71.123 78.23)'))
189+
190+
f2 = QgsFeature()
191+
f2.setAttributes([3, 300, 'Pear', 'PEaR', '3'])
192+
193+
f3 = QgsFeature()
194+
f3.setAttributes([1, 100, 'Orange', 'oranGe', '1'])
195+
f3.setGeometry(QgsGeometry.fromWkt('Point (-70.332 66.33)'))
196+
197+
f4 = QgsFeature()
198+
f4.setAttributes([2, 200, 'Apple', 'Apple', '2'])
199+
f4.setGeometry(QgsGeometry.fromWkt('Point (-68.2 70.8)'))
200+
201+
f5 = QgsFeature()
202+
f5.setAttributes([4, 400, 'Honey', 'Honey', '4'])
203+
f5.setGeometry(QgsGeometry.fromWkt('Point (-65.32 78.3)'))
204+
205+
vl.dataProvider().addFeatures([f1, f2, f3, f4, f5])
206+
return vl
207+
208+
@classmethod
209+
def setUpClass(cls):
210+
"""Run before all tests"""
211+
# Create test layer for FeatureSourceTestCase
212+
cls.source = cls.getSource()
213+
214+
def testGetFeaturesSubsetAttributes2(self):
215+
""" Override and skip this QgsFeatureSource test. We are using a memory provider, and it's actually more efficient for the memory provider to return
216+
its features as direct copies (due to implicit sharing of QgsFeature)
217+
"""
218+
pass
219+
220+
def testGetFeaturesNoGeometry(self):
221+
""" Override and skip this QgsFeatureSource test. We are using a memory provider, and it's actually more efficient for the memory provider to return
222+
its features as direct copies (due to implicit sharing of QgsFeature)
223+
"""
224+
pass
176225

177226
def test_FeatureCount(self):
178227
myPath = os.path.join(unitTestDataPath(), 'lines.shp')

0 commit comments

Comments
 (0)
Please sign in to comment.