Skip to content

Commit

Permalink
Merge pull request #89 from andrewsayre/refresh_players_after_group
Browse files Browse the repository at this point in the history
Refresh players after group event
  • Loading branch information
andrewsayre authored Jan 23, 2025
2 parents 4793483 + a35984d commit 8a652dc
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 5 deletions.
1 change: 0 additions & 1 deletion pyheos/command/player.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ async def get_players(self, *, refresh: bool = False) -> dict[int, HeosPlayer]:
References:
4.2.1 Get Players"""
# get players and pull initial state
if not self._players_loaded or refresh:
await self.load_players()
return self._players
Expand Down
2 changes: 2 additions & 0 deletions pyheos/heos.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@ async def _on_event_heos(self, event: HeosMessage) -> None:
else:
self._signed_in_username = None
elif event.command == const.EVENT_GROUPS_CHANGED and self._groups_loaded:
if self._players_loaded:
await self.get_players(refresh=True)
await self.get_groups(refresh=True)

await self._dispatcher.wait_send(
Expand Down
1 change: 1 addition & 0 deletions tests/fixtures/player.get_players.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"payload": [{
"name": "Back Patio",
"pid": 1,
"gid": 2,
"model": "HEOS Drive",
"version": "1.493.180",
"ip": "127.0.0.1",
Expand Down
27 changes: 27 additions & 0 deletions tests/fixtures/player.get_players_no_groups.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"heos": {
"command": "player/get_players",
"result": "success",
"message": ""
},
"payload": [{
"name": "Back Patio",
"pid": 1,
"model": "HEOS Drive",
"version": "1.493.180",
"ip": "127.0.0.1",
"network": "wired",
"lineout": 2,
"control": 2,
"serial": "B1A2C3K"
}, {
"name": "Front Porch",
"pid": 2,
"model": "HEOS Drive",
"version": "1.493.180",
"ip": "127.0.0.2",
"network": "wifi",
"lineout": 1
}
]
}
43 changes: 39 additions & 4 deletions tests/test_heos.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,7 @@ async def test_get_players(heos: Heos) -> None:
assert len(heos.players) == 2
player = heos.players[1]
assert player.player_id == 1
assert player.group_id == 2
assert player.name == "Back Patio"
assert player.ip_address == "127.0.0.1"
assert player.line_out == LineOutLevelType.FIXED
Expand All @@ -507,8 +508,6 @@ async def test_get_players(heos: Heos) -> None:
assert not player.shuffle
assert player.available
assert player.heos == heos
assert player.group_id is None
assert heos.players[2].group_id == 2


@calls_commands(
Expand Down Expand Up @@ -1004,11 +1003,14 @@ async def handler(event: str, data: dict[str, Any]) -> None:
assert heos.music_sources[MUSIC_SOURCE_TUNEIN].available


@calls_player_commands()
@calls_group_commands()
async def test_groups_changed_event(mock_device: MockHeosDevice, heos: Heos) -> None:
"""Test groups changed fires dispatcher."""
groups = await heos.get_groups()
players = await heos.get_players()
assert len(groups) == 1
assert all(player.group_id is not None for player in players.values())
signal = asyncio.Event()

async def handler(event: str, data: dict[str, Any]) -> None:
Expand All @@ -1018,14 +1020,47 @@ async def handler(event: str, data: dict[str, Any]) -> None:
heos.dispatcher.connect(SignalType.CONTROLLER_EVENT, handler)

# Write event through mock device
command = mock_device.register(
commands = [
mock_device.register(
c.COMMAND_GET_GROUPS, None, "group.get_groups_changed", replace=True
),
mock_device.register(
c.COMMAND_GET_PLAYERS, None, "player.get_players_no_groups", replace=True
),
]
await mock_device.write_event("event.groups_changed")

# Wait until the signal is set
await signal.wait()
map(lambda c: c.assert_called(), commands)
assert not await heos.get_groups()
assert all(player.group_id is None for player in players.values())


@calls_group_commands()
async def test_groups_changed_event_players_not_loaded(
mock_device: MockHeosDevice, heos: Heos
) -> None:
"""Test groups changed fires dispatcher and does not load players."""
groups = await heos.get_groups()
assert len(groups) == 1
signal = asyncio.Event()

async def handler(event: str, data: dict[str, Any]) -> None:
assert event == EVENT_GROUPS_CHANGED
signal.set()

heos.dispatcher.connect(SignalType.CONTROLLER_EVENT, handler)

# Write event through mock device
get_groups_command = mock_device.register(
c.COMMAND_GET_GROUPS, None, "group.get_groups_changed", replace=True
)
await mock_device.write_event("event.groups_changed")

# Wait until the signal is set
await signal.wait()
command.assert_called()
get_groups_command.assert_called()
assert not await heos.get_groups()


Expand Down

0 comments on commit 8a652dc

Please sign in to comment.