From d9e6ce00e0a43ee9d666d9dc9a7c87fa4714601a Mon Sep 17 00:00:00 2001 From: Simone Chemelli Date: Tue, 25 Jan 2022 10:46:04 +0100 Subject: [PATCH] Fix extra data for AWS sns service (#64771) * Fix extra data for ANS sns service * Add test * apply review comments --- homeassistant/components/aws/notify.py | 13 ++++--- tests/components/aws/test_init.py | 48 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/aws/notify.py b/homeassistant/components/aws/notify.py index b3df967343ec..37b49d44a88e 100644 --- a/homeassistant/components/aws/notify.py +++ b/homeassistant/components/aws/notify.py @@ -12,6 +12,7 @@ from homeassistant.components.notify import ( ATTR_TITLE_DEFAULT, BaseNotificationService, ) +from homeassistant.components.notify.const import ATTR_DATA from homeassistant.const import ( CONF_NAME, CONF_PLATFORM, @@ -166,11 +167,13 @@ class AWSSNS(AWSNotify): _LOGGER.error("At least one target is required") return - message_attributes = { - k: {"StringValue": json.dumps(v), "DataType": "String"} - for k, v in kwargs.items() - if v is not None - } + message_attributes = {} + if data := kwargs.get(ATTR_DATA): + message_attributes = { + k: {"StringValue": v, "DataType": "String"} + for k, v in data.items() + if v is not None + } subject = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) async with self.session.create_client( diff --git a/tests/components/aws/test_init.py b/tests/components/aws/test_init.py index 1cb14a1d6156..8a5589cf62d7 100644 --- a/tests/components/aws/test_init.py +++ b/tests/components/aws/test_init.py @@ -266,3 +266,51 @@ async def test_credential_skip_validate(hass): session = sessions.get("key") assert isinstance(session, MockAioSession) session.get_user.assert_not_awaited() + + +async def test_service_call_extra_data(hass): + """Test service call extra data are parsed properly.""" + with async_patch("homeassistant.components.aws.AioSession", new=MockAioSession): + await async_setup_component( + hass, + "aws", + { + "aws": { + "notify": [ + { + "service": "sns", + "name": "SNS Test", + "region_name": "us-east-1", + } + ] + } + }, + ) + await hass.async_block_till_done() + + sessions = hass.data[aws.DATA_SESSIONS] + assert sessions is not None + assert len(sessions) == 1 + session = sessions.get("default") + assert isinstance(session, MockAioSession) + + assert hass.services.has_service("notify", "sns_test") is True + await hass.services.async_call( + "notify", + "sns_test", + { + "message": "test", + "target": "ARN", + "data": {"AWS.SNS.SMS.SenderID": "HA-notify"}, + }, + blocking=True, + ) + + session.publish.assert_called_once_with( + TargetArn="ARN", + Message="test", + Subject="Home Assistant", + MessageAttributes={ + "AWS.SNS.SMS.SenderID": {"StringValue": "HA-notify", "DataType": "String"} + }, + )