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())