Skip to content

Commit

Permalink
[postgres] Add styleExists test, minor fix for listStylesInDatabase r…
Browse files Browse the repository at this point in the history
…eturning error when layer_styles table not present
  • Loading branch information
nyalldawson committed Jan 24, 2022
1 parent 9515695 commit 77bc195
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 17 deletions.
6 changes: 6 additions & 0 deletions src/providers/postgres/qgspostgresprovider.cpp
Expand Up @@ -5637,6 +5637,7 @@ QString QgsPostgresProviderMetadata::loadStyle( const QString &uri, QString &err
int QgsPostgresProviderMetadata::listStyles( const QString &uri, QStringList &ids, QStringList &names,
QStringList &descriptions, QString &errCause )
{
errCause.clear();
QgsDataSourceUri dsUri( uri );

QgsPostgresConn *conn = QgsPostgresConn::connectDb( dsUri.connectionInfo( false ), false );
Expand All @@ -5646,6 +5647,11 @@ int QgsPostgresProviderMetadata::listStyles( const QString &uri, QStringList &id
return -1;
}

if ( !tableExists( *conn, QStringLiteral( "layer_styles" ) ) )
{
return -1;
}

if ( dsUri.database().isEmpty() ) // typically when a service file is used
{
dsUri.setDatabase( conn->currentDatabase() );
Expand Down
81 changes: 64 additions & 17 deletions tests/src/python/test_provider_postgres.py
Expand Up @@ -1883,16 +1883,24 @@ def testStyle(self):
self.assertTrue(vl.dataProvider().isDeleteStyleFromDatabaseSupported())

# table layer_styles does not exist

res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), '')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'a style')
self.assertFalse(res)
self.assertFalse(err)

related_count, idlist, namelist, desclist, errmsg = vl.listStylesInDatabase()
self.assertEqual(related_count, -1)
self.assertEqual(idlist, [])
self.assertEqual(namelist, [])
self.assertEqual(desclist, [])
self.assertNotEqual(errmsg, "")
self.assertFalse(errmsg)

qml, errmsg = vl.getStyleFromDatabase("1")
self.assertEqual(qml, "")
self.assertNotEqual(errmsg, "")
self.assertFalse(qml)
self.assertTrue(errmsg)

mFilePath = QDir.toNativeSeparators(
'%s/symbol_layer/%s.qml' % (unitTestDataPath(), "singleSymbol"))
Expand All @@ -1902,43 +1910,69 @@ def testStyle(self):
# The style is saved as non-default
errorMsg = vl.saveStyleToDatabase(
"by day", "faded greens and elegant patterns", False, "")
self.assertEqual(errorMsg, "")
self.assertFalse(errorMsg)

# the style id should be "1", not "by day"
qml, errmsg = vl.getStyleFromDatabase("by day")
self.assertEqual(qml, "")
self.assertNotEqual(errmsg, "")

res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), '')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'a style')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'by day')
self.assertTrue(res)
self.assertFalse(err)

related_count, idlist, namelist, desclist, errmsg = vl.listStylesInDatabase()
self.assertEqual(related_count, 1)
self.assertEqual(errmsg, "")
self.assertFalse(errmsg)
self.assertEqual(idlist, ["1"])
self.assertEqual(namelist, ["by day"])
self.assertEqual(desclist, ["faded greens and elegant patterns"])

qml, errmsg = vl.getStyleFromDatabase("100")
self.assertEqual(qml, "")
self.assertNotEqual(errmsg, "")
self.assertFalse(qml)
self.assertTrue(errmsg)

qml, errmsg = vl.getStyleFromDatabase("1")
self.assertTrue(qml.startswith('<!DOCTYPE qgis'), qml)
self.assertEqual(errmsg, "")
self.assertFalse(errmsg)

res, errmsg = vl.deleteStyleFromDatabase("100")
self.assertTrue(res)
self.assertEqual(errmsg, "")

res, errmsg = vl.deleteStyleFromDatabase("1")
self.assertTrue(res)
self.assertEqual(errmsg, "")
self.assertFalse(errmsg)

# We save now the style again twice but with one as default
errorMsg = vl.saveStyleToDatabase(
errmsg = vl.saveStyleToDatabase(
"related style", "faded greens and elegant patterns", False, "")
self.assertEqual(errorMsg, "")
errorMsg = vl.saveStyleToDatabase(
self.assertEqual(errmsg, "")
errmsg = vl.saveStyleToDatabase(
"default style", "faded greens and elegant patterns", True, "")
self.assertEqual(errorMsg, "")
self.assertFalse(errmsg)

res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), '')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'a style')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'default style')
self.assertTrue(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'related style')
self.assertTrue(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'by day')
self.assertFalse(res)
self.assertFalse(err)

related_count, idlist, namelist, desclist, errmsg = vl.listStylesInDatabase()
self.assertEqual(related_count, 2)
Expand All @@ -1950,18 +1984,31 @@ def testStyle(self):
# We remove these 2 styles
res, errmsg = vl.deleteStyleFromDatabase("2")
self.assertTrue(res)
self.assertEqual(errmsg, "")
self.assertFalse(errmsg)
res, errmsg = vl.deleteStyleFromDatabase("3")
self.assertTrue(res)
self.assertEqual(errmsg, "")
self.assertFalse(errmsg)

# table layer_styles does exit, but is now empty
# table layer_styles does exist, but is now empty
related_count, idlist, namelist, desclist, errmsg = vl.listStylesInDatabase()
self.assertEqual(related_count, 0)
self.assertEqual(idlist, [])
self.assertEqual(namelist, [])
self.assertEqual(desclist, [])
self.assertEqual(errmsg, "")
self.assertFalse(errmsg)

res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), '')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'a style')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'default style')
self.assertFalse(res)
self.assertFalse(err)
res, err = QgsProviderRegistry.instance().styleExists('postgres', vl.source(), 'related style')
self.assertFalse(res)
self.assertFalse(err)

def testStyleWithGeometryType(self):
"""Test saving styles with the additional geometry type
Expand Down

0 comments on commit 77bc195

Please sign in to comment.