"""The tests for the persistent notification component.""" from homeassistant.components.websocket_api.const import TYPE_RESULT from homeassistant.setup import setup_component, async_setup_component import homeassistant.components.persistent_notification as pn from tests.common import get_test_home_assistant class TestPersistentNotification: """Test persistent notification component.""" def setup_method(self, method): """Set up things to be run when tests are started.""" self.hass = get_test_home_assistant() setup_component(self.hass, pn.DOMAIN, {}) def teardown_method(self, method): """Stop everything that was started.""" self.hass.stop() def test_create(self): """Test creating notification without title or notification id.""" notifications = self.hass.data[pn.DOMAIN]["notifications"] assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 pn.create(self.hass, "Hello World {{ 1 + 1 }}", title="{{ 1 + 1 }} beers") self.hass.block_till_done() entity_ids = self.hass.states.entity_ids(pn.DOMAIN) assert len(entity_ids) == 1 assert len(notifications) == 1 state = self.hass.states.get(entity_ids[0]) assert state.state == pn.STATE assert state.attributes.get("message") == "Hello World 2" assert state.attributes.get("title") == "2 beers" notification = notifications.get(entity_ids[0]) assert notification["status"] == pn.STATUS_UNREAD assert notification["message"] == "Hello World 2" assert notification["title"] == "2 beers" assert notification["created_at"] is not None notifications.clear() def test_create_notification_id(self): """Ensure overwrites existing notification with same id.""" notifications = self.hass.data[pn.DOMAIN]["notifications"] assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 pn.create(self.hass, "test", notification_id="Beer 2") self.hass.block_till_done() assert len(self.hass.states.entity_ids()) == 1 assert len(notifications) == 1 entity_id = "persistent_notification.beer_2" state = self.hass.states.get(entity_id) assert state.attributes.get("message") == "test" notification = notifications.get(entity_id) assert notification["message"] == "test" assert notification["title"] is None pn.create(self.hass, "test 2", notification_id="Beer 2") self.hass.block_till_done() # We should have overwritten old one assert len(self.hass.states.entity_ids()) == 1 state = self.hass.states.get(entity_id) assert state.attributes.get("message") == "test 2" notification = notifications.get(entity_id) assert notification["message"] == "test 2" notifications.clear() def test_create_template_error(self): """Ensure we output templates if contain error.""" notifications = self.hass.data[pn.DOMAIN]["notifications"] assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 pn.create(self.hass, "{{ message + 1 }}", "{{ title + 1 }}") self.hass.block_till_done() entity_ids = self.hass.states.entity_ids(pn.DOMAIN) assert len(entity_ids) == 1 assert len(notifications) == 1 state = self.hass.states.get(entity_ids[0]) assert state.attributes.get("message") == "{{ message + 1 }}" assert state.attributes.get("title") == "{{ title + 1 }}" notification = notifications.get(entity_ids[0]) assert notification["message"] == "{{ message + 1 }}" assert notification["title"] == "{{ title + 1 }}" notifications.clear() def test_dismiss_notification(self): """Ensure removal of specific notification.""" notifications = self.hass.data[pn.DOMAIN]["notifications"] assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 pn.create(self.hass, "test", notification_id="Beer 2") self.hass.block_till_done() assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 1 assert len(notifications) == 1 pn.dismiss(self.hass, notification_id="Beer 2") self.hass.block_till_done() assert len(self.hass.states.entity_ids(pn.DOMAIN)) == 0 assert len(notifications) == 0 notifications.clear() def test_mark_read(self): """Ensure notification is marked as Read.""" notifications = self.hass.data[pn.DOMAIN]["notifications"] assert len(notifications) == 0 pn.create(self.hass, "test", notification_id="Beer 2") self.hass.block_till_done() entity_id = "persistent_notification.beer_2" assert len(notifications) == 1 notification = notifications.get(entity_id) assert notification["status"] == pn.STATUS_UNREAD self.hass.services.call( pn.DOMAIN, pn.SERVICE_MARK_READ, {"notification_id": "Beer 2"} ) self.hass.block_till_done() assert len(notifications) == 1 notification = notifications.get(entity_id) assert notification["status"] == pn.STATUS_READ notifications.clear() async def test_ws_get_notifications(hass, hass_ws_client): """Test websocket endpoint for retrieving persistent notifications.""" await async_setup_component(hass, pn.DOMAIN, {}) client = await hass_ws_client(hass) await client.send_json({"id": 5, "type": "persistent_notification/get"}) msg = await client.receive_json() assert msg["id"] == 5 assert msg["type"] == TYPE_RESULT assert msg["success"] notifications = msg["result"] assert len(notifications) == 0 # Create hass.components.persistent_notification.async_create( "test", notification_id="Beer 2" ) await client.send_json({"id": 6, "type": "persistent_notification/get"}) msg = await client.receive_json() assert msg["id"] == 6 assert msg["type"] == TYPE_RESULT assert msg["success"] notifications = msg["result"] assert len(notifications) == 1 notification = notifications[0] assert notification["notification_id"] == "Beer 2" assert notification["message"] == "test" assert notification["title"] is None assert notification["status"] == pn.STATUS_UNREAD assert notification["created_at"] is not None # Mark Read await hass.services.async_call( pn.DOMAIN, pn.SERVICE_MARK_READ, {"notification_id": "Beer 2"} ) await client.send_json({"id": 7, "type": "persistent_notification/get"}) msg = await client.receive_json() notifications = msg["result"] assert len(notifications) == 1 assert notifications[0]["status"] == pn.STATUS_READ # Dismiss hass.components.persistent_notification.async_dismiss("Beer 2") await client.send_json({"id": 8, "type": "persistent_notification/get"}) msg = await client.receive_json() notifications = msg["result"] assert len(notifications) == 0