Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
add tests
  • Loading branch information
3nids committed Jan 16, 2023
1 parent f4e4146 commit 0974a86
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 17 deletions.
1 change: 1 addition & 0 deletions tests/src/python/CMakeLists.txt
Expand Up @@ -417,6 +417,7 @@ ADD_PYTHON_TEST(PyQgsFileDownloader test_qgsfiledownloader.py)
ADD_PYTHON_TEST(PyQgsSettings test_qgssettings.py)
ADD_PYTHON_TEST(PyQgsSettingsEntry test_qgssettingsentry.py)
ADD_PYTHON_TEST(PyQgsSettingsRegistry test_qgssettingsregistry.py)
ADD_PYTHON_TEST(PyQgsSettingsTreeElement test_qgssettingstreeelement.py)
ADD_PYTHON_TEST(PyQgsZipUtils test_qgsziputils.py)
ADD_PYTHON_TEST(PyQgsSourceSelectProvider test_qgssourceselectprovider.py)
ADD_PYTHON_TEST(PyQgsAuthManagerProxy test_authmanager_proxy.py)
Expand Down
59 changes: 42 additions & 17 deletions tests/src/python/test_qgssettingsentry.py
Expand Up @@ -37,7 +37,7 @@ def tearDown(self):

def test_settings_entry_base(self):
settingsKey = "settingsEntryBase/variantValue"
settingsKeyComplete = f"plugins/{self.pluginName}/{settingsKey}"
settingsKeyComplete = f"/plugins/{self.pluginName}/{settingsKey}"

# Make sure settings does not exists
QgsSettings().remove(settingsKeyComplete)
Expand Down Expand Up @@ -95,14 +95,19 @@ def test_settings_plugin_key(self):
self.assertEqual(settings_types, list(hardcoded_types.keys()))
for setting_type, default_value in hardcoded_types.items():
settings_key = "settings/key_{}".format(setting_type)
settings_key_complete = "plugins/{}/{}".format(self.pluginName, settings_key)
settings_key_complete = "/plugins/{}/{}".format(self.pluginName, settings_key)
QgsSettings().remove(settings_key_complete)
settings_entry = eval('qgis_core.{}(settings_key, self.pluginName, default_value)'.format(setting_type))
self.assertEqual(settings_entry.key(), settings_key_complete)

def test_with_parent_element(self):
root = QgsSettings.createPluginTreeElement(self.pluginName)
setting = QgsSettingsEntryInteger("my_setting", root)
self.assertEqual(setting.key(), f"/plugins/{self.pluginName}/my_setting")

def test_settings_entry_base_default_value_override(self):
settingsKey = "settingsEntryBase/defaultValueOverride/variantValue"
settingsKeyComplete = f"plugins/{self.pluginName}/{settingsKey}"
settingsKeyComplete = f"/plugins/{self.pluginName}/{settingsKey}"

# Make sure settings does not exists
QgsSettings().remove(settingsKeyComplete)
Expand All @@ -125,8 +130,8 @@ def test_settings_entry_base_dynamic_key(self):
settingsKeyDynamic = "settingsEntryBase/%1/variantValue"
dynamicKeyPart1 = "first"
dynamicKeyPart2 = "second"
settingsKeyComplete1 = "plugins/{}/{}".format(self.pluginName, settingsKeyDynamic).replace("%1", dynamicKeyPart1)
settingsKeyComplete2 = "plugins/{}/{}".format(self.pluginName, settingsKeyDynamic).replace("%1", dynamicKeyPart2)
settingsKeyComplete1 = "/plugins/{}/{}".format(self.pluginName, settingsKeyDynamic).replace("%1", dynamicKeyPart1)
settingsKeyComplete2 = "/plugins/{}/{}".format(self.pluginName, settingsKeyDynamic).replace("%1", dynamicKeyPart2)

