Convert last media player tests to async (#64572)

This commit is contained in:
Paulus Schoutsen 2022-01-20 13:05:33 -08:00 committed by GitHub
parent a420e9443c
commit 7f2f135e13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 1056 additions and 1029 deletions

View File

@ -1,6 +1,5 @@
"""The tests for the Monoprice Blackbird media player platform.""" """The tests for the Monoprice Blackbird media player platform."""
from collections import defaultdict from collections import defaultdict
import unittest
from unittest import mock from unittest import mock
import pytest import pytest
@ -19,8 +18,6 @@ from homeassistant.components.media_player.const import (
) )
from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.const import STATE_OFF, STATE_ON
import tests.common
class AttrDict(dict): class AttrDict(dict):
"""Helper class for mocking attributes.""" """Helper class for mocking attributes."""
@ -60,283 +57,301 @@ class MockBlackbird:
self.zones[3].av = source_idx self.zones[3].av = source_idx
class TestBlackbirdSchema(unittest.TestCase): def test_valid_serial_schema():
"""Test Blackbird schema.""" """Test valid schema."""
valid_schema = {
"platform": "blackbird",
"port": "/dev/ttyUSB0",
"zones": {
1: {"name": "a"},
2: {"name": "a"},
3: {"name": "a"},
4: {"name": "a"},
5: {"name": "a"},
6: {"name": "a"},
7: {"name": "a"},
8: {"name": "a"},
},
"sources": {
1: {"name": "a"},
2: {"name": "a"},
3: {"name": "a"},
4: {"name": "a"},
5: {"name": "a"},
6: {"name": "a"},
7: {"name": "a"},
8: {"name": "a"},
},
}
PLATFORM_SCHEMA(valid_schema)
def test_valid_serial_schema(self):
"""Test valid schema.""" def test_valid_socket_schema():
valid_schema = { """Test valid schema."""
valid_schema = {
"platform": "blackbird",
"host": "192.168.1.50",
"zones": {
1: {"name": "a"},
2: {"name": "a"},
3: {"name": "a"},
4: {"name": "a"},
5: {"name": "a"},
},
"sources": {
1: {"name": "a"},
2: {"name": "a"},
3: {"name": "a"},
4: {"name": "a"},
},
}
PLATFORM_SCHEMA(valid_schema)
def test_invalid_schemas():
"""Test invalid schemas."""
schemas = (
{}, # Empty
None, # None
# Port and host used concurrently
{
"platform": "blackbird", "platform": "blackbird",
"port": "/dev/ttyUSB0", "port": "/dev/ttyUSB0",
"zones": {
1: {"name": "a"},
2: {"name": "a"},
3: {"name": "a"},
4: {"name": "a"},
5: {"name": "a"},
6: {"name": "a"},
7: {"name": "a"},
8: {"name": "a"},
},
"sources": {
1: {"name": "a"},
2: {"name": "a"},
3: {"name": "a"},
4: {"name": "a"},
5: {"name": "a"},
6: {"name": "a"},
7: {"name": "a"},
8: {"name": "a"},
},
}
PLATFORM_SCHEMA(valid_schema)
def test_valid_socket_schema(self):
"""Test valid schema."""
valid_schema = {
"platform": "blackbird",
"host": "192.168.1.50", "host": "192.168.1.50",
"zones": { "name": "Name",
1: {"name": "a"}, "zones": {1: {"name": "a"}},
2: {"name": "a"}, "sources": {1: {"name": "b"}},
3: {"name": "a"}, },
4: {"name": "a"}, # Port or host missing
5: {"name": "a"}, {
}, "platform": "blackbird",
"sources": { "name": "Name",
1: {"name": "a"}, "zones": {1: {"name": "a"}},
2: {"name": "a"}, "sources": {1: {"name": "b"}},
3: {"name": "a"}, },
4: {"name": "a"}, # Invalid zone number
}, {
} "platform": "blackbird",
PLATFORM_SCHEMA(valid_schema) "port": "/dev/ttyUSB0",
"name": "Name",
def test_invalid_schemas(self): "zones": {11: {"name": "a"}},
"""Test invalid schemas.""" "sources": {1: {"name": "b"}},
schemas = ( },
{}, # Empty # Invalid source number
None, # None {
# Port and host used concurrently "platform": "blackbird",
{ "port": "/dev/ttyUSB0",
"platform": "blackbird", "name": "Name",
"port": "/dev/ttyUSB0", "zones": {1: {"name": "a"}},
"host": "192.168.1.50", "sources": {9: {"name": "b"}},
"name": "Name", },
"zones": {1: {"name": "a"}}, # Zone missing name
"sources": {1: {"name": "b"}}, {
}, "platform": "blackbird",
# Port or host missing "port": "/dev/ttyUSB0",
{ "name": "Name",
"platform": "blackbird", "zones": {1: {}},
"name": "Name", "sources": {1: {"name": "b"}},
"zones": {1: {"name": "a"}}, },
"sources": {1: {"name": "b"}}, # Source missing name
}, {
# Invalid zone number "platform": "blackbird",
{ "port": "/dev/ttyUSB0",
"platform": "blackbird", "name": "Name",
"port": "/dev/ttyUSB0", "zones": {1: {"name": "a"}},
"name": "Name", "sources": {1: {}},
"zones": {11: {"name": "a"}}, },
"sources": {1: {"name": "b"}}, )
}, for value in schemas:
# Invalid source number with pytest.raises(vol.MultipleInvalid):
{ PLATFORM_SCHEMA(value)
"platform": "blackbird",
"port": "/dev/ttyUSB0",
"name": "Name",
"zones": {1: {"name": "a"}},
"sources": {9: {"name": "b"}},
},
# Zone missing name
{
"platform": "blackbird",
"port": "/dev/ttyUSB0",
"name": "Name",
"zones": {1: {}},
"sources": {1: {"name": "b"}},
},
# Source missing name
{
"platform": "blackbird",
"port": "/dev/ttyUSB0",
"name": "Name",
"zones": {1: {"name": "a"}},
"sources": {1: {}},
},
)
for value in schemas:
with pytest.raises(vol.MultipleInvalid):
PLATFORM_SCHEMA(value)
class TestBlackbirdMediaPlayer(unittest.TestCase): @pytest.fixture
"""Test the media_player module.""" def mock_blackbird():
"""Return a mock blackbird instance."""
return MockBlackbird()
def setUp(self):
"""Set up the test case.""" @pytest.fixture
self.blackbird = MockBlackbird() async def setup_blackbird(hass, mock_blackbird):
self.hass = tests.common.get_test_home_assistant() """Set up blackbird."""
self.hass.start() with mock.patch(
# Note, source dictionary is unsorted! "homeassistant.components.blackbird.media_player.get_blackbird",
with mock.patch( new=lambda *a: mock_blackbird,
"homeassistant.components.blackbird.media_player.get_blackbird", ):
new=lambda *a: self.blackbird, await hass.async_add_executor_job(
): setup_platform,
setup_platform( hass,
self.hass, {
{ "platform": "blackbird",
"platform": "blackbird", "port": "/dev/ttyUSB0",
"port": "/dev/ttyUSB0", "zones": {3: {"name": "Zone name"}},
"zones": {3: {"name": "Zone name"}}, "sources": {
"sources": { 1: {"name": "one"},
1: {"name": "one"}, 3: {"name": "three"},
3: {"name": "three"}, 2: {"name": "two"},
2: {"name": "two"},
},
}, },
lambda *args, **kwargs: None, },
{}, lambda *args, **kwargs: None,
) {},
self.hass.block_till_done()
self.media_player = self.hass.data[DATA_BLACKBIRD]["/dev/ttyUSB0-3"]
self.media_player.hass = self.hass
self.media_player.entity_id = "media_player.zone_3"
self.addCleanup(self.tear_down_cleanup)
def tear_down_cleanup(self):
"""Tear down the test case."""
self.hass.stop()
def test_setup_platform(self, *args):
"""Test setting up platform."""
# One service must be registered
assert self.hass.services.has_service(DOMAIN, SERVICE_SETALLZONES)
assert len(self.hass.data[DATA_BLACKBIRD]) == 1
assert self.hass.data[DATA_BLACKBIRD]["/dev/ttyUSB0-3"].name == "Zone name"
def test_setallzones_service_call_with_entity_id(self):
"""Test set all zone source service call with entity id."""
self.media_player.update()
assert self.media_player.name == "Zone name"
assert self.media_player.state == STATE_ON
assert self.media_player.source == "one"
# Call set all zones service
self.hass.services.call(
DOMAIN,
SERVICE_SETALLZONES,
{"entity_id": "media_player.zone_3", "source": "three"},
blocking=True,
) )
await hass.async_block_till_done()
# Check that source was changed
assert self.blackbird.zones[3].av == 3
self.media_player.update()
assert self.media_player.source == "three"
def test_setallzones_service_call_without_entity_id(self): @pytest.fixture
"""Test set all zone source service call without entity id.""" def media_player_entity(hass, setup_blackbird):
self.media_player.update() """Return the media player entity."""
assert self.media_player.name == "Zone name" media_player = hass.data[DATA_BLACKBIRD]["/dev/ttyUSB0-3"]
assert self.media_player.state == STATE_ON media_player.hass = hass
assert self.media_player.source == "one" media_player.entity_id = "media_player.zone_3"
return media_player
# Call set all zones service
self.hass.services.call(
DOMAIN, SERVICE_SETALLZONES, {"source": "three"}, blocking=True
)
# Check that source was changed async def test_setup_platform(hass, setup_blackbird):
assert self.blackbird.zones[3].av == 3 """Test setting up platform."""
self.media_player.update() # One service must be registered
assert self.media_player.source == "three" assert hass.services.has_service(DOMAIN, SERVICE_SETALLZONES)
assert len(hass.data[DATA_BLACKBIRD]) == 1
assert hass.data[DATA_BLACKBIRD]["/dev/ttyUSB0-3"].name == "Zone name"
def test_update(self):
"""Test updating values from blackbird."""
assert self.media_player.state is None
assert self.media_player.source is None
self.media_player.update() async def test_setallzones_service_call_with_entity_id(
hass, media_player_entity, mock_blackbird
):
"""Test set all zone source service call with entity id."""
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.name == "Zone name"
assert media_player_entity.state == STATE_ON
assert media_player_entity.source == "one"
assert self.media_player.state == STATE_ON # Call set all zones service
assert self.media_player.source == "one" await hass.services.async_call(
DOMAIN,
SERVICE_SETALLZONES,
{"entity_id": "media_player.zone_3", "source": "three"},
blocking=True,
)
def test_name(self): # Check that source was changed
"""Test name property.""" assert mock_blackbird.zones[3].av == 3
assert self.media_player.name == "Zone name" await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.source == "three"
def test_state(self):
"""Test state property."""
assert self.media_player.state is None
self.media_player.update() async def test_setallzones_service_call_without_entity_id(
assert self.media_player.state == STATE_ON mock_blackbird, hass, media_player_entity
):
"""Test set all zone source service call without entity id."""
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.name == "Zone name"
assert media_player_entity.state == STATE_ON
assert media_player_entity.source == "one"
self.blackbird.zones[3].power = False # Call set all zones service
self.media_player.update() await hass.services.async_call(
assert self.media_player.state == STATE_OFF DOMAIN, SERVICE_SETALLZONES, {"source": "three"}, blocking=True
)
def test_supported_features(self): # Check that source was changed
"""Test supported features property.""" assert mock_blackbird.zones[3].av == 3
assert ( await hass.async_add_executor_job(media_player_entity.update)
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_SELECT_SOURCE assert media_player_entity.source == "three"
== self.media_player.supported_features
)
def test_source(self):
"""Test source property."""
assert self.media_player.source is None
self.media_player.update()
assert self.media_player.source == "one"
def test_media_title(self): async def test_update(hass, media_player_entity):
"""Test media title property.""" """Test updating values from blackbird."""
assert self.media_player.media_title is None assert media_player_entity.state is None
self.media_player.update() assert media_player_entity.source is None
assert self.media_player.media_title == "one"
def test_source_list(self): await hass.async_add_executor_job(media_player_entity.update)
"""Test source list property."""
# Note, the list is sorted!
assert self.media_player.source_list == ["one", "two", "three"]
def test_select_source(self): assert media_player_entity.state == STATE_ON
"""Test source selection methods.""" assert media_player_entity.source == "one"
self.media_player.update()
assert self.media_player.source == "one"
self.media_player.select_source("two") async def test_name(media_player_entity):
assert self.blackbird.zones[3].av == 2 """Test name property."""
self.media_player.update() assert media_player_entity.name == "Zone name"
assert self.media_player.source == "two"
# Trying to set unknown source.
self.media_player.select_source("no name")
assert self.blackbird.zones[3].av == 2
self.media_player.update()
assert self.media_player.source == "two"
def test_turn_on(self): async def test_state(hass, media_player_entity, mock_blackbird):
"""Testing turning on the zone.""" """Test state property."""
self.blackbird.zones[3].power = False assert media_player_entity.state is None
self.media_player.update()
assert self.media_player.state == STATE_OFF
self.media_player.turn_on() await hass.async_add_executor_job(media_player_entity.update)
assert self.blackbird.zones[3].power assert media_player_entity.state == STATE_ON
self.media_player.update()
assert self.media_player.state == STATE_ON
def test_turn_off(self): mock_blackbird.zones[3].power = False
"""Testing turning off the zone.""" await hass.async_add_executor_job(media_player_entity.update)
self.blackbird.zones[3].power = True assert media_player_entity.state == STATE_OFF
self.media_player.update()
assert self.media_player.state == STATE_ON
self.media_player.turn_off()
assert not self.blackbird.zones[3].power async def test_supported_features(media_player_entity):
self.media_player.update() """Test supported features property."""
assert self.media_player.state == STATE_OFF assert (
SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_SELECT_SOURCE
== media_player_entity.supported_features
)
async def test_source(hass, media_player_entity):
"""Test source property."""
assert media_player_entity.source is None
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.source == "one"
async def test_media_title(hass, media_player_entity):
"""Test media title property."""
assert media_player_entity.media_title is None
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.media_title == "one"
async def test_source_list(media_player_entity):
"""Test source list property."""
# Note, the list is sorted!
assert media_player_entity.source_list == ["one", "two", "three"]
async def test_select_source(hass, media_player_entity, mock_blackbird):
"""Test source selection methods."""
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.source == "one"
await media_player_entity.async_select_source("two")
assert mock_blackbird.zones[3].av == 2
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.source == "two"
# Trying to set unknown source.
await media_player_entity.async_select_source("no name")
assert mock_blackbird.zones[3].av == 2
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.source == "two"
async def test_turn_on(hass, media_player_entity, mock_blackbird):
"""Testing turning on the zone."""
mock_blackbird.zones[3].power = False
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.state == STATE_OFF
await media_player_entity.async_turn_on()
assert mock_blackbird.zones[3].power
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.state == STATE_ON
async def test_turn_off(hass, media_player_entity, mock_blackbird):
"""Testing turning off the zone."""
mock_blackbird.zones[3].power = True
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.state == STATE_ON
await media_player_entity.async_turn_off()
assert not mock_blackbird.zones[3].power
await hass.async_add_executor_job(media_player_entity.update)
assert media_player_entity.state == STATE_OFF

File diff suppressed because it is too large Load Diff