Skip to content

Commit

Permalink
Merge 1fa4cd5 into fbb8f7f
Browse files Browse the repository at this point in the history
  • Loading branch information
romer8 committed Jun 8, 2023
2 parents fbb8f7f + 1fa4cd5 commit 9025476
Show file tree
Hide file tree
Showing 7 changed files with 674 additions and 38 deletions.
393 changes: 393 additions & 0 deletions tests/unit_tests/test_tethys_apps/test_utilities.py
Original file line number Diff line number Diff line change
Expand Up @@ -1025,3 +1025,396 @@ def test_secrets_signed_unsigned_value_with_secrets(
custom_secret_setting.name(), secret_signed_mock, app_target_name, False
)
self.assertEqual(unsigned_secret, mock_val)

@mock.patch(
"tethys_apps.utilities.Path.open",
new_callable=lambda: mock.mock_open(read_data='{"apps": "{}"}'),
)
@mock.patch("tethys_apps.utilities.yaml.dump")
@mock.patch("tethys_apps.utilities.get_attribute_for_service")
@mock.patch("tethys_apps.utilities.get_setting_type_for_state")
@mock.patch("tethys_apps.utilities.yaml.safe_load")
def test_update_app_settings_with_apps_section(
self,
mock_yaml_safe_load,
mock_get_setting_type_for_state,
mock_get_attribute_for_service,
_,
__,
):
app_name = "fake_app_name"
mock_yaml_safe_load.side_effect = [
{
"apps": {
app_name: {
"services": {
"persistent": {
"this_setting_is_in_the_file_but_does_not_exist": "random_persistent_setting"
},
"custom_settings": {"no_val_persistent_setting": {}},
}
}
}
},
{
"apps": {
app_name: {"services": {"persistent": {}, "custom_settings": {}}}
}
},
]
final_portal_yamls = [
{
"apps": {
app_name: {
"services": {
"persistent": {},
"custom_settings": {},
}
}
}
},
{
"apps": {
app_name: {
"services": {
"persistent": {},
"custom_settings": {},
"spatial": {
"linked_spatial_setting": "linked_spatial_setting_value"
},
"dataset": {
"dataset_setting_with_val": "dataset_setting_value"
},
}
}
}
},
]
mock_get_setting_type_for_state.side_effect = [
"custom_settings",
"persistent",
"spatial",
"dataset",
]
mock_get_attribute_for_service.side_effect = [
"unlinked_value_1",
"unlinked_value_2",
"linked_spatial_setting_value",
"dataset_setting_value",
]
# This persistent setting exists and is listed in the file
mock_persistent_dataset_setting = mock.MagicMock()
mock_persistent_dataset_setting.name = "dataset_setting_with_val"
mock_persistent_dataset_setting.value = "dataset_setting_value"

# This setting exists, but there is no value assigned in the file
mock_no_val_persistent_setting = mock.MagicMock()
mock_no_val_persistent_setting.name = "no_val_persistent_setting"

# This persistent setting is not listed in the file, but exists in the db
mock_setting_unlisted = mock.MagicMock()
mock_setting_unlisted.name = "this_setting_is_in_the_file_but_does_not_exist"

mock_setting_already_linked_spatial = mock.MagicMock()
mock_setting_already_linked_spatial.name = "linked_spatial_setting"
mock_setting_already_linked_spatial.value = "linked_spatial_setting_value"

settings = {
"unlinked_settings": [
mock_no_val_persistent_setting, #: This setting exists and is listed in the file, but no value given
mock_setting_unlisted, #: This persistent is listed in the file, it will be removed
],
"linked_settings": [
mock_setting_already_linked_spatial, #: This setting is already linked, and so it won't be configured again
mock_persistent_dataset_setting, #: This persistent setting exists and is listed with value
],
}
self.assertDictEqual(
utilities.update_app_settings(
app_name, settings["unlinked_settings"], remove=True
),
final_portal_yamls[0],
)
self.assertDictEqual(
utilities.update_app_settings(
app_name, settings["linked_settings"], remove=False
),
final_portal_yamls[1],
)

