feat(media): MprisController fängt Player- und Bus-Fehler sauber ab
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -97,3 +97,79 @@ async def test_resume_with_empty_paused_list_is_noop(monkeypatch):
|
||||
await controller.resume()
|
||||
|
||||
get_player.assert_not_awaited()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_pause_logs_and_continues_when_single_player_fails(monkeypatch, caplog):
|
||||
from whisper_local.media._mpris import MprisController
|
||||
|
||||
good = _make_player("Playing")
|
||||
|
||||
async def fake_get_player(name: str):
|
||||
if name.endswith("broken"):
|
||||
raise RuntimeError("player disappeared")
|
||||
return good
|
||||
|
||||
controller = MprisController()
|
||||
monkeypatch.setattr(
|
||||
controller,
|
||||
"_list_player_names",
|
||||
AsyncMock(return_value=[
|
||||
"org.mpris.MediaPlayer2.broken",
|
||||
"org.mpris.MediaPlayer2.good",
|
||||
]),
|
||||
)
|
||||
monkeypatch.setattr(controller, "_get_player_interface", fake_get_player)
|
||||
|
||||
with caplog.at_level("WARNING"):
|
||||
await controller.pause()
|
||||
|
||||
good.call_pause.assert_awaited_once()
|
||||
assert controller._paused == ["org.mpris.MediaPlayer2.good"]
|
||||
assert any("broken" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_resume_logs_and_continues_when_single_player_fails(monkeypatch, caplog):
|
||||
from whisper_local.media._mpris import MprisController
|
||||
|
||||
good = _make_player("Paused")
|
||||
|
||||
async def fake_get_player(name: str):
|
||||
if name.endswith("broken"):
|
||||
raise RuntimeError("player disappeared")
|
||||
return good
|
||||
|
||||
controller = MprisController()
|
||||
controller._paused = [
|
||||
"org.mpris.MediaPlayer2.broken",
|
||||
"org.mpris.MediaPlayer2.good",
|
||||
]
|
||||
monkeypatch.setattr(controller, "_get_player_interface", fake_get_player)
|
||||
|
||||
with caplog.at_level("WARNING"):
|
||||
await controller.resume()
|
||||
|
||||
good.call_play.assert_awaited_once()
|
||||
assert controller._paused == []
|
||||
assert any("broken" in r.message for r in caplog.records)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_pause_is_noop_when_bus_unreachable(monkeypatch, caplog):
|
||||
from whisper_local.media._mpris import MprisController
|
||||
|
||||
async def failing_connect(self):
|
||||
raise RuntimeError("no session bus")
|
||||
|
||||
monkeypatch.setattr(
|
||||
"dbus_next.aio.MessageBus.connect", failing_connect, raising=False
|
||||
)
|
||||
controller = MprisController()
|
||||
|
||||
with caplog.at_level("WARNING"):
|
||||
await controller.pause()
|
||||
|
||||
assert controller._paused == []
|
||||
assert any("D-Bus" in r.message or "bus" in r.message.lower()
|
||||
for r in caplog.records)
|
||||
|
||||
Reference in New Issue
Block a user