Tests: Add a 'mass' fixture (#1398)
authorJc2k <john.carr@unrouted.co.uk>
Fri, 21 Jun 2024 17:54:31 +0000 (18:54 +0100)
committerGitHub <noreply@github.com>
Fri, 21 Jun 2024 17:54:31 +0000 (19:54 +0200)
music_assistant/server/server.py
tests/conftest.py [new file with mode: 0644]
tests/server/__init__.py [new file with mode: 0644]
tests/server/test_server.py [new file with mode: 0644]

index 25aa27b3e60c0ca557c18f1b9b43dc52d4cc3ec9..4a0ec37d4c61cbff074a166d38165b84e44705e5 100644 (file)
@@ -284,8 +284,8 @@ class MusicAssistant:
     def subscribe(
         self,
         cb_func: EventCallBackType,
-        event_filter: EventType | tuple[EventType] | None = None,
-        id_filter: str | tuple[str] | None = None,
+        event_filter: EventType | tuple[EventType, ...] | None = None,
+        id_filter: str | tuple[str, ...] | None = None,
     ) -> Callable:
         """Add callback to event listeners.
 
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644 (file)
index 0000000..6ebde31
--- /dev/null
@@ -0,0 +1,30 @@
+"""Fixtures for testing Music Assistant."""
+
+import logging
+import pathlib
+from collections.abc import AsyncGenerator
+
+import pytest
+
+from music_assistant.server.server import MusicAssistant
+
+
+@pytest.fixture(name="caplog")
+def caplog_fixture(caplog: pytest.LogCaptureFixture) -> pytest.LogCaptureFixture:
+    """Set log level to debug for tests using the caplog fixture."""
+    caplog.set_level(logging.DEBUG)
+    return caplog
+
+
+@pytest.fixture
+async def mass(tmp_path: pathlib.Path) -> AsyncGenerator[MusicAssistant, None]:
+    """Start a Music Assistant in test mode."""
+    storage_path = tmp_path / "root"
+    storage_path.mkdir(parents=True)
+
+    mass = MusicAssistant(storage_path)
+    await mass.start()
+    try:
+        yield mass
+    finally:
+        await mass.stop()
diff --git a/tests/server/__init__.py b/tests/server/__init__.py
new file mode 100644 (file)
index 0000000..326fb7b
--- /dev/null
@@ -0,0 +1 @@
+"""Tests for the Music Assistant server."""
diff --git a/tests/server/test_server.py b/tests/server/test_server.py
new file mode 100644 (file)
index 0000000..ee1b58b
--- /dev/null
@@ -0,0 +1,50 @@
+"""Tests for the core Music Assistant server object."""
+
+import asyncio
+
+from music_assistant.common.models.enums import EventType
+from music_assistant.common.models.event import MassEvent
+from music_assistant.server.server import MusicAssistant
+
+
+async def test_start_and_stop_server(mass: MusicAssistant) -> None:
+    """Test that music assistant starts and stops cleanly."""
+    domains = frozenset(p.domain for p in mass.get_provider_manifests())
+    core_providers = frozenset(
+        ("builtin", "cache", "metadata", "music", "player_queues", "players", "streams")
+    )
+    assert domains.issuperset(core_providers)
+
+
+async def test_events(mass: MusicAssistant) -> None:
+    """Test that events sent by signal_event can be seen by subscribe."""
+    filters: list[tuple[EventType | tuple[EventType, ...] | None, str | tuple[str, ...] | None]] = [
+        (None, None),
+        (EventType.UNKNOWN, None),
+        ((EventType.UNKNOWN, EventType.AUTH_SESSION), None),
+        (None, "myid1"),
+        (None, ("myid1", "myid2")),
+        (EventType.UNKNOWN, "myid1"),
+    ]
+
+    for event_filter, id_filter in filters:
+        flag = False
+
+        def _ev(event: MassEvent) -> None:
+            assert event.event == EventType.UNKNOWN
+            assert event.data == "mytestdata"
+            assert event.object_id == "myid1"
+            nonlocal flag
+            flag = True
+
+        remove_cb = mass.subscribe(_ev, event_filter, id_filter)
+
+        mass.signal_event(EventType.UNKNOWN, "myid1", "mytestdata")
+        await asyncio.sleep(0)
+        assert flag is True
+
+        flag = False
+        remove_cb()
+        mass.signal_event(EventType.UNKNOWN)
+        await asyncio.sleep(0)
+        assert flag is False