Ejemplo n.º 1
0
    def test_hash(self, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser1 = spotify.ArtistBrowser(self.session,
                                         sp_artistbrowse=sp_artistbrowse)
        browser2 = spotify.ArtistBrowser(self.session,
                                         sp_artistbrowse=sp_artistbrowse)

        self.assertEqual(hash(browser1), hash(browser2))
Ejemplo n.º 2
0
    def test_ne(self, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser1 = spotify.ArtistBrowser(self.session,
                                         sp_artistbrowse=sp_artistbrowse)
        browser2 = spotify.ArtistBrowser(self.session,
                                         sp_artistbrowse=sp_artistbrowse)

        self.assertFalse(browser1 != browser2)
Ejemplo n.º 3
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)
Ejemplo n.º 4
0
    def test_portraits(self, image_mock, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)
        lib_mock.sp_artistbrowse_num_portraits.return_value = 1
        image_id = spotify.ffi.new('char[]', b'image-id')
        lib_mock.sp_artistbrowse_portrait.return_value = 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
        callback = mock.Mock()

        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 1)
        result = browser.portraits(callback=callback)
        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 2)

        self.assertEqual(len(result), 1)
        lib_mock.sp_artistbrowse_num_portraits.assert_called_with(
            sp_artistbrowse)

        item = result[0]
        self.assertIs(item, mock.sentinel.image)
        self.assertEqual(lib_mock.sp_artistbrowse_portrait.call_count, 1)
        lib_mock.sp_artistbrowse_portrait.assert_called_with(
            sp_artistbrowse, 0)

        # 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)
Ejemplo n.º 5
0
    def test_load(self, load_mock, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        browser.load(10)

        load_mock.assert_called_with(browser, timeout=10)
Ejemplo n.º 6
0
    def test_portraits(self, image_lib_mock, lib_mock):
        image_id = spotify.ffi.new('char[]', b'image-id')
        lib_mock.sp_artistbrowse_num_portraits.return_value = 1
        lib_mock.sp_artistbrowse_portrait.return_value = image_id
        sp_image = spotify.ffi.new('int *')
        lib_mock.sp_image_create.return_value = sp_image
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 1)
        result = browser.portraits
        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 2)

        self.assertEqual(len(result), 1)
        lib_mock.sp_artistbrowse_num_portraits.assert_called_with(
            sp_artistbrowse)

        item = result[0]
        self.assertIsInstance(item, spotify.Image)
        self.assertEqual(item._sp_image, sp_image)
        self.assertEqual(lib_mock.sp_artistbrowse_portrait.call_count, 1)
        lib_mock.sp_artistbrowse_portrait.assert_called_with(
            sp_artistbrowse, 0)

        # 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)
Ejemplo n.º 7
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)
Ejemplo n.º 8
0
    def test_repr_if_unloaded(self, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)
        lib_mock.sp_artistbrowse_is_loaded.return_value = 0

        result = repr(browser)

        self.assertEqual(result, 'ArtistBrowser(<not loaded>)')
Ejemplo n.º 9
0
    def test_load(self, load_mock, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)

        browser.load(10)

        load_mock.assert_called_with(self.session, browser, timeout=10)
Ejemplo n.º 10
0
    def test_releases_sp_artistbrowse_when_artist_dies(self, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')

        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)
        browser = None  # noqa
        tests.gc_collect()

        lib_mock.sp_artistbrowse_release.assert_called_with(sp_artistbrowse)
Ejemplo n.º 11
0
    def test_repr_if_unloaded(self, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)
        lib_mock.sp_artistbrowse_is_loaded.return_value = 0

        result = repr(browser)

        self.assertEqual(result, 'ArtistBrowser(<not loaded>)')
Ejemplo n.º 12
0
    def test_releases_sp_artistbrowse_when_artist_dies(self, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)

        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)
        browser = None  # noqa
        tests.gc_collect()

        lib_mock.sp_artistbrowse_release.assert_called_with(sp_artistbrowse)
Ejemplo n.º 13
0
    def test_similar_artists_if_unloaded(self, lib_mock):
        lib_mock.sp_artistbrowse_is_loaded.return_value = 0
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        result = browser.similar_artists

        lib_mock.sp_artistbrowse_is_loaded.assert_called_with(sp_artistbrowse)
        self.assertEqual(len(result), 0)