@mock.patch(
"tethys_apps.utilities.Path.open",
new_callable=lambda: mock.mock_open(read_data='{"apps": "{}"}'),
)
@mock.patch("tethys_apps.utilities.yaml.dump")
@mock.patch("tethys_apps.utilities.get_attribute_for_service")
@mock.patch("tethys_apps.utilities.get_setting_type_for_state")
@mock.patch("tethys_apps.utilities.yaml.safe_load")
def test_override_update_app_settings_with_apps_section(
self,
mock_yaml_safe_load,
mock_get_setting_type_for_state,
mock_get_attribute_for_service,
_,
__,
):
app_name = "fake_app_name"
mock_yaml_safe_load.side_effect = [
{
"apps": {
app_name: {
"services": {
"persistent": {"persist_setting": "old_value_persist"},
"custom_settings": {
"custom_setting_name": "custom_setting_value"
},
}
}
}
}
]
final_portal_yaml = {
"apps": {
app_name: {
"services": {
"persistent": {"persist_setting": "new_value_persist"},
"custom_settings": {
"custom_setting_name": {
"key1": "value1",
"key2": 2,
"key3": "value3",
}
},
}
}
}
}

mock_get_attribute_for_service.side_effect = [
{
"key1": "value1",
"key2": 2,
"key3": "value3",
},
"new_value_persist",
]
mock_get_setting_type_for_state.side_effect = ["custom_settings", "persistent"]
# This persistent setting exists and is listed in the file, we are changing its value
mock_persistent_dataset_setting = mock.MagicMock()
mock_persistent_dataset_setting.name = "persist_setting"
mock_persistent_dataset_setting.value = "new_value_persist"

# This custom setting exists, but there is no value assigned in the file, we are changing its value
mock_persistent_cs_setting = mock.MagicMock()
mock_persistent_cs_setting.name = "custom_setting_name"
mock_persistent_cs_setting.value = {
"key1": "value1",
"key2": 2,
"key3": "value3",
}

settings = {
"linked_settings": [
mock_persistent_cs_setting, #: This persistent setting exists and is listed with value
mock_persistent_dataset_setting, #: This setting is already linked, we are just changing the value
],
}
self.assertDictEqual(
utilities.update_app_settings(
app_name, settings["linked_settings"], remove=False
),
final_portal_yaml,
)

@mock.patch(
"tethys_apps.utilities.Path.open",
new_callable=lambda: mock.mock_open(read_data='{"apps": "{}"}'),
)
@mock.patch("tethys_apps.utilities.yaml.dump")
@mock.patch("tethys_apps.utilities.get_attribute_for_service")
@mock.patch("tethys_apps.utilities.get_setting_type_for_state")
@mock.patch("tethys_apps.utilities.yaml.safe_load")
def test_removing_update_app_settings_with_apps_section(
self,
mock_yaml_safe_load,
mock_get_setting_type_for_state,
mock_get_attribute_for_service,
_,
__,
):
app_name = "fake_app_name"
mock_yaml_safe_load.side_effect = [
{
"apps": {
app_name: {
"services": {
"persistent": {"persist_setting": "old_value_persist"},
"custom_settings": {
"custom_setting_name": "custom_setting_value"
},
"wps": {},
}
}
}
}
]
mock_get_attribute_for_service.side_effect = [
"custom_setting_name",
"persist_setting",
"wps_setting_name",
]

final_portal_yaml = {
"apps": {app_name: {"services": {"persistent": {}, "custom_settings": {}}}}
}
mock_get_setting_type_for_state.side_effect = [
"custom_settings",
"persistent",
"wps",
]
# This persistent setting exists and is listed in the file, we are changing its value
mock_persistent_dataset_setting = mock.MagicMock()
mock_persistent_dataset_setting.name = "persist_setting"

# This custom setting exists, but there is no value assigned in the file, we are changing its value
mock_persistent_cs_setting = mock.MagicMock()
mock_persistent_cs_setting.name = "custom_setting_name"

# This service is empty
mock_persistent_wps_setting = mock.MagicMock()
mock_persistent_wps_setting.name = "wps_setting_name"
settings = {
"unlinked_settings": [
mock_persistent_cs_setting, #: This persistent setting exists and is listed with value
mock_persistent_dataset_setting, #: This setting is already linked, we are just changing the value
mock_persistent_wps_setting,
],
}
self.assertDictEqual(
utilities.update_app_settings(
app_name, settings["unlinked_settings"], remove=True
),
final_portal_yaml,
)

