"""The tests for the pushbullet notification platform.""" import json import unittest from unittest.mock import patch from pushbullet import PushBullet import requests_mock from homeassistant.setup import setup_component import homeassistant.components.notify as notify from tests.common import ( assert_setup_component, get_test_home_assistant, load_fixture) class TestPushBullet(unittest.TestCase): """Tests the Pushbullet Component.""" def setUp(self): """Initialize values for this test case class.""" self.hass = get_test_home_assistant() def tearDown(self): # pylint: disable=invalid-name """Stop everything that we started.""" self.hass.stop() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_config(self, mock__get_data): """Test setup.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] def test_pushbullet_config_bad(self): """Test set up the platform with bad/missing configuration.""" config = { notify.DOMAIN: { 'platform': 'pushbullet', } } with assert_setup_component(0) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert not handle_config[notify.DOMAIN] @requests_mock.Mocker() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_push_default(self, mock, mock__get_data): """Test pushbullet push to default target.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] mock.register_uri( requests_mock.POST, 'https://api.pushbullet.com/v2/pushes', status_code=200, json={'mock_response': 'Ok'} ) data = {'title': 'Test Title', 'message': 'Test Message'} self.hass.services.call(notify.DOMAIN, 'test', data) self.hass.block_till_done() self.assertTrue(mock.called) self.assertEqual(mock.call_count, 1) expected_body = {'body': 'Test Message', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.last_request.json(), expected_body) @requests_mock.Mocker() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_push_device(self, mock, mock__get_data): """Test pushbullet push to default target.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] mock.register_uri( requests_mock.POST, 'https://api.pushbullet.com/v2/pushes', status_code=200, json={'mock_response': 'Ok'} ) data = {'title': 'Test Title', 'message': 'Test Message', 'target': ['device/DESKTOP']} self.hass.services.call(notify.DOMAIN, 'test', data) self.hass.block_till_done() self.assertTrue(mock.called) self.assertEqual(mock.call_count, 1) expected_body = {'body': 'Test Message', 'device_iden': 'identity1', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.last_request.json(), expected_body) @requests_mock.Mocker() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_push_devices(self, mock, mock__get_data): """Test pushbullet push to default target.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] mock.register_uri( requests_mock.POST, 'https://api.pushbullet.com/v2/pushes', status_code=200, json={'mock_response': 'Ok'} ) data = {'title': 'Test Title', 'message': 'Test Message', 'target': ['device/DESKTOP', 'device/My iPhone']} self.hass.services.call(notify.DOMAIN, 'test', data) self.hass.block_till_done() self.assertTrue(mock.called) self.assertEqual(mock.call_count, 2) self.assertEqual(len(mock.request_history), 2) expected_body = {'body': 'Test Message', 'device_iden': 'identity1', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.request_history[0].json(), expected_body) expected_body = {'body': 'Test Message', 'device_iden': 'identity2', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.request_history[1].json(), expected_body) @requests_mock.Mocker() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_push_email(self, mock, mock__get_data): """Test pushbullet push to default target.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] mock.register_uri( requests_mock.POST, 'https://api.pushbullet.com/v2/pushes', status_code=200, json={'mock_response': 'Ok'} ) data = {'title': 'Test Title', 'message': 'Test Message', 'target': ['email/user@host.net']} self.hass.services.call(notify.DOMAIN, 'test', data) self.hass.block_till_done() self.assertTrue(mock.called) self.assertEqual(mock.call_count, 1) self.assertEqual(len(mock.request_history), 1) expected_body = {'body': 'Test Message', 'email': 'user@host.net', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.request_history[0].json(), expected_body) @requests_mock.Mocker() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_push_mixed(self, mock, mock__get_data): """Test pushbullet push to default target.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] mock.register_uri( requests_mock.POST, 'https://api.pushbullet.com/v2/pushes', status_code=200, json={'mock_response': 'Ok'} ) data = {'title': 'Test Title', 'message': 'Test Message', 'target': ['device/DESKTOP', 'email/user@host.net']} self.hass.services.call(notify.DOMAIN, 'test', data) self.hass.block_till_done() self.assertTrue(mock.called) self.assertEqual(mock.call_count, 2) self.assertEqual(len(mock.request_history), 2) expected_body = {'body': 'Test Message', 'device_iden': 'identity1', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.request_history[0].json(), expected_body) expected_body = {'body': 'Test Message', 'email': 'user@host.net', 'title': 'Test Title', 'type': 'note'} self.assertEqual(mock.request_history[1].json(), expected_body) @requests_mock.Mocker() @patch.object(PushBullet, '_get_data', return_value=json.loads(load_fixture( 'pushbullet_devices.json'))) def test_pushbullet_push_no_file(self, mock, mock__get_data): """Test pushbullet push to default target.""" config = {notify.DOMAIN: {'name': 'test', 'platform': 'pushbullet', 'api_key': 'MYFAKEKEY'}} with assert_setup_component(1) as handle_config: assert setup_component(self.hass, notify.DOMAIN, config) assert handle_config[notify.DOMAIN] mock.register_uri( requests_mock.POST, 'https://api.pushbullet.com/v2/pushes', status_code=200, json={'mock_response': 'Ok'} ) data = {'title': 'Test Title', 'message': 'Test Message', 'target': ['device/DESKTOP', 'device/My iPhone'], 'data': {'file': 'not_a_file'}} assert not self.hass.services.call(notify.DOMAIN, 'test', data) self.hass.block_till_done()