# Make sure settings does not exists
QgsSettings().remove(settingsKeyComplete1)
Expand All @@ -151,7 +156,7 @@ def test_settings_entry_base_dynamic_multiple_keys(self):
settingsKeyDynamic = "settingsEntryBase/%1/anotherPart_%2/variantValue"
dynamicKeyPart1 = "first"
dynamicKeyPart2 = "second"
settingsKeyComplete = "plugins/{}/{}".format(self.pluginName, settingsKeyDynamic).replace("%1", dynamicKeyPart1).replace("%2", dynamicKeyPart2)
settingsKeyComplete = f"/plugins/{self.pluginName}/{settingsKeyDynamic}".replace("%1", dynamicKeyPart1).replace("%2", dynamicKeyPart2)

# Make sure settings does not exists
QgsSettings().remove(settingsKeyComplete)
Expand All @@ -169,7 +174,7 @@ def test_settings_entry_base_dynamic_multiple_keys(self):

def test_settings_entry_variant(self):
settingsKey = "settingsEntryVariant/variantValue"
settingsKeyComplete = f"plugins/{self.pluginName}/{settingsKey}"
settingsKeyComplete = f"/plugins/{self.pluginName}/{settingsKey}"

# Make sure settings does not exists
QgsSettings().remove(settingsKeyComplete)
Expand Down Expand Up @@ -365,12 +370,12 @@ def test_settings_entry_enum(self):
self.assertEqual(qgsSettingsValue, QgsUnitTypes.LayoutPicas)

# With save as integer option
settingsEntryEnumAsInteger = QgsSettingsEntryEnumFlag(settingsKey, self.pluginName, defaultValue, description, Qgis.SettingsOption.SaveEnumFlagAsInt)
settingsEntryEnumAsInteger = QgsSettingsEntryEnumFlag("enum-value-2", self.pluginName, defaultValue, description, Qgis.SettingsOption.SaveEnumFlagAsInt)
settingsEntryEnumAsInteger.remove()
self.assertEqual(settingsEntryEnumAsInteger.value(), defaultValue)
success = settingsEntryEnumAsInteger.setValue(QgsUnitTypes.LayoutFeet)
self.assertEqual(success, True)
qgsSettingsValue = QgsSettings().value(settingsKeyComplete, int(QgsUnitTypes.LayoutMeters))
qgsSettingsValue = QgsSettings().value(f"plugins/{self.pluginName}/enum-value-2", int(QgsUnitTypes.LayoutMeters))
self.assertEqual(qgsSettingsValue, int(QgsUnitTypes.LayoutFeet))

def test_settings_entry_flag(self):
Expand Down Expand Up @@ -432,23 +437,43 @@ def test_settings_entry_group(self):
self.assertFalse(settingsEntryString_1.exists())
self.assertFalse(settingsEntryString_2.exists())

def test_migrate_from_key(self):
def test_copy_value_from_key(self):
settingsNewKey = "settingsEntryMigrationNewKey"
settingsEntryNew = QgsSettingsEntryString(settingsNewKey, self.pluginName)
settingsEntryNew.remove()

settingsOldKey = "settingsEntryMigrationOldKey"
settingsEntryOld = QgsSettingsEntryString(settingsOldKey, self.pluginName)
settingsEntryOld.setValue("value from old key")

self.assertFalse(settingsEntryNew.exists())
self.assertTrue(settingsEntryNew.migrateFromKey(f"plugins/{self.pluginName}/{settingsOldKey}"))
self.assertFalse(settingsEntryNew.copyValueFromKey(f"plugins/{self.pluginName}/a-key-which-does-not-exist"))
self.assertTrue(settingsEntryNew.copyValueFromKey(f"plugins/{self.pluginName}/{settingsOldKey}", [], False))
self.assertTrue(settingsEntryNew.exists())

self.assertEqual(settingsEntryNew.value(), settingsEntryOld.value())
settingsEntryNew.setValue("a new value")
self.assertFalse(settingsEntryNew.migrateFromKey(settingsOldKey))
self.assertNotEqual(settingsEntryNew.value(), settingsEntryOld.value())