def test_get_setting_type_for_state(self):
from tethys_apps.models import (
PersistentStoreDatabaseSetting,
SpatialDatasetServiceSetting,
DatasetServiceSetting,
WebProcessingServiceSetting,
CustomSetting,
SecretCustomSetting,
JSONCustomSetting,
)

self.assertEqual(
"persistent",
utilities.get_setting_type_for_state(PersistentStoreDatabaseSetting()),
)
self.assertEqual(
"spatial",
utilities.get_setting_type_for_state(SpatialDatasetServiceSetting()),
)
self.assertEqual(
"dataset",
utilities.get_setting_type_for_state(DatasetServiceSetting()),
)
self.assertEqual(
"wps",
utilities.get_setting_type_for_state(WebProcessingServiceSetting()),
)
self.assertEqual(
"custom_settings",
utilities.get_setting_type_for_state(CustomSetting()),
)
self.assertEqual(
"custom_settings",
utilities.get_setting_type_for_state(SecretCustomSetting()),
)
self.assertEqual(
"custom_settings",
utilities.get_setting_type_for_state(JSONCustomSetting()),
)

@mock.patch(
"tethys_apps.utilities.Path.open",
new_callable=lambda: mock.mock_open(read_data='{"apps": "{}"}'),
)
@mock.patch("tethys_apps.utilities.yaml.safe_load")
@mock.patch("tethys_apps.utilities.yaml.dump")
def test_clean_app_in_apps_section(self, mock_dump, mock_load, mock_open):
# Mock the portal_config.yml file
mock_file = mock_open()
mock_file.return_value.__enter__.return_value = mock_file

# Mock the portal_settings dictionary
portal_settings = {
"apps": {
"app1": {"setting1": "value1", "setting2": "value2"},
"app2": {"setting3": "value3", "setting4": "value4"},
}
}

# Patch the required functions
mock_load.return_value = portal_settings
result = utilities.clean_app_in_apps_section("app1")

# Assert that the mock functions were called with the correct arguments
self.assertTrue(mock_load.called)
self.assertTrue(mock_dump.called)

# Assert the result of the function
self.assertIsNone(result)

# Assert that the app1 entry is removed from the portal_settings
expected_settings = {
"apps": {"app2": {"setting3": "value3", "setting4": "value4"}}
}
mock_dump.assert_called_with(expected_settings, mock_file)

@mock.patch("tethys_apps.utilities.yaml.dump")
@mock.patch(
"tethys_apps.utilities.Path.open",
new_callable=lambda: mock.mock_open(read_data='{"apps": "{}"}'),
)
@mock.patch("tethys_apps.utilities.yaml.safe_load")
def test_clean_app_in_apps_section_error(self, mock_load, _, __):
mock_load.return_value = Exception
result = utilities.clean_app_in_apps_section("app1")
self.assertIsNone(result)

def test_get_attribute_for_persistent_service(self):
setting = mock.Mock()
setting.persistent_store_service.name = "persistent_value"
result = utilities.get_attribute_for_service(setting, "persistent")
self.assertEqual(result, "persistent_value")

def test_get_attribute_for_spatial_service(self):
setting = mock.Mock()
setting.spatial_dataset_service.name = "spatial_value"
result = utilities.get_attribute_for_service(setting, "spatial")
self.assertEqual(result, "spatial_value")

def test_get_attribute_for_dataset_service(self):
setting = mock.Mock()
setting.dataset_service.name = "dataset_value"
result = utilities.get_attribute_for_service(setting, "dataset")
self.assertEqual(result, "dataset_value")

def test_get_attribute_for_wps_service(self):
setting = mock.Mock()
setting.web_processing_service.name = "wps_value"
result = utilities.get_attribute_for_service(setting, "wps")
self.assertEqual(result, "wps_value")

def test_get_attribute_for_custom_settings(self):
setting = mock.Mock()
setting.value = "custom_value"
result = utilities.get_attribute_for_service(setting, "custom_settings")
self.assertEqual(result, "custom_value")

def test_get_attribute_for_unknown_service(self):
setting = mock.Mock()
result = utilities.get_attribute_for_service(setting, "unknown")
self.assertIsNone(result)
Loading

0 comments on commit 9025476

Please sign in to comment.