示例#1
0
    def test_eq(self, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist1 = spotify.Artist(self.session, sp_artist=sp_artist)
        artist2 = spotify.Artist(self.session, sp_artist=sp_artist)

        self.assertTrue(artist1 == artist2)
        self.assertFalse(artist1 == 'foo')
示例#2
0
    def test_create_from_uri(self, link_mock, lib_mock):
        sp_artist = spotify.ffi.new('int *')
        link_instance_mock = link_mock.return_value
        link_instance_mock.as_artist.return_value = spotify.Artist(
            sp_artist=sp_artist)
        lib_mock.sp_link_as_artist.return_value = sp_artist
        uri = 'spotify:artist:foo'

        result = spotify.Artist(uri)

        link_mock.assert_called_with(uri)
        link_instance_mock.as_artist.assert_called_with()
        lib_mock.sp_artist_add_ref.assert_called_with(sp_artist)
        self.assertEqual(result._sp_artist, sp_artist)
示例#3
0
    def test_browser_is_gone_before_callback_is_called(self, lib_mock):
        tests.create_session()
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *',
                                           spotify.ffi.new('int *'))
        lib_mock.sp_artistbrowse_create.return_value = sp_artistbrowse
        callback = mock.Mock()

        result = spotify.ArtistBrowser(artist=artist, callback=callback)
        complete_event = result.complete_event
        result = None  # noqa
        tests.gc_collect()

        # FIXME The mock keeps the handle/userdata alive, thus the artist is
        # kept alive, and this test doesn't test what it is intended to test.
        artistbrowse_complete_cb = (
            lib_mock.sp_artistbrowse_create.call_args[0][3])
        userdata = lib_mock.sp_artistbrowse_create.call_args[0][4]
        artistbrowse_complete_cb(sp_artistbrowse, userdata)

        complete_event.wait(3)
        self.assertEqual(callback.call_count, 1)
        self.assertEqual(callback.call_args[0][0]._sp_artistbrowse,
                         sp_artistbrowse)
示例#4
0
    def test_browser_is_gone_before_callback_is_called(self, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 43)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        lib_mock.sp_artistbrowse_create.return_value = sp_artistbrowse
        callback = mock.Mock()

        result = spotify.ArtistBrowser(self.session,
                                       artist=artist,
                                       callback=callback)
        loaded_event = result.loaded_event
        result = None  # noqa
        tests.gc_collect()

        # The mock keeps the handle/userdata alive, thus this test doesn't
        # really test that session._callback_handles keeps the handle alive.
        artistbrowse_complete_cb = lib_mock.sp_artistbrowse_create.call_args[
            0][3]
        userdata = lib_mock.sp_artistbrowse_create.call_args[0][4]
        artistbrowse_complete_cb(sp_artistbrowse, userdata)

        loaded_event.wait(3)
        self.assertEqual(callback.call_count, 1)
        self.assertEqual(callback.call_args[0][0]._sp_artistbrowse,
                         sp_artistbrowse)
示例#5
0
    def test_portrait(self, image_mock, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        sp_image_id = spotify.ffi.new('char[]', b'portrait-id')
        lib_mock.sp_artist_portrait.return_value = sp_image_id
        sp_image = spotify.ffi.cast('sp_image *', 43)
        lib_mock.sp_image_create.return_value = sp_image
        image_mock.return_value = mock.sentinel.image
        image_size = spotify.ImageSize.SMALL
        callback = mock.Mock()

        result = artist.portrait(image_size, callback=callback)

        self.assertIs(result, mock.sentinel.image)
        lib_mock.sp_artist_portrait.assert_called_with(sp_artist,
                                                       int(image_size))
        lib_mock.sp_image_create.assert_called_with(self.session._sp_session,
                                                    sp_image_id)

        # Since we *created* the sp_image, we already have a refcount of 1 and
        # shouldn't increase the refcount when wrapping this sp_image in an
        # Image object
        image_mock.assert_called_with(self.session,
                                      sp_image=sp_image,
                                      add_ref=False,
                                      callback=callback)
示例#6
0
    def test_load(self, load_mock, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)

        artist.load(10)

        load_mock.assert_called_with(self.session, artist, timeout=10)
示例#7
0
    def test_load(self, load_mock, lib_mock):
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)

        artist.load(10)

        load_mock.assert_called_with(artist, timeout=10)
示例#8
0
    def test_releases_sp_artist_when_artist_dies(self, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 42)

        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        artist = None  # noqa
        tests.gc_collect()

        lib_mock.sp_artist_release.assert_called_with(sp_artist)
