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
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user