peteforde-scrobbler 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/History.txt +4 -0
  2. data/MIT-LICENSE +19 -0
  3. data/Manifest +67 -0
  4. data/README.rdoc +113 -0
  5. data/Rakefile +36 -0
  6. data/examples/album.rb +17 -0
  7. data/examples/artist.rb +13 -0
  8. data/examples/scrobble.rb +31 -0
  9. data/examples/tag.rb +11 -0
  10. data/examples/track.rb +10 -0
  11. data/examples/user.rb +14 -0
  12. data/lib/scrobbler.rb +20 -0
  13. data/lib/scrobbler/album.rb +143 -0
  14. data/lib/scrobbler/artist.rb +127 -0
  15. data/lib/scrobbler/base.rb +29 -0
  16. data/lib/scrobbler/chart.rb +31 -0
  17. data/lib/scrobbler/playing.rb +49 -0
  18. data/lib/scrobbler/rest.rb +51 -0
  19. data/lib/scrobbler/scrobble.rb +66 -0
  20. data/lib/scrobbler/simpleauth.rb +59 -0
  21. data/lib/scrobbler/tag.rb +104 -0
  22. data/lib/scrobbler/track.rb +98 -0
  23. data/lib/scrobbler/user.rb +192 -0
  24. data/lib/scrobbler/version.rb +3 -0
  25. data/scrobbler.gemspec +39 -0
  26. data/setup.rb +1585 -0
  27. data/test/fixtures/xml/album/info.xml +70 -0
  28. data/test/fixtures/xml/artist/fans.xml +18 -0
  29. data/test/fixtures/xml/artist/similar.xml +39 -0
  30. data/test/fixtures/xml/artist/topalbums.xml +36 -0
  31. data/test/fixtures/xml/artist/toptags.xml +18 -0
  32. data/test/fixtures/xml/artist/toptracks.xml +27 -0
  33. data/test/fixtures/xml/tag/topalbums.xml +39 -0
  34. data/test/fixtures/xml/tag/topartists.xml +39 -0
  35. data/test/fixtures/xml/tag/toptags.xml +252 -0
  36. data/test/fixtures/xml/tag/toptracks.xml +30 -0
  37. data/test/fixtures/xml/track/fans.xml +28 -0
  38. data/test/fixtures/xml/track/toptags.xml +33 -0
  39. data/test/fixtures/xml/user/friends.xml +21 -0
  40. data/test/fixtures/xml/user/neighbours.xml +18 -0
  41. data/test/fixtures/xml/user/profile.xml +12 -0
  42. data/test/fixtures/xml/user/recentbannedtracks.xml +24 -0
  43. data/test/fixtures/xml/user/recentlovedtracks.xml +24 -0
  44. data/test/fixtures/xml/user/recenttracks.xml +27 -0
  45. data/test/fixtures/xml/user/systemrecs.xml +18 -0
  46. data/test/fixtures/xml/user/topalbums.xml +42 -0
  47. data/test/fixtures/xml/user/topartists.xml +30 -0
  48. data/test/fixtures/xml/user/toptags.xml +18 -0
  49. data/test/fixtures/xml/user/toptracks.xml +27 -0
  50. data/test/fixtures/xml/user/weeklyalbumchart.xml +35 -0
  51. data/test/fixtures/xml/user/weeklyalbumchart_from_1138536002_to_1139140802.xml +35 -0
  52. data/test/fixtures/xml/user/weeklyartistchart.xml +38 -0
  53. data/test/fixtures/xml/user/weeklyartistchart_from_1138536002_to_1139140802.xml +59 -0
  54. data/test/fixtures/xml/user/weeklychartlist.xml +74 -0
  55. data/test/fixtures/xml/user/weeklytrackchart.xml +35 -0
  56. data/test/fixtures/xml/user/weeklytrackchart_from_1138536002_to_1139140802.xml +35 -0
  57. data/test/mocks/rest.rb +50 -0
  58. data/test/test_helper.rb +17 -0
  59. data/test/unit/album_test.rb +86 -0
  60. data/test/unit/artist_test.rb +82 -0
  61. data/test/unit/chart_test.rb +34 -0
  62. data/test/unit/playing_test.rb +53 -0
  63. data/test/unit/scrobble_test.rb +69 -0
  64. data/test/unit/simpleauth_test.rb +45 -0
  65. data/test/unit/tag_test.rb +65 -0
  66. data/test/unit/track_test.rb +42 -0
  67. data/test/unit/user_test.rb +291 -0
  68. metadata +177 -0
