class ApiTest(unittest.TestCase): @my_vcr.use_cassette('sc-login.yaml') def setUp(self): config = SoundCloudExtension().get_config_schema() config['auth_token'] = '1-35204-61921957-55796ebef403996' config['explore_songs'] = 10 self.api = SoundCloudClient({'soundcloud': config, 'proxy': {}}) def test_sets_user_agent(self): agent = 'Mopidy-SoundCloud/%s Mopidy/' % mopidy_soundcloud.__version__ self.assertTrue(agent in self.api.http_client.headers['user-agent']) def test_resolves_string(self): _id = self.api.parse_track_uri('soundcloud:song.38720262') self.assertEquals(_id, '38720262') @my_vcr.use_cassette('sc-login-error.yaml') def test_responds_with_error(self): with mock.patch('mopidy_soundcloud.soundcloud.logger.error') as d: config = SoundCloudExtension().get_config_schema() config['auth_token'] = '1-fake-token' SoundCloudClient({'soundcloud': config, 'proxy': {}}).user d.assert_called_once_with('Invalid "auth_token" used for ' 'SoundCloud authentication!') @my_vcr.use_cassette('sc-login.yaml') def test_returns_username(self): user = self.api.user.get('username') self.assertEquals(user, 'Nick Steel 3') @my_vcr.use_cassette('sc-resolve-track.yaml') def test_resolves_object(self): trackc = {} trackc[b'uri'] = 'soundcloud:song.38720262' track = Track(**trackc) id = self.api.parse_track_uri(track) self.assertEquals(id, '38720262') @my_vcr.use_cassette('sc-resolve-track-none.yaml') def test_resolves_unknown_track_to_none(self): track = self.api.get_track('s38720262') self.assertIsNone(track) @my_vcr.use_cassette('sc-resolve-track.yaml') def test_resolves_Track(self): track = self.api.get_track('13158665') self.assertIsInstance(track, Track) self.assertEquals( track.uri, 'soundcloud:song/Munching at Tiannas house.13158665') @my_vcr.use_cassette('sc-resolve-http.yaml') def test_resolves_http_url(self): track = self.api.resolve_url( 'https://soundcloud.com/bbc-radio-4/m-w-cloud')[0] self.assertIsInstance(track, Track) self.assertEquals( track.uri, 'soundcloud:song/That Mitchell and Webb Sound The Cloud.122889665') @my_vcr.use_cassette('sc-resolve-set.yaml') def test_resolves_set_url(self): expected_tracks = [ '01 Dash And Blast', '02 We Flood Empty Lakes', '03 A Song For Starlit Beaches', '04 Illuminate My Heart, My Darling' ] tracks = self.api.resolve_url( 'https://soundcloud.com/yndihalda/sets/dash-and-blast') self.assertEquals(len(tracks), 4) for i, t in enumerate(expected_tracks): self.assertIsInstance(tracks[i], Track) self.assertEquals(tracks[i].name, expected_tracks[i]) self.assertTrue(tracks[i].length > 500) self.assertEquals(len(tracks[i].artists), 1) self.assertEquals(list(tracks[i].artists)[0].name, 'yndi halda') @my_vcr.use_cassette('sc-liked.yaml') def test_get_user_likes(self): tracks = self.api.get_likes() self.assertEquals(len(tracks), 3) self.assertIsInstance(tracks[0], Track) self.assertEquals(tracks[1].name, 'Pelican - Deny The Absolute') @my_vcr.use_cassette('sc-stream.yaml') def test_get_user_stream(self): tracks = self.api.get_user_stream() self.assertEquals(len(tracks), 10) self.assertIsInstance(tracks[0], Track) self.assertEquals(tracks[2].name, 'JW Ep 20- Jeremiah Watkins') @my_vcr.use_cassette('sc-following.yaml') def test_get_followings(self): users = self.api.get_followings() self.assertEquals(len(users), 10) self.assertEquals(users[0], (u'Young Legionnaire', '992503')) self.assertEquals(users[1], (u'Tall Ships', '1710483')) self.assertEquals(users[8], (u'Pelican Song', '27945548')) self.assertEquals(users[9], (u'sleepmakeswaves', '1739693')) @my_vcr.use_cassette('sc-user-tracks.yaml') def test_get_user_tracks(self): expected_tracks = [ 'The Wait', 'The Cliff (Palms Remix)', 'The Cliff (Justin Broadrick Remix)', 'The Cliff (Vocal Version)', 'Pelican - The Creeper', 'Pelican - Lathe Biosas', 'Pelican - Ephemeral', 'Pelican - Deny the Absolute', 'Pelican - Immutable Dusk', 'Pelican - Strung Up From The Sky' ] tracks = self.api.get_tracks(27945548) for i, t in enumerate(expected_tracks): self.assertIsInstance(tracks[i], Track) self.assertEquals(tracks[i].name, expected_tracks[i]) self.assertTrue(tracks[i].length > 500) self.assertEquals(len(tracks[i].artists), 1) @my_vcr.use_cassette('sc-set.yaml') def test_get_set(self): tracks = self.api.get_set('10961826') self.assertEquals(len(tracks), 1) self.assertIsInstance(tracks[0], dict) @my_vcr.use_cassette('sc-set-invalid.yaml') def test_get_invalid_set(self): tracks = self.api.get_set('blahblahrubbosh') self.assertEquals(tracks, []) @my_vcr.use_cassette('sc-sets.yaml') def test_get_sets(self): sets = self.api.get_sets() self.assertEquals(len(sets), 2) name, set_id, tracks = sets[1] self.assertEquals(name, 'Pelican') self.assertEquals(set_id, '10961826') self.assertEquals(len(tracks), 1) def test_readeble_url(self): self.assertEquals('Barsuk Records', readable_url('"@"Barsuk Records')) self.assertEquals('_Barsuk Records', readable_url('_Barsuk \'Records\'')) @my_vcr.use_cassette('sc-resolve-track-id.yaml') def test_resolves_stream_track(self): track = self.api.get_track('13158665', True) self.assertIsInstance(track, Track) self.assertEquals( track.uri, 'https://cf-media.sndcdn.com/fxguEjG4ax6B.128.mp3?Policy=eyJTdGF0Z' 'W1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLW1lZGlhLnNuZGNkbi5jb20vZnhndU' 'VqRzRheDZCLjEyOC5tcDMiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkF' 'XUzpFcG9jaFRpbWUiOjE0Nzc2MDA1NTd9fX1dfQ__&Signature=u9bxAkZOtTTF1' 'VqTmLGmw3ENrqbiSTFK-sMvZL-ZsQK85DOepHh5MfPA4MNooszUy~PZqiVyBn4YnE' 'lhWyb~4B7kS6y0VZ6t-qF78CfTMOimemafpqfWJ8nYXczhM9pUpAwiS--lkNjGks4' 'Qxi-FZJDBPG99gAIU0eVW78CADcpuOKLugGpzHl6gRPN2Z4zZ9dVujZ5MlG2OWnPu' 'NiBcE~wUFwcOxt9N6ePTff-wMFQR2PGpEK6wc6bWuB4WFNBkE0bmEke4cOQjWHa5F' 'wYEidZN5rvv5lVT1r07zzifnADEipwMaZ2-QYdqzOYaM4jymFDhl7DklaU24PY5C5' 'mH0A__&Key-Pair-Id=APKAJAGZ7VMH2PFPW6UQ') @my_vcr.use_cassette('sc-search.yaml') def test_search(self): tracks = self.api.search('the great descent') self.assertEquals(len(tracks), 10) self.assertIsInstance(tracks[0], Track) self.assertEquals(tracks[0].name, 'Turn Around (Mix1)')