121 lines
4.2 KiB
Python
121 lines
4.2 KiB
Python
|
"""The tests for the discovery component."""
|
||
|
import unittest
|
||
|
|
||
|
from unittest import mock
|
||
|
from unittest.mock import patch
|
||
|
|
||
|
from homeassistant.bootstrap import setup_component
|
||
|
from homeassistant.components import discovery
|
||
|
from homeassistant.const import EVENT_HOMEASSISTANT_START
|
||
|
|
||
|
from tests.common import get_test_home_assistant
|
||
|
|
||
|
# One might consider to "mock" services, but it's easy enough to just use
|
||
|
# what is already available.
|
||
|
SERVICE = 'yamaha'
|
||
|
SERVICE_COMPONENT = 'media_player'
|
||
|
|
||
|
SERVICE_NO_PLATFORM = 'hass_ios'
|
||
|
SERVICE_NO_PLATFORM_COMPONENT = 'ios'
|
||
|
SERVICE_INFO = {'key': 'value'} # Can be anything
|
||
|
|
||
|
UNKNOWN_SERVICE = 'this_service_will_never_be_supported'
|
||
|
|
||
|
BASE_CONFIG = {
|
||
|
discovery.DOMAIN: {
|
||
|
'ignore': []
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IGNORE_CONFIG = {
|
||
|
discovery.DOMAIN: {
|
||
|
'ignore': [SERVICE_NO_PLATFORM]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
@patch('netdisco.service.DiscoveryService')
|
||
|
@patch('homeassistant.components.discovery.load_platform')
|
||
|
@patch('homeassistant.components.discovery.discover')
|
||
|
class DiscoveryTest(unittest.TestCase):
|
||
|
"""Test the discovery component."""
|
||
|
|
||
|
def setUp(self):
|
||
|
"""Setup things to be run when tests are started."""
|
||
|
self.hass = get_test_home_assistant()
|
||
|
self.netdisco = mock.Mock()
|
||
|
|
||
|
def tearDown(self):
|
||
|
"""Stop everything that was started."""
|
||
|
self.hass.stop()
|
||
|
|
||
|
def setup_discovery_component(self, discovery_service, config):
|
||
|
"""Setup the discovery component with mocked netdisco."""
|
||
|
discovery_service.return_value = self.netdisco
|
||
|
|
||
|
setup_component(self.hass, discovery.DOMAIN, config)
|
||
|
|
||
|
self.hass.bus.fire(EVENT_HOMEASSISTANT_START)
|
||
|
self.hass.block_till_done()
|
||
|
|
||
|
def discover_service(self, discovery_service, name):
|
||
|
"""Simulate that netdisco discovered a new service."""
|
||
|
self.assertTrue(self.netdisco.add_listener.called)
|
||
|
|
||
|
# Extract a refernce to the service listener
|
||
|
args, _ = self.netdisco.add_listener.call_args
|
||
|
listener = args[0]
|
||
|
|
||
|
# Call the listener (just like netdisco does)
|
||
|
listener(name, SERVICE_INFO)
|
||
|
|
||
|
def test_netdisco_is_started(
|
||
|
self, discover, load_platform, discovery_service):
|
||
|
"""Test that netdisco is started."""
|
||
|
self.setup_discovery_component(discovery_service, BASE_CONFIG)
|
||
|
self.assertTrue(self.netdisco.start.called)
|
||
|
|
||
|
def test_unknown_service(
|
||
|
self, discover, load_platform, discovery_service):
|
||
|
"""Test that unknown service is ignored."""
|
||
|
self.setup_discovery_component(discovery_service, BASE_CONFIG)
|
||
|
self.discover_service(discovery_service, UNKNOWN_SERVICE)
|
||
|
|
||
|
self.assertFalse(load_platform.called)
|
||
|
self.assertFalse(discover.called)
|
||
|
|
||
|
def test_load_platform(
|
||
|
self, discover, load_platform, discovery_service):
|
||
|
"""Test load a supported platform."""
|
||
|
self.setup_discovery_component(discovery_service, BASE_CONFIG)
|
||
|
self.discover_service(discovery_service, SERVICE)
|
||
|
|
||
|
load_platform.assert_called_with(self.hass,
|
||
|
SERVICE_COMPONENT,
|
||
|
SERVICE,
|
||
|
SERVICE_INFO,
|
||
|
BASE_CONFIG)
|
||
|
|
||
|
def test_discover_platform(
|
||
|
self, discover, load_platform, discovery_service):
|
||
|
"""Test discover a supported platform."""
|
||
|
self.setup_discovery_component(discovery_service, BASE_CONFIG)
|
||
|
self.discover_service(discovery_service, SERVICE_NO_PLATFORM)
|
||
|
|
||
|
discover.assert_called_with(self.hass,
|
||
|
SERVICE_NO_PLATFORM,
|
||
|
SERVICE_INFO,
|
||
|
SERVICE_NO_PLATFORM_COMPONENT,
|
||
|
BASE_CONFIG)
|
||
|
|
||
|
def test_ignore_platforms(
|
||
|
self, discover, load_platform, discovery_service):
|
||
|
"""Test that ignored platforms are not setup."""
|
||
|
self.setup_discovery_component(discovery_service, IGNORE_CONFIG)
|
||
|
|
||
|
self.discover_service(discovery_service, SERVICE_NO_PLATFORM)
|
||
|
self.assertFalse(discover.called)
|
||
|
|
||
|
self.discover_service(discovery_service, SERVICE)
|
||
|
self.assertTrue(load_platform.called)
|