from unittest import mock import pytest from mopidy import models from mopidy_webhooks import frontend as frontend_lib @pytest.fixture def frontend(): config = { "webhooks": { "urls": "http://127.0.0.1/receiver/,http://127.0.0.1/receiver/two/", "tokens": "secrettoken,anotherone", } } core = mock.sentinel.core return frontend_lib.WebhooksFrontend(config, core) def test_on_start_creates_lastfm_network(pylast_mock, frontend): frontend.on_start() assert frontend.webhook_urls == [ "http://127.0.0.1/receiver/", "http://127.0.0.1/receiver/two/", ] assert frontend.webhook_tokens == ["secrettoken", "anotherone"] def test_on_start_stops_actor_on_error(pylast_mock, frontend): pylast_mock.NetworkError = pylast.NetworkError pylast_mock.LastFMNetwork.side_effect = pylast.NetworkError(None, "foo") frontend.stop = mock.Mock() frontend.on_start() frontend.stop.assert_called_with() def test_track_playback_started_updates_now_playing(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) artists = [models.Artist(name="ABC"), models.Artist(name="XYZ")] album = models.Album(name="The Collection") track = models.Track( name="One Two Three", artists=artists, album=album, track_no=3, length=180432, musicbrainz_id="123-456", ) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_started(tl_track) frontend.lastfm.update_now_playing.assert_called_with( "ABC, XYZ", "One Two Three", duration="180", album="The Collection", track_number="3", mbid="123-456", ) def test_track_playback_started_has_default_values(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) track = models.Track() tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_started(tl_track) frontend.lastfm.update_now_playing.assert_called_with( "", "", duration="0", album="", track_number="0", mbid="" ) def test_track_playback_started_catches_pylast_error(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) pylast_mock.NetworkError = pylast.NetworkError frontend.lastfm.update_now_playing.side_effect = pylast.NetworkError( None, "foo" ) track = models.Track() tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_started(tl_track) def test_track_playback_ended_scrobbles_played_track(pylast_mock, frontend): frontend.last_start_time = 123 frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) artists = [models.Artist(name="ABC"), models.Artist(name="XYZ")] album = models.Album(name="The Collection") track = models.Track( name="One Two Three", artists=artists, album=album, track_no=3, length=180432, musicbrainz_id="123-456", ) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_ended(tl_track, 150000) frontend.lastfm.scrobble.assert_called_with( "ABC, XYZ", "One Two Three", "123", duration="180", album="The Collection", track_number="3", mbid="123-456", ) def test_track_playback_ended_has_default_values(pylast_mock, frontend): frontend.last_start_time = 123 frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) track = models.Track(length=180432) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_ended(tl_track, 150000) frontend.lastfm.scrobble.assert_called_with( "", "", "123", duration="180", album="", track_number="0", mbid="" ) def test_does_not_scrobble_tracks_shorter_than_30_sec(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) track = models.Track(length=20432) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_ended(tl_track, 20432) assert frontend.lastfm.scrobble.call_count == 0 def test_does_not_scrobble_if_played_less_than_half(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) track = models.Track(length=180432) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_ended(tl_track, 60432) assert frontend.lastfm.scrobble.call_count == 0 def test_does_scrobble_if_played_not_half_but_240_sec(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) track = models.Track(length=880432) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_ended(tl_track, 241432) assert frontend.lastfm.scrobble.call_count == 1 def test_track_playback_ended_catches_pylast_error(pylast_mock, frontend): frontend.lastfm = mock.Mock(spec=pylast.LastFMNetwork) pylast_mock.NetworkError = pylast.NetworkError frontend.lastfm.scrobble.side_effect = pylast.NetworkError(None, "foo") track = models.Track(length=180432) tl_track = models.TlTrack(track=track, tlid=17) frontend.track_playback_ended(tl_track, 150000)