Refactor Cast (#26550)

* Refactor Cast

* Fix tests & address comments

* Update reqs
This commit is contained in:
Paulus Schoutsen 2019-09-10 13:05:46 -07:00 committed by GitHub
parent a7830bc2d2
commit 7468cc21be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 526 additions and 471 deletions

View file

@ -22,12 +22,16 @@ from tests.common import MockConfigEntry, mock_coro
@pytest.fixture(autouse=True)
def cast_mock():
"""Mock pychromecast."""
with patch.dict(
"sys.modules",
{
"pychromecast": MagicMock(),
"pychromecast.controllers.multizone": MagicMock(),
},
pycast_mock = MagicMock()
with patch(
"homeassistant.components.cast.media_player.pychromecast", pycast_mock
), patch(
"homeassistant.components.cast.discovery.pychromecast", pycast_mock
), patch(
"homeassistant.components.cast.helpers.dial", MagicMock()
), patch(
"homeassistant.components.cast.media_player.MultizoneManager", MagicMock()
):
yield
@ -73,7 +77,8 @@ async def async_setup_cast_internal_discovery(hass, config=None, discovery_info=
browser = MagicMock(zc={})
with patch(
"pychromecast.start_discovery", return_value=(listener, browser)
"homeassistant.components.cast.discovery.pychromecast.start_discovery",
return_value=(listener, browser),
) as start_discovery:
add_entities = await async_setup_cast(hass, config, discovery_info)
await hass.async_block_till_done()
@ -104,7 +109,8 @@ async def async_setup_media_player_cast(hass: HomeAssistantType, info: Chromecas
cast.CastStatusListener = MagicMock()
with patch(
"pychromecast._get_chromecast_from_host", return_value=chromecast
"homeassistant.components.cast.discovery.pychromecast._get_chromecast_from_host",
return_value=chromecast,
) as get_chromecast:
await async_setup_component(
hass,
@ -122,7 +128,8 @@ async def async_setup_media_player_cast(hass: HomeAssistantType, info: Chromecas
def test_start_discovery_called_once(hass):
"""Test pychromecast.start_discovery called exactly once."""
with patch(
"pychromecast.start_discovery", return_value=(None, None)
"homeassistant.components.cast.discovery.pychromecast.start_discovery",
return_value=(None, None),
) as start_discovery:
yield from async_setup_cast(hass)
@ -138,14 +145,17 @@ def test_stop_discovery_called_on_stop(hass):
browser = MagicMock(zc={})
with patch(
"pychromecast.start_discovery", return_value=(None, browser)
"homeassistant.components.cast.discovery.pychromecast.start_discovery",
return_value=(None, browser),
) as start_discovery:
# start_discovery should be called with empty config
yield from async_setup_cast(hass, {})
assert start_discovery.call_count == 1
with patch("pychromecast.stop_discovery") as stop_discovery:
with patch(
"homeassistant.components.cast.discovery.pychromecast.stop_discovery"
) as stop_discovery:
# stop discovery should be called on shutdown
hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP)
yield from hass.async_block_till_done()
@ -153,7 +163,8 @@ def test_stop_discovery_called_on_stop(hass):
stop_discovery.assert_called_once_with(browser)
with patch(
"pychromecast.start_discovery", return_value=(None, browser)
"homeassistant.components.cast.discovery.pychromecast.start_discovery",
return_value=(None, browser),
) as start_discovery:
# start_discovery should be called again on re-startup
yield from async_setup_cast(hass)
@ -173,7 +184,10 @@ async def test_internal_discovery_callback_fill_out(hass):
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch("pychromecast.dial.get_device_status", return_value=full_info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=full_info,
):
signal = MagicMock()
async_dispatcher_connect(hass, "cast_discovered", signal)
@ -210,7 +224,7 @@ async def test_normal_chromecast_not_starting_discovery(hass):
"""Test cast platform not starting discovery when not required."""
# pylint: disable=no-member
with patch(
"homeassistant.components.cast.media_player." "_setup_internal_discovery"
"homeassistant.components.cast.media_player.setup_internal_discovery"
) as setup_discovery:
# normal (non-group) chromecast shouldn't start discovery.
add_entities = await async_setup_cast(hass, {"host": "host1"})
@ -275,7 +289,10 @@ async def test_entity_media_states(hass: HomeAssistantType):
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch("pychromecast.dial.get_device_status", return_value=full_info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=full_info,
):
chromecast, entity = await async_setup_media_player_cast(hass, info)
entity._available = True
@ -330,7 +347,10 @@ async def test_group_media_states(hass: HomeAssistantType):
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch("pychromecast.dial.get_device_status", return_value=full_info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=full_info,
):
chromecast, entity = await async_setup_media_player_cast(hass, info)
entity._available = True
@ -377,7 +397,10 @@ async def test_dynamic_group_media_states(hass: HomeAssistantType):
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch("pychromecast.dial.get_device_status", return_value=full_info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=full_info,
):
chromecast, entity = await async_setup_media_player_cast(hass, info)
entity._available = True
@ -426,12 +449,14 @@ async def test_group_media_control(hass: HomeAssistantType):
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch("pychromecast.dial.get_device_status", return_value=full_info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=full_info,
):
chromecast, entity = await async_setup_media_player_cast(hass, info)
entity._available = True
entity.schedule_update_ha_state()
await hass.async_block_till_done()
entity.async_write_ha_state()
state = hass.states.get("media_player.speaker")
assert state is not None
@ -480,7 +505,10 @@ async def test_dynamic_group_media_control(hass: HomeAssistantType):
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch("pychromecast.dial.get_device_status", return_value=full_info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=full_info,
):
chromecast, entity = await async_setup_media_player_cast(hass, info)
entity._available = True
@ -529,7 +557,10 @@ async def test_disconnect_on_stop(hass: HomeAssistantType):
"""Test cast device disconnects socket on stop."""
info = get_fake_chromecast_info()
with patch("pychromecast.dial.get_device_status", return_value=info):
with patch(
"homeassistant.components.cast.helpers.dial.get_device_status",
return_value=info,
):
chromecast, _ = await async_setup_media_player_cast(hass, info)
hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP)