0b4f739d12
- FastAPI server with audio mixer (Windows + Voicemeeter), media tracking, notifications (progress + alerts), telemetry, and system tray .exe build - Test suite covering notifications, audio mixer, media, telemetry, and API - E-Ink web client (vanilla JS, DOM API, block meters, swipe gestures) - Android WebView APK for BOOX Go 7 Color Gen II (Android 13, Kotlin) - Design decision records in .pi/docs/design/ - PyInstaller build script for server .exe
74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
"""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
|