1 from __future__ import with_statement
2 import os
3 import tempfile
4 import itertools
5 from ConfigParser import SafeConfigParser
6 import pkg_resources
7 import scapi
8 import scapi.authentication
9 import logging
10 import webbrowser
11
12 logger = logging.getLogger(__name__)
13 logger.setLevel(logging.DEBUG)
14 _logger = logging.getLogger("scapi")
15
16
17 RUN_INTERACTIVE_TESTS = False
18 USE_OAUTH = True
19
20 TOKEN = "FjNE9aRTg8kpxuOjzwsX8Q"
21 SECRET = "NP5PGoyKcQv64E0aZgV4CRNzHfPwR4QghrWoqEgEE"
22 CONSUMER = "EEi2URUfM97pAAxHTogDpQ"
23 CONSUMER_SECRET = "NFYd8T3i4jVKGZ9TMy9LHaBQB3Sh8V5sxBiMeMZBow"
24 API_HOST = "api.soundcloud.dev:3000"
25 USER = ""
26 PASSWORD = ""
27
28 CONFIG_NAME = "soundcloud.cfg"
29
30 CONNECTOR = None
31 ROOT = None
52
54 global TOKEN, SECRET, CONSUMER_SECRET, CONSUMER, API_HOST, USER, PASSWORD
55 if config_name is None:
56 config_name = CONFIG_NAME
57 parser = SafeConfigParser()
58 current = os.getcwd()
59 while current:
60 name = os.path.join(current, config_name)
61 if os.path.exists(name):
62 parser.read([name])
63 TOKEN = parser.get('global', 'accesstoken')
64 SECRET = parser.get('global', 'accesstoken_secret')
65 CONSUMER = parser.get('global', 'consumer')
66 CONSUMER_SECRET = parser.get('global', 'consumer_secret')
67 API_HOST = parser.get('global', 'host')
68 USER = parser.get('global', 'user')
69 PASSWORD = parser.get('global', 'password')
70 logger.debug("token: %s", TOKEN)
71 logger.debug("secret: %s", SECRET)
72 logger.debug("consumer: %s", CONSUMER)
73 logger.debug("consumer_secret: %s", CONSUMER_SECRET)
74 logger.debug("user: %s", USER)
75 logger.debug("password: %s", PASSWORD)
76 logger.debug("host: %s", API_HOST)
77 break
78 new_current = os.path.dirname(current)
79 if new_current == current:
80 break
81 current = new_current
82
83
85 base = tempfile.mkdtemp()
86 oldcwd = os.getcwd()
87 cdir = os.path.join(base, "foo")
88 os.mkdir(cdir)
89 os.chdir(cdir)
90 test_config = """
91 [global]
92 host=host
93 consumer=consumer
94 consumer_secret=consumer_secret
95 accesstoken=accesstoken
96 accesstoken_secret=accesstoken_secret
97 user=user
98 password=password
99 """
100 with open(os.path.join(base, CONFIG_NAME), "w") as cf:
101 cf.write(test_config)
102 load_config()
103 assert TOKEN == "accesstoken" and SECRET == "accesstoken_secret" and API_HOST == 'host'
104 assert CONSUMER == "consumer" and CONSUMER_SECRET == "consumer_secret"
105 assert USER == "user" and PASSWORD == "password"
106 os.chdir(oldcwd)
107 load_config()
108
109
111 sca = ROOT
112 quite_a_few_users = list(itertools.islice(sca.users(), 0, 127))
113
114 logger.debug(quite_a_few_users)
115 assert isinstance(quite_a_few_users, list) and isinstance(quite_a_few_users[0], scapi.User)
116 user = sca.me()
117 logger.debug(user)
118 assert isinstance(user, scapi.User)
119 contacts = list(user.contacts())
120 assert isinstance(contacts, list)
121 assert isinstance(contacts[0], scapi.User)
122 logger.debug(contacts)
123 tracks = list(user.tracks())
124 assert isinstance(tracks, list)
125 assert isinstance(tracks[0], scapi.Track)
126 logger.debug(tracks)
127
128
130 """
131 This test is commented out because it needs user-interaction.
132 """
133 if not RUN_INTERACTIVE_TESTS:
134 return
135 oauth_authenticator = scapi.authentication.OAuthAuthenticator(CONSUMER,
136 CONSUMER_SECRET,
137 None,
138 None)
139
140 sca = scapi.ApiConnector(host=API_HOST, authenticator=oauth_authenticator)
141 token, secret = sca.fetch_request_token()
142 authorization_url = sca.get_request_token_authorization_url(token)
143 webbrowser.open(authorization_url)
144 raw_input("please press return")
145 oauth_authenticator = scapi.authentication.OAuthAuthenticator(CONSUMER,
146 CONSUMER_SECRET,
147 token,
148 secret)
149
150 sca = scapi.ApiConnector(API_HOST, authenticator=oauth_authenticator)
151 token, secret = sca.fetch_access_token()
152 logger.info("Access token: '%s'", token)
153 logger.info("Access token secret: '%s'", secret)
154 oauth_authenticator = scapi.authentication.OAuthAuthenticator(CONSUMER,
155 CONSUMER_SECRET,
156 token,
157 secret)
158
159 sca = scapi.ApiConnector(API_HOST, authenticator=oauth_authenticator)
160 test_track_creation()
161
166
168 sca = ROOT
169 track = sca.Track.new(title='bar')
170 assert isinstance(track, scapi.Track)
171 track.title='baz'
172 track = sca.Track.get(track.id)
173 assert track.title == "baz"
174
176 sca = ROOT
177 user = sca.me()
178 track = user.tracks.new(title="bar")
179 assert isinstance(track, scapi.Track)
180
182 assert pkg_resources.resource_exists("scapi.tests.test_connect", "knaster.mp3")
183 data = pkg_resources.resource_stream("scapi.tests.test_connect", "knaster.mp3")
184 sca = ROOT
185 user = sca.me()
186 logger.debug(user)
187 asset = sca.assets.new(filedata=data)
188 assert isinstance(asset, scapi.Asset)
189 logger.debug(asset)
190 tracks = list(user.tracks())
191 track = tracks[0]
192 track.assets.append(asset)
193
200
202 sca = ROOT
203 user = sca.me()
204 tracks = itertools.islice(user.tracks(), 1)
205 for track in tracks:
206 permissions = list(track.permissions())
207 logger.debug(permissions)
208 assert isinstance(permissions, list)
209 if permissions:
210 assert isinstance(permissions[0], scapi.User)
211
213 sca = ROOT
214 me = sca.me()
215 track = sca.Track.new(title='bar', sharing="private")
216 assert track.sharing == "private"
217 users = itertools.islice(sca.users(), 10)
218 users_to_set = [user for user in users if user != me]
219 assert users_to_set, "Didn't find any suitable users"
220 track.permissions = users_to_set
221 assert set(track.permissions()) == set(users_to_set)
222
230
231
238
260
261
263 sca = ROOT
264 me = sca.me()
265
266 favorites = list(me.favorites())
267 assert favorites == [] or isinstance(favorites[0], scapi.Track)
268
269 track = None
270 for user in sca.users():
271 if user == me:
272 continue
273 for track in user.tracks():
274 break
275 if track is not None:
276 break
277
278 me.favorites.append(track)
279
280 favorites = list(me.favorites())
281 assert track in favorites
282
283 me.favorites.remove(track)
284
285 favorites = list(me.favorites())
286 assert track not in favorites
287
298
299
301 events = list(ROOT.events())
302 assert isinstance(events, list)
303 assert isinstance(events[0], scapi.Event)
304
306 sca = ROOT
307 for _ in xrange(20):
308 setup()
309 sca.me()
310
319
321 sca = ROOT
322 playlists = list(itertools.islice(sca.playlists(), 0, 127))
323 found = False
324 for playlist in playlists:
325 tracks = playlist.tracks
326 if not isinstance(tracks, list):
327 tracks = [tracks]
328 for trackdata in tracks:
329 print trackdata
330 user = trackdata.user
331 print user
332 print user.tracks()
333 print playlist.user
334 break
335