# with dynamic keys + delete
settingsNewKeyDynamic = "settingsEntryMigrationNewKeyDynamic/%1/key"
settingsEntryNewDynamic = QgsSettingsEntryString(settingsNewKeyDynamic, self.pluginName)
settingsEntryNewDynamic.remove("key1")
settingsOldKeyDynamic = "settingsEntryMigrationOldKey/%1/xxx"
settingsEntryOldDynamic = QgsSettingsEntryString(settingsOldKeyDynamic, self.pluginName)
settingsEntryOldDynamic.setValue("value from old key")
self.assertFalse(settingsEntryNewDynamic.exists())
self.assertTrue(settingsEntryNewDynamic.copyValueFromKey(f"plugins/{self.pluginName}/{settingsOldKey}", ["key1"], True))
self.assertTrue(settingsEntryNewDynamic.exists("key1"))
self.assertFalse(settingsEntryOldDynamic.exists("key1"))
self.assertEqual(settingsEntryNewDynamic.value("key1"), "value from old key")

def test_copy_to_value(self):
settingsDestKey = "settingsEntryMigrationDestKey"
settingsEntryDest = QgsSettingsEntryString(settingsDestKey, self.pluginName)
settingsEntryDest.remove()
settingsSrcKey = "settingsEntryMigrationSrcKey"
settingsEntrySrc = QgsSettingsEntryString(settingsSrcKey, self.pluginName)
settingsEntrySrc.setValue("value from source key")
self.assertFalse(settingsEntryDest.exists())
settingsEntrySrc.copyValueToKey(f"plugins/{self.pluginName}/{settingsDestKey}")
self.assertTrue(settingsEntryDest.exists())
self.assertEqual(settingsEntryDest.value(), settingsEntryDest.value())


if __name__ == '__main__':
Expand Down
137 changes: 137 additions & 0 deletions tests/src/python/test_qgssettingstreeelement.py
@@ -0,0 +1,137 @@
# -*- coding: utf-8 -*-
"""
Test the QgsSettingsEntry classes
Run with: ctest -V -R PyQgsSettingsEntry
.. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
"""

from qgis.core import QgsSettingsException, QgsSettings, QgsSettingsTreeElement, QgsSettingsEntryString, QgsSettingsEntryEnumFlag, QgsUnitTypes
from qgis.testing import start_app, unittest

from qgis.PyQt import sip


__author__ = 'Denis Rouzaud'
__date__ = '19/12/2022'
__copyright__ = 'Copyright 2022, The QGIS Project'


start_app()


class TestQgsSettingsEntry(unittest.TestCase):

def setUp(self):
self.pluginName = "UnitTest"

def tearDown(self):
QgsSettings.unregisterPluginTreeElement(self.pluginName)

def test_constructor(self):
with self.assertRaises(TypeError):
QgsSettingsTreeElement()

root = QgsSettings.createPluginTreeElement(self.pluginName)
self.assertEqual(root.type(), QgsSettingsTreeElement.Type.Normal)
pluginsElement = root.parent()
self.assertEqual(pluginsElement.type(), QgsSettingsTreeElement.Type.Normal)
self.assertEqual(pluginsElement.parent().type(), QgsSettingsTreeElement.Type.Root)
self.assertEqual(pluginsElement.parent().parent(), None)

def test_parent(self):
root = QgsSettings.createPluginTreeElement(self.pluginName)
self.assertEqual(root.type(), QgsSettingsTreeElement.Type.Normal)

l1 = root.createChildElement("test-parent-level-1")
self.assertEqual(l1.type(), QgsSettingsTreeElement.Type.Normal)
self.assertEqual(l1.key(), "test-parent-level-1")
self.assertEqual(l1.completeKey(), f"/plugins/{self.pluginName}/test-parent-level-1/")
self.assertEqual(l1.parent(), root)
self.assertEqual(root.childrenElements(), [l1])
self.assertEqual(root.childrenSettings(), [])

l1a = l1.createChildElement("level-a")
self.assertEqual(l1a.type(), QgsSettingsTreeElement.Type.Normal)
self.assertEqual(l1a.key(), "level-a")
self.assertEqual(l1a.completeKey(), f"/plugins/{self.pluginName}/test-parent-level-1/level-a/")
self.assertEqual(l1a.parent(), l1)
self.assertEqual(l1.childrenElements(), [l1a])
l1b = l1.createChildElement("level-b")
self.assertEqual(l1.childrenElements(), [l1a, l1b])

