shortwave 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +10 -0
- data/.gitmodules +3 -0
- data/LICENSE +20 -0
- data/README.rdoc +74 -0
- data/Rakefile +133 -0
- data/VERSION +1 -0
- data/lib/shortwave.rb +12 -0
- data/lib/shortwave/authentication.rb +107 -0
- data/lib/shortwave/facade.rb +3 -0
- data/lib/shortwave/facade/build/facade_builder.rb +199 -0
- data/lib/shortwave/facade/build/facade_template.erb +17 -0
- data/lib/shortwave/facade/lastfm.rb +878 -0
- data/lib/shortwave/facade/remote.rb +86 -0
- data/lib/shortwave/model/album.rb +33 -0
- data/lib/shortwave/model/artist.rb +62 -0
- data/lib/shortwave/model/base_model.rb +112 -0
- data/lib/shortwave/model/chart_dates.rb +15 -0
- data/lib/shortwave/model/comparison.rb +15 -0
- data/lib/shortwave/model/event.rb +55 -0
- data/lib/shortwave/model/group.rb +26 -0
- data/lib/shortwave/model/location.rb +45 -0
- data/lib/shortwave/model/playlist.rb +36 -0
- data/lib/shortwave/model/shout.rb +21 -0
- data/lib/shortwave/model/tag.rb +47 -0
- data/lib/shortwave/model/track.rb +71 -0
- data/lib/shortwave/model/user.rb +70 -0
- data/lib/shortwave/model/venue.rb +37 -0
- data/lib/shortwave/model/weekly_charts.rb +31 -0
- data/lib/shortwave/providers.rb +161 -0
- data/shortwave.gemspec +178 -0
- data/test/authentication_test.rb +64 -0
- data/test/build/build_test.rb +25 -0
- data/test/build/data/intro.yml +2 -0
- data/test/build/data/screens/album_addTags.html +1238 -0
- data/test/build/data/screens/intro_truncated.html +426 -0
- data/test/build/data/screens/tasteometer_compare.html +1274 -0
- data/test/build/data/screens/user_getLovedTracks.html +1278 -0
- data/test/build/data/screens/venue_search.html +1261 -0
- data/test/build/facade_builder_test.rb +23 -0
- data/test/build/parameter_test.rb +43 -0
- data/test/build/remote_method_test.rb +47 -0
- data/test/build/ruby_class_test.rb +12 -0
- data/test/build/ruby_method_test.rb +137 -0
- data/test/helper.rb +35 -0
- data/test/model/album_test.rb +62 -0
- data/test/model/artist_test.rb +103 -0
- data/test/model/chart_dates_test.rb +11 -0
- data/test/model/comparison_test.rb +18 -0
- data/test/model/data/album_info.xml +38 -0
- data/test/model/data/album_search.xml +210 -0
- data/test/model/data/artist_info.xml +58 -0
- data/test/model/data/artist_search.xml +109 -0
- data/test/model/data/artist_shouts.xml +546 -0
- data/test/model/data/artist_top_fans.xml +405 -0
- data/test/model/data/event_info.xml +47 -0
- data/test/model/data/group_members.xml +242 -0
- data/test/model/data/group_weekly_album_chart.xml +1754 -0
- data/test/model/data/group_weekly_artist_chart.xml +604 -0
- data/test/model/data/group_weekly_track_chart.xml +1005 -0
- data/test/model/data/location_events.xml +383 -0
- data/test/model/data/ok.xml +2 -0
- data/test/model/data/playlist_fetch.xml +227 -0
- data/test/model/data/tag_search.xml +110 -0
- data/test/model/data/tag_similar.xml +254 -0
- data/test/model/data/tag_top_albums.xml +805 -0
- data/test/model/data/tag_top_artists.xml +605 -0
- data/test/model/data/tag_top_tags.xml +1254 -0
- data/test/model/data/tag_top_tracks.xml +843 -0
- data/test/model/data/tag_weekly_chart_list.xml +57 -0
- data/test/model/data/tasteometer_compare.xml +54 -0
- data/test/model/data/track_info.xml +53 -0
- data/test/model/data/track_search.xml +195 -0
- data/test/model/data/user_chartlist.xml +90 -0
- data/test/model/data/user_info.xml +16 -0
- data/test/model/data/user_neighbours.xml +484 -0
- data/test/model/data/user_playlists.xml +17 -0
- data/test/model/data/user_recent_tracks.xml +124 -0
- data/test/model/data/user_recommended_artists.xml +454 -0
- data/test/model/data/user_shouts.xml +9 -0
- data/test/model/data/user_weekly_artist_chart.xml +478 -0
- data/test/model/data/venue_events.xml +556 -0
- data/test/model/data/venue_past_events.xml +1778 -0
- data/test/model/data/venue_search.xml +355 -0
- data/test/model/event_test.rb +63 -0
- data/test/model/group_test.rb +45 -0
- data/test/model/location_test.rb +25 -0
- data/test/model/playlist_test.rb +51 -0
- data/test/model/shout_test.rb +23 -0
- data/test/model/tag_test.rb +39 -0
- data/test/model/track_test.rb +67 -0
- data/test/model/user_test.rb +125 -0
- data/test/model/venue_test.rb +60 -0
- data/test/provider/album_provider_test.rb +26 -0
- data/test/provider/artist_provider_test.rb +25 -0
- data/test/provider/group_provider_test.rb +9 -0
- data/test/provider/location_provider_test.rb +9 -0
- data/test/provider/playlist_provider_test.rb +12 -0
- data/test/provider/tag_provider_test.rb +24 -0
- data/test/provider/track_provider_test.rb +26 -0
- data/test/provider/user_provider_test.rb +11 -0
- data/test/provider/venue_provider_test.rb +15 -0
- data/test/provider_test_helper.rb +27 -0
- data/test/remote_test.rb +26 -0
- metadata +209 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'facade/build/facade_builder'
|
|
3
|
+
|
|
4
|
+
class FacadeBuilderTest < TestCase
|
|
5
|
+
|
|
6
|
+
test "remote method definitions can be loaded from file" do
|
|
7
|
+
expected = {"User" => {"foo.bar" => "/baz"}}
|
|
8
|
+
assert_equal( expected, FacadeBuilder.new.remote_method_definitions(File.dirname(__FILE__) + "/data/intro.yml") )
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "remote method defintions can be added to file" do
|
|
12
|
+
expected = {"A" => {"B" => "C"}}
|
|
13
|
+
|
|
14
|
+
File.expects(:exists?).returns(false)
|
|
15
|
+
DocumentationRemote.expects(:scrape_remote_method_index).returns(expected)
|
|
16
|
+
fh = mock()
|
|
17
|
+
fh.expects(:write).with("--- \nA: \n B: C\n")
|
|
18
|
+
File.expects(:open).yields(fh)
|
|
19
|
+
|
|
20
|
+
assert_equal( expected, FacadeBuilder.new.remote_method_definitions("non-existent") )
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'facade/build/facade_builder'
|
|
3
|
+
|
|
4
|
+
class ParameterTest < TestCase
|
|
5
|
+
|
|
6
|
+
test "can be parsed from an html screen" do
|
|
7
|
+
assert_equal 2, make_parameters("user_getLovedTracks").size
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
test "have a name" do
|
|
11
|
+
assert_equal :user, make_parameters("user_getLovedTracks").first.name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "can be required or optional" do
|
|
15
|
+
assert make_parameters("venue_search").first.required?
|
|
16
|
+
assert ! make_parameters("venue_search")[1].required?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test "can have a description" do
|
|
20
|
+
assert_equal "The venue name you would like to search for.",
|
|
21
|
+
make_parameters("venue_search").first.description
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test "copes with defaults in the optional section" do
|
|
25
|
+
assert ! make_parameters("tasteometer_compare")[4].required?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test "copes with multiple parameters defined as type[1|2]" do
|
|
29
|
+
assert_equal :type1, make_parameters("tasteometer_compare").first.name
|
|
30
|
+
assert_equal :type2, make_parameters("tasteometer_compare")[1].name
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "copes with extra information in the required string" do
|
|
34
|
+
assert make_parameters("tasteometer_compare").first.required?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def make_parameters(screen)
|
|
40
|
+
raw = File.read(File.dirname(__FILE__) + "/data/screens/#{screen}.html")
|
|
41
|
+
Shortwave::Facade::Build::Parameter.parse(raw)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'facade/build/facade_builder'
|
|
3
|
+
|
|
4
|
+
class RemoteMethodTest < TestCase
|
|
5
|
+
|
|
6
|
+
test "parsed method has a description" do
|
|
7
|
+
make_builder "user_getLovedTracks"
|
|
8
|
+
assert_equal "Get the last 50 tracks loved by a user.", @method.description
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "parsed method has a remote name" do
|
|
12
|
+
make_builder "user_getLovedTracks"
|
|
13
|
+
assert_equal "user.getLovedTracks", @method.remote_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test "parsed method has a name" do
|
|
17
|
+
make_builder "user_getLovedTracks"
|
|
18
|
+
assert_equal :loved_tracks, @method.name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test "parsed method has parameters" do
|
|
22
|
+
make_builder "user_getLovedTracks"
|
|
23
|
+
assert_equal [:user, :api_key], @method.parameters.map {|p| p.name }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test "read methods should use http GET" do
|
|
27
|
+
make_builder "user_getLovedTracks"
|
|
28
|
+
assert_equal :get, @method.http_method
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test "write methods should use http POST" do
|
|
32
|
+
make_builder "album_addTags"
|
|
33
|
+
assert_equal :post, @method.http_method
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test "parsed methods have sample response code" do
|
|
37
|
+
make_builder "album_addTags"
|
|
38
|
+
assert_equal "<lfm status=\"ok\">\n</lfm>", @method.sample_response
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def make_builder(screen)
|
|
44
|
+
raw = File.read(File.dirname(__FILE__) + "/data/screens/#{screen}.html")
|
|
45
|
+
@method = Shortwave::Facade::Build::RemoteMethod.new(raw)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
require 'facade/build/facade_builder'
|
|
3
|
+
|
|
4
|
+
include Shortwave::Facade::Build
|
|
5
|
+
|
|
6
|
+
RemoteMethodStub = Struct.new(:remote_name, :name, :description, :sample_response, :parameters, :http_method)
|
|
7
|
+
ParameterStub = Struct.new(:name, :description, :required)
|
|
8
|
+
|
|
9
|
+
class ParameterStub
|
|
10
|
+
def required?
|
|
11
|
+
required
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class RubyMethodTest < TestCase
|
|
16
|
+
|
|
17
|
+
test "outputs a simple method signature with no arguments" do
|
|
18
|
+
method = RemoteMethodStub.new("user.getLovedTracks", :loved_tracks)
|
|
19
|
+
assert_equal "loved_tracks", RubyMethod.new(method).signature
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test "outputs the description as first line of comment" do
|
|
23
|
+
method = RemoteMethodStub.new("user.getLovedTracks", :loved_tracks, "A user's loved tracks")
|
|
24
|
+
assert_equal "# A user's loved tracks", RubyMethod.new(method).comment.first
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
test "outputs parameter descriptions as a comment" do
|
|
28
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
29
|
+
:loved_tracks,
|
|
30
|
+
"Description",
|
|
31
|
+
nil,
|
|
32
|
+
[ParameterStub.new(:user, "A username", true),
|
|
33
|
+
ParameterStub.new(:optional, "Optional", false),
|
|
34
|
+
ParameterStub.new(:api_key, "api key", true)])
|
|
35
|
+
|
|
36
|
+
expected = ["# Description",
|
|
37
|
+
"#",
|
|
38
|
+
"# +user+:: A username",
|
|
39
|
+
"#",
|
|
40
|
+
"# <b>Options</b>",
|
|
41
|
+
"# +optional+:: Optional"]
|
|
42
|
+
assert_equal expected, RubyMethod.new(method).comment
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
test "adds required parameters to the method signature" do
|
|
46
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
47
|
+
:loved_tracks,
|
|
48
|
+
nil,
|
|
49
|
+
nil,
|
|
50
|
+
[ParameterStub.new(:user, "A username", true)])
|
|
51
|
+
|
|
52
|
+
assert_equal "loved_tracks(user)", RubyMethod.new(method).signature
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
[:api_key, :api_sig, :sk].each do |param|
|
|
56
|
+
test "#{param} parameter should not be part of the signature" do
|
|
57
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
58
|
+
:loved_tracks,
|
|
59
|
+
nil,
|
|
60
|
+
nil,
|
|
61
|
+
[ParameterStub.new(:user, "A username", true),
|
|
62
|
+
ParameterStub.new(param, "API key", true)])
|
|
63
|
+
|
|
64
|
+
assert_equal "loved_tracks(user)", RubyMethod.new(method).signature
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test "optional parameters should be collapsed to an options hash" do
|
|
69
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
70
|
+
:loved_tracks,
|
|
71
|
+
nil,
|
|
72
|
+
nil,
|
|
73
|
+
[ParameterStub.new(:user, "A username", true),
|
|
74
|
+
ParameterStub.new(:number, "optional", false)])
|
|
75
|
+
|
|
76
|
+
assert_equal "loved_tracks(user, options={})", RubyMethod.new(method).signature
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
test "method body generates a GET request to the remote method" do
|
|
80
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
81
|
+
:loved_tracks,
|
|
82
|
+
nil,
|
|
83
|
+
nil,
|
|
84
|
+
[ParameterStub.new(:user, "A username", true)],
|
|
85
|
+
:get)
|
|
86
|
+
|
|
87
|
+
expected = ["get(:standard, {:method => \"user.getLovedTracks\", :user => user})"]
|
|
88
|
+
assert_equal expected, RubyMethod.new(method).body
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
test "optional parameters are merged into the sent data" do
|
|
92
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
93
|
+
:loved_tracks,
|
|
94
|
+
nil,
|
|
95
|
+
nil,
|
|
96
|
+
[ParameterStub.new(:user, "A username", true),
|
|
97
|
+
ParameterStub.new(:number, "optional", false)],
|
|
98
|
+
:get)
|
|
99
|
+
|
|
100
|
+
expected = ["get(:standard, {:method => \"user.getLovedTracks\", :user => user}.merge(options))"]
|
|
101
|
+
assert_equal expected, RubyMethod.new(method).body
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
test "write methods are sent via POST" do
|
|
105
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
106
|
+
:loved_tracks,
|
|
107
|
+
nil,
|
|
108
|
+
nil,
|
|
109
|
+
[ParameterStub.new(:user, "A username", true),
|
|
110
|
+
ParameterStub.new(:number, "optional", false)],
|
|
111
|
+
:post)
|
|
112
|
+
|
|
113
|
+
assert_equal "post", RubyMethod.new(method).body.first[0..3]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
test "method with an sk parameter should be a session method" do
|
|
117
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
118
|
+
:loved_tracks,
|
|
119
|
+
nil,
|
|
120
|
+
nil,
|
|
121
|
+
[ParameterStub.new(:sk, "sk", true)],
|
|
122
|
+
:get)
|
|
123
|
+
expected = ["get(:session, {:method => \"user.getLovedTracks\"})"]
|
|
124
|
+
assert_equal expected, RubyMethod.new(method).body
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
test "method with an api_sig but no sk parameter should be a signed method" do
|
|
128
|
+
method = RemoteMethodStub.new("user.getLovedTracks",
|
|
129
|
+
:loved_tracks,
|
|
130
|
+
nil,
|
|
131
|
+
nil,
|
|
132
|
+
[ParameterStub.new(:api_sig, "api_sig", true)],
|
|
133
|
+
:get)
|
|
134
|
+
expected = ["get(:signed, {:method => \"user.getLovedTracks\"})"]
|
|
135
|
+
assert_equal expected, RubyMethod.new(method).body
|
|
136
|
+
end
|
|
137
|
+
end
|
data/test/helper.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'test/unit'
|
|
3
|
+
require 'mocha'
|
|
4
|
+
require 'fakeweb'
|
|
5
|
+
|
|
6
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
7
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
8
|
+
require 'shortwave'
|
|
9
|
+
|
|
10
|
+
FakeWeb.allow_net_connect = false
|
|
11
|
+
TestCase = Test::Unit::TestCase
|
|
12
|
+
|
|
13
|
+
class TestCase
|
|
14
|
+
def setup
|
|
15
|
+
FakeWeb.clean_registry
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.test(name, &block)
|
|
19
|
+
test_name = "test_#{name.gsub(/\s+/, '_')}".to_sym
|
|
20
|
+
defined = instance_method(test_name) rescue false
|
|
21
|
+
raise "#{test_name} is already defined in #{self}" if defined
|
|
22
|
+
|
|
23
|
+
if block_given?
|
|
24
|
+
define_method(test_name, &block)
|
|
25
|
+
else
|
|
26
|
+
define_method(test_name) do
|
|
27
|
+
flunk "No implementation for #{test_name}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
include Shortwave
|
|
34
|
+
require 'provider_test_helper'
|
|
35
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
|
|
3
|
+
class AlbumTest < TestCase
|
|
4
|
+
include ProviderTestHelper
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
super
|
|
8
|
+
@facade.stubs(:session).returns(stub(:album_facade => @facade, :merge! => nil, :signed_in? => true))
|
|
9
|
+
@album = Model::Album.parse(xml("album_info"), :single => true)
|
|
10
|
+
@album.session = @facade.session
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
test "has a name" do
|
|
14
|
+
assert_equal "Only Life", @album.name
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test "has an id" do
|
|
18
|
+
assert_equal 2045356, @album.id
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test "has a url" do
|
|
22
|
+
assert_equal "http://www.last.fm/music/The+Feelies/Only+Life", @album.url
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test "has a release date" do
|
|
26
|
+
assert_equal Time.local(1987, 11, 30, 0, 0, 0), @album.release_date
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
test "has images" do
|
|
30
|
+
assert_equal 4, @album.images.size
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "has a musicbrainz id" do
|
|
34
|
+
assert_equal "464efacc-a133-4ae6-a9ff-7573c448eb32", @album.mbid
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test "has listeners" do
|
|
38
|
+
assert_equal 10068, @album.listeners
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test "has a play count" do
|
|
42
|
+
assert_equal 67545, @album.play_count
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
test "has tags" do
|
|
46
|
+
assert_equal 5, @album.tags.size
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
test "has an artist name" do
|
|
50
|
+
assert_equal "The Feelies", @album.artist_name
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
test "can be tagged by a user" do
|
|
54
|
+
@facade.expects(:add_tags).with("The Feelies", "Only Life", "tag1,tag2,tag3")
|
|
55
|
+
@album.add_tags("tag1", "tag2", "tag3")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test "can remove a user tag" do
|
|
59
|
+
@facade.expects(:remove_tag).with("The Feelies", "Only Life", "tag1")
|
|
60
|
+
@album.remove_tag("tag1")
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
require 'helper'
|
|
2
|
+
|
|
3
|
+
class ArtistTest < TestCase
|
|
4
|
+
include ProviderTestHelper
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
super
|
|
8
|
+
@artist = Model::Artist.parse(xml("artist_info"), :single => true)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "has a name" do
|
|
12
|
+
assert_equal "The Feelies", @artist.name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "has a url" do
|
|
16
|
+
assert_equal "http://www.last.fm/music/The+Feelies", @artist.url
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test "has a musicbrainz id" do
|
|
20
|
+
assert_equal "28c07254-aeae-42ad-beea-67f59c3c8baf", @artist.mbid
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "has listeners" do
|
|
24
|
+
assert_equal 43593, @artist.listeners
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
test "has a play count" do
|
|
28
|
+
assert_equal 498218, @artist.play_count
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test "has a biography and summary" do
|
|
32
|
+
assert @artist.biography
|
|
33
|
+
assert @artist.biography_summary
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
test "has images" do
|
|
37
|
+
assert_equal 3, @artist.images.size
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "has user tags" do
|
|
41
|
+
@artist.session = StubSession.new
|
|
42
|
+
expect_get "method=artist.getTags&artist=The%20Feelies", :tag_search
|
|
43
|
+
@artist.my_tags
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
test "has shouts" do
|
|
47
|
+
@artist.session = StubSession.new
|
|
48
|
+
expect_get "method=artist.getShouts&artist=The%20Feelies", :artist_shouts
|
|
49
|
+
assert_equal 104, @artist.shouts.size
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "can be shouted at" do
|
|
53
|
+
@facade.stubs(:session).returns(stub(:artist_facade => @facade))
|
|
54
|
+
@artist.session = @facade.session
|
|
55
|
+
@facade.expects(:shout).with("The Feelies", "Hi there").returns(xml("ok"))
|
|
56
|
+
@artist.shout("Hi there")
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
test "can be shared with other users or email addresses" do
|
|
60
|
+
@facade.stubs(:session).returns(stub(:artist_facade => @facade))
|
|
61
|
+
@artist.session = @facade.session
|
|
62
|
+
args = ["The Feelies", "roland@example.com,kate", {:message => "This is awesome!"}]
|
|
63
|
+
@facade.expects(:share).with(*args).returns(xml("ok"))
|
|
64
|
+
# TODO should be a user object, not just a username
|
|
65
|
+
@artist.share(["roland@example.com", "kate"], "This is awesome!")
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test "has events" do
|
|
69
|
+
@artist.session = StubSession.new
|
|
70
|
+
expect_get "method=artist.getEvents&artist=The%20Feelies", :venue_events
|
|
71
|
+
assert @artist.events.first.kind_of? Model::Event
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
test "has similar artists" do
|
|
75
|
+
@artist.session = StubSession.new
|
|
76
|
+
expect_get "method=artist.getSimilar&artist=The%20Feelies", :artist_search
|
|
77
|
+
assert @artist.similar.first.kind_of? Model::Artist
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
test "has albums" do
|
|
81
|
+
@artist.session = StubSession.new
|
|
82
|
+
expect_get "method=artist.getTopAlbums&artist=The%20Feelies", :album_search
|
|
83
|
+
assert @artist.albums.first.kind_of? Model::Album
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
test "has fans" do
|
|
87
|
+
@artist.session = StubSession.new
|
|
88
|
+
expect_get "method=artist.getTopFans&artist=The%20Feelies", :artist_top_fans
|
|
89
|
+
assert @artist.fans.first.kind_of? Model::User
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
test "has tags" do
|
|
93
|
+
@artist.session = StubSession.new
|
|
94
|
+
expect_get "method=artist.getTopTags&artist=The%20Feelies", :tag_search
|
|
95
|
+
assert @artist.tags.first.kind_of? Model::Tag
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
test "has tracks" do
|
|
99
|
+
@artist.session = StubSession.new
|
|
100
|
+
expect_get "method=artist.getTopTracks&artist=The%20Feelies", :track_search
|
|
101
|
+
assert @artist.tracks.first.kind_of? Model::Track
|
|
102
|
+
end
|
|
103
|
+
end
|