- Optional profile_id on groups; UI and API for shared vs profile-only groups\n- Zone content_kind (presets vs sequences); edit modal shows matching sections; devices via groups only\n- Server sequence playback folds zone brightness into preset wire b (per MAC where needed)\n- Related preset/sequence/audio/beat-route and client updates Co-authored-by: Cursor <cursoragent@cursor.com>
84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
from models.sequence import Sequence
|
|
import os
|
|
|
|
_HERE = os.path.dirname(os.path.abspath(__file__))
|
|
_PROJECT_DB = os.path.normpath(os.path.join(_HERE, "..", "..", "db", "sequence.json"))
|
|
|
|
|
|
def test_sequence():
|
|
"""Test Sequence model CRUD operations."""
|
|
if os.path.exists(_PROJECT_DB):
|
|
os.remove(_PROJECT_DB)
|
|
|
|
sequences = Sequence()
|
|
|
|
print("Testing create sequence")
|
|
sequence_id = sequences.create("1")
|
|
print(f"Created sequence with ID: {sequence_id}")
|
|
assert sequence_id is not None
|
|
assert sequence_id in sequences
|
|
|
|
print("\nTesting read sequence")
|
|
sequence = sequences.read(sequence_id)
|
|
print(f"Read: {sequence}")
|
|
assert sequence is not None
|
|
assert sequence["profile_id"] == "1"
|
|
assert sequence["steps"] == []
|
|
assert sequence["lanes"] == [[]]
|
|
assert sequence.get("lanes_group_ids") == [[]]
|
|
assert sequence.get("advance_mode") == "beats"
|
|
assert sequence.get("simulated_bpm") == 120
|
|
assert sequence["step_duration_ms"] == 3000
|
|
assert sequence["loop"] is True
|
|
assert sequence.get("sequence_transition") == 500
|
|
|
|
print("\nTesting update sequence")
|
|
update_data = {
|
|
"name": "updated_seq",
|
|
"steps": [
|
|
{"preset_id": "5", "group_ids": ["1"], "beats": 2},
|
|
{"preset_id": "6", "group_ids": [], "beats": 4},
|
|
],
|
|
"lanes_group_ids": [["1"]],
|
|
"step_duration_ms": 5000,
|
|
"loop": True,
|
|
"advance_mode": "beats",
|
|
"simulated_bpm": 128,
|
|
}
|
|
result = sequences.update(sequence_id, update_data)
|
|
assert result is True
|
|
updated = sequences.read(sequence_id)
|
|
assert updated["name"] == "updated_seq"
|
|
assert len(updated["steps"]) == 2
|
|
assert updated["steps"][0]["preset_id"] == "5"
|
|
assert updated["steps"][0]["group_ids"] == ["1"]
|
|
assert updated["steps"][0].get("beats") == 2
|
|
assert isinstance(updated.get("lanes"), list)
|
|
assert len(updated["lanes"]) == 1
|
|
assert len(updated["lanes"][0]) == 2
|
|
assert updated["lanes"][0][0]["beats"] == 2
|
|
assert updated.get("advance_mode") == "beats"
|
|
assert updated.get("simulated_bpm") == 128
|
|
assert updated["step_duration_ms"] == 5000
|
|
assert updated["loop"] is True
|
|
|
|
print("\nTesting list sequences")
|
|
sequence_list = sequences.list()
|
|
print(f"Sequence list: {sequence_list}")
|
|
assert sequence_id in sequence_list
|
|
|
|
print("\nTesting delete sequence")
|
|
deleted = sequences.delete(sequence_id)
|
|
assert deleted is True
|
|
assert sequence_id not in sequences
|
|
|
|
print("\nTesting read after delete")
|
|
sequence = sequences.read(sequence_id)
|
|
assert sequence is None
|
|
|
|
print("\nAll sequence tests passed!")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_sequence()
|