@@ -0,0 +1,38 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <weeklyartistchart user="jnunemaker" from="1177848000" to="1178452800">
3
+ <artist>
4
+ <name>Rascal Flatts</name>
5
+ <mbid>6e0ae159-8449-4262-bba5-18ec87fa529f</mbid>
6
+ <chartposition>1</chartposition>
7
+ <playcount>25</playcount>
8
+ <url>http://www.last.fm/music/Rascal+Flatts</url>
9
+ </artist>
10
+ <artist>
11
+ <name>Reba McEntire</name>
12
+ <mbid>3ec17e85-9284-4f4c-8831-4e56c2354cdb</mbid>
13
+ <chartposition>2</chartposition>
14
+ <playcount>15</playcount>
15
+ <url>http://www.last.fm/music/Reba+McEntire</url>
16
+ </artist>
17
+ <artist>
18
+ <name>LeAnn Rimes</name>
19
+ <mbid>9092d8e1-9b38-4372-a96d-000b8561a8bc</mbid>
20
+ <chartposition>3</chartposition>
21
+ <playcount>14</playcount>
22
+ <url>http://www.last.fm/music/LeAnn+Rimes</url>
23
+ </artist>
24
+ <artist>
25
+ <name>SHeDaisy</name>
26
+ <mbid>166c939c-a97e-44b9-b405-23d49a72df4e</mbid>
27
+ <chartposition>4</chartposition>
28
+ <playcount>13</playcount>
29
+ <url>http://www.last.fm/music/SHeDaisy</url>
30
+ </artist>
31
+ <artist>
32
+ <name>Sawyer Brown</name>
33
+ <mbid>1b69a7bc-7563-4aaf-a859-8b6050a7a0f2</mbid>
34
+ <chartposition>5</chartposition>
35
+ <playcount>12</playcount>
36
+ <url>http://www.last.fm/music/Sawyer+Brown</url>
37
+ </artist>
38
+ </weeklyartistchart>
@@ -0,0 +1,59 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <weeklyartistchart user="jnunemaker" from="1138536002" to="1139140802">
3
+ <artist>
4
+ <name>Jenny Lewis with The Watson Twins</name>
5
+ <mbid>4b179fe2-dfa5-40b1-b6db-b56dbc3b5f09</mbid>
6
+ <chartposition>1</chartposition>
7
+ <playcount>48</playcount>
8
+ <url>http://www.last.fm/music/Jenny+Lewis+with+The+Watson+Twins</url>
9
+ </artist>
10
+ <artist>
11
+ <name>Johnny Cash</name>
12
+ <mbid>d43d12a1-2dc9-4257-a2fd-0a3bb1081b86</mbid>
13
+ <chartposition>2</chartposition>
14
+ <playcount>25</playcount>
15
+ <url>http://www.last.fm/music/Johnny+Cash</url>
16
+ </artist>
17
+ <artist>
18
+ <name>Jewel</name>
19
+ <mbid>abae8575-ec8a-4736-abc3-1ad5093a68aa</mbid>
20
+ <chartposition>3</chartposition>
21
+ <playcount>14</playcount>
22
+ <url>http://www.last.fm/music/Jewel</url>
23
+ </artist>
24
+ <artist>
25
+ <name>Nine Inch Nails</name>
26
+ <mbid>b7ffd2af-418f-4be2-bdd1-22f8b48613da</mbid>
27
+ <chartposition>4</chartposition>
28
+ <playcount>8</playcount>
29
+ <url>http://www.last.fm/music/Nine+Inch+Nails</url>
30
+ </artist>
31
+ <artist>
32
+ <name>Natasha Bedingfield</name>
33
+ <mbid>8b477559-946e-4ef2-9fe1-446cff8fdd79</mbid>
34
+ <chartposition>4</chartposition>
35
+ <playcount>8</playcount>
36
+ <url>http://www.last.fm/music/Natasha+Bedingfield</url>
37
+ </artist>
38
+ <artist>
39
+ <name>Martina McBride</name>
40
+ <mbid>b0a55bd8-60c7-45c1-b78e-f20e4c8adba1</mbid>
41
+ <chartposition>6</chartposition>
42
+ <playcount>7</playcount>
43
+ <url>http://www.last.fm/music/Martina+McBride</url>
44
+ </artist>
45
+ <artist>
46
+ <name>Kanye West</name>
47
+ <mbid>164f0d73-1234-4e2c-8743-d77bf2191051</mbid>
48
+ <chartposition>7</chartposition>
49
+ <playcount>6</playcount>
50
+ <url>http://www.last.fm/music/Kanye+West</url>
51
+ </artist>
52
+ <artist>
53
+ <name>The Pussycat Dolls</name>
54
+ <mbid>1fda852b-92e9-4562-82fa-c52820a77b23</mbid>
55
+ <chartposition>8</chartposition>
56
+ <playcount>5</playcount>
57
+ <url>http://www.last.fm/music/The+Pussycat+Dolls</url>
58
+ </artist>
59
+ </weeklyartistchart>
@@ -0,0 +1,74 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <weeklychartlist user="jnunemaker">
3
+ <chart from="1134302403" to="1134907203"/>
4
+ <chart from="1134907202" to="1135512002"/>
5
+ <chart from="1135512002" to="1136116802"/>
6
+ <chart from="1136116801" to="1136721601"/>
7
+ <chart from="1136721601" to="1137326401"/>
8
+ <chart from="1137326402" to="1137931202"/>
9
+ <chart from="1137931202" to="1138536002"/>
10
+ <chart from="1138536002" to="1139140802"/>
11
+ <chart from="1139140801" to="1139745601"/>
12
+ <chart from="1139745601" to="1140350401"/>
13
+ <chart from="1140350401" to="1140955201"/>
14
+ <chart from="1140955203" to="1141560003"/>
15
+ <chart from="1141560002" to="1142164802"/>
16
+ <chart from="1142164802" to="1142769602"/>
17
+ <chart from="1142769602" to="1143374402"/>
18
+ <chart from="1143374402" to="1143979202"/>
19
+ <chart from="1143979202" to="1144584000"/>
20
+ <chart from="1144584000" to="1145188800"/>
21
+ <chart from="1145188800" to="1145793600"/>
22
+ <chart from="1145793600" to="1146398400"/>
23
+ <chart from="1146398400" to="1147003200"/>
24
+ <chart from="1147003200" to="1147608000"/>
25
+ <chart from="1147608000" to="1148212800"/>
26
+ <chart from="1148212800" to="1148817600"/>
27
+ <chart from="1148817600" to="1149422400"/>
28
+ <chart from="1149422400" to="1150027200"/>
29
+ <chart from="1150027200" to="1150632000"/>
30
+ <chart from="1150632000" to="1151236800"/>
31
+ <chart from="1151236800" to="1151841600"/>
32
+ <chart from="1151841600" to="1152446400"/>
33
+ <chart from="1152446400" to="1153051200"/>
34
+ <chart from="1153656000" to="1154260800"/>
35
+ <chart from="1154260800" to="1154865600"/>
36
+ <chart from="1154865600" to="1155470400"/>
37
+ <chart from="1155470400" to="1156075200"/>
38
+ <chart from="1156075200" to="1156680000"/>
39
+ <chart from="1156680000" to="1157284800"/>
40
+ <chart from="1157284800" to="1157889600"/>
41
+ <chart from="1157889600" to="1158494400"/>
42
+ <chart from="1158494400" to="1159099200"/>
43
+ <chart from="1159099200" to="1159704000"/>
44
+ <chart from="1159704000" to="1160308800"/>
45
+ <chart from="1160308800" to="1160913600"/>
46
+ <chart from="1160913600" to="1161518400"/>
47
+ <chart from="1162123200" to="1162728000"/>
48
+ <chart from="1162728000" to="1163332800"/>
49
+ <chart from="1163332800" to="1163937600"/>
50
+ <chart from="1163937600" to="1164542400"/>
51
+ <chart from="1164542400" to="1165147200"/>
52
+ <chart from="1165147200" to="1165752000"/>
53
+ <chart from="1165752000" to="1166356800"/>
54
+ <chart from="1166356800" to="1166961600"/>
55
+ <chart from="1166961600" to="1167566400"/>
56
+ <chart from="1167566400" to="1168171200"/>
57
+ <chart from="1168171200" to="1168776000"/>
58
+ <chart from="1168776000" to="1169380800"/>
59
+ <chart from="1169380800" to="1169985600"/>
60
+ <chart from="1169985600" to="1170590400"/>
61
+ <chart from="1170590400" to="1171195200"/>
62
+ <chart from="1171195200" to="1171800000"/>
63
+ <chart from="1171800000" to="1172404800"/>
64
+ <chart from="1172404800" to="1173009600"/>
65
+ <chart from="1173009600" to="1173614400"/>
66
+ <chart from="1173614400" to="1174219200"/>
67
+ <chart from="1174219200" to="1174824000"/>
68
+ <chart from="1174824000" to="1175428800"/>
69
+ <chart from="1175428800" to="1176033600"/>
70
+ <chart from="1176033600" to="1176638400"/>
71
+ <chart from="1176638400" to="1177243200"/>
72
+ <chart from="1177243200" to="1177848000"/>
73
+ <chart from="1177848000" to="1178452800"/>
74
+ </weeklychartlist>
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <weeklytrackchart user="jnunemaker" from="1177848000" to="1178452800">
3
+ <track>
4
+ <artist mbid="302716e4-a702-4bbc-baac-591f8a8e20bc">Rebecca St. James</artist>
5
+ <name>Omega</name>
6
+ <mbid></mbid>
7
+ <chartposition>1</chartposition>
8
+ <playcount>2</playcount>
9
+ <url>http://www.last.fm/music/Rebecca+St.+James/_/Omega</url>
10
+ </track>
11
+ <track>
12
+ <artist mbid="0cd4810e-9f57-4003-bdfa-e188cd3ba818">Michael English</artist>
13
+ <name>In Christ Alone</name>
14
+ <mbid></mbid>
15
+ <chartposition>2</chartposition>
16
+ <playcount>1</playcount>
17
+ <url>http://www.last.fm/music/Michael+English/_/In+Christ+Alone</url>
18
+ </track>
19
+ <track>
20
+ <artist mbid="3ec17e85-9284-4f4c-8831-4e56c2354cdb">Reba McEntire</artist>
21
+ <name>How Was I to Know</name>
22
+ <mbid></mbid>
23
+ <chartposition>2</chartposition>
24
+ <playcount>1</playcount>
25
+ <url>http://www.last.fm/music/Reba+McEntire/_/How+Was+I+to+Know</url>
26
+ </track>
27
+ <track>
28
+ <artist mbid="faabb55d-3c9e-4c23-8779-732ac2ee2c0d">Shania Twain</artist>
29
+ <name>Don't Be Stupid (You Know I Love You) (remix)</name>
30
+ <mbid></mbid>
31
+ <chartposition>2</chartposition>
32
+ <playcount>1</playcount>
33
+ <url>http://www.last.fm/music/Shania+Twain/_/Don%27t+Be+Stupid+%28You+Know+I+Love+You%29+%28remix%29</url>
34
+ </track>
35
+ </weeklytrackchart>
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <weeklytrackchart user="jnunemaker" from="1138536002" to="1139140802">
3
+ <track>
4
+ <artist mbid="8b477559-946e-4ef2-9fe1-446cff8fdd79">Natasha Bedingfield</artist>
5
+ <name>Unwritten</name>
6
+ <mbid></mbid>
7
+ <chartposition>1</chartposition>
8
+ <playcount>8</playcount>
9
+ <url>http://www.last.fm/music/Natasha+Bedingfield/_/Unwritten</url>
10
+ </track>
11
+ <track>
12
+ <artist mbid="d43d12a1-2dc9-4257-a2fd-0a3bb1081b86">Johnny Cash</artist>
13
+ <name>Hurt</name>
14
+ <mbid></mbid>
15
+ <chartposition>2</chartposition>
16
+ <playcount>6</playcount>
17
+ <url>http://www.last.fm/music/Johnny+Cash/_/Hurt</url>
18
+ </track>
19
+ <track>
20
+ <artist mbid="ba853904-ae25-4ebb-89d6-c44cfbd71bd2">Blur</artist>
21
+ <name>Song 2</name>
22
+ <mbid></mbid>
23
+ <chartposition>3</chartposition>
24
+ <playcount>4</playcount>
25
+ <url>http://www.last.fm/music/Blur/_/Song+2</url>
26
+ </track>
27
+ <track>
28
+ <artist mbid="bc710bcf-8815-42cf-bad2-3f1d12246aeb">Nickelback</artist>
29
+ <name>Photograph</name>
30
+ <mbid></mbid>
31
+ <chartposition>3</chartposition>
32
+ <playcount>4</playcount>
33
+ <url>http://www.last.fm/music/Nickelback/_/Photograph</url>
34
+ </track>
35
+ </weeklytrackchart>
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/../../lib/scrobbler/rest'
2
+ require 'digest/md5'
3
+
4
+ module Scrobbler
5
+ module REST
6
+ class Connection
7
+ # reads xml fixture file instead of hitting up the internets
8
+ def request(resource, method = "get", args = nil)
9
+ @now_playing_url = 'http://62.216.251.203:80/nowplaying'
10
+ @submission_url = 'http://62.216.251.205:80/protocol_1.2'
11
+ @session_id = '17E61E13454CDD8B68E8D7DEEEDF6170'
12
+
13
+ if @base_url == Scrobbler::API_URL
14
+ pieces = resource.split('/')
15
+ pieces.shift
16
+ pieces.shift
17
+ folder = pieces.shift
18
+ file = pieces.last[0, pieces.last.index('.xml')]
19
+ base_pieces = pieces.last.split('?')
20
+
21
+ file = if base_pieces.size > 1
22
+ # if query string params are in resource they are underscore separated for filenames
23
+ base_pieces.last.split('&').inject("#{file}_") { |str, pair| str << pair.split('=').join('_') + '_'; str }.chop!
24
+ else
25
+ file
26
+ end
27
+
28
+ File.read(File.dirname(__FILE__) + "/../fixtures/xml/#{folder}/#{file}.xml")
29
+ elsif @base_url == Scrobbler::AUTH_URL
30
+ if args[:hs] == "true" && args[:p] == Scrobbler::AUTH_VER.to_s && args[:c] == 'rbs' &&
31
+ args[:v] == Scrobbler::Version.to_s && args[:u] == 'chunky' && !args[:t].blank? &&
32
+ args[:a] == Digest::MD5.hexdigest('7813258ef8c6b632dde8cc80f6bda62f' + args[:t])
33
+
34
+ "OK\n#{@session_id}\n#{@now_playing_url}\n#{@submission_url}"
35
+ end
36
+ elsif @base_url == @now_playing_url
37
+ if args[:s] == @session_id && ![args[:a], args[:t], args[:b], args[:n]].any?(&:blank?)
38
+ 'OK'
39
+ end
40
+ elsif @base_url == @submission_url
41
+ if args[:s] == @session_id &&
42
+ ![args['a[0]'], args['t[0]'], args['i[0]'], args['o[0]'], args['l[0]'], args['b[0]']].any?(&:blank?)
43
+ 'OK'
44
+ end
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,17 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/scrobbler'
3
+ require File.dirname(__FILE__) + '/mocks/rest'
4
+
5
+ class << Test::Unit::TestCase
6
+ def test(name, &block)
7
+ test_name = :"test_#{name.gsub(' ','_')}"
8
+ raise ArgumentError, "#{test_name} is already defined" if self.instance_methods.include? test_name.to_s
9
+ define_method test_name, &block
10
+ end
11
+
12
+ def expect(expected_value, &block)
13
+ define_method :"test_#{caller.first.split("/").last}" do
14
+ assert_equal expected_value, instance_eval(&block)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,86 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ class TestAlbum < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @album = Scrobbler::Album.new('Carrie Underwood', 'Some Hearts')
7
+ end
8
+
9
+ test 'should require the artist name' do
10
+ assert_raises(ArgumentError) { Scrobbler::Album.new('', 'Some Hearts') }
11
+ end
12
+
13
+ test 'should require the track name' do
14
+ assert_raises(ArgumentError) { Scrobbler::Album.new('Carrie Underwood', '') }
15
+ end
16
+
17
+ test 'should know the artist' do
18
+ assert_equal('Carrie Underwood', @album.artist)
19
+ end
20
+
21
+ test "should know it's name" do
22
+ assert_equal('Some Hearts', @album.name)
23
+ end
24
+
25
+ test 'should have correct api path' do
26
+ assert_equal("/1.0/album/Carrie+Underwood/Some+Hearts", @album.api_path)
27
+ end
28
+
29
+ test 'should be able to load album info' do
30
+ @album.load_info
31
+ assert_equal('18589', @album.reach)
32
+ assert_equal('http://www.last.fm/music/Carrie+Underwood/Some+Hearts', @album.url)
33
+ assert_equal(Time.mktime(2005, 11, 15, 00, 00, 00), @album.release_date)
34
+ assert_equal(14, @album.tracks.size)
35
+ assert_equal('Wasted', @album.tracks.first.name)
36
+ assert_equal('http://www.last.fm/music/Carrie+Underwood/_/Wasted', @album.tracks.first.url)
37
+ assert_equal('6738', @album.tracks.first.reach)
38
+ end
39
+
40
+ test 'should be able to find an ablum' do
41
+ album = Scrobbler::Album.find('Carrie Underwood', 'Some Hearts')
42
+ assert_equal('Carrie Underwood', album.artist)
43
+ assert_equal('Some Hearts', album.name)
44
+ end
45
+
46
+ test "should be able to find an ablum and load the album's info" do
47
+ album = Scrobbler::Album.find('Carrie Underwood', 'Some Hearts', :include_info => true)
48
+ assert_equal('Carrie Underwood', album.artist)
49
+ assert_equal('Some Hearts', album.name)
50
+ assert_equal('18589', album.reach)
51
+ assert_equal('http://www.last.fm/music/Carrie+Underwood/Some+Hearts', album.url)
52
+ assert_equal(Time.mktime(2005, 11, 15, 00, 00, 00), album.release_date)
53
+ end
54
+
55
+ test "should be able to include the album's info on initialize" do
56
+ album = Scrobbler::Album.new('Carrie Underwood', 'Some Hearts', :include_info => true)
57
+ assert_equal('Carrie Underwood', album.artist)
58
+ assert_equal('Some Hearts', album.name)
59
+ assert_equal('18589', album.reach)
60
+ assert_equal('http://www.last.fm/music/Carrie+Underwood/Some+Hearts', album.url)
61
+ assert_equal(Time.mktime(2005, 11, 15, 00, 00, 00), album.release_date)
62
+ end
63
+
64
+ test 'should load info when trying to access tracks if info has not been loaded' do
65
+ assert_equal(14, @album.tracks.size)
66
+ assert_equal('Wasted', @album.tracks.first.name)
67
+ assert_equal('http://www.last.fm/music/Carrie+Underwood/_/Wasted', @album.tracks.first.url)
68
+ assert_equal('6738', @album.tracks.first.reach)
69
+ end
70
+
71
+ test 'should have an image method that accepts a type' do
72
+ @album.load_info
73
+ assert_equal('http://images.amazon.com/images/P/B000BGR18W.01.MZZZZZZZ.jpg', @album.image(:small))
74
+ assert_equal('http://images.amazon.com/images/P/B000BGR18W.01.MZZZZZZZ.jpg', @album.image(:medium))
75
+ assert_equal('http://images.amazon.com/images/P/B000BGR18W.01.MZZZZZZZ.jpg', @album.image(:large))
76
+ end
77
+
78
+ test "should raise an argument error when attempting to get an image that doesn't exist" do
79
+ @album.load_info
80
+ assert_raises(ArgumentError) { @album.image(:fake) }
81
+ end
82
+
83
+ test 'should load info when trying to access an image if the info has not been loaded' do
84
+ assert_equal('http://images.amazon.com/images/P/B000BGR18W.01.MZZZZZZZ.jpg', @album.image(:small))
85
+ end
86
+ end
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/../test_helper.rb'
2
+
3
+ class TestArtist < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @artist = Scrobbler::Artist.new('Metallica')
7
+ end
8
+
9
+ test 'should require name' do
10
+ assert_raises(ArgumentError) { Scrobbler::Artist.new('') }
11
+ end
12
+
13
+ test "should know it's name" do
14
+ assert_equal('Metallica', @artist.name)
15
+ end
16
+
17
+ test 'should have the correct api_path' do
18
+ assert_equal('/1.0/artist/Metallica', @artist.api_path)
19
+ end
20
+
21
+ test 'should escape api path' do
22
+ assert_equal('/1.0/artist/Carrie+Underwood', Scrobbler::Artist.new('Carrie Underwood').api_path)
23
+ end
24
+
25
+ test 'should have the correct ical path to current events' do
26
+ assert_equal('http://ws.audioscrobbler.com/1.0/artist/Metallica/events.ics', @artist.current_events(:ical))
27
+ end
28
+
29
+ test 'should have the correct rss path to current events' do
30
+ assert_equal('http://ws.audioscrobbler.com/1.0/artist/Metallica/events.rss', @artist.current_events(:rss))
31
+ end
32
+
33
+ test 'should be able to find similar artists' do
34
+ assert_equal(['Iron Maiden', 'System of a Down', "Guns N' Roses", 'Rammstein'], @artist.similar.collect(&:name))
35
+ first = @artist.similar.first
36
+ assert_equal('Iron Maiden', first.name)
37
+ assert_equal('ca891d65-d9b0-4258-89f7-e6ba29d83767', first.mbid)
38
+ assert_equal('100', first.match)
39
+ assert_equal('http://www.last.fm/music/Iron+Maiden', first.url)
40
+ assert_equal('http://static3.last.fm/storable/image/177412/small.jpg', first.thumbnail)
41
+ assert_equal('http://panther1.last.fm/proposedimages/sidebar/6/1000107/528560.jpg', first.image)
42
+ assert_equal('yes', first.streamable)
43
+ end
44
+
45
+ test 'should be able to find top fans' do
46
+ assert_equal(%w{Kikoin Chrisis92 delekt0r}, @artist.top_fans.collect(&:username))
47
+ first = @artist.top_fans.first
48
+ assert_equal('Kikoin', first.username)
49
+ assert_equal('http://www.last.fm/user/Kikoin/', first.url)
50
+ assert_equal('http://panther1.last.fm/avatar/621340085aed19b9ab77a0f8c575758a.gif', first.avatar)
51
+ assert_equal('6081000', first.weight)
52
+ end
53
+
54
+ test 'should be able to find top tracks' do
55
+ assert_equal(['Nothing Else Matters', 'Enter Sandman', 'Master of Puppets', 'One'], @artist.top_tracks.collect(&:name))
56
+ first = @artist.top_tracks.first
57
+ assert_equal('Nothing Else Matters', first.name)
58
+ assert_equal('', first.mbid)
59
+ assert_equal('http://www.last.fm/music/Metallica/_/Nothing+Else+Matters', first.url)
60
+ assert_equal('59135', first.reach)
61
+ end
62
+
63
+ test 'should be able to find top albums' do
64
+ assert_equal(['Master of Puppets', 'Metallica', 'Reload'], @artist.top_albums.collect(&:name))
65
+ first = @artist.top_albums.first
66
+ assert_equal('Master of Puppets', first.name)
67
+ assert_equal('fed37cfc-2a6d-4569-9ac0-501a7c7598eb', first.mbid)
68
+ assert_equal('65717', first.reach)
69
+ assert_equal('http://www.last.fm/music/Metallica/Master+of+Puppets', first.url)
70
+ assert_equal('http://cdn.last.fm/coverart/50x50/1411810.jpg', first.image(:small))
71
+ assert_equal('http://cdn.last.fm/coverart/130x130/1411810.jpg', first.image(:medium))
72
+ assert_equal('http://panther1.last.fm/coverart/130x130/1411810.jpg', first.image(:large))
73
+ end
74
+
75
+ test 'should be able to find top tags' do
76
+ assert_equal(['metal', 'thrash metal', 'heavy metal'], @artist.top_tags.collect(&:name))
77
+ first = @artist.top_tags.first
78
+ assert_equal('metal', first.name)
79
+ assert_equal('100', first.count)
80
+ assert_equal('http://www.last.fm/tag/metal', first.url)
81
+ end
82
+ end