示例#9
0
    def test_create_from_uri_fail_raises_error(self, link_mock, lib_mock):
        link_instance_mock = link_mock.return_value
        link_instance_mock.as_artist.return_value = None
        lib_mock.sp_link_as_artist.return_value = spotify.ffi.NULL
        uri = 'spotify:artist:foo'

        with self.assertRaises(ValueError):
            spotify.Artist(uri)
示例#10
0
    def test_releases_sp_artist_when_artist_dies(self, lib_mock):
        sp_artist = spotify.ffi.new('int *')

        artist = spotify.Artist(sp_artist=sp_artist)
        artist = None  # noqa
        tests.gc_collect()

        lib_mock.sp_artist_release.assert_called_with(sp_artist)
示例#11
0
    def test_is_loaded(self, lib_mock):
        lib_mock.sp_artist_is_loaded.return_value = 1
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)

        result = artist.is_loaded

        lib_mock.sp_artist_is_loaded.assert_called_once_with(sp_artist)
        self.assertTrue(result)
示例#12
0
    def artist(self):
        """The artist of the album.

        Will always return :class:`None` if the album isn't loaded.
        """
        sp_artist = lib.sp_album_artist(self._sp_album)
        if sp_artist == ffi.NULL:
            return None
        return spotify.Artist(self._session, sp_artist=sp_artist, add_ref=True)
示例#13
0
    def test_is_loaded(self, lib_mock):
        lib_mock.sp_artist_is_loaded.return_value = 1
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)

        result = artist.is_loaded

        lib_mock.sp_artist_is_loaded.assert_called_once_with(sp_artist)
        self.assertTrue(result)
示例#14
0
    def test_repr(self, link_mock, lib_mock):
        link_instance_mock = link_mock.return_value
        link_instance_mock.uri = 'foo'
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)

        result = repr(artist)

        self.assertEqual(result, 'Artist(%r)' % 'foo')
示例#15
0
    def test_name_is_none_if_unloaded(self, lib_mock):
        lib_mock.sp_artist_name.return_value = spotify.ffi.new('char[]', b'')
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)

        result = artist.name

        lib_mock.sp_artist_name.assert_called_once_with(sp_artist)
        self.assertIsNone(result)
示例#16
0
    def test_name(self, lib_mock):
        lib_mock.sp_artist_name.return_value = spotify.ffi.new(
            'char[]', b'Foo Bar Baz')
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)

        result = artist.name

        lib_mock.sp_artist_name.assert_called_once_with(sp_artist)
        self.assertEqual(result, 'Foo Bar Baz')
示例#17
0
    def test_portrait_is_none_if_null(self, lib_mock):
        lib_mock.sp_artist_portrait.return_value = spotify.ffi.NULL
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)

        result = artist.portrait()

        lib_mock.sp_artist_portrait.assert_called_with(
            sp_artist, int(spotify.ImageSize.NORMAL))
        self.assertIsNone(result)
示例#18
0
    def test_portrait_link_defaults_to_normal_size(self, link_mock, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        sp_link = spotify.ffi.cast('sp_link *', 43)
        lib_mock.sp_link_create_from_artist_portrait.return_value = sp_link
        link_mock.return_value = mock.sentinel.link

        artist.portrait_link()

        lib_mock.sp_link_create_from_artist_portrait.assert_called_once_with(
            sp_artist, int(spotify.ImageSize.NORMAL))
示例#19
0
    def test_link_creates_link_to_artist(self, link_mock, lib_mock):
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)
        sp_link = spotify.ffi.new('int *')
        lib_mock.sp_link_create_from_artist.return_value = sp_link
        link_mock.return_value = mock.sentinel.link

        result = artist.link

        link_mock.assert_called_once_with(sp_link=sp_link, add_ref=False)
        self.assertEqual(result, mock.sentinel.link)
示例#20
0
    def test_portrait_defaults_to_normal_size(self, image_mock, lib_mock):
        sp_image_id = spotify.ffi.new('char[]', b'portrait-id')
        lib_mock.sp_artist_portrait.return_value = sp_image_id
        sp_image = spotify.ffi.cast('sp_image *', 43)
        lib_mock.sp_image_create.return_value = sp_image
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)

        artist.portrait()

        lib_mock.sp_artist_portrait.assert_called_with(
            sp_artist, int(spotify.ImageSize.NORMAL))
示例#21
0
    def get_artist(self, uri):
        """
        Get :class:`Artist` from a Spotify artist URI.

        Example::

            >>> session = spotify.Session()
            # ...
            >>> artist = session.get_artist(
            ...     'spotify:artist:22xRIphSN7IkPVbErICu7s')
            >>> artist.load().name
            u'Rob Dougan'
        """
        return spotify.Artist(self, uri=uri)
