Update docs and screenshots
CI / backend (pull_request) Canceled after 0s
CI / shell (pull_request) Canceled after 0s
CI / frontend (pull_request) Canceled after 0s
CI / arm64-smoke (pull_request) Canceled after 0s
CI / backend (push) Canceled after 0s
CI / shell (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / arm64-smoke (push) Canceled after 0s

This commit is contained in:
2026-07-25 10:26:29 +02:00
parent d6cda77aaf
commit 1f110866f5
170 changed files with 24657 additions and 3 deletions
+55
View File
@@ -0,0 +1,55 @@
from __future__ import annotations
import asyncio
from app.effects.service import EffectService
from app.models.schemas import EffectPayload
class FakeEngine:
def __init__(self) -> None:
self.layers: dict[str, object] = {}
def set_layer(self, layer) -> None: # type: ignore[no-untyped-def]
self.layers[layer.name] = layer
def remove_layer(self, name: str) -> None:
self.layers.pop(name, None)
class FakeBpm:
def __init__(self) -> None:
self.current_bpm = 180.0
self.audio_connected = False
self.beat_counter = 0
def test_beat_flash_effect_pulses_layer_from_bpm_clock() -> None:
async def run_test() -> None:
engine = FakeEngine()
bpm = FakeBpm()
service = EffectService(engine, bpm) # type: ignore[arg-type]
payload = EffectPayload(
name="Beat dimmer",
slug="beat-dimmer",
effect_type="beat-flash",
priority=60,
parameters={
"duration_ms": 90,
"channels": {"1": 255},
"precedence": {"1": "htp"},
},
)
service.save(payload)
service.trigger(payload.slug)
await asyncio.sleep(0.03)
assert "effect:beat-dimmer" in engine.layers
await asyncio.sleep(0.16)
assert "effect:beat-dimmer" not in engine.layers
service.stop(payload.slug)
await service.shutdown()
asyncio.run(run_test())