From bacd987b06887f4451cd5a80e05abed3ea38a55a Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Thu, 8 Oct 2020 18:22:51 +0200 Subject: [PATCH] Test for issue 39230 expressions fields in ogr --- tests/src/python/test_provider_ogr.py | 56 ++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/tests/src/python/test_provider_ogr.py b/tests/src/python/test_provider_ogr.py index 6cf56db26978..7d892003f051 100644 --- a/tests/src/python/test_provider_ogr.py +++ b/tests/src/python/test_provider_ogr.py @@ -19,12 +19,23 @@ from osgeo import gdal, ogr # NOQA from qgis.PyQt.QtCore import QVariant, QByteArray -from qgis.core import (NULL, - QgsApplication, - QgsRectangle, - QgsProviderRegistry, - QgsFeature, QgsFeatureRequest, QgsField, QgsSettings, QgsDataProvider, - QgsVectorDataProvider, QgsVectorLayer, QgsWkbTypes, QgsNetworkAccessManager) +from qgis.core import ( + NULL, + QgsApplication, + QgsProject, + QgsField, + QgsFields, + QgsRectangle, + QgsProviderRegistry, + QgsFeature, + QgsFeatureRequest, + QgsSettings, + QgsDataProvider, + QgsVectorDataProvider, + QgsVectorLayer, + QgsWkbTypes, + QgsNetworkAccessManager +) from qgis.testing import start_app, unittest from utilities import unitTestDataPath @@ -780,6 +791,39 @@ def testOpenOptions(self): os.remove(filename) + def testTransactionGroupExpressionFields(self): + """Test issue GH #39230, this is not really specific to GPKG""" + + project = QgsProject() + project.setAutoTransaction(True) + tmpfile = os.path.join( + self.basetestpath, 'tempGeoPackageTransactionExpressionFields.gpkg') + ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile) + lyr = ds.CreateLayer('test', geom_type=ogr.wkbPoint) + lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString)) + + f = ogr.Feature(lyr.GetLayerDefn()) + f.SetGeometry(ogr.CreateGeometryFromWkt('POINT (1 1)')) + f.SetField('str_field', 'one') + lyr.CreateFeature(f) + + del lyr + del ds + + vl = QgsVectorLayer(tmpfile + '|layername=test', 'test', 'ogr') + f = QgsField('expression_field', QVariant.Int) + idx = vl.addExpressionField('123', f) + self.assertEqual(vl.fields().fieldOrigin(idx), QgsFields.OriginExpression) + + project.addMapLayers([vl]) + + feature = next(vl.getFeatures()) + feature.setAttributes([None, 'two', 123]) + + self.assertTrue(vl.startEditing()) + self.assertTrue(vl.addFeature(feature)) + self.assertFalse(vl.dataProvider().hasErrors()) + if __name__ == '__main__': unittest.main()