Report created: 19 June 2014

Participant Information

Experience: 12 years: PHP, Ruby, Ruby on Rails, SQL, HTML5, CSS3.

Development System: Windows 7 x86, Ruby 1.9.3.

 

Tasks

1. Create a simple application that returns list of tracks for an account.

For all tasks use the following accounts:

SoundCloud account:
    Login: test43643
    Password: 2b_32e9

Gmail Account:
    Login: test43643@gmail.com
    Password: 75a42c_2d

If you need sample tracks use the following samples:

https://drive.google.com/file/d/0ByJFNf4ZBEb5dWJtXy05SmdzZVk/edit?usp=sharing

Sources: download

Time spent: 30 minutes

Notes:

Most of the time, I was trying to figure out what client_id was. I didn't realise I needed to log into the website to create an app.

A good source of documentation was https://github.com/soundcloud/soundcloud-ruby. I found there that I can use:

client = SoundCloud.new(:client_id => YOUR_CLIENT_ID)

I didn't see that at http://developers.soundcloud.com/docs/api/guide#authentication

The call

client.get('/tracks')

returns all tracks. I didn't specified an order (the task didn't specify that). I noticed I got a different (random?) order each time I ran the script. That felt weird. I'de expect some sort of default order.

 

2. Upload the track sample1.mp3 to the account.

Sources: download

Time spent: 30 minutes

Notes:

Most time spent getting around the openauth authentication. I didn't (want to) create a web application, so I have no server running that could receive the authorization token. It took me a while to find out how to get around this. It happened that the SoundCloud#new can be used for this, when you pass a users username and password. I tried this code on my windows machine, that doesn't have a valid server certificate. I ran into this error:

3. Add an ability to get the track sample1.mp3 by your application.

Sources: download

Time spent: 10 minutes

Notes:

All 'hard' things were done in the previous tasks. I verified that the downloaded mp3 file/stream is the same as the uploaded wav by listening to them both.

 

4. Update a description of the track sample1.mp3.

Sources: download

Time spent: 15 minutes

Notes:

Most time spend looking for a 'put' example. I didn't find a client.put example after a few minutes looking, so I started guessing. My guess was this:

track = client.put("/tracks/#{track.id}", :description => "Test track 5 task 4" )

It didn't do anything, but it also didn't give an error or hint (missing parameters?).  I soon found out that this was wrong use of the API (I found usage of put on the soundcloud-ruby github page).

 

5. Implement search by word "classic" and print list of the search results.

Sources: download

Time spent: 10 minutes

Notes:

Almost identical to task 1. I already read about the search parameter (q) while looking for other things.

Questions

1. Name at least three of the most difficult problems you encountered during task execution and how you solved them (documentation, forums, stackoverflow, help from a friend, ...).

  1. Task 2: how to get an authentication token or work around it by passing username/psw. I found the solution in the documentation.
  2. Finding out how PUT worked, to change an entity. I found an example on the soundcloud-ruby github page.
  3. Figuring out how that I had to register my app with soundcloud. At first, I thought that I needed to pass the username/psw to use the api. It makes sense that I had to get a client_id, but it took me some time to figure that out.

2. Have you experienced any unexpected errors? If yes, did you find the error messages useful?

  1. invalid ssl server certificate on windows.
  2. using wrong parameters with the client#put. No error message/hints

3. Did you find that some classes or methods behave non-obviously or unexpectedly?

No

4. Name at least three ways we can improve the documentation.

  1. Add a clear description on what client_id is and how to obtain it.
  2. For a non-native English speaker like me, it wasnt clear what the difference between HTTP API Guide and HTTP API Reference is.
  3. More client#put examples in the guide.

5. Name at least three ways we can improve design of the API.

  1. It would be more intuitive from my point of view if we could use

    client#tracks
    

    instead of

    client#get('/tracks')
    

  2. It would be more intuitive if we could use

    track.description = "Changed description"
    

    instead of the put method.

  3. Make more verbose and meaningful error messages for the Ruby wrapper.

 

www.apiusabilitytesting.com