Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ classifiers = [
]
dynamic = ["version"]
dependencies = [
"mopidy >= 4.0.0a7",
"mopidy >= 4.0.0a8",
"pykka >= 4.1",
"uritools >= 4.0.3",
]
Expand Down
5 changes: 3 additions & 2 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import functools
import pathlib
import warnings

from mopidy.internal import deprecation
from mopidy.types import Uri


Expand All @@ -17,7 +17,8 @@ def generate_song(i) -> Uri:
def populate_tracklist(func):
@functools.wraps(func)
def wrapper(self):
with deprecation.ignore("core.tracklist.add:tracks_arg"):
with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning)
self.tl_tracks = self.core.tracklist.add(self.tracks)
return func(self)

Expand Down
70 changes: 26 additions & 44 deletions tests/dummy_audio.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,23 @@
tests of the core and backends.
"""

from typing import override

import pykka
from mopidy import audio
from mopidy.types import DurationMs, PlaybackState


def create_proxy(config=None, mixer=None):
return DummyAudio.start(config, mixer).proxy()


# TODO: reset position on track change?
class DummyAudio(pykka.ThreadingActor):
class DummyAudio(audio.Audio, pykka.ThreadingActor):
def __init__(self, config=None, mixer=None):
super().__init__()
self.state = audio.PlaybackState.STOPPED
self._volume = 0
self._position = 0
self.state = PlaybackState.STOPPED
self._position = DurationMs(0)
self._source_setup_callback = None
self._about_to_finish_callback = None
self._uri = None
Expand All @@ -27,72 +29,60 @@ def __init__(self, config=None, mixer=None):
self._tags = {}
self._bad_uris = set()

@override
def set_uri(self, uri, live_stream=False, download=False):
assert self._uri is None, "prepare change not called before set"
self._position = 0
self._position = DurationMs(0)
self._uri = uri
self._stream_changed = True
self._live_stream = live_stream
self._tags = {}

def set_appsrc(self, *args, **kwargs):
pass
@override
def set_source_setup_callback(self, callback):
self._source_setup_callback = callback

def emit_data(self, buffer_):
pass
@override
def set_about_to_finish_callback(self, callback):
self._about_to_finish_callback = callback

@override
def get_position(self):
return self._position

@override
def set_position(self, position):
self._position = position
audio.AudioListener.send("position_changed", position=position)
return True

@override
def start_playback(self):
return self._change_state(audio.PlaybackState.PLAYING)
return self._change_state(PlaybackState.PLAYING)

@override
def pause_playback(self):
return self._change_state(audio.PlaybackState.PAUSED)
return self._change_state(PlaybackState.PAUSED)

@override
def prepare_change(self):
self._uri = None
self._source_setup_callback = None
return True

@override
def stop_playback(self):
return self._change_state(audio.PlaybackState.STOPPED)

def get_volume(self):
return self._volume

def set_volume(self, volume):
self._volume = volume
return True

def set_metadata(self, track):
pass
return self._change_state(PlaybackState.STOPPED)

@override
def get_current_tags(self):
return self._tags

def set_source_setup_callback(self, callback):
self._source_setup_callback = callback

def set_about_to_finish_callback(self, callback):
self._about_to_finish_callback = callback

def enable_sync_handler(self):
pass

def wait_for_state_change(self):
pass

def _change_state(self, new_state):
if not self._uri:
return False

if new_state == audio.PlaybackState.STOPPED and self._uri:
if new_state == PlaybackState.STOPPED and self._uri:
self._stream_changed = True
self._uri = None

Expand All @@ -111,7 +101,7 @@ def _change_state(self, new_state):
target_state=None,
)

if new_state == audio.PlaybackState.PLAYING:
if new_state == PlaybackState.PLAYING:
self._tags["audio-codec"] = ["fake info..."]
audio.AudioListener.send("tags_changed", tags=["audio-codec"])

Expand All @@ -124,14 +114,6 @@ def trigger_fake_tags_changed(self, tags):
self._tags.update(tags)
audio.AudioListener.send("tags_changed", tags=self._tags.keys())

def get_source_setup_callback(self):
# This needs to be called from outside the actor or we lock up.
def wrapper():
if self._source_setup_callback:
self._source_setup_callback()

return wrapper

def get_about_to_finish_callback(self):
# This needs to be called from outside the actor or we lock up.
def wrapper():
Expand Down
27 changes: 17 additions & 10 deletions tests/test_library.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import contextlib
import pathlib
import unittest
from typing import cast
from unittest import mock

import pykka
from mopidy import core
from mopidy import backend, core
from mopidy.models import SearchResult, Track

from mopidy_local import actor, storage, translator
Expand All @@ -29,15 +30,21 @@ class LocalLibraryProviderTest(unittest.TestCase):

def setUp(self):
self.audio = dummy_audio.create_proxy()
self.backend = actor.LocalBackend.start(
config=self.config,
audio=self.audio,
).proxy()
self.core = core.Core.start(
audio=self.audio,
backends=[self.backend],
config=self.config,
).proxy()
self.backend = cast(
"backend.BackendProxy",
actor.LocalBackend.start(
config=self.config,
audio=self.audio,
).proxy(),
)
self.core = cast(
"core.CoreProxy",
core.Core.start(
audio=self.audio,
backends=[self.backend],
config=self.config,
).proxy(),
)
self.library = self.backend.library
self.storage = storage.LocalStorageProvider(self.config)
self.storage.load()
Expand Down
5 changes: 2 additions & 3 deletions tests/test_playback.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@

import pykka
from mopidy import backend, core
from mopidy.core import PlaybackState
from mopidy.models import TlTrack, Track
from mopidy.types import DurationMs
from mopidy.types import DurationMs, PlaybackState

from mopidy_local import actor
from tests import (
Expand Down Expand Up @@ -677,7 +676,7 @@ def test_tracklist_position_at_end_of_playlist(self):
# EOS should have triggered
self.assert_current_track_index_is(None)

@mock.patch("mopidy.core.playback.PlaybackController._on_tracklist_change")
@mock.patch.object(core.PlaybackController, "_on_tracklist_change")
def test_on_tracklist_change_gets_called(self, change_mock):
self.tracklist.add([Track()]).get()
change_mock.assert_called_once_with()
Expand Down
26 changes: 18 additions & 8 deletions tests/test_tracklist.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import random
import unittest
from typing import cast

import pykka
from mopidy import core
from mopidy.core import PlaybackState
from mopidy.models import Playlist, Track
from mopidy.types import PlaybackState

from mopidy_local import actor
from tests import (
Expand Down Expand Up @@ -37,11 +38,14 @@ def setUp(self):
config=self.config,
audio=self.audio,
).proxy()
self.core = core.Core.start(
audio=self.audio,
backends=[self.backend],
config=self.config,
).proxy()
self.core = cast(
"core.CoreProxy",
core.Core.start(
audio=self.audio,
backends=[self.backend],
config=self.config,
).proxy(),
)
self.controller = self.core.tracklist
self.playback = self.core.playback

Expand Down Expand Up @@ -75,7 +79,10 @@ def test_add(self):

def test_add_at_position(self):
for track in self.tracks[:-1]:
added = self.controller.add([track], 0).get()
added = self.controller.add(
tracks=[track],
at_position=0,
).get()
tracks = self.controller.get_tracks().get()
tl_tracks = self.controller.get_tl_tracks().get()

Expand All @@ -86,7 +93,10 @@ def test_add_at_position(self):
@populate_tracklist
def test_add_at_position_outside_of_playlist(self):
for track in self.tracks:
added = self.controller.add([track], len(self.tracks) + 2).get()
added = self.controller.add(
tracks=[track],
at_position=len(self.tracks) + 2,
).get()
tracks = self.controller.get_tracks().get()
tl_tracks = self.controller.get_tl_tracks().get()

Expand Down