Ejemplo n.º 14
0
    def test_artist_when_not_loaded(self, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)
        lib_mock.sp_artistbrowse_artist.return_value = spotify.ffi.NULL

        result = browser.artist

        lib_mock.sp_artistbrowse_artist.assert_called_with(sp_artistbrowse)
        self.assertIsNone(result)
Ejemplo n.º 15
0
    def test_biography(self, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)
        biography = spotify.ffi.new('char[]', b'Lived, played, and died')
        lib_mock.sp_artistbrowse_biography.return_value = biography

        result = browser.biography

        self.assertIsInstance(result, utils.text_type)
        self.assertEqual(result, 'Lived, played, and died')
Ejemplo n.º 16
0
    def test_artist(self, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)
        sp_artist = spotify.ffi.new('int *')
        lib_mock.sp_artistbrowse_artist.return_value = sp_artist

        result = browser.artist

        self.assertIsInstance(result, spotify.Artist)
        self.assertEqual(result._sp_artist, sp_artist)
Ejemplo n.º 17
0
    def test_backend_request_duration(self, lib_mock):
        lib_mock.sp_artistbrowse_backend_request_duration.return_value = 137
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        result = browser.backend_request_duration

        lib_mock.sp_artistbrowse_backend_request_duration.assert_called_with(
            sp_artistbrowse)
        self.assertEqual(result, 137)
Ejemplo n.º 18
0
    def test_is_loaded(self, lib_mock):
        lib_mock.sp_artistbrowse_is_loaded.return_value = 1
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        result = browser.is_loaded

        lib_mock.sp_artistbrowse_is_loaded.assert_called_once_with(
            sp_artistbrowse)
        self.assertTrue(result)
Ejemplo n.º 19
0
    def test_error(self, lib_mock):
        lib_mock.sp_artistbrowse_error.return_value = int(
            spotify.ErrorType.OTHER_PERMANENT)
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        result = browser.error

        lib_mock.sp_artistbrowse_error.assert_called_once_with(sp_artistbrowse)
        self.assertIs(result, spotify.ErrorType.OTHER_PERMANENT)
Ejemplo n.º 20
0
    def test_albums_if_unloaded(self, lib_mock):
        lib_mock.sp_artistbrowse_is_loaded.return_value = 0
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)

        result = browser.albums

        lib_mock.sp_artistbrowse_is_loaded.assert_called_with(sp_artistbrowse)
        self.assertEqual(len(result), 0)
Ejemplo n.º 21
0
    def test_albums_if_no_albums(self, lib_mock):
        lib_mock.sp_artistbrowse_num_albums.return_value = 0
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        result = browser.albums

        self.assertEqual(len(result), 0)
        lib_mock.sp_artistbrowse_num_albums.assert_called_with(sp_artistbrowse)
        self.assertEqual(lib_mock.sp_artistbrowse_album.call_count, 0)
Ejemplo n.º 22
0
    def test_is_loaded(self, lib_mock):
        lib_mock.sp_artistbrowse_is_loaded.return_value = 1
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)

        result = browser.is_loaded

        lib_mock.sp_artistbrowse_is_loaded.assert_called_once_with(
            sp_artistbrowse)
        self.assertTrue(result)
Ejemplo n.º 23
0
    def test_backend_request_duration_when_not_loaded(self, lib_mock):
        lib_mock.sp_artistbrowse_is_loaded.return_value = 0
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        result = browser.backend_request_duration

        lib_mock.sp_artistbrowse_is_loaded.assert_called_with(sp_artistbrowse)
        self.assertEqual(
            lib_mock.sp_artistbrowse_backend_request_duration.call_count, 0)
        self.assertIsNone(result)
Ejemplo n.º 24
0
    def test_artist(self, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)
        sp_artist = spotify.ffi.cast('sp_artist *', 43)
        lib_mock.sp_artistbrowse_artist.return_value = sp_artist

        result = browser.artist

        self.assertIsInstance(result, spotify.Artist)
        self.assertEqual(result._sp_artist, sp_artist)
