From d489aad453c12a9a6ddd944b1a98168b4988120d Mon Sep 17 00:00:00 2001 From: Alex Harvey Date: Fri, 5 Jul 2024 16:32:15 +1000 Subject: [PATCH 1/2] [Resolve #1484] Gracefully handle invalid parameters This adds logic to _cast_parameters to also handle the case that the `parameters` dict itself is not a dict but some other invalid type. --- sceptre/stack.py | 5 +++++ tests/test_stack.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/sceptre/stack.py b/sceptre/stack.py index f085ced7f..ba96e5816 100644 --- a/sceptre/stack.py +++ b/sceptre/stack.py @@ -305,6 +305,11 @@ def is_valid(value: Any) -> bool: or isinstance(value, Resolver) ) + if not isinstance(parameters, dict): + raise InvalidConfigFileError( + f"{self.name}: parameters must be a dictionary of key-value apirs, got {parameters}" + ) + casted_parameters = {k: cast_value(v) for k, v in parameters.items()} if not all(is_valid(value) for value in casted_parameters.values()): diff --git a/tests/test_stack.py b/tests/test_stack.py index eeddf7451..e67edc49b 100644 --- a/tests/test_stack.py +++ b/tests/test_stack.py @@ -202,6 +202,20 @@ def test_init__invalid_parameters_raise_invalid_config_file_error(self, paramete parameters=parameters, ) + @pytest.mark.parametrize( + "parameters", + [["this", "is", "a", "list"], "a_string"], + ) + def test_init__invalid_parameters__parameters_a_list(self, parameters): + with pytest.raises(InvalidConfigFileError): + Stack( + name="stack_name", + project_code="project_code", + template_handler_config={"type": "file"}, + region="region", + parameters=parameters, + ) + @pytest.mark.parametrize( "parameters", [ From 08d6e139c676f83789f6d54f0b29ec8ed46e912b Mon Sep 17 00:00:00 2001 From: Alex Harvey Date: Fri, 5 Jul 2024 20:50:09 +1000 Subject: [PATCH 2/2] typo --- sceptre/stack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sceptre/stack.py b/sceptre/stack.py index ba96e5816..7990e8126 100644 --- a/sceptre/stack.py +++ b/sceptre/stack.py @@ -307,7 +307,7 @@ def is_valid(value: Any) -> bool: if not isinstance(parameters, dict): raise InvalidConfigFileError( - f"{self.name}: parameters must be a dictionary of key-value apirs, got {parameters}" + f"{self.name}: parameters must be a dictionary of key-value pairs, got {parameters}" ) casted_parameters = {k: cast_value(v) for k, v in parameters.items()}