Files
Imrayya 0b4f739d12 feat: initial project scaffold — server, client, Android APK
- 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
2026-07-01 11:19:32 +00:00

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