示例#22
0
    def test_portrait_link_creates_link_to_portrait(self, link_mock, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 42)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        sp_link = spotify.ffi.cast('sp_link *', 43)
        lib_mock.sp_link_create_from_artist_portrait.return_value = sp_link
        link_mock.return_value = mock.sentinel.link
        image_size = spotify.ImageSize.SMALL

        result = artist.portrait_link(image_size)

        lib_mock.sp_link_create_from_artist_portrait.assert_called_once_with(
            sp_artist, int(image_size))
        link_mock.assert_called_once_with(self.session,
                                          sp_link=sp_link,
                                          add_ref=False)
        self.assertEqual(result, mock.sentinel.link)
示例#23
0
    def test_create_from_artist(self, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 43)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        lib_mock.sp_artistbrowse_create.return_value = sp_artistbrowse

        result = artist.browse()

        lib_mock.sp_artistbrowse_create.assert_called_with(
            self.session._sp_session, sp_artist,
            int(spotify.ArtistBrowserType.FULL), mock.ANY, mock.ANY)
        self.assertIsInstance(result, spotify.ArtistBrowser)

        artistbrowse_complete_cb = (
            lib_mock.sp_artistbrowse_create.call_args[0][3])
        userdata = lib_mock.sp_artistbrowse_create.call_args[0][4]
        self.assertFalse(result.loaded_event.is_set())
        artistbrowse_complete_cb(sp_artistbrowse, userdata)
        self.assertTrue(result.loaded_event.is_set())
示例#24
0
    def test_create_from_artist_with_type_and_callback(self, lib_mock):
        sp_artist = spotify.ffi.cast('sp_artist *', 43)
        artist = spotify.Artist(self.session, sp_artist=sp_artist)
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        lib_mock.sp_artistbrowse_create.return_value = sp_artistbrowse
        callback = mock.Mock()

        result = artist.browse(type=spotify.ArtistBrowserType.NO_TRACKS,
                               callback=callback)

        lib_mock.sp_artistbrowse_create.assert_called_with(
            self.session._sp_session, sp_artist,
            int(spotify.ArtistBrowserType.NO_TRACKS), mock.ANY, mock.ANY)
        artistbrowse_complete_cb = (
            lib_mock.sp_artistbrowse_create.call_args[0][3])
        userdata = lib_mock.sp_artistbrowse_create.call_args[0][4]
        artistbrowse_complete_cb(sp_artistbrowse, userdata)

        result.loaded_event.wait(3)
        callback.assert_called_with(result)
示例#25
0
    def test_portrait(self, image_lib_mock, lib_mock):
        session = tests.create_session()
        sp_image_id = spotify.ffi.new('char[]', b'portrait-id')
        lib_mock.sp_artist_portrait.return_value = sp_image_id
        sp_image = spotify.ffi.new('int *')
        lib_mock.sp_image_create.return_value = sp_image
        sp_artist = spotify.ffi.new('int *')
        artist = spotify.Artist(sp_artist=sp_artist)
        image_size = spotify.ImageSize.SMALL

        result = artist.portrait(image_size)

        lib_mock.sp_artist_portrait.assert_called_with(sp_artist,
                                                       int(image_size))
        lib_mock.sp_image_create.assert_called_with(session._sp_session,
                                                    sp_image_id)

        self.assertIsInstance(result, spotify.Image)
        self.assertEqual(result._sp_image, sp_image)

        # Since we *created* the sp_image, we already have a refcount of 1 and
        # shouldn't increase the refcount when wrapping this sp_image in an
        # Image object
        self.assertEqual(image_lib_mock.sp_image_add_ref.call_count, 0)
示例#26
0
    def test_adds_ref_to_sp_artist_when_created(self, lib_mock):
        sp_artist = spotify.ffi.new('int *')

        spotify.Artist(sp_artist=sp_artist)

        lib_mock.sp_artist_add_ref.assert_called_with(sp_artist)
示例#27
0
 def get_artist(sp_track, key):
     return spotify.Artist(
         self._session,
         sp_artist=lib.sp_track_artist(sp_track, key),
         add_ref=True,
     )
示例#28
0
 def test_create_without_uri_or_sp_artist_fails(self, lib_mock):
     with self.assertRaises(AssertionError):
         spotify.Artist()
示例#29
0
 def get_artist(sp_track, key):
     return spotify.Artist(sp_artist=lib.sp_track_artist(sp_track, key),
                           add_ref=True)
示例#30
0
 def get_artist(sp_artistbrowse, key):
     return spotify.Artist(self._session,
                           sp_artist=lib.sp_artistbrowse_similar_artist(
                               sp_artistbrowse, key),
                           add_ref=True)