From a1f70e11aeaa85ad6630e0ae5dd1d2fadc8a0f0f Mon Sep 17 00:00:00 2001 From: Jeff H Date: Sun, 4 Oct 2020 17:17:24 -0400 Subject: [PATCH] Fix slack message icon override (#41212) * Fix slack message icon override Allows overriding the icon for individual slack messages using either an emoji or a URL. * Run python3 -m script.gen_requirements_all * Add period to first line * Add support for python 3.7 testing AsyncMock is only available from python 3.8+. Prior to this, CoroutineMock is used which doesn't mock the method so it needs to be done manually. * Fix tests for python3.7 compatibility The Python3.7 mock call object doesn't have the kwargs helper property. * Update default emoji test docstring --- homeassistant/components/slack/notify.py | 5 +- requirements_test_all.txt | 3 ++ tests/components/slack/__init__.py | 1 + tests/components/slack/test_notify.py | 66 ++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 tests/components/slack/__init__.py create mode 100644 tests/components/slack/test_notify.py diff --git a/homeassistant/components/slack/notify.py b/homeassistant/components/slack/notify.py index 8477b2fb501..8fb45c36d9f 100644 --- a/homeassistant/components/slack/notify.py +++ b/homeassistant/components/slack/notify.py @@ -209,8 +209,9 @@ class SlackNotificationService(BaseNotificationService): "username": username, } - if self._icon: - if self._icon.lower().startswith(("http://", "https://")): + icon = icon or self._icon + if icon: + if icon.lower().startswith(("http://", "https://")): icon_type = "url" else: icon_type = "emoji" diff --git a/requirements_test_all.txt b/requirements_test_all.txt index f5c688e7b01..c43f977e014 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -938,6 +938,9 @@ simplehound==0.3 # homeassistant.components.simplisafe simplisafe-python==9.4.1 +# homeassistant.components.slack +slackclient==2.5.0 + # homeassistant.components.sleepiq sleepyq==0.7 diff --git a/tests/components/slack/__init__.py b/tests/components/slack/__init__.py new file mode 100644 index 00000000000..b32ec5ef7b1 --- /dev/null +++ b/tests/components/slack/__init__.py @@ -0,0 +1 @@ +"""Slack notification tests.""" diff --git a/tests/components/slack/test_notify.py b/tests/components/slack/test_notify.py new file mode 100644 index 00000000000..bfd78b20900 --- /dev/null +++ b/tests/components/slack/test_notify.py @@ -0,0 +1,66 @@ +"""Test slack notifications.""" +from unittest.mock import Mock + +from homeassistant.components.slack.notify import SlackNotificationService + +from tests.async_mock import AsyncMock + + +async def test_message_includes_default_emoji(): + """Tests that default icon is used when no message icon is given.""" + mock_client = Mock() + mock_client.chat_postMessage = AsyncMock() + expected_icon = ":robot_face:" + service = SlackNotificationService(None, mock_client, "_", "_", expected_icon) + + await service.async_send_message("test") + + mock_fn = mock_client.chat_postMessage + mock_fn.assert_called_once() + _, kwargs = mock_fn.call_args + assert kwargs["icon_emoji"] == expected_icon + + +async def test_message_emoji_overrides_default(): + """Tests that overriding the default icon emoji when sending a message works.""" + mock_client = Mock() + mock_client.chat_postMessage = AsyncMock() + service = SlackNotificationService(None, mock_client, "_", "_", "default_icon") + + expected_icon = ":new:" + await service.async_send_message("test", data={"icon": expected_icon}) + + mock_fn = mock_client.chat_postMessage + mock_fn.assert_called_once() + _, kwargs = mock_fn.call_args + assert kwargs["icon_emoji"] == expected_icon + + +async def test_message_includes_default_icon_url(): + """Tests that overriding the default icon url when sending a message works.""" + mock_client = Mock() + mock_client.chat_postMessage = AsyncMock() + expected_icon = "https://example.com/hass.png" + service = SlackNotificationService(None, mock_client, "_", "_", expected_icon) + + await service.async_send_message("test") + + mock_fn = mock_client.chat_postMessage + mock_fn.assert_called_once() + _, kwargs = mock_fn.call_args + assert kwargs["icon_url"] == expected_icon + + +async def test_message_icon_url_overrides_default(): + """Tests that overriding the default icon url when sending a message works.""" + mock_client = Mock() + mock_client.chat_postMessage = AsyncMock() + service = SlackNotificationService(None, mock_client, "_", "_", "default_icon") + + expected_icon = "https://example.com/hass.png" + await service.async_send_message("test", data={"icon": expected_icon}) + + mock_fn = mock_client.chat_postMessage + mock_fn.assert_called_once() + _, kwargs = mock_fn.call_args + assert kwargs["icon_url"] == expected_icon