Skip to content

Commit 3cba1aa

Browse files
committed
test_provider_shapefile: add test for correct repacking on feature deletion (test fix for #11007)
1 parent 647ab4e commit 3cba1aa

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

tests/src/python/test_provider_shapefile.py

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import shutil
1818
import glob
1919
import osgeo.gdal
20+
import osgeo.ogr
2021
import sys
2122

2223
from qgis.core import QgsFeature, QgsField, QgsGeometry, QgsVectorLayer, QgsFeatureRequest, QgsVectorDataProvider
@@ -25,12 +26,6 @@
2526
from utilities import unitTestDataPath
2627
from providertestbase import ProviderTestCase
2728

28-
try:
29-
from osgeo import gdal
30-
gdal_ok = True
31-
except:
32-
gdal_ok = False
33-
3429
start_app()
3530
TEST_DATA_DIR = unitTestDataPath()
3631

@@ -205,11 +200,9 @@ def testUpdateMode(self):
205200
self.assertTrue(vl.dataProvider().deleteFeatures([fid]))
206201

207202
# Check that it has really disappeared
208-
if gdal_ok:
209-
gdal.PushErrorHandler('CPLQuietErrorHandler')
203+
osgeo.gdal.PushErrorHandler('CPLQuietErrorHandler')
210204
features = [f_iter for f_iter in vl.getFeatures(QgsFeatureRequest().setFilterFid(fid))]
211-
if gdal_ok:
212-
gdal.PopErrorHandler()
205+
osgeo.gdal.PopErrorHandler()
213206
self.assertEquals(features, [])
214207

215208
self.assertTrue(vl.dataProvider().addAttributes([QgsField("new_field", QVariant.Int, "integer")]))
@@ -358,5 +351,34 @@ def testDeleteGeometry(self):
358351
fet = next(vl.getFeatures())
359352
self.assertIsNone(fet.geometry())
360353

354+
def testDeleteShapes(self):
355+
''' Test fix for #11007 '''
356+
357+
tmpdir = tempfile.mkdtemp()
358+
self.dirs_to_cleanup.append(tmpdir)
359+
srcpath = os.path.join(TEST_DATA_DIR, 'provider')
360+
for file in glob.glob(os.path.join(srcpath, 'shapefile.*')):
361+
shutil.copy(os.path.join(srcpath, file), tmpdir)
362+
datasource = os.path.join(tmpdir, 'shapefile.shp')
363+
364+
vl = QgsVectorLayer(u'{}|layerid=0'.format(datasource), u'test', u'ogr')
365+
feature_count = vl.featureCount()
366+
# Start an iterator that will open a new connection
367+
iterator = vl.getFeatures()
368+
f = next(iterator)
369+
370+
# Delete a feature
371+
self.assertTrue(vl.startEditing())
372+
self.assertTrue(vl.deleteFeature(1))
373+
self.assertTrue(vl.commitChanges())
374+
375+
# Test the content of the shapefile while it is still opened
376+
ds = osgeo.ogr.Open(datasource)
377+
# Test repacking has been done
378+
self.assertTrue(ds.GetLayer(0).GetFeatureCount(), feature_count - 1)
379+
ds = None
380+
381+
vl = None
382+
361383
if __name__ == '__main__':
362384
unittest.main()

0 commit comments

Comments
 (0)