diff --git a/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py b/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py index 3d0d87d3b4..b817fe3bda 100644 --- a/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py +++ b/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py @@ -31,8 +31,6 @@ class AlertActionsConf(ConfGenerator): def _set_attributes(self, **kwargs: Any) -> None: self.conf_file = "alert_actions.conf" self.conf_spec_file = f"{self.conf_file}.spec" - if self._global_config is None: - return envs = normalize.normalize( self._global_config.alerts, diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json index b8bb0fa55f..3391f3837b 100644 --- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json @@ -2090,7 +2090,7 @@ "meta": { "name": "Splunk_TA_UCCExample", "restRoot": "splunk_ta_uccexample", - "version": "5.60.0+34ad0cb7a", + "version": "5.60.0+19f2276ad", "displayName": "Splunk UCC test Add-on", "schemaVersion": "0.0.9", "supportedThemes": [ diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 632676d955..61d204a4b8 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -117,6 +117,22 @@ def global_config_single_authentication() -> global_config_lib.GlobalConfig: return global_config +@pytest.fixture +def global_config_with_oauth_account() -> global_config_lib.GlobalConfig: + global_config_path = helpers.get_testdata_file_path("valid_config_expand.json") + global_config = global_config_lib.GlobalConfig.from_file(global_config_path) + return global_config + + +@pytest.fixture +def global_config_with_with_one_entity_per_input() -> global_config_lib.GlobalConfig: + global_config_path = helpers.get_testdata_file_path( + "valid_config_with_one_entity_per_input.json" + ) + global_config = global_config_lib.GlobalConfig.from_file(global_config_path) + return global_config + + @pytest.fixture() def os_dependent_library_config(): return lambda name="lib1", python_version="37", target="t", os="os": OSDependentLibraryConfig( diff --git a/tests/unit/generators/conf_files/test_create_account_conf_spec.py b/tests/unit/generators/conf_files/test_create_account_conf_spec.py index 016f9d4ddd..d8b1a8436b 100644 --- a/tests/unit/generators/conf_files/test_create_account_conf_spec.py +++ b/tests/unit/generators/conf_files/test_create_account_conf_spec.py @@ -1,46 +1,32 @@ -from pytest import fixture from unittest.mock import patch, MagicMock from splunk_add_on_ucc_framework.generators.conf_files import AccountConf -from splunk_add_on_ucc_framework.global_config import GlobalConfig -from tests.unit.helpers import get_testdata_file_path -TA_NAME = "test_addon" - -@fixture -def global_config(): - gc = GlobalConfig.from_file(get_testdata_file_path("valid_config.json")) - gc._content["meta"]["restRoot"] = TA_NAME - return gc - - -def test_set_attributes(global_config, input_dir, output_dir, ucc_dir, ta_name): +def test_set_attributes( + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir, + ta_name, +): """Test when _global_config has mixed accounts (some 'oauth', some not).""" account_spec = AccountConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name - ) - account_spec._global_config = MagicMock() - account_spec._gc_schema = MagicMock() - - # Mock the global config and schema behaviors - account_spec._global_config.configs = [ - {"name": "oauth", "entity": "entity1"}, - {"name": "non_oauth", "entity": "entity2"}, - ] - account_spec._global_config.namespace = TA_NAME - account_spec._gc_schema._get_oauth_enitities.return_value = "mocked_content" - account_spec._gc_schema._parse_fields.return_value = ( - [MagicMock(_name="field2")], - [MagicMock(_name="field3")], + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) account_spec._set_attributes() # Only the non-oauth account should be processed - assert account_spec.account_fields == [("<name>", ["field2 = "])] + assert account_spec.account_fields == [ + ("<name>", ["custom_endpoint = ", "endpoint = ", "account_checkbox = "]) + ] assert ( account_spec.conf_spec_file - == f"{global_config.namespace.lower()}_account.conf.spec" + == f"{global_config_with_with_one_entity_per_input.namespace.lower()}_account.conf.spec" ) @@ -56,23 +42,22 @@ def test_set_attributes_conf_only_TA( addon_name=ta_name, ) - account_spec._set_attributes() - assert account_spec.account_fields == [] def test_set_attributes_with_oauth_account( - global_config, input_dir, output_dir, ucc_dir, ta_name + global_config_with_oauth_account, input_dir, output_dir, ucc_dir, ta_name ): """Test when _global_config has an account with name 'oauth'.""" + # need to expand the global config for logging tab + global_config_with_oauth_account.expand() account_spec = AccountConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name + global_config_with_oauth_account, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) - account_spec._global_config = MagicMock() - - account_spec._global_config.configs = [{"name": "oauth", "entity": "entity1"}] - - account_spec._set_attributes() # Since 'oauth' should be skipped, account_fields should remain empty assert account_spec.account_fields == [] @@ -81,34 +66,31 @@ def test_set_attributes_with_oauth_account( @patch( "splunk_add_on_ucc_framework.generators.conf_files.AccountConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.AccountConf.get_file_output_path" -) def test_generate_conf_spec( - mock_op_path, mock_template, global_config, input_dir, output_dir, ucc_dir, ta_name + mock_template, + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir, + ta_name, ): content = "content" exp_fname = f"{ta_name}_account.conf.spec" - file_path = "output_path/ta_name_account.conf.spec" - mock_op_path.return_value = file_path mock_template_render = MagicMock() mock_template_render.render.return_value = content account_spec = AccountConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) - account_spec.writer = MagicMock() account_spec._template = mock_template_render file_paths = account_spec.generate_conf_spec() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - account_spec.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/README/{exp_fname}"} def test_generate_conf_spec_no_configuration( diff --git a/tests/unit/generators/conf_files/test_create_alert_actions_conf.py b/tests/unit/generators/conf_files/test_create_alert_actions_conf.py index 5f33933153..503502ded6 100644 --- a/tests/unit/generators/conf_files/test_create_alert_actions_conf.py +++ b/tests/unit/generators/conf_files/test_create_alert_actions_conf.py @@ -1,5 +1,7 @@ from unittest.mock import patch, MagicMock from splunk_add_on_ucc_framework.generators.conf_files import AlertActionsConf +import shutil +import json def mocked__set_attribute(this, **kwargs): @@ -45,12 +47,42 @@ def mocked__set_attribute(this, **kwargs): this.conf_spec_file = f"{this.conf_file}.spec" -def test_set_attributes_global_config_with_empty_alerts( - global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name +@patch.object(shutil, "copy") +def test_parameters_processing( + mock_copy, global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name +): + alert_action_conf = AlertActionsConf( + global_config_for_alerts, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + assert "param.name = xyz" in alert_action_conf.alerts["test_alert_no_support"] + + +@patch.object(shutil, "copy") +def test_keys_not_in_deny_list( + mock_copy, global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name ): - global_config_for_alerts = MagicMock() - global_config_for_alerts.alerts = [] + alert_actions_conf = AlertActionsConf( + global_config_for_alerts, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + assert ( + "label = Test Alert Default" in alert_actions_conf.alerts["test_alert_default"] + ) + +@patch.object(shutil, "copy") +def test_parameters_without_default_value( + mock_copy, global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name +): alert_action_conf = AlertActionsConf( global_config_for_alerts, input_dir, @@ -58,8 +90,87 @@ def test_set_attributes_global_config_with_empty_alerts( ucc_dir=ucc_dir, addon_name=ta_name, ) - alert_action_conf._set_attributes(ucc_dir=ucc_dir) + assert "param.name = " in alert_action_conf.alerts["test_alert_active"] + + +@patch.object(shutil, "copy") +def test_custom_icon_file_name( + mock_copy, global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name +): + alert_action_conf = AlertActionsConf( + global_config_for_alerts, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + assert "icon_path = dev_icon.png" in alert_action_conf.alerts["test_alert_default"] + + +@patch.object(shutil, "copy") +def test_default_icon_file_name( + mock_copy, global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name +): + alert_action_conf = AlertActionsConf( + global_config_for_alerts, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + assert "icon_path = alerticon.png" in alert_action_conf.alerts["test_alert_active"] + + +@patch.object(shutil, "copy") +def test_adaptive_response( + mock_copy, global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name +): + alert_action_conf = AlertActionsConf( + global_config_for_alerts, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + expected_json = json.dumps( + { + "task": ["Create"], + "subject": ["endpoint"], + "category": ["Information Portrayal"], + "technology": [ + { + "version": ["1.0.0"], + "product": "Test Incident Update", + "vendor": "Splunk", + } + ], + "supports_adhoc": True, + "supports_cloud": True, + "drilldown_uri": 'search?q=search%20index%3D"_internal"&earliest=0&latest=', + } + ) + + assert ( + f"param._cam = {expected_json}" + in alert_action_conf.alerts["test_alert_adaptive"] + ) + + +def test_set_attributes_global_config_with_empty_alerts( + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name +): + alert_action_conf = AlertActionsConf( + global_config_only_configuration, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + assert alert_action_conf._alert_settings == [] assert alert_action_conf.alerts == {} assert alert_action_conf.alerts_spec == {} @@ -68,11 +179,7 @@ def test_set_attributes_global_config_with_empty_alerts( @patch( "splunk_add_on_ucc_framework.generators.conf_files.AlertActionsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.AlertActionsConf.get_file_output_path" -) def test_generate_conf( - mock_op_path, mock_template, global_config_for_alerts, input_dir, @@ -82,8 +189,6 @@ def test_generate_conf( ): content = "content" exp_fname = "alert_actions.conf" - file_path = "output_path/alert_actions.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -95,33 +200,22 @@ def test_generate_conf( addon_name=ta_name, ) - alert_actions_conf.writer = MagicMock() alert_actions_conf._template = template_render file_paths = alert_actions_conf.generate_conf() - - # Ensure the appropriate methods were called and the file was generated - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - alert_actions_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} -@patch.object(AlertActionsConf, "_set_attributes", mocked__set_attribute) def test_generate_conf_no_alerts( - global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): alert_action_conf = AlertActionsConf( - global_config_for_alerts, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - alert_action_conf.alerts = {} result = alert_action_conf.generate_conf() assert result is None @@ -130,11 +224,7 @@ def test_generate_conf_no_alerts( @patch( "splunk_add_on_ucc_framework.generators.conf_files.AlertActionsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.AlertActionsConf.get_file_output_path" -) def test_generate_conf_spec( - mock_op_path, mock_template, global_config_for_alerts, input_dir, @@ -144,8 +234,6 @@ def test_generate_conf_spec( ): content = "content" exp_fname = "alert_actions.conf.spec" - file_path = "output_path/alert_actions.conf.spec" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -157,32 +245,23 @@ def test_generate_conf_spec( addon_name=ta_name, ) - alert_actions_conf.writer = MagicMock() alert_actions_conf._template = template_render file_paths = alert_actions_conf.generate_conf_spec() # Ensure the appropriate methods were called and the file was generated - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - alert_actions_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/README/{exp_fname}"} -@patch.object(AlertActionsConf, "_set_attributes", mocked__set_attribute) def test_generate_conf_no_alerts_spec( - global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): alert_action_conf = AlertActionsConf( - global_config_for_alerts, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - alert_action_conf.alerts_spec = {} result = alert_action_conf.generate_conf_spec() assert result is None diff --git a/tests/unit/generators/conf_files/test_create_app_conf.py b/tests/unit/generators/conf_files/test_create_app_conf.py index 2cda9e8e8c..b1a16e66cd 100644 --- a/tests/unit/generators/conf_files/test_create_app_conf.py +++ b/tests/unit/generators/conf_files/test_create_app_conf.py @@ -47,12 +47,6 @@ def test_set_attributes_check_for_updates_false( has_ui=has_ui, app_manifest=app_manifest, ) - app_conf._global_config = MagicMock() - app_conf._global_config.meta = {"checkForUpdates": False} - - app_conf._set_attributes( - addon_version=addon_version, has_ui=has_ui, app_manifest=app_manifest - ) assert app_conf.check_for_updates == "false" @@ -78,12 +72,6 @@ def test_set_attributes_supported_themes( has_ui=has_ui, app_manifest=app_manifest, ) - app_conf._global_config = MagicMock() - app_conf._global_config.meta = {"supportedThemes": ["dark", "light"]} - - app_conf._set_attributes( - addon_version=addon_version, has_ui=has_ui, app_manifest=app_manifest - ) assert app_conf.supported_themes == "dark, light" @@ -109,27 +97,19 @@ def test_set_attributes_with_global_config_and_schema( has_ui=has_ui, app_manifest=app_manifest, ) - app_conf._global_config = MagicMock() - app_conf._gc_schema = MagicMock() - app_conf._gc_schema.settings_conf_file_names = ["settings1.conf"] - app_conf._gc_schema.configs_conf_file_names = ["configs1.conf"] - app_conf._gc_schema.oauth_conf_file_names = ["oauth1.conf"] - - app_conf._set_attributes( - addon_version=addon_version, has_ui=has_ui, app_manifest=app_manifest - ) - - expected_custom_conf = ["settings1.conf", "configs1.conf", "oauth1.conf"] + expected_custom_conf = [ + "splunk_ta_uccexample_settings", + "splunk_ta_uccexample_account", + "splunk_ta_uccexample_oauth", + ] assert app_conf.custom_conf == expected_custom_conf @patch( "splunk_add_on_ucc_framework.generators.conf_files.AppConf.set_template_and_render" ) -@patch("splunk_add_on_ucc_framework.generators.conf_files.AppConf.get_file_output_path") def test_generate_conf( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -142,8 +122,6 @@ def test_generate_conf( ): content = "content" exp_fname = "app.conf" - file_path = "output_path/app.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -157,17 +135,9 @@ def test_generate_conf( has_ui=has_ui, app_manifest=app_manifest, ) - app_conf.writer = MagicMock() app_conf._template = template_render file_paths = app_conf.generate_conf() # Ensure the appropriate methods were called and the file was generated - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - app_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - merge_mode="item_overwrite", - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} diff --git a/tests/unit/generators/conf_files/test_create_eventypes_conf.py b/tests/unit/generators/conf_files/test_create_eventypes_conf.py index f2b40807d6..023cf4dcb1 100644 --- a/tests/unit/generators/conf_files/test_create_eventypes_conf.py +++ b/tests/unit/generators/conf_files/test_create_eventypes_conf.py @@ -11,19 +11,29 @@ def test_set_attribute(global_config_all_json, input_dir, output_dir, ucc_dir, t addon_name=ta_name, ) - eventtypes_conf._set_attributes() assert eventtypes_conf.alert_settings assert eventtypes_conf.conf_file == "eventtypes.conf" +def test_set_attribute_without_alerts( + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name +): + eventtypes_conf = EventtypesConf( + global_config_for_conf_only_TA, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + assert eventtypes_conf.alert_settings == [] + assert eventtypes_conf.conf_file == "eventtypes.conf" + + @patch( "splunk_add_on_ucc_framework.generators.conf_files.EventtypesConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.EventtypesConf.get_file_output_path" -) def test_generate_conf( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -33,8 +43,6 @@ def test_generate_conf( ): content = "content" exp_fname = "eventtypes.conf" - file_path = "output_path/eventtypes.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -45,39 +53,23 @@ def test_generate_conf( ucc_dir=ucc_dir, addon_name=ta_name, ) - - eventtypes_conf.writer = MagicMock() eventtypes_conf._template = template_render file_paths = eventtypes_conf.generate_conf() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - # Ensure the writer function was called with the correct parameters - eventtypes_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.EventtypesConf._set_attributes", - return_value=MagicMock(), -) def test_generate_conf_no_alert_settings( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): eventtypes_conf = EventtypesConf( - global_config_all_json, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - - eventtypes_conf.alert_settings = {} file_paths = eventtypes_conf.generate_conf() assert file_paths is None diff --git a/tests/unit/generators/conf_files/test_create_inputs_conf.py b/tests/unit/generators/conf_files/test_create_inputs_conf.py index bd3f818a63..198fa824ca 100644 --- a/tests/unit/generators/conf_files/test_create_inputs_conf.py +++ b/tests/unit/generators/conf_files/test_create_inputs_conf.py @@ -15,112 +15,123 @@ def test_set_attributes_no_inputs_in_global_config( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): """Test when _global_config is provided but has no inputs.""" inputs_conf = InputsConf( - global_config_all_json, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf._global_config = MagicMock() - inputs_conf._global_config.inputs = [] - - inputs_conf._set_attributes() assert inputs_conf.input_names == [] def test_set_attributes_with_conf_key( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir, + ta_name, ): """Test when a service has a 'conf' key.""" inputs_conf = InputsConf( - global_config_all_json, + global_config_with_with_one_entity_per_input, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf._global_config = MagicMock() - inputs_conf._global_config.inputs = [{"name": "service1", "conf": "some_conf"}] - - inputs_conf._set_attributes() - expected_output = [{"service1": ["placeholder = placeholder"]}] - assert inputs_conf.input_names == expected_output + expected_output = {"service_with_conf_param": ["placeholder = placeholder"]} + assert expected_output in inputs_conf.input_names assert inputs_conf.conf_file == "inputs.conf" assert inputs_conf.conf_spec_file == "inputs.conf.spec" def test_set_attributes_without_conf_key_and_name_field( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir, + ta_name, ): """Test when a service does not have 'conf' key and 'entity' contains 'name' field.""" inputs_conf = InputsConf( - global_config_all_json, + global_config_with_with_one_entity_per_input, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf._global_config = MagicMock() - inputs_conf._global_config.inputs = [ - {"name": "service1", "entity": [{"field": "name"}], "disableNewInput": True} - ] - - inputs_conf._set_attributes() - expected_output: List[Dict[str, List[str]]] = [{"service1": []}] - assert inputs_conf.input_names == expected_output + expected_output: Dict[str, List[str]] = {"example_input_three": []} + assert expected_output in inputs_conf.input_names assert inputs_conf.disable is True - assert inputs_conf.service_name == "service1" + assert inputs_conf.service_name == "example_input_three" + + +def test_set_attributes_without_conf_key_and_default_boolean( + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir, + ta_name, +): + """Test when a service does not have 'conf' key and 'entity' contains fields other than 'name' + with a boolean default value. + """ + inputs_conf = InputsConf( + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + expected_output = { + "input_with_default_boolean": [ + "test_checkbox = This is an example checkbox. Default: True" + ] + } + assert expected_output in inputs_conf.input_names + assert inputs_conf.default_value_info.get("input_with_default_boolean") == { + "test_checkbox": "true" + } def test_set_attributes_without_conf_key_and_other_fields( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_with_with_one_entity_per_input, + input_dir, + output_dir, + ucc_dir, + ta_name, ): """Test when a service does not have 'conf' key and 'entity' contains fields other than 'name'.""" inputs_conf = InputsConf( - global_config_all_json, + global_config_with_with_one_entity_per_input, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf._global_config = MagicMock() - inputs_conf._global_config.inputs = [ - { - "name": "service1", - "entity": [ - { - "field": "other_field", - "help": "help text", - "defaultValue": "default_val", - } - ], - } - ] - - inputs_conf._set_attributes() - expected_output = [{"service1": ["other_field = help text Default: default_val"]}] - assert inputs_conf.input_names == expected_output - assert inputs_conf.default_value_info == { - "service1": {"other_field": "default_val"} + expected_output = { + "example_input_four": [ + "Interval = Time interval of the data input, in seconds. Default: 600" + ] + } + assert expected_output in inputs_conf.input_names + assert inputs_conf.default_value_info.get("example_input_four") == { + "Interval": "600" } @patch( "splunk_add_on_ucc_framework.generators.conf_files.InputsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.InputsConf.get_file_output_path" -) def test_generate_conf( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -130,8 +141,6 @@ def test_generate_conf( ): content = "content" exp_fname = "inputs.conf" - file_path = "output_path/inputs.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -142,36 +151,24 @@ def test_generate_conf( ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf.writer = MagicMock() inputs_conf._template = template_render file_paths = inputs_conf.generate_conf() # Ensure the appropriate methods were called and the file was generated - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - inputs_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.InputsConf._set_attributes", - return_value=MagicMock(), -) -def test_generate_conf_spec_no_input_names( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name +def test_generate_conf_no_input_names( + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): inputs_conf = InputsConf( - global_config_all_json, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf.input_names = [] result = inputs_conf.generate_conf() assert result is None @@ -179,11 +176,7 @@ def test_generate_conf_spec_no_input_names( @patch( "splunk_add_on_ucc_framework.generators.conf_files.InputsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.InputsConf.get_file_output_path" -) def test_generate_conf_spec( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -193,8 +186,6 @@ def test_generate_conf_spec( ): content = "content" exp_fname = "inputs.conf.spec" - file_path = "output_path/inputs.conf.spec" - mock_op_path.return_value = file_path mock_template_render = MagicMock() mock_template_render.render.return_value = content @@ -205,37 +196,25 @@ def test_generate_conf_spec( ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf.writer = MagicMock() inputs_conf._template = mock_template_render file_paths = inputs_conf.generate_conf_spec() # Ensure the appropriate methods were called and the file was generated - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - inputs_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/README/{exp_fname}"} -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.InputsConf._set_attributes", - return_value=MagicMock(), -) -def test_generate_conf_no_input_names( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name +def test_generate_conf_spec_no_input_names( + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): inputs_conf = InputsConf( - global_config_all_json, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_conf.input_names = [] result = inputs_conf.generate_conf_spec() assert result is None diff --git a/tests/unit/generators/conf_files/test_create_restmap_conf.py b/tests/unit/generators/conf_files/test_create_restmap_conf.py index 911ec437b4..3d28e4c75d 100644 --- a/tests/unit/generators/conf_files/test_create_restmap_conf.py +++ b/tests/unit/generators/conf_files/test_create_restmap_conf.py @@ -15,11 +15,7 @@ @patch( "splunk_add_on_ucc_framework.generators.conf_files.RestMapConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.RestMapConf.get_file_output_path" -) def test_generate_conf( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -29,8 +25,6 @@ def test_generate_conf( ): content = "content" exp_fname = "restmap.conf" - file_path = "output_path/restmap.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -42,35 +36,10 @@ def test_generate_conf( addon_name=ta_name, ) - restmap_conf.writer = MagicMock() restmap_conf._template = template_render file_paths = restmap_conf.generate_conf() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - - # Ensure the writer function was called with the correct parameters - restmap_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - - assert file_paths == {exp_fname: file_path} - - -def test_generate_conf_no_gc_schema( - global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name -): - restmap_conf = RestMapConf( - global_config_for_conf_only_TA, - input_dir, - output_dir, - ucc_dir=ucc_dir, - addon_name=ta_name, - ) - - file_paths = restmap_conf.generate_conf() - assert file_paths is None + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} def test_generate_conf_for_conf_only_TA( @@ -98,7 +67,6 @@ def test_set_attributes( ucc_dir=ucc_dir, addon_name=ta_name, ) - restmap_conf._set_attributes() assert hasattr(restmap_conf, "endpoints") assert hasattr(restmap_conf, "endpoint_names") assert hasattr(restmap_conf, "namespace") diff --git a/tests/unit/generators/conf_files/test_create_server_conf.py b/tests/unit/generators/conf_files/test_create_server_conf.py index f6e050dbc3..7130b13a91 100644 --- a/tests/unit/generators/conf_files/test_create_server_conf.py +++ b/tests/unit/generators/conf_files/test_create_server_conf.py @@ -13,14 +13,11 @@ def test_set_attributes( addon_name=ta_name, ) - server_conf._gc_schema = MagicMock() - server_conf._gc_schema.settings_conf_file_names = ["settings_conf"] - server_conf._gc_schema.configs_conf_file_names = ["configs_conf"] - server_conf._gc_schema.oauth_conf_file_names = ["oauth_conf"] - - server_conf._set_attributes() - - expected_custom_conf = ["settings_conf", "configs_conf", "oauth_conf"] + expected_custom_conf = [ + "splunk_ta_uccexample_settings", + "splunk_ta_uccexample_account", + "splunk_ta_uccexample_oauth", + ] assert server_conf.custom_conf == expected_custom_conf @@ -28,11 +25,7 @@ def test_set_attributes( @patch( "splunk_add_on_ucc_framework.generators.conf_files.ServerConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.ServerConf.get_file_output_path" -) def test_generate_conf_no_existing_conf( - mock_op_path, mock_template, mock_isfile, global_config_all_json, @@ -43,8 +36,6 @@ def test_generate_conf_no_existing_conf( ): content = "content" exp_fname = "server.conf" - file_path = "output_path/server.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -56,30 +47,18 @@ def test_generate_conf_no_existing_conf( addon_name=ta_name, ) - server_conf.writer = MagicMock() server_conf._template = template_render file_paths = server_conf.generate_conf() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - server_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} @patch( "splunk_add_on_ucc_framework.generators.conf_files.create_server_conf.isfile", return_value=True, ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.ServerConf.get_file_output_path" -) def test_generate_conf_existing_conf( - mock_op_path, mock_isfile, global_config_all_json, input_dir, @@ -100,16 +79,15 @@ def test_generate_conf_existing_conf( def test_generate_conf_no_custom_conf( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name ): server_conf = ServerConf( - global_config_all_json, + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - server_conf.custom_conf = [] file_paths = server_conf.generate_conf() assert file_paths is None diff --git a/tests/unit/generators/conf_files/test_create_settings_conf.py b/tests/unit/generators/conf_files/test_create_settings_conf.py index 65aa47e2d8..68f0b075a1 100644 --- a/tests/unit/generators/conf_files/test_create_settings_conf.py +++ b/tests/unit/generators/conf_files/test_create_settings_conf.py @@ -14,35 +14,30 @@ def global_config(): return gc -def test_set_attributes(global_config, input_dir, output_dir, ucc_dir, ta_name): +def test_set_attributes( + global_config_only_logging, input_dir, output_dir, ucc_dir, ta_name +): settings_conf = SettingsConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name + global_config_only_logging, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) - settings_conf._global_config = MagicMock() - settings_conf._gc_schema = MagicMock() - - settings_conf._global_config.settings = [{"entity": "entity1", "name": "setting1"}] - settings_conf._global_config.namespace = TA_NAME - settings_conf._gc_schema._get_oauth_enitities.return_value = "mocked_content" - settings_conf._gc_schema._parse_fields.return_value = ( - [MagicMock(_name="field1")], - [MagicMock(_name="field3")], + assert ( + settings_conf.conf_file + == f"{global_config_only_logging.namespace.lower()}_settings.conf" + ) + assert ( + settings_conf.conf_file + == f"{global_config_only_logging.namespace.lower()}_settings.conf" ) - - settings_conf._gc_schema._endpoints = {"settings": MagicMock()} - settings_conf._gc_schema._endpoints[ - "settings" - ].generate_conf_with_default_values.return_value = "default_values" - - settings_conf._set_attributes() - - assert settings_conf.conf_file == f"{global_config.namespace.lower()}_settings.conf" assert ( settings_conf.conf_spec_file - == f"{global_config.namespace.lower()}_settings.conf.spec" + == f"{global_config_only_logging.namespace.lower()}_settings.conf.spec" ) - assert settings_conf.settings_stanzas == [("setting1", ["field1 = "])] - assert settings_conf.default_content == "default_values" + assert settings_conf.settings_stanzas == [("logging", ["loglevel = "])] + assert settings_conf.default_content == "[logging]\nloglevel = INFO" def test_set_attribute_for_conf_only_TA( @@ -55,80 +50,54 @@ def test_set_attribute_for_conf_only_TA( ucc_dir=ucc_dir, addon_name=ta_name, ) - settings_conf._set_attributes() assert settings_conf.settings_stanzas == [] assert settings_conf.default_content == "" def test_set_attributes_no_settings_key( - global_config, input_dir, output_dir, ucc_dir, ta_name + global_config_for_alerts, input_dir, output_dir, ucc_dir, ta_name ): settings_conf = SettingsConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name - ) - settings_conf._addon_name = "TestAddon" - settings_conf._global_config = MagicMock() - settings_conf._gc_schema = MagicMock() - - settings_conf._global_config.settings = [{"entity": "entity1", "name": "setting1"}] - settings_conf._gc_schema._get_oauth_enitities.return_value = "mocked_content" - settings_conf._gc_schema._parse_fields.return_value = ( - [MagicMock(_name="field1")], - [MagicMock(_name="field3")], + global_config_for_alerts, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) - - settings_conf._gc_schema._endpoints = {} - - settings_conf._set_attributes() - - assert settings_conf.settings_stanzas == [("setting1", ["field1 = "])] assert settings_conf.default_content == "" @patch( "splunk_add_on_ucc_framework.generators.conf_files.SettingsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.SettingsConf.get_file_output_path" -) def test_generate_conf( - mock_op_path, mock_template, global_config, input_dir, output_dir, ucc_dir, ta_name + mock_template, global_config, input_dir, output_dir, ucc_dir, ta_name ): content = "content" exp_fname = f"{ta_name}_settings.conf" - file_path = f"output_path/{exp_fname}" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content settings_conf = SettingsConf( global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name ) - settings_conf.writer = MagicMock() settings_conf._template = template_render file_paths = settings_conf.generate_conf() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - settings_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{TA_NAME}/default/{exp_fname}"} -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.SettingsConf._set_attributes", - return_value=MagicMock(), -) def test_generate_conf_no_default_content( - global_config, input_dir, output_dir, ucc_dir, ta_name + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name ): settings_conf = SettingsConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name + global_config_for_conf_only_TA, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) - settings_conf.default_content = "" result = settings_conf.generate_conf() result is None @@ -136,46 +105,34 @@ def test_generate_conf_no_default_content( @patch( "splunk_add_on_ucc_framework.generators.conf_files.SettingsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.SettingsConf.get_file_output_path" -) def test_generate_conf_spec( - mock_op_path, mock_template, global_config, input_dir, output_dir, ucc_dir, ta_name + mock_template, global_config, input_dir, output_dir, ucc_dir, ta_name ): content = "content" exp_fname = f"{ta_name}_settings.conf.spec" - file_path = f"output_path/{exp_fname}" - mock_op_path.return_value = file_path mock_template_render = MagicMock() mock_template_render.render.return_value = content settings_conf = SettingsConf( global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name ) - settings_conf.writer = MagicMock() settings_conf._template = mock_template_render file_paths = settings_conf.generate_conf_spec() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - settings_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{TA_NAME}/README/{exp_fname}"} -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.SettingsConf._set_attributes", - return_value=MagicMock(), -) def test_generate_conf_no_settings_stanzas( - global_config, input_dir, output_dir, ucc_dir, ta_name + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name ): settings_conf = SettingsConf( - global_config, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name + global_config_for_conf_only_TA, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) settings_conf.settings_stanzas = [] result = settings_conf.generate_conf_spec() diff --git a/tests/unit/generators/conf_files/test_create_tags_conf.py b/tests/unit/generators/conf_files/test_create_tags_conf.py index be1897c8a1..3f7d1311f3 100644 --- a/tests/unit/generators/conf_files/test_create_tags_conf.py +++ b/tests/unit/generators/conf_files/test_create_tags_conf.py @@ -11,19 +11,29 @@ def test_set_attribute(global_config_all_json, input_dir, output_dir, ucc_dir, t addon_name=ta_name, ) - tags_conf._set_attributes() assert tags_conf.alert_settings assert tags_conf.conf_file == "tags.conf" +def test_set_attribute_without_alerts( + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name +): + tags_conf = TagsConf( + global_config_for_conf_only_TA, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + assert tags_conf.alert_settings == [] + assert tags_conf.conf_file == "tags.conf" + + @patch( "splunk_add_on_ucc_framework.generators.conf_files.TagsConf.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.TagsConf.get_file_output_path" -) def test_generate_conf( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -33,8 +43,6 @@ def test_generate_conf( ): content = "content" exp_fname = "tags.conf" - file_path = "output_path/tags.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -46,37 +54,24 @@ def test_generate_conf( addon_name=ta_name, ) - tags_conf.writer = MagicMock() tags_conf._template = template_render file_paths = tags_conf.generate_conf() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - tags_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} - assert file_paths == {exp_fname: file_path} - -@patch( - "splunk_add_on_ucc_framework.generators.conf_files.TagsConf._set_attributes", - return_value=MagicMock(), -) def test_generate_conf_no_alert_settings( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_only_configuration, input_dir, output_dir, ucc_dir, ta_name ): tags_conf = TagsConf( - global_config_all_json, + global_config_only_configuration, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - tags_conf.alert_settings = {} file_paths = tags_conf.generate_conf() assert file_paths is None diff --git a/tests/unit/generators/conf_files/test_create_web_conf.py b/tests/unit/generators/conf_files/test_create_web_conf.py index ad315660ff..828a7dda8b 100644 --- a/tests/unit/generators/conf_files/test_create_web_conf.py +++ b/tests/unit/generators/conf_files/test_create_web_conf.py @@ -7,37 +7,33 @@ RestHandlerConfig, ) from splunk_add_on_ucc_framework.generators.conf_files import WebConf +from splunk_add_on_ucc_framework.commands.rest_builder.endpoint.base import ( + RestEndpointBuilder, +) UCC_DIR = os.path.dirname(ucc_framework_file) def test_set_attributes( - global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_only_logging, input_dir, output_dir, ucc_dir, ta_name ): web_conf = WebConf( - global_config_all_json, + global_config_only_logging, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - expected_endpoints = ["endpoint"] - - web_conf._gc_schema = MagicMock() - web_conf._gc_schema.endpoints = expected_endpoints - - web_conf._set_attributes() - - assert web_conf.endpoints == expected_endpoints + # Had to specifically mention this to pass pre-commit check + assert isinstance(web_conf.endpoints[0], RestEndpointBuilder) + assert web_conf.endpoints[0].conf_name == "splunk_ta_uccexample_settings" @patch( "splunk_add_on_ucc_framework.generators.conf_files.WebConf.set_template_and_render" ) -@patch("splunk_add_on_ucc_framework.generators.conf_files.WebConf.get_file_output_path") def test_generate_conf( - mock_op_path, mock_template, global_config_all_json, input_dir, @@ -47,8 +43,6 @@ def test_generate_conf( ): content = "content" exp_fname = "web.conf" - file_path = "output_path/web.conf" - mock_op_path.return_value = file_path template_render = MagicMock() template_render.render.return_value = content @@ -60,22 +54,14 @@ def test_generate_conf( addon_name=ta_name, ) - web_conf.writer = MagicMock() web_conf._template = template_render file_paths = web_conf.generate_conf() - assert mock_op_path.call_count == 1 assert mock_template.call_count == 1 - web_conf.writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=content, - ) - - assert file_paths == {exp_fname: file_path} + assert file_paths == {exp_fname: f"{output_dir}/{ta_name}/default/{exp_fname}"} -def test_generate_conf_no_gc_schema( +def test_set_attribute_for_conf_only_TA( global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name ): web_conf = WebConf( @@ -85,9 +71,7 @@ def test_generate_conf_no_gc_schema( ucc_dir=ucc_dir, addon_name=ta_name, ) - - file_paths = web_conf.generate_conf() - assert file_paths is None + assert web_conf.endpoints == [] def test_generate_conf_for_conf_only_TA( diff --git a/tests/unit/generators/html_files/test_create_alert_actions_html.py b/tests/unit/generators/html_files/test_create_alert_actions_html.py index 39a85e9742..c9acb1676c 100644 --- a/tests/unit/generators/html_files/test_create_alert_actions_html.py +++ b/tests/unit/generators/html_files/test_create_alert_actions_html.py @@ -48,7 +48,7 @@ def mocked__set_attribute(this, **kwargs): this._html_home = "_html_home" -def test_alert_html_generate_html_no_global_config( +def test_alert_html_generate_html_no_alerts( global_config_for_conf_only_TA, input_dir, output_dir, @@ -64,92 +64,50 @@ def test_alert_html_generate_html_no_global_config( ) output = alert_html.generate_html() assert output is None + assert not hasattr(alert_html, "_alert_settings") -@patch( - "splunk_add_on_ucc_framework.generators.html_files.AlertActionsHtml._set_attributes", - return_value=MagicMock(), -) -def test_alert_html_generate_html_no_alerts( - mock_set_attributes, +def test_alert_html_set_attribute_no_alerts( + global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name, ): - mocked_gc = MagicMock() - mocked_gc.has_alerts.return_value = False - alert_html = AlertActionsHtml( - global_config=mocked_gc, - input_dir=input_dir, - output_dir=output_dir, + global_config_for_conf_only_TA, + input_dir, + output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - output = alert_html.generate_html() - assert output is None assert not hasattr(alert_html, "_alert_settings") -@patch.object(AlertActionsHtml, "_set_attributes", mocked__set_attribute) -@patch( - "splunk_add_on_ucc_framework.generators.html_files.AlertActionsHtml.set_template_and_render" -) -@patch( - "splunk_add_on_ucc_framework.generators.html_files.AlertActionsHtml.get_file_output_path" -) -def test_alert_html_generate_html_with_alerts( - mock_op_path, - mock_template, - global_config_for_alerts, +def test_alert_html_set_attribute_with_alerts( + global_config_all_json, input_dir, output_dir, ucc_dir, ta_name, ): - html_content = """<html> -<body> -<p>This is a paragraph.</p> -<p>This is another paragraph.</p> -</body> -</html>""" - exp_fname = "dev_alert.html" - file_path = "output_path/alert_html.html" - mock_op_path.return_value = file_path - template_render = MagicMock() - template_render.render.return_value = html_content - alert_html = AlertActionsHtml( - global_config_for_alerts, + global_config_all_json, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - print("\n \n") - print(alert_html._alert_settings) - alert_html.writer = MagicMock() - alert_html._template = template_render - - assert alert_html.generate_html() == {exp_fname: file_path} - assert mock_op_path.call_count == 1 - assert mock_template.call_count == 1 - alert_html.writer.assert_called_once_with( - file_name=exp_fname, file_path=file_path, content=html_content - ) + assert hasattr(alert_html, "_alert_settings") + assert alert_html._alert_settings[0]["short_name"] == "test_alert" @patch( "splunk_add_on_ucc_framework.generators.html_files.AlertActionsHtml.set_template_and_render" ) -@patch( - "splunk_add_on_ucc_framework.generators.html_files.AlertActionsHtml.get_file_output_path" -) -def test_alert_actions_html_set_attributes_and_generate( - mock_op_path, +def test_alert_html_generate_html_with_alerts( mock_template, - global_config_for_alerts, + global_config_all_json, input_dir, output_dir, ucc_dir, @@ -161,24 +119,20 @@ def test_alert_actions_html_set_attributes_and_generate( <p>This is another paragraph.</p> </body> </html>""" - file_path = "output_path/alert_html.html" - mock_op_path.return_value = file_path + exp_fname = "test_alert.html" template_render = MagicMock() template_render.render.return_value = html_content alert_html = AlertActionsHtml( - global_config_for_alerts, + global_config_all_json, input_dir, output_dir, ucc_dir=ucc_dir, addon_name=ta_name, ) - assert hasattr(alert_html, "_alert_settings") - alert_html.writer = MagicMock() alert_html._template = template_render - output = alert_html.generate_html() - assert output is not None - assert len(output) == 4, "4 alert action html file path should be provided" - assert mock_op_path.call_count == 4 - assert mock_template.call_count == 4 + assert alert_html.generate_html() == { + exp_fname: f"{output_dir}/{ta_name}/default/data/ui/alerts/{exp_fname}" + } + assert mock_template.call_count == 1 diff --git a/tests/unit/generators/test_file_generator.py b/tests/unit/generators/test_file_generator.py index d4e274e378..a2769a16bf 100644 --- a/tests/unit/generators/test_file_generator.py +++ b/tests/unit/generators/test_file_generator.py @@ -31,10 +31,6 @@ def test_get_output_dir( @patch("splunk_add_on_ucc_framework.generators.FileGenerator._set_attributes") -@patch( - "splunk_add_on_ucc_framework.generators.FileGenerator._get_output_dir", - return_value="tmp/path", -) def test_get_file_output_path( global_config_all_json, input_dir, output_dir, ucc_dir, ta_name ): @@ -48,11 +44,11 @@ def test_get_file_output_path( # Test with string result = file_gen.get_file_output_path("output_file") - assert result == "tmp/path/output_file" + assert result == f"{output_dir}/{ta_name}/output_file" # Test with list result = file_gen.get_file_output_path(["dir1", "dir2", "output_file"]) - assert result == "tmp/path/dir1/dir2/output_file" + assert result == f"{output_dir}/{ta_name}/dir1/dir2/output_file" # Test with invalid type with raises(TypeError): @@ -112,15 +108,14 @@ def test_set_template_and_render_invalid_file_name( "splunk_add_on_ucc_framework.generators.file_generator.fc.GEN_FILE_LIST", new_callable=list, ) -@patch("splunk_add_on_ucc_framework.generators.file_generator.logger") def test_begin( - mock_logger, mock_gen_file_list, global_config_all_json, input_dir, output_dir, ucc_dir, ta_name, + caplog, ): mock_item = MagicMock() mock_item.file_class.return_value.generate.return_value = { @@ -138,10 +133,40 @@ def test_begin( ) assert result == [{"file1": "/path/to/file1"}] - mock_logger.info.assert_called_once_with( - "Successfully generated 'file1' at '/path/to/file1'." + expected_msg = "Successfully generated 'file1' at '/path/to/file1'." + assert expected_msg in caplog.text + + +@patch( + "splunk_add_on_ucc_framework.generators.file_generator.fc.GEN_FILE_LIST", + new_callable=list, +) +@patch("splunk_add_on_ucc_framework.generators.file_generator.logger") +def test_begin_if_empty_dict( + mock_logger, + mock_gen_file_list, + global_config_all_json, + input_dir, + output_dir, + ucc_dir, + ta_name, +): + mock_item = MagicMock() + mock_item.file_class.return_value.generate.return_value = {"": "/path/to/file1"} + + mock_gen_file_list.extend([mock_item]) + + result = begin( + global_config_all_json, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, ) + assert result == [{"": "/path/to/file1"}] + mock_logger.info.assert_not_called() + def test__set_attributes_error( global_config_all_json, input_dir, output_dir, ucc_dir, ta_name diff --git a/tests/unit/generators/xml_files/test_create_configuration_xml.py b/tests/unit/generators/xml_files/test_create_configuration_xml.py index e063ffc144..4dc415ee77 100644 --- a/tests/unit/generators/xml_files/test_create_configuration_xml.py +++ b/tests/unit/generators/xml_files/test_create_configuration_xml.py @@ -1,13 +1,8 @@ -from unittest.mock import patch, MagicMock from splunk_add_on_ucc_framework.generators.xml_files import ConfigurationXml -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_configuration_xml", - return_value="<xml></xml>", -) def test_set_attributes( - mock_generate_xml, global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_all_json, input_dir, output_dir, ucc_dir, ta_name ): config_xml = ConfigurationXml( global_config_all_json, @@ -36,12 +31,7 @@ def test_set_attributes_without_configuration( assert not hasattr(config_xml, "configuration_xml_content") -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.ConfigurationXml._set_attributes", - return_value=MagicMock(), -) def test_generate_xml_without_configuration( - mock_set_attributes, global_config_no_configuration, input_dir, output_dir, @@ -56,24 +46,11 @@ def test_generate_xml_without_configuration( addon_name=ta_name, ) - mock_writer = MagicMock() - with patch.object(configuration_xml, "writer", mock_writer): - file_paths = configuration_xml.generate_xml() + file_paths = configuration_xml.generate_xml() + assert file_paths is None - # Assert that no files are returned since no dashboard is configured - assert file_paths is None - -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.ConfigurationXml._set_attributes", - return_value=MagicMock(), -) -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.ConfigurationXml.get_file_output_path" -) def test_generate_xml( - mock_op_path, - mock_set_attributes, global_config_all_json, input_dir, output_dir, @@ -87,20 +64,10 @@ def test_generate_xml( ucc_dir=ucc_dir, addon_name=ta_name, ) - config_xml.configuration_xml_content = "<xml></xml>" exp_fname = "configuration.xml" - file_path = "output_path/configuration.xml" - mock_op_path.return_value = file_path - - mock_writer = MagicMock() - with patch.object(config_xml, "writer", mock_writer): - file_paths = config_xml.generate_xml() - assert mock_op_path.call_count == 1 - mock_writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=config_xml.configuration_xml_content, - ) + file_paths = config_xml.generate_xml() - assert file_paths == {exp_fname: file_path} + assert file_paths == { + exp_fname: f"{output_dir}/{ta_name}/default/data/ui/views/{exp_fname}" + } diff --git a/tests/unit/generators/xml_files/test_create_dashboard_xml.py b/tests/unit/generators/xml_files/test_create_dashboard_xml.py index f41c4b700f..d9f63297eb 100644 --- a/tests/unit/generators/xml_files/test_create_dashboard_xml.py +++ b/tests/unit/generators/xml_files/test_create_dashboard_xml.py @@ -1,13 +1,7 @@ -from unittest.mock import patch, MagicMock from splunk_add_on_ucc_framework.generators.xml_files import DashboardXml -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_dashboard_xml", - return_value="<xml></xml>", -) def test_set_attributes_with_dashboard( - mock_generate_dashboard_xml, global_config_all_json, input_dir, output_dir, @@ -25,12 +19,7 @@ def test_set_attributes_with_dashboard( assert hasattr(dashboard_xml, "dashboard_xml_content") -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_dashboard_xml", - return_value="<xml></xml>", -) def test_set_attributes_without_dashboard( - mock_generate_dashboard_xml, global_config_only_configuration, input_dir, output_dir, @@ -47,16 +36,7 @@ def test_set_attributes_without_dashboard( assert not hasattr(dashboard_xml, "dashboard_xml_content") -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.DashboardXml._set_attributes", - return_value=MagicMock(), -) -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.DashboardXml.get_file_output_path" -) def test_generate_xml_with_dashboard( - mock_op_path, - mock_set_attributes, global_config_all_json, input_dir, output_dir, @@ -70,30 +50,15 @@ def test_generate_xml_with_dashboard( ucc_dir=ucc_dir, addon_name=ta_name, ) - dashboard_xml.dashboard_xml_content = "<dashboard></dashboard>" exp_fname = "dashboard.xml" - file_path = "output_path/dashboard.xml" - mock_op_path.return_value = file_path - mock_writer = MagicMock() - with patch.object(dashboard_xml, "writer", mock_writer): - file_paths = dashboard_xml.generate_xml() - assert mock_op_path.call_count == 1 + file_paths = dashboard_xml.generate_xml() + assert file_paths == { + exp_fname: f"{output_dir}/{ta_name}/default/data/ui/views/{exp_fname}" + } - mock_writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=dashboard_xml.dashboard_xml_content, - ) - assert file_paths == {exp_fname: file_path} - -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.DashboardXml._set_attributes", - return_value=MagicMock(), -) def test_generate_xml_without_dashboard( - mock_set_attributes, global_config_only_configuration, input_dir, output_dir, @@ -107,9 +72,7 @@ def test_generate_xml_without_dashboard( ucc_dir=ucc_dir, addon_name=ta_name, ) - mock_writer = MagicMock() - with patch.object(dashboard_xml, "writer", mock_writer): - file_paths = dashboard_xml.generate_xml() + file_paths = dashboard_xml.generate_xml() - # Assert that no files are returned since no dashboard is configured - assert file_paths is None + # Assert that no files are returned since no dashboard is configured + assert file_paths is None diff --git a/tests/unit/generators/xml_files/test_create_default_xml.py b/tests/unit/generators/xml_files/test_create_default_xml.py index 667e4590e9..8d6d404bae 100644 --- a/tests/unit/generators/xml_files/test_create_default_xml.py +++ b/tests/unit/generators/xml_files/test_create_default_xml.py @@ -1,5 +1,5 @@ from pytest import fixture, raises -from unittest.mock import patch, MagicMock +from unittest.mock import patch from splunk_add_on_ucc_framework.generators.xml_files import DefaultXml @@ -21,12 +21,7 @@ def test_set_attribute_with_error( ) -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_nav_default_xml", - return_value="<xml></xml>", -) def test_set_attribute( - mock_data_ui_generator, global_config_all_json, input_dir, output_dir, @@ -40,10 +35,34 @@ def test_set_attribute( ucc_dir=ucc_dir, addon_name=ta_name, ) - assert hasattr(default_xml, "default_xml_content") +@patch("os.path.exists", return_value=True) +def test_set_attribute_when_file_is_present( + mock_os_path, + global_config_all_json, + input_dir, + output_dir, + ucc_dir, + ta_name, + caplog, +): + default_xml = DefaultXml( + global_config_all_json, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + expected_msg = ( + "Skipping generating data/ui/nav/default.xml because file already exists." + ) + assert expected_msg in caplog.text + assert not hasattr(default_xml, "default_xml_content") + + def test_set_attribute_with_no_pages( global_config_for_conf_only_TA, input_dir, output_dir, ucc_dir, ta_name ): @@ -58,16 +77,26 @@ def test_set_attribute_with_no_pages( assert not hasattr(default_xml, "default_xml_content") -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.DefaultXml._set_attributes", - return_value=MagicMock(), -) -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.DefaultXml.get_file_output_path" -) +def test_generate_xml_without_pages( + global_config_for_conf_only_TA, + input_dir, + output_dir, + ucc_dir, + ta_name, +): + default_xml = DefaultXml( + global_config_for_conf_only_TA, + input_dir, + output_dir, + ucc_dir=ucc_dir, + addon_name=ta_name, + ) + + file_paths = default_xml.generate_xml() + assert file_paths is None + + def test_generate_xml( - mock_op_path, - mock_set_attributes, global_config_all_json, input_dir, output_dir, @@ -81,18 +110,9 @@ def test_generate_xml( ucc_dir=ucc_dir, addon_name=ta_name, ) - config_xml.default_xml_content = "<xml></xml>" exp_fname = "default.xml" - file_path = "output_path/default.xml" - mock_op_path.return_value = file_path - mock_writer = MagicMock() - with patch.object(config_xml, "writer", mock_writer): - file_paths = config_xml.generate_xml() - - mock_writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=config_xml.default_xml_content, - ) - assert file_paths == {exp_fname: file_path} + file_paths = config_xml.generate_xml() + assert file_paths == { + exp_fname: f"{output_dir}/{ta_name}/default/data/ui/nav/{exp_fname}" + } diff --git a/tests/unit/generators/xml_files/test_create_inputs_xml.py b/tests/unit/generators/xml_files/test_create_inputs_xml.py index c6cebedaea..dda86e5807 100644 --- a/tests/unit/generators/xml_files/test_create_inputs_xml.py +++ b/tests/unit/generators/xml_files/test_create_inputs_xml.py @@ -1,13 +1,7 @@ -from unittest.mock import patch, MagicMock from splunk_add_on_ucc_framework.generators.xml_files import InputsXml -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_inputs_xml", - return_value="<xml></xml>", -) def test_set_attributes_with_inputs( - mock_generate_dashboard_xml, global_config_all_json, input_dir, output_dir, @@ -25,12 +19,7 @@ def test_set_attributes_with_inputs( assert hasattr(inputs_xml, "inputs_xml_content") -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_inputs_xml", - return_value="<xml></xml>", -) def test_set_attributes_without_inputs( - mock_generate_dashboard_xml, global_config_only_configuration, input_dir, output_dir, @@ -48,16 +37,7 @@ def test_set_attributes_without_inputs( assert not hasattr(inputs_xml, "inputs_xml_content") -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.InputsXml._set_attributes", - return_value=MagicMock(), -) -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.InputsXml.get_file_output_path" -) def test_generate_xml_with_inputs( - mock_op_path, - mock_set_attributes, global_config_all_json, input_dir, output_dir, @@ -71,30 +51,14 @@ def test_generate_xml_with_inputs( ucc_dir=ucc_dir, addon_name=ta_name, ) - inputs_xml.inputs_xml_content = "<xml></xml>" exp_fname = "inputs.xml" - file_path = "output_path/inputs.xml" - mock_op_path.return_value = file_path + file_paths = inputs_xml.generate_xml() + assert file_paths == { + exp_fname: f"{output_dir}/{ta_name}/default/data/ui/views/{exp_fname}" + } - mock_writer = MagicMock() - with patch.object(inputs_xml, "writer", mock_writer): - file_paths = inputs_xml.generate_xml() - # Assert that the writer function was called with the correct parameters - mock_writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=inputs_xml.inputs_xml_content, - ) - assert file_paths == {exp_fname: file_path} - - -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.InputsXml._set_attributes", - return_value=MagicMock(), -) def test_generate_xml_without_inputs( - mock_set_attributes, global_config_only_configuration, input_dir, output_dir, @@ -108,10 +72,7 @@ def test_generate_xml_without_inputs( ucc_dir=ucc_dir, addon_name=ta_name, ) + file_paths = inputs_xml.generate_xml() - mock_writer = MagicMock() - with patch.object(inputs_xml, "writer", mock_writer): - file_paths = inputs_xml.generate_xml() - - # Assert that no files are returned since no dashboard is configured - assert file_paths is None + # Assert that no files are returned since no dashboard is configured + assert file_paths is None diff --git a/tests/unit/generators/xml_files/test_create_redirect_xml.py b/tests/unit/generators/xml_files/test_create_redirect_xml.py index a8b109a8cb..5e9f4d1d87 100644 --- a/tests/unit/generators/xml_files/test_create_redirect_xml.py +++ b/tests/unit/generators/xml_files/test_create_redirect_xml.py @@ -1,13 +1,7 @@ -from unittest.mock import patch, MagicMock from splunk_add_on_ucc_framework.generators.xml_files import RedirectXml -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_redirect_xml", - return_value="<xml></xml>", -) def test_set_attributes_with_oauth( - mock_generate_redirect_xml, global_config_all_json, input_dir, output_dir, @@ -26,12 +20,7 @@ def test_set_attributes_with_oauth( assert redirect_xml.ta_name == "test_addon" -@patch( - "splunk_add_on_ucc_framework.data_ui_generator.generate_views_redirect_xml", - return_value="<xml></xml>", -) def test_set_attributes_without_oauth( - mock_generate_redirect_xml, global_config_only_logging, input_dir, output_dir, @@ -49,11 +38,8 @@ def test_set_attributes_without_oauth( assert not hasattr(redirect_xml, "redirect_xml_content") -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.RedirectXml.get_file_output_path" -) def test_generate_xml_with_oauth( - mock_op_path, global_config_all_json, input_dir, output_dir, ucc_dir, ta_name + global_config_all_json, input_dir, output_dir, ucc_dir, ta_name ): redirect_xml = RedirectXml( global_config_all_json, @@ -62,30 +48,15 @@ def test_generate_xml_with_oauth( ucc_dir=ucc_dir, addon_name=ta_name, ) - redirect_xml.redirect_xml_content = "<xml></xml>" exp_fname = f"{redirect_xml.ta_name}_redirect.xml" - file_path = "output_path/ta_name_redirect.xml" - mock_op_path.return_value = file_path - mock_writer = MagicMock() - with patch.object(redirect_xml, "writer", mock_writer): - file_paths = redirect_xml.generate_xml() + file_paths = redirect_xml.generate_xml() + assert file_paths == { + exp_fname: f"{output_dir}/{ta_name}/default/data/ui/views/{exp_fname}" + } - # Assert that the writer function was called with the correct parameters - mock_writer.assert_called_once_with( - file_name=exp_fname, - file_path=file_path, - content=redirect_xml.redirect_xml_content, - ) - assert file_paths == {exp_fname: file_path} - -@patch( - "splunk_add_on_ucc_framework.generators.xml_files.RedirectXml._set_attributes", - return_value=MagicMock(), -) def test_generate_xml_without_oauth( - mock_set_attributes, global_config_only_logging, input_dir, output_dir, @@ -100,9 +71,7 @@ def test_generate_xml_without_oauth( addon_name=ta_name, ) - mock_writer = MagicMock() - with patch.object(redirect_xml, "writer", mock_writer): - file_paths = redirect_xml.generate_xml() + file_paths = redirect_xml.generate_xml() - # Assert that no files are returned since no dashboard is configured - assert file_paths is None + # Assert that no files are returned since no dashboard is configured + assert file_paths is None diff --git a/tests/unit/testdata/valid_config.json b/tests/unit/testdata/valid_config.json index 1ebb30b219..9909206c21 100644 --- a/tests/unit/testdata/valid_config.json +++ b/tests/unit/testdata/valid_config.json @@ -1329,6 +1329,11 @@ "version": "1.0.0", "displayName": "Splunk UCC test Add-on", "schemaVersion": "0.0.3", + "checkForUpdates": false, + "supportedThemes": [ + "dark", + "light" + ], "os-dependentLibraries": [ { "name": "cryptography", diff --git a/tests/unit/testdata/valid_config_all_alerts.json b/tests/unit/testdata/valid_config_all_alerts.json index 6131b8514a..2279b9775f 100644 --- a/tests/unit/testdata/valid_config_all_alerts.json +++ b/tests/unit/testdata/valid_config_all_alerts.json @@ -45,6 +45,7 @@ "name": "test_alert_active", "label": "Test Alert Active", "description": "Description for test Alert Action", + "iconFileName": "alerticon.png", "activeResponse": { "task": [ "Create" @@ -73,7 +74,6 @@ "type": "text", "label": "Name", "field": "name", - "defaultValue": "xyz", "required": true, "help": "Please enter your name" } @@ -122,6 +122,7 @@ "name": "test_alert_default", "label": "Test Alert Default", "description": "Description for test Alert Action", + "iconFileName": "dev_icon.png", "adaptiveResponse": { "task": [ "Create" diff --git a/tests/unit/testdata/valid_config_expand.json b/tests/unit/testdata/valid_config_expand.json index 9afa89695c..317bc676f1 100644 --- a/tests/unit/testdata/valid_config_expand.json +++ b/tests/unit/testdata/valid_config_expand.json @@ -13,6 +13,50 @@ ], "title": "Some page" }, + { + "name": "oauth", + "table": { + "actions": [ + "edit", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Endpoint", + "field": "endpoint" + } + ] + }, + "entity": [ + { + "type": "text", + "label": "client id", + "field": "client_id", + "required": true, + "encrypted": true + }, + { + "type": "text", + "label": "client secret", + "field": "client_secret", + "required": true, + "encrypted": true + }, + { + "type": "text", + "label": "Redirect URL", + "field": "redirect_url", + "encrypted": true, + "required": true + } + ], + "title": "Account with name Oauth" + }, { "type": "loggingTab" } @@ -90,4 +134,4 @@ "displayName": "Splunk UCC test Add-on", "schemaVersion": "0.0.3" } -} +} \ No newline at end of file diff --git a/tests/unit/testdata/valid_config_with_one_entity_per_input.json b/tests/unit/testdata/valid_config_with_one_entity_per_input.json new file mode 100644 index 0000000000..bf2b2deb8c --- /dev/null +++ b/tests/unit/testdata/valid_config_with_one_entity_per_input.json @@ -0,0 +1,237 @@ +{ + "pages": { + "configuration": { + "tabs": [ + { + "name": "account", + "table": { + "actions": [ + "edit", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Auth Type", + "field": "auth_type" + } + ] + }, + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "string", + "errorMsg": "Length of ID should be between 1 and 50", + "minLength": 1, + "maxLength": 50 + }, + { + "type": "regex", + "errorMsg": "Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + } + ], + "field": "name", + "help": "Enter a unique name for this account.", + "required": true + }, + { + "type": "singleSelect", + "label": "Example Environment", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "login.example.com", + "label": "Value1" + }, + { + "value": "test.example.com", + "label": "Value2" + }, + { + "value": "other", + "label": "Other" + } + ], + "display": true + }, + "help": "", + "field": "custom_endpoint", + "defaultValue": "login.example.com", + "required": true + }, + { + "type": "text", + "label": "Endpoint URL", + "help": "Enter the endpoint URL.", + "field": "endpoint", + "options": { + "display": false + } + }, + { + "type": "checkbox", + "label": "Example Checkbox", + "field": "account_checkbox", + "help": "This is an example checkbox for the account entity" + } + ], + "title": "Account" + } + ] + }, + "inputs": { + "services": [ + { + "name": "example_input_three", + "title": "Example Input Three", + "entity": [ + { + "type": "text", + "label": "Name", + "field": "name" + } + ], + "disableNewInput": true + }, + { + "name": "example_input_four", + "title": "Example Input Four", + "entity": [ + { + "type": "text", + "label": "Interval", + "field": "Interval", + "defaultValue": 600, + "help": "Time interval of the data input, in seconds." + } + ] + }, + { + "name": "input_with_default_boolean", + "title": "Input with default boolean", + "entity": [ + { + "type": "checkbox", + "label": "Example Checkbox", + "field": "test_checkbox", + "help": "This is an example checkbox.", + "defaultValue": true + } + ] + }, + { + "name": "service_with_conf_param", + "conf": "some_conf", + "entity": [ + { + "type": "text", + "field": "interval", + "label": "Interval", + "help": "Time interval of the data input, in seconds.", + "required": true + } + ], + "title": "Service with conf param" + } + ], + "title": "Inputs", + "description": "Manage your data inputs", + "table": { + "actions": [ + "edit", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Account Name", + "field": "account" + }, + { + "label": "Interval", + "field": "interval" + }, + { + "label": "Index", + "field": "index" + }, + { + "label": "Status", + "field": "disabled" + } + ], + "moreInfo": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Interval", + "field": "interval" + }, + { + "label": "Index", + "field": "index" + }, + { + "label": "Status", + "field": "disabled", + "mapping": { + "true": "Disabled", + "false": "Enabled" + } + }, + { + "label": "Example Account", + "field": "account" + }, + { + "label": "Object", + "field": "object" + }, + { + "label": "Object Fields", + "field": "object_fields" + }, + { + "label": "Order By", + "field": "order_by" + }, + { + "label": "Query Start Date", + "field": "start_date" + }, + { + "label": "Limit", + "field": "limit" + } + ] + } + } + }, + "meta": { + "name": "Splunk_TA_UCCExample", + "restRoot": "test_addon", + "version": "1.0.0", + "displayName": "Splunk UCC test Add-on", + "schemaVersion": "0.0.3", + "checkForUpdates": false, + "supportedThemes": [ + "dark", + "light" + ] + } +} \ No newline at end of file