Ejemplo n.º 25
0
    def test_tracks_if_no_tracks(self, lib_mock):
        lib_mock.sp_artistbrowse_num_tracks.return_value = 0
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)

        result = browser.tracks

        self.assertEqual(len(result), 0)
        lib_mock.sp_artistbrowse_num_tracks.assert_called_with(sp_artistbrowse)
        self.assertEqual(lib_mock.sp_artistbrowse_track.call_count, 0)
Ejemplo n.º 26
0
    def test_biography(self, lib_mock):
        sp_artistbrowse = spotify.ffi.cast('sp_artistbrowse *', 42)
        browser = spotify.ArtistBrowser(self.session,
                                        sp_artistbrowse=sp_artistbrowse)
        biography = spotify.ffi.new('char[]', b'Lived, played, and died')
        lib_mock.sp_artistbrowse_biography.return_value = biography

        result = browser.biography

        self.assertIsInstance(result, compat.text_type)
        self.assertEqual(result, 'Lived, played, and died')
Ejemplo n.º 27
0
    def test_repr(self, link_mock, lib_mock):
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)
        lib_mock.sp_artistbrowse_is_loaded.return_value = 1
        sp_artist = spotify.ffi.new('int *')
        lib_mock.sp_artistbrowse_artist.return_value = sp_artist
        link_instance_mock = link_mock.return_value
        link_instance_mock.uri = 'foo'

        result = repr(browser)

        self.assertEqual(result, 'ArtistBrowser(%r)' % 'foo')
Ejemplo n.º 28
0
    def browse(self, type=None, callback=None):
        """Get an :class:`ArtistBrowser` for the artist.

        If ``type`` is :class:`None`, it defaults to
        :attr:`ArtistBrowserType.FULL`.

        If ``callback`` isn't :class:`None`, it is expected to be a callable
        that accepts a single argument, an :class:`ArtistBrowser` instance,
        when the browser is done loading.

        Can be created without the artist being loaded.
        """
        return spotify.ArtistBrowser(artist=self, type=type, callback=callback)
Ejemplo n.º 29
0
    def test_tracks(self, track_lib_mock, lib_mock):
        sp_track = spotify.ffi.cast('sp_track *', spotify.ffi.new('int *'))
        lib_mock.sp_artistbrowse_num_tracks.return_value = 1
        lib_mock.sp_artistbrowse_track.return_value = sp_track
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 1)
        result = browser.tracks
        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 2)

        self.assertEqual(len(result), 1)
        lib_mock.sp_artistbrowse_num_tracks.assert_called_with(sp_artistbrowse)

        item = result[0]
        self.assertIsInstance(item, spotify.Track)
        self.assertEqual(item._sp_track, sp_track)
        self.assertEqual(lib_mock.sp_artistbrowse_track.call_count, 1)
        lib_mock.sp_artistbrowse_track.assert_called_with(sp_artistbrowse, 0)
        track_lib_mock.sp_track_add_ref.assert_called_with(sp_track)
Ejemplo n.º 30
0
    def test_albums(self, album_lib_mock, lib_mock):
        sp_album = spotify.ffi.cast('sp_album *', spotify.ffi.new('int *'))
        lib_mock.sp_artistbrowse_num_albums.return_value = 1
        lib_mock.sp_artistbrowse_album.return_value = sp_album
        sp_artistbrowse = spotify.ffi.new('int *')
        browser = spotify.ArtistBrowser(sp_artistbrowse=sp_artistbrowse)

        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 1)
        result = browser.albums
        self.assertEqual(lib_mock.sp_artistbrowse_add_ref.call_count, 2)

        self.assertEqual(len(result), 1)
        lib_mock.sp_artistbrowse_num_albums.assert_called_with(sp_artistbrowse)

        item = result[0]
        self.assertIsInstance(item, spotify.Album)
        self.assertEqual(item._sp_album, sp_album)
        self.assertEqual(lib_mock.sp_artistbrowse_album.call_count, 1)
        lib_mock.sp_artistbrowse_album.assert_called_with(sp_artistbrowse, 0)
        album_lib_mock.sp_album_add_ref.assert_called_with(sp_album)