core/tests/components/apprise/test_notify.py

148 lines
5.0 KiB
Python

"""The tests for the apprise notification platform."""
from homeassistant.setup import async_setup_component
from tests.async_mock import MagicMock, patch
BASE_COMPONENT = "notify"
async def test_apprise_config_load_fail01(hass):
"""Test apprise configuration failures 1."""
config = {
BASE_COMPONENT: {"name": "test", "platform": "apprise", "config": "/path/"}
}
with patch("apprise.AppriseConfig.add", return_value=False):
assert await async_setup_component(hass, BASE_COMPONENT, config)
await hass.async_block_till_done()
# Test that our service failed to load
assert not hass.services.has_service(BASE_COMPONENT, "test")
async def test_apprise_config_load_fail02(hass):
"""Test apprise configuration failures 2."""
config = {
BASE_COMPONENT: {"name": "test", "platform": "apprise", "config": "/path/"}
}
with patch("apprise.Apprise.add", return_value=False):
with patch("apprise.AppriseConfig.add", return_value=True):
assert await async_setup_component(hass, BASE_COMPONENT, config)
await hass.async_block_till_done()
# Test that our service failed to load
assert not hass.services.has_service(BASE_COMPONENT, "test")
async def test_apprise_config_load_okay(hass, tmp_path):
"""Test apprise configuration failures."""
# Test cases where our URL is invalid
d = tmp_path / "apprise-config"
d.mkdir()
f = d / "apprise"
f.write_text("mailto://user:pass@example.com/")
config = {BASE_COMPONENT: {"name": "test", "platform": "apprise", "config": str(f)}}
assert await async_setup_component(hass, BASE_COMPONENT, config)
await hass.async_block_till_done()
# Valid configuration was loaded; our service is good
assert hass.services.has_service(BASE_COMPONENT, "test")
async def test_apprise_url_load_fail(hass):
"""Test apprise url failure."""
config = {
BASE_COMPONENT: {
"name": "test",
"platform": "apprise",
"url": "mailto://user:pass@example.com",
}
}
with patch("apprise.Apprise.add", return_value=False):
assert await async_setup_component(hass, BASE_COMPONENT, config)
await hass.async_block_till_done()
# Test that our service failed to load
assert not hass.services.has_service(BASE_COMPONENT, "test")
async def test_apprise_notification(hass):
"""Test apprise notification."""
config = {
BASE_COMPONENT: {
"name": "test",
"platform": "apprise",
"url": "mailto://user:pass@example.com",
}
}
# Our Message
data = {"title": "Test Title", "message": "Test Message"}
with patch("apprise.Apprise") as mock_apprise:
obj = MagicMock()
obj.add.return_value = True
obj.notify.return_value = True
mock_apprise.return_value = obj
assert await async_setup_component(hass, BASE_COMPONENT, config)
await hass.async_block_till_done()
# Test the existence of our service
assert hass.services.has_service(BASE_COMPONENT, "test")
# Test the call to our underlining notify() call
await hass.services.async_call(BASE_COMPONENT, "test", data)
await hass.async_block_till_done()
# Validate calls were made under the hood correctly
obj.add.assert_called_once_with([config[BASE_COMPONENT]["url"]])
obj.notify.assert_called_once_with(
**{"body": data["message"], "title": data["title"], "tag": None}
)
async def test_apprise_notification_with_target(hass, tmp_path):
"""Test apprise notification with a target."""
# Test cases where our URL is invalid
d = tmp_path / "apprise-config"
d.mkdir()
f = d / "apprise"
# Write 2 config entries each assigned to different tags
f.write_text("devops=mailto://user:pass@example.com/\r\n")
f.write_text("system,alert=syslog://\r\n")
config = {BASE_COMPONENT: {"name": "test", "platform": "apprise", "config": str(f)}}
# Our Message, only notify the services tagged with "devops"
data = {"title": "Test Title", "message": "Test Message", "target": ["devops"]}
with patch("apprise.Apprise") as mock_apprise:
apprise_obj = MagicMock()
apprise_obj.add.return_value = True
apprise_obj.notify.return_value = True
mock_apprise.return_value = apprise_obj
assert await async_setup_component(hass, BASE_COMPONENT, config)
await hass.async_block_till_done()
# Test the existence of our service
assert hass.services.has_service(BASE_COMPONENT, "test")
# Test the call to our underlining notify() call
await hass.services.async_call(BASE_COMPONENT, "test", data)
await hass.async_block_till_done()
# Validate calls were made under the hood correctly
apprise_obj.notify.assert_called_once_with(
**{"body": data["message"], "title": data["title"], "tag": data["target"]}
)