def test_setting(self):
root = QgsSettings.createPluginTreeElement(self.pluginName)
setting = QgsSettingsEntryString("mysetting", root)

self.assertEqual(setting.parent(), root)
self.assertEqual(setting.key(), f"/plugins/{self.pluginName}/mysetting")

self.assertEqual(root.childrenSettings(), [setting])
self.assertEqual(root.childrenElements(), [])

def test_named_list(self):
proot = QgsSettings.createPluginTreeElement(self.pluginName)
l1 = proot.createChildElement("level-1")
self.assertEqual(l1.namedElementsCount(), 0)
nl = l1.createNamedListElement("my_list")
self.assertEqual(nl.key(), "my_list")
self.assertEqual(nl.completeKey(), f"/plugins/{self.pluginName}/level-1/my_list/items/%1/")
self.assertEqual(nl.namedElementsCount(), 1)
self.assertEqual(nl.childrenElements(), [])
self.assertEqual(nl.childrenSettings(), [])

# nesting lists
nl2 = nl.createNamedListElement("my_nested_list", QgsSettingsTreeElement.Option.NamedListSelectedItemSetting)
self.assertEqual(nl2.key(), "my_nested_list")
self.assertEqual(nl2.completeKey(), f"/plugins/{self.pluginName}/level-1/my_list/items/%1/my_nested_list/items/%2/")
self.assertEqual(nl2.namedElementsCount(), 2)
self.assertEqual(nl2.childrenElements(), [])
self.assertEqual(len(nl2.childrenSettings()), 0) # the setting for the current selection
self.assertEqual(nl2.selectedItemSetting().key(), f"/plugins/{self.pluginName}/level-1/my_list/items/%1/my_nested_list/selected")

# list with settings
setting = QgsSettingsEntryString("mysetting-inlist", nl2)
self.assertEqual(setting.key(), f"/plugins/{self.pluginName}/level-1/my_list/items/%1/my_nested_list/items/%2/mysetting-inlist")
self.assertEqual(setting.key(['item1', 'item2']), f"/plugins/{self.pluginName}/level-1/my_list/items/item1/my_nested_list/items/item2/mysetting-inlist")
self.assertEqual(nl2.childrenElements(), [])
self.assertEqual(len(nl2.childrenSettings()), 1)
self.assertEqual(nl2.childrenSettings()[0], setting)

def test_registration(self):
proot = QgsSettings.createPluginTreeElement(self.pluginName)
self.assertEqual(len(proot.childrenElements()), 0)
l1 = proot.createChildElement("level-1")
self.assertEqual(len(proot.childrenElements()), 1)
QgsSettings.unregisterPluginTreeElement(self.pluginName)

# with several levels + settings
proot = QgsSettings.createPluginTreeElement(self.pluginName)
l1 = proot.createChildElement("level-1")
s1 = QgsSettingsEntryString("my-setting-1", l1)
l2 = l1.createChildElement("level-2")
s2 = QgsSettingsEntryString("my-setting-2", l2)
l2.unregisterChildSetting(s2)
QgsSettings.unregisterPluginTreeElement(self.pluginName)

def test_duplicated_key(self):
proot = QgsSettings.createPluginTreeElement(self.pluginName)
proot.createChildElement("duplicate-key")
with self.assertRaises(QgsSettingsException):
proot.createChildElement("duplicate-key")
with self.assertRaises(QgsSettingsException):
QgsSettingsEntryString("duplicate-key", proot)

def test_python_implementation(self):
proot = QgsSettings.createPluginTreeElement(self.pluginName)
self.setting = QgsSettingsEntryEnumFlag("python-implemented-setting", proot, QgsUnitTypes.LayoutMeters)
self.assertEqual(type(self.setting), QgsSettingsEntryEnumFlag)
self.assertEqual(type(proot.childSetting("python-implemented-setting")), QgsSettingsEntryEnumFlag)


if __name__ == '__main__':
unittest.main()

0 comments on commit 0974a86

Please sign in to comment.