@@ -358,6 +358,41 @@ def testSetDataSource(self):
358
358
self .assertNotEqual (layer .renderer (), r )
359
359
self .assertEqual (layer .renderer ().symbol ().type (), QgsSymbol .Line )
360
360
361
+ def testSetDataSourceInvalidToValid (self ):
362
+ """
363
+ Test that changing an invalid layer path to valid maintains the renderer
364
+ """
365
+ layer = createLayerWithOnePoint ()
366
+ layer .setCrs (QgsCoordinateReferenceSystem ("epsg:3111" ))
367
+ r = QgsSingleSymbolRenderer (QgsSymbol .defaultSymbol (QgsWkbTypes .PointGeometry ))
368
+ layer .setRenderer (r )
369
+ self .assertEqual (layer .renderer ().symbol ().type (), QgsSymbol .Marker )
370
+
371
+ # change to invalid path
372
+ options = QgsDataProvider .ProviderOptions ()
373
+ layer .setDataSource ('nothing' , 'new name' , 'ogr' , options )
374
+
375
+ self .assertFalse (layer .isValid ())
376
+ # these properties should be kept intact!
377
+ self .assertEqual (layer .name (), 'new name' )
378
+ self .assertEqual (layer .wkbType (), QgsWkbTypes .Point )
379
+ self .assertEqual (layer .crs ().authid (), 'EPSG:3111' )
380
+ # should have kept the same renderer!
381
+ self .assertEqual (layer .renderer (), r )
382
+
383
+ # set to a valid path
384
+ points_path = os .path .join (unitTestDataPath (), 'points.shp' )
385
+ layer .setDataSource (points_path , 'new name2' , 'ogr' , options )
386
+
387
+ self .assertTrue (layer .isValid ())
388
+ self .assertEqual (layer .name (), 'new name2' )
389
+ self .assertEqual (layer .wkbType (), QgsWkbTypes .Point )
390
+ self .assertEqual (layer .crs ().authid (), 'EPSG:4326' )
391
+ self .assertIn (points_path , layer .dataProvider ().dataSourceUri ())
392
+
393
+ # should STILL have kept renderer!
394
+ self .assertEqual (layer .renderer (), r )
395
+
361
396
def test_layer_crs (self ):
362
397
"""
363
398
Test that spatial layers have CRS, and non-spatial don't
0 commit comments