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))
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)
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)
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)
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)
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)
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)
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>)')
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)
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)
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>)')
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)
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)
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)
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')
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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')
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')
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)
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)
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)