"""Tests for the audio mixer data models and backend interface.""" from __future__ import annotations import pytest from ..audio_mixer import ( AudioChannel, AudioMixerManager, AudioMixerState, ) class TestDataModels: def test_audio_channel_defaults(self) -> None: ch = AudioChannel(name="Master") assert ch.name == "Master" assert ch.volume == 0.0 assert ch.muted == False assert ch.peak_left == 0.0 def test_audio_mixer_state_defaults(self) -> None: state = AudioMixerState(backend="windows") assert state.backend == "windows" assert state.master_volume == 0.0 assert state.master_muted == False assert state.channels == [] def test_audio_mixer_state_with_channels(self) -> None: channels = [ AudioChannel(name="A1", volume=0.8, muted=False), AudioChannel(name="B1", volume=0.5, muted=True), ] state = AudioMixerState( backend="voicemeeter", master_volume=0.65, master_muted=False, channels=channels, ) assert len(state.channels) == 2 assert state.channels[0].name == "A1" assert state.channels[1].muted == True class TestAudioMixerManager: def test_init_with_no_backends(self) -> None: """Manager should initialize even with no backends available.""" manager = AudioMixerManager() # Should not raise state = manager.get_state() assert isinstance(state, dict) assert "backend" in state assert "master_volume" in state assert "channels" in state def test_get_state_returns_dict(self) -> None: manager = AudioMixerManager() state = manager.get_state() assert isinstance(state, dict) assert state["backend"] in ("windows", "voicemeeter") assert isinstance(state["channels"], list) @pytest.mark.asyncio async def test_set_volume_no_backends(self) -> None: """set_volume should not raise when no backends are available.""" manager = AudioMixerManager() await manager.set_volume("master", 0.5) # Should not raise @pytest.mark.asyncio async def test_set_mute_no_backends(self) -> None: """set_mute should not raise when no backends are available.""" manager = AudioMixerManager() await manager.set_mute("master", True) # Should not raise