hallon 0.15.0 → 0.16.0
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/CHANGELOG.md +40 -0
- data/README.markdown +1 -1
- data/dev/application_key_converter.rb +11 -0
- data/examples/example_support.rb +4 -0
- data/examples/playing_audio.rb +1 -1
- data/lib/hallon.rb +11 -0
- data/lib/hallon/album_browse.rb +3 -3
- data/lib/hallon/artist_browse.rb +20 -4
- data/lib/hallon/blob.rb +11 -0
- data/lib/hallon/enumerator.rb +5 -0
- data/lib/hallon/ext/spotify.rb +2 -0
- data/lib/hallon/image.rb +7 -1
- data/lib/hallon/link.rb +5 -2
- data/lib/hallon/observable.rb +48 -1
- data/lib/hallon/player.rb +15 -26
- data/lib/hallon/playlist.rb +16 -25
- data/lib/hallon/playlist_container.rb +38 -0
- data/lib/hallon/search.rb +75 -4
- data/lib/hallon/session.rb +31 -42
- data/lib/hallon/toplist.rb +3 -3
- data/lib/hallon/track.rb +28 -10
- data/lib/hallon/version.rb +1 -1
- data/spec/hallon/album_browse_spec.rb +68 -18
- data/spec/hallon/album_spec.rb +62 -27
- data/spec/hallon/artist_browse_spec.rb +106 -31
- data/spec/hallon/artist_spec.rb +32 -18
- data/spec/hallon/blob_spec.rb +6 -0
- data/spec/hallon/enumerator_spec.rb +10 -0
- data/spec/hallon/error_spec.rb +4 -4
- data/spec/hallon/hallon_spec.rb +1 -1
- data/spec/hallon/image_spec.rb +58 -47
- data/spec/hallon/link_spec.rb +51 -43
- data/spec/hallon/observable/album_browse_spec.rb +1 -1
- data/spec/hallon/observable/artist_browse_spec.rb +1 -1
- data/spec/hallon/observable/image_spec.rb +1 -1
- data/spec/hallon/observable/playlist_container_spec.rb +4 -4
- data/spec/hallon/observable/playlist_spec.rb +14 -14
- data/spec/hallon/observable/post_spec.rb +1 -1
- data/spec/hallon/observable/search_spec.rb +1 -1
- data/spec/hallon/observable/session_spec.rb +17 -17
- data/spec/hallon/observable/toplist_spec.rb +1 -1
- data/spec/hallon/observable_spec.rb +40 -6
- data/spec/hallon/player_spec.rb +1 -1
- data/spec/hallon/playlist_container_spec.rb +96 -13
- data/spec/hallon/playlist_spec.rb +180 -45
- data/spec/hallon/search_spec.rb +211 -28
- data/spec/hallon/session_spec.rb +44 -38
- data/spec/hallon/toplist_spec.rb +31 -14
- data/spec/hallon/track_spec.rb +159 -50
- data/spec/hallon/user_post_spec.rb +10 -5
- data/spec/hallon/user_spec.rb +60 -50
- data/spec/spec_helper.rb +40 -15
- data/spec/support/album_mocks.rb +30 -0
- data/spec/support/artist_mocks.rb +36 -0
- data/spec/support/common_objects.rb +0 -201
- data/spec/support/image_mocks.rb +34 -0
- data/spec/support/playlist_container_mocks.rb +36 -0
- data/spec/support/playlist_mocks.rb +70 -0
- data/spec/support/search_mocks.rb +23 -0
- data/spec/support/session_mocks.rb +33 -0
- data/spec/support/toplist_mocks.rb +19 -0
- data/spec/support/track_mocks.rb +28 -0
- data/spec/support/user_mocks.rb +20 -0
- metadata +40 -18
- data/spec/support/context_stub_session.rb +0 -5
data/spec/hallon/album_spec.rb
CHANGED
@@ -1,59 +1,94 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
#
|
3
3
|
describe Hallon::Album do
|
4
|
-
|
4
|
+
let(:album) do
|
5
|
+
Hallon::Album.new(mock_albums[:default])
|
6
|
+
end
|
7
|
+
|
8
|
+
let(:empty_album) do
|
9
|
+
Hallon::Album.new(mock_albums[:empty])
|
10
|
+
end
|
11
|
+
|
12
|
+
specify { album.should be_a Hallon::Loadable }
|
5
13
|
|
6
14
|
it_should_behave_like "a Linkable object" do
|
7
15
|
let(:spotify_uri) { "spotify:album:1xvnWMz2PNFf7mXOSRuLws" }
|
8
16
|
end
|
9
17
|
|
10
|
-
|
11
|
-
|
18
|
+
describe ".types" do
|
19
|
+
subject { Hallon::Album.types }
|
12
20
|
|
13
|
-
|
14
|
-
|
15
|
-
its(:type) { should be :single }
|
16
|
-
its(:browse) do
|
17
|
-
mock_session { should eq Hallon::AlbumBrowse.new(album) }
|
21
|
+
it { should be_an Array }
|
22
|
+
it { should include :single }
|
18
23
|
end
|
19
24
|
|
20
|
-
|
21
|
-
|
25
|
+
describe "#name" do
|
26
|
+
it "returns the album’s name" do
|
27
|
+
album.name.should eq "Finally Woken"
|
28
|
+
end
|
22
29
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
30
|
+
it "returns an empty string if the album is not loaded" do
|
31
|
+
empty_album.name.should be_empty
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#release_year" do
|
36
|
+
it "returns the album’s release year" do
|
37
|
+
album.release_year.should eq 2004
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#type" do
|
42
|
+
it "returns the album’s type" do
|
43
|
+
album.type.should eq :single
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#browse" do
|
48
|
+
it "returns the album’s browser object" do
|
49
|
+
album.browse.should eq Hallon::AlbumBrowse.new(album)
|
27
50
|
end
|
51
|
+
end
|
28
52
|
|
53
|
+
describe "#available?" do
|
54
|
+
it "returns true when the album is available" do
|
55
|
+
album.should be_available
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#loaded?" do
|
60
|
+
it "returns true when the album is loaded" do
|
61
|
+
album.should be_loaded
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "artist" do
|
29
66
|
it "should be an artist if it exists" do
|
30
67
|
album.artist.should eq Hallon::Artist.new(mock_artist)
|
31
68
|
end
|
32
|
-
end
|
33
69
|
|
34
|
-
|
35
|
-
|
36
|
-
Spotify.should_receive(:album_cover).and_return(null_pointer)
|
37
|
-
album.cover.should be_nil
|
70
|
+
it "should be nil if there is no artist" do
|
71
|
+
empty_album.artist.should be_nil
|
38
72
|
end
|
73
|
+
end
|
39
74
|
|
75
|
+
describe "#cover" do
|
40
76
|
it "should be an image if it exists" do
|
41
|
-
|
77
|
+
album.cover.should eq Hallon::Image.new(mock_image_id)
|
42
78
|
end
|
43
|
-
end
|
44
79
|
|
45
|
-
describe "#cover_link" do
|
46
80
|
it "should be nil if there is no image" do
|
47
|
-
|
48
|
-
album.cover_link.should be_nil
|
81
|
+
empty_album.cover.should be_nil
|
49
82
|
end
|
83
|
+
end
|
50
84
|
|
85
|
+
describe "#cover_link" do
|
51
86
|
it "should be a link if it exists" do
|
52
87
|
album.cover_link.should eq Hallon::Link.new("spotify:image:3ad93423add99766e02d563605c6e76ed2b0e400")
|
53
88
|
end
|
54
|
-
end
|
55
89
|
|
56
|
-
|
57
|
-
|
90
|
+
it "should be nil if there is no image" do
|
91
|
+
empty_album.cover_link.should be_nil
|
92
|
+
end
|
58
93
|
end
|
59
94
|
end
|
@@ -1,11 +1,22 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
|
2
3
|
describe Hallon::ArtistBrowse do
|
3
|
-
|
4
|
+
let(:browse) do
|
5
|
+
artist = Hallon::Artist.new(mock_artists[:default])
|
6
|
+
Hallon::ArtistBrowse.new(artist)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:empty_browse) do
|
10
|
+
artist = Hallon::Artist.new(mock_artists[:empty])
|
11
|
+
Hallon::ArtistBrowse.new(artist)
|
12
|
+
end
|
13
|
+
|
14
|
+
specify { browse.should be_a Hallon::Loadable }
|
4
15
|
|
5
16
|
describe ".new" do
|
6
17
|
it "should raise an error if the browse request failed" do
|
7
18
|
Spotify.should_receive(:artistbrowse_create).and_return(null_pointer)
|
8
|
-
expect {
|
19
|
+
expect { Hallon::ArtistBrowse.new(mock_artist) }.to raise_error(FFI::NullPointerError)
|
9
20
|
end
|
10
21
|
|
11
22
|
it "should raise an error given a non-album spotify pointer" do
|
@@ -13,48 +24,112 @@ describe Hallon::ArtistBrowse do
|
|
13
24
|
end
|
14
25
|
end
|
15
26
|
|
16
|
-
|
17
|
-
|
18
|
-
|
27
|
+
describe '.types' do
|
28
|
+
subject { Hallon::ArtistBrowse.types }
|
29
|
+
|
30
|
+
it { should be_an Array }
|
31
|
+
it { should include :full }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#loaded?" do
|
35
|
+
it "is true when the artist browser is loaded" do
|
36
|
+
browse.should be_loaded
|
37
|
+
end
|
19
38
|
end
|
20
39
|
|
21
|
-
|
40
|
+
describe "#status" do
|
41
|
+
it "returns the artist browser’s status" do
|
42
|
+
browse.status.should eq :ok
|
43
|
+
end
|
44
|
+
end
|
22
45
|
|
23
|
-
|
24
|
-
|
25
|
-
|
46
|
+
describe "#biography" do
|
47
|
+
it "returns the artist’s biography" do
|
48
|
+
browse.biography.should eq 'grew up in DA BLOCK'
|
49
|
+
end
|
26
50
|
|
27
|
-
|
28
|
-
|
29
|
-
|
51
|
+
it "returns an empty string when the artist browser is not loaded" do
|
52
|
+
empty_browse.biography.should be_empty
|
53
|
+
end
|
30
54
|
end
|
31
55
|
|
32
|
-
|
33
|
-
|
56
|
+
describe "#artist" do
|
57
|
+
it "returns the artist" do
|
58
|
+
browse.artist.should eq Hallon::Artist.new(mock_artists[:default])
|
59
|
+
end
|
34
60
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
its('similar_artists.size') { should eq 2 }
|
40
|
-
its('similar_artists.to_a') { should eq [mock_artist, mock_artist_two].map{ |p| Hallon::Artist.new(p) } }
|
41
|
-
its(:biography) { should eq 'grew up in DA BLOCK' }
|
61
|
+
it "returns nil if the artist browser is not loaded" do
|
62
|
+
empty_browse.artist.should be_nil
|
63
|
+
end
|
64
|
+
end
|
42
65
|
|
43
|
-
describe "#
|
44
|
-
it "
|
45
|
-
browse.
|
66
|
+
describe "#portraits" do
|
67
|
+
it "returns an enumerator of the artist’s portraits" do
|
68
|
+
browse.portraits.to_a.should eq instantiate(Hallon::Image, mock_image_id, mock_image_id)
|
46
69
|
end
|
47
70
|
|
48
|
-
it "
|
49
|
-
|
50
|
-
browse.request_duration.should be_nil
|
71
|
+
it "returns an empty enumerator when the artist browser is not loaded" do
|
72
|
+
empty_browse.portraits.size.should eq 0
|
51
73
|
end
|
52
74
|
end
|
53
75
|
|
54
|
-
describe
|
55
|
-
|
76
|
+
describe "#portrait_links" do
|
77
|
+
it "returns an enumerator of the artist’s portrait links" do
|
78
|
+
browse.portrait_links.to_a.should eq instantiate(Hallon::Link, mock_image_link, mock_image_link)
|
79
|
+
end
|
56
80
|
|
57
|
-
it
|
58
|
-
|
81
|
+
it "returns an empty enumerator when the artist browser is not loaded" do
|
82
|
+
empty_browse.portrait_links.size.should eq 0
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#tracks" do
|
87
|
+
it "returns an enumerator of the artist’s tracks" do
|
88
|
+
browse.tracks.to_a.should eq instantiate(Hallon::Track, mock_track, mock_track_two)
|
89
|
+
end
|
90
|
+
|
91
|
+
it "returns an empty enumerator when the artist browser is not loaded" do
|
92
|
+
empty_browse.tracks.size.should eq 0
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "#albums" do
|
97
|
+
it "returns an enumerator of the artist’s albums" do
|
98
|
+
browse.albums.to_a.should eq instantiate(Hallon::Album, mock_album)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "returns an empty enumerator when the artist browser is not loaded" do
|
102
|
+
empty_browse.albums.size.should eq 0
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "#similar_artists" do
|
107
|
+
it "returns an enumerator of the artist’s albums" do
|
108
|
+
browse.similar_artists.to_a.should eq instantiate(Hallon::Artist, mock_artist, mock_artist_two)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns an empty enumerator when the artist browser is not loaded" do
|
112
|
+
empty_browse.similar_artists.size.should eq 0
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#top_hits" do
|
117
|
+
it "returns an enumerator of the artist’s top hits" do
|
118
|
+
browse.top_hits.to_a.should eq instantiate(Hallon::Track, mock_track)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "returns an empty enumerator when the artist browser is not loaded" do
|
122
|
+
empty_browse.top_hits.should be_empty
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "#request_duration" do
|
127
|
+
it "should return the request duration in seconds" do
|
128
|
+
browse.request_duration.should eq 2.751
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should be zero if the request was fetched from local cache" do
|
132
|
+
empty_browse.request_duration.should eq 0
|
133
|
+
end
|
59
134
|
end
|
60
135
|
end
|
data/spec/hallon/artist_spec.rb
CHANGED
@@ -1,20 +1,38 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
describe Hallon::Artist do
|
3
|
-
|
3
|
+
let(:artist) do
|
4
|
+
Hallon::Artist.new(mock_artists[:default])
|
5
|
+
end
|
6
|
+
|
7
|
+
let(:empty_artist) do
|
8
|
+
Hallon::Artist.new(mock_artists[:empty])
|
9
|
+
end
|
10
|
+
|
11
|
+
specify { artist.should be_a Hallon::Loadable }
|
4
12
|
|
5
13
|
it_should_behave_like "a Linkable object" do
|
6
14
|
let(:spotify_uri) { "spotify:artist:3bftcFwl4vqRNNORRsqm1G" }
|
7
15
|
end
|
8
16
|
|
9
|
-
|
10
|
-
|
17
|
+
describe "#loaded?" do
|
18
|
+
it "returns true when the artist is loaded" do
|
19
|
+
artist.should be_loaded
|
20
|
+
end
|
21
|
+
end
|
11
22
|
|
12
|
-
|
13
|
-
|
23
|
+
describe "#name" do
|
24
|
+
it "returns the artist’s name" do
|
25
|
+
artist.name.should eq "Jem"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "returns an empty string if the artist is not loaded" do
|
29
|
+
empty_artist.name.should be_empty
|
30
|
+
end
|
31
|
+
end
|
14
32
|
|
15
33
|
describe "#browse" do
|
16
34
|
it "should return an artist browsing object" do
|
17
|
-
|
35
|
+
artist.browse.should eq Hallon::ArtistBrowse.new(mock_artist)
|
18
36
|
end
|
19
37
|
|
20
38
|
it "should default to full browsing" do
|
@@ -29,26 +47,22 @@ describe Hallon::Artist do
|
|
29
47
|
end
|
30
48
|
|
31
49
|
describe "#portrait" do
|
32
|
-
let(:link) { Hallon::Link.new(mock_image_uri) }
|
33
|
-
|
34
|
-
it "should be nil if an image is not available" do
|
35
|
-
Spotify.should_receive(:artist_portrait).and_return(null_pointer)
|
36
|
-
artist.portrait.should be_nil
|
37
|
-
end
|
38
|
-
|
39
50
|
it "should be an image if it exists" do
|
40
|
-
|
51
|
+
artist.portrait.should eq Hallon::Image.new(mock_image_id)
|
41
52
|
end
|
42
|
-
end
|
43
53
|
|
44
|
-
describe "#portrait_link" do
|
45
54
|
it "should be nil if an image is not available" do
|
46
|
-
|
47
|
-
artist.portrait_link.should be_nil
|
55
|
+
empty_artist.portrait.should be_nil
|
48
56
|
end
|
57
|
+
end
|
49
58
|
|
59
|
+
describe "#portrait_link" do
|
50
60
|
it "should be a link if it exists" do
|
51
61
|
artist.portrait_link.should eq Hallon::Link.new(mock_image_uri)
|
52
62
|
end
|
63
|
+
|
64
|
+
it "should be nil if an image is not available" do
|
65
|
+
empty_artist.portrait_link.should be_nil
|
66
|
+
end
|
53
67
|
end
|
54
68
|
end
|
@@ -50,6 +50,16 @@ describe Hallon::Enumerator do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
+
describe "#empty?" do
|
54
|
+
it "returns true if the enumerator is empty" do
|
55
|
+
enumerator(0).should be_empty
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns false if the enumerator is not empty" do
|
59
|
+
enum.should_not be_empty
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
53
63
|
describe "#[]" do
|
54
64
|
it "should return nil if #[x] is not within the enumerators’ size (no matter if the value exists or not)" do
|
55
65
|
enum.should_receive(:size).and_return(1)
|
data/spec/hallon/error_spec.rb
CHANGED
@@ -3,7 +3,7 @@ describe Hallon::Error do
|
|
3
3
|
|
4
4
|
it { should <= RuntimeError }
|
5
5
|
|
6
|
-
describe "
|
6
|
+
describe ".disambiguate" do
|
7
7
|
it "should not fail on invalid numbers" do
|
8
8
|
subject.disambiguate(10000).should eq [-1, nil]
|
9
9
|
end
|
@@ -13,7 +13,7 @@ describe Hallon::Error do
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
describe "
|
16
|
+
describe ".explain" do
|
17
17
|
it "should work properly given an integer" do
|
18
18
|
subject.explain(0).should eq 'sp_error: 0'
|
19
19
|
end
|
@@ -23,7 +23,7 @@ describe Hallon::Error do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
describe "
|
26
|
+
describe ".maybe_raise" do
|
27
27
|
it "should not raise error when given 0 as error code" do
|
28
28
|
expect { subject.maybe_raise(0) }.to_not raise_error
|
29
29
|
end
|
@@ -47,7 +47,7 @@ describe Hallon::Error do
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
describe "
|
50
|
+
describe ".table" do
|
51
51
|
it "should return a hash of symbol to integer" do
|
52
52
|
Hallon::Error.table[:ok].should eq 0
|
53
53
|
end
|
data/spec/hallon/hallon_spec.rb
CHANGED
data/spec/hallon/image_spec.rb
CHANGED
@@ -2,76 +2,87 @@
|
|
2
2
|
require 'ostruct'
|
3
3
|
|
4
4
|
describe Hallon::Image do
|
5
|
-
|
5
|
+
let(:image) do
|
6
|
+
Hallon::Image.new(mock_image)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:empty_image) do
|
10
|
+
Hallon::Image.new(mock_empty_image)
|
11
|
+
end
|
6
12
|
|
7
13
|
it_should_behave_like "a Linkable object" do
|
8
14
|
let(:spotify_uri) { "spotify:image:#{mock_image_hex}" }
|
9
15
|
let(:custom_object) { mock_image_hex }
|
16
|
+
let(:described_class) { Hallon::Image }
|
17
|
+
end
|
10
18
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
19
|
+
specify { image.should be_a Hallon::Loadable }
|
20
|
+
|
21
|
+
describe "#loaded?" do
|
22
|
+
it "returns true when the image is loaded" do
|
23
|
+
image.should be_loaded
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
21
|
-
describe "
|
22
|
-
|
23
|
-
|
27
|
+
describe "#status" do
|
28
|
+
it "returns the image’s status" do
|
29
|
+
image.status.should eq :ok
|
30
|
+
end
|
31
|
+
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
describe "#format" do
|
34
|
+
it "returns the image’s format" do
|
35
|
+
image.format.should eq :jpeg
|
36
|
+
end
|
37
|
+
end
|
28
38
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
39
|
+
describe "#id" do
|
40
|
+
it "returns the image id as a hexadecimal string" do
|
41
|
+
image.id.should eq mock_image_hex
|
33
42
|
end
|
43
|
+
end
|
34
44
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
45
|
+
describe "#raw_id" do
|
46
|
+
it "returns the image id as a binary string" do
|
47
|
+
image.raw_id.should eq mock_image_id
|
39
48
|
end
|
49
|
+
end
|
40
50
|
|
41
|
-
|
42
|
-
|
51
|
+
describe "#data" do
|
52
|
+
it "returns the image’s data" do
|
53
|
+
image.data.should eq File.open(fixture_image_path, 'r:binary', &:read)
|
54
|
+
end
|
43
55
|
|
44
|
-
|
45
|
-
|
46
|
-
|
56
|
+
it "has a binary encoding" do
|
57
|
+
image.data.encoding.name.should eq 'ASCII-8BIT'
|
58
|
+
end
|
47
59
|
|
48
|
-
|
49
|
-
|
50
|
-
end
|
60
|
+
it "returns an empty string if the image is not loaded" do
|
61
|
+
empty_image.data.should be_empty
|
51
62
|
end
|
63
|
+
end
|
52
64
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
65
|
+
describe "#to_link" do
|
66
|
+
it "should retrieve the Spotify URI" do
|
67
|
+
image.to_link.should eq Hallon::Link.new("spotify:image:#{image.id}")
|
57
68
|
end
|
69
|
+
end
|
58
70
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
71
|
+
describe "#===" do
|
72
|
+
it "should compare ids (but only if other is an Image)" do
|
73
|
+
other = double
|
74
|
+
other.should_receive(:is_a?).with(Hallon::Image).and_return(true)
|
75
|
+
other.should_receive(:raw_id).and_return(image.raw_id)
|
64
76
|
|
65
|
-
|
66
|
-
|
67
|
-
|
77
|
+
image.should eq other
|
78
|
+
image.should_not eq double
|
79
|
+
end
|
68
80
|
|
69
|
-
|
70
|
-
|
71
|
-
|
81
|
+
it "should not call #id if other is not an image" do
|
82
|
+
other = double
|
83
|
+
other.should_not_receive(:raw_id)
|
72
84
|
|
73
|
-
|
74
|
-
end
|
85
|
+
image.should_not eq other
|
75
86
|
end
|
76
87
|
end
|
77
88
|
end
|