def test_must_resolve_array_value(self): parameters = {"key1": "value1"} input = {"Fn::Sub": ["Hello ${key1} ${a}", {"a": "b"}]} expected = {"Fn::Sub": ["Hello value1 ${a}", {"a": "b"}]} sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_must_resolve_string_value(self): input = {"Fn::Sub": self.input_sub_value} expected = {"Fn::Sub": self.expected_output_sub_value} sub = SubAction() result = sub.resolve_resource_id_refs(input, self.supported_resource_id_refs) self.assertEqual(expected, result)
def test_handle_sub_value_must_call_handler_on_array(self, sub_all_refs_mock): input = ["sub string", {"a": "b"}] expected = ["sub string", {"a": "b"}] handler_mock = Mock() sub_all_refs_mock.return_value = expected[0] sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) sub_all_refs_mock.assert_called_once_with(input[0], handler_mock)
def test_handle_sub_value_must_skip_no_string(self, sub_all_refs_mock): input = [{"a":"b"}] expected = [{"a":"b"}] handler_mock = Mock() sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) handler_mock.assert_not_called() sub_all_refs_mock.assert_not_called()
def test_must_skip_invalid_input_dict(self, sub_all_refs_mock): input = {"a": "b"} expected = {"a": "b"} handler_mock = Mock() sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) handler_mock.assert_not_called() sub_all_refs_mock.assert_not_called()
def test_handle_sub_value_must_skip_no_string(self, sub_all_refs_mock): input = [{"a": "b"}] expected = [{"a": "b"}] handler_mock = Mock() sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) handler_mock.assert_not_called() sub_all_refs_mock.assert_not_called()
def test_handle_sub_value_must_call_handler_on_string(self, sub_all_refs_mock): input = "sub string" expected = "result" handler_mock = Mock() sub_all_refs_mock.return_value = expected sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) sub_all_refs_mock.assert_called_once_with(input, handler_mock)
def test_handle_sub_value_must_call_handler_on_array( self, sub_all_refs_mock): input = ["sub string", {"a": "b"}] expected = ["sub string", {"a": "b"}] handler_mock = Mock() sub_all_refs_mock.return_value = expected[0] sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) sub_all_refs_mock.assert_called_once_with(input[0], handler_mock)
def test_handle_sub_value_must_call_handler_on_string( self, sub_all_refs_mock): input = "sub string" expected = "result" handler_mock = Mock() sub_all_refs_mock.return_value = expected sub = SubAction() result = sub._handle_sub_value(input, handler_mock) self.assertEqual(expected, result) sub_all_refs_mock.assert_called_once_with(input, handler_mock)
def test_sub_all_refs_with_literals(self): parameters = {"key1": "value1", "key2": "value2"} input = {"Fn::Sub": "hello ${key1} ${key2} ${!key1} ${!key2}"} expected = { # ${! is the prefix for literal. These won't be substituted "Fn::Sub": "hello value1 value2 ${!key1} ${!key2}" } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_must_resolve_string_value(self): input = { "Fn::Sub": self.input_sub_value } expected = { "Fn::Sub": self.expected_output_sub_value } sub = SubAction() result = sub.resolve_resource_id_refs(input, self.supported_resource_id_refs) self.assertEqual(expected, result)
def test_must_resolve_array_value(self): input = { "Fn::Sub": [self.input_sub_value, {"unknown":"a"}] } expected = { "Fn::Sub": [self.expected_output_sub_value, {"unknown": "a"}] } sub = SubAction() result = sub.resolve_resource_id_refs(input, self.supported_resource_id_refs) self.assertEqual(expected, result)
def test_must_resolve_array_value(self): input = {"Fn::Sub": [self.input_sub_value, {"unknown": "a"}]} expected = { "Fn::Sub": [self.expected_output_sub_value, { "unknown": "a" }] } sub = SubAction() result = sub.resolve_resource_refs(input, self.supported_resource_refs) self.assertEqual(expected, result)
def test_return_value_if_cannot_handle(self, can_handle_mock): parameters = { "key": "value" } input = { "Fn::Sub": "${key}" } expected = { "Fn::Sub": "${key}" } sub = SubAction() can_handle_mock.return_value = False # Simulate failure to handle the input. Result should be same as input self.assertEqual(expected, sub.resolve_resource_id_refs(input, parameters))
def test_must_resolve_string_value(self): parameters = { "key1": "value1" } input = { "Fn::Sub": "Hello ${key1}" } expected = { "Fn::Sub": "Hello value1" } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_sub_all_refs_multiple_references(self): parameters = {"key1": "value1", "key2": "value2"} input = { "Fn::Sub": "hello ${key1} ${key2} ${key1}${key2} ${unknown} ${key1.attr}" } expected = { "Fn::Sub": "hello value1 value2 value1value2 ${unknown} ${key1.attr}" } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_sub_all_refs_multiple_references(self): parameters = { "key1": "value1", "key2": "value2" } input = { "Fn::Sub": "hello ${key1} ${key2} ${key1}${key2} ${unknown} ${key1.attr}" } expected = { "Fn::Sub": "hello value1 value2 value1value2 ${unknown} ${key1.attr}" } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_sub_all_refs_with_dict_input(self): parameters = { "key1": "value1", "key2": "value2" } input = { "Fn::Sub": {"a": "key1", "b": "key2"} } expected = { "Fn::Sub": {"a": "key1", "b": "key2"} } sub = SubAction() result = sub.resolve_resource_id_refs(input, parameters) self.assertEqual(expected, result)
def test_must_resolve_array_value(self): parameters = { "key1": "value1" } input = { "Fn::Sub": ["Hello ${key1} ${a}", {"a":"b"}] } expected = { "Fn::Sub": ["Hello value1 ${a}", {"a": "b"}] } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_sub_all_refs_with_list_input(self): parameters = { "key1": "value1", "key2": "value2" } input = { "Fn::Sub": ["key1", "key2"] } expected = { "Fn::Sub": ["key1", "key2"] } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_sub_all_refs_with_pseudo_parameters(self): parameters = { "key1": "value1", "AWS::Region": "ap-southeast-1" } input = { "Fn::Sub": "hello ${AWS::Region} ${key1}" } expected = { "Fn::Sub": "hello ap-southeast-1 value1" } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)
def test_sub_all_refs_with_literals(self): parameters = { "key1": "value1", "key2": "value2" } input = { "Fn::Sub": "hello ${key1} ${key2} ${!key1} ${!key2}" } expected = { # ${! is the prefix for literal. These won't be substituted "Fn::Sub": "hello value1 value2 ${!key1} ${!key2}" } sub = SubAction() result = sub.resolve_parameter_refs(input, parameters) self.assertEqual(expected, result)