hallon 0.15.0 → 0.16.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/player_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
describe Hallon::Player do
|
3
|
-
let(:player) { Hallon::Player.new(
|
3
|
+
let(:player) { Hallon::Player.new(AudioDriverMock) }
|
4
4
|
let(:track) { Hallon::Track.new(mock_track) }
|
5
5
|
let(:driver) { player.instance_variable_get('@driver') }
|
6
6
|
let(:queue) { player.instance_variable_get('@queue') } # black box? WHAT?
|
@@ -1,14 +1,48 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
describe Hallon::PlaylistContainer do
|
3
|
-
|
3
|
+
let(:container) do
|
4
|
+
Hallon::PlaylistContainer.new(mock_containers[:default])
|
5
|
+
end
|
6
|
+
|
7
|
+
let(:empty_container) do
|
8
|
+
Hallon::PlaylistContainer.new(mock_containers[:empty])
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:empty_playlist) do
|
12
|
+
Hallon::Playlist.new(mock_playlists[:empty])
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:playlist) do
|
16
|
+
Hallon::Playlist.new(mock_playlists[:default])
|
17
|
+
end
|
4
18
|
|
5
|
-
|
19
|
+
specify { container.should be_a Hallon::Loadable }
|
6
20
|
|
7
|
-
|
21
|
+
describe "#loaded?" do
|
22
|
+
it "returns true if the playlist container is loaded" do
|
23
|
+
container.should be_loaded
|
24
|
+
end
|
25
|
+
end
|
8
26
|
|
9
|
-
|
10
|
-
|
11
|
-
|
27
|
+
describe "#owner" do
|
28
|
+
it "returns the playlist container’s owner" do
|
29
|
+
container.owner.should eq Hallon::User.new("burgestrand")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "returns nil if the playlist container is not loaded" do
|
33
|
+
empty_container.owner.should be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#size" do
|
38
|
+
it "returns the number of playlists inside the container" do
|
39
|
+
container.size.should eq 4
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns zero if the container is empty" do
|
43
|
+
empty_container.size.should eq 0
|
44
|
+
end
|
45
|
+
end
|
12
46
|
|
13
47
|
describe "#add" do
|
14
48
|
context "given a string that’s not a valid spotify playlist uri" do
|
@@ -29,7 +63,7 @@ describe Hallon::PlaylistContainer do
|
|
29
63
|
context "given a string that’s a valid spotify playlist uri" do
|
30
64
|
it "should add the existing Playlist at the end of the container" do
|
31
65
|
playlist_uri = "spotify:user:burgestrand:playlist:07AX9IY9Hqmj1RqltcG0fi"
|
32
|
-
playlist =
|
66
|
+
playlist = Hallon::Playlist.new(playlist_uri)
|
33
67
|
|
34
68
|
expect do
|
35
69
|
new_playlist = container.add(playlist_uri)
|
@@ -169,13 +203,31 @@ describe Hallon::PlaylistContainer do
|
|
169
203
|
end
|
170
204
|
|
171
205
|
describe Hallon::PlaylistContainer::Folder do
|
172
|
-
|
173
|
-
|
206
|
+
let(:folder) { container.contents[1] }
|
207
|
+
|
208
|
+
describe "#id" do
|
209
|
+
it "returns the folder’s ID" do
|
210
|
+
folder.id.should eq 1337
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe "#name" do
|
215
|
+
it "returns the folder’s name" do
|
216
|
+
folder.name.should eq "Boogie"
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
describe "#begin" do
|
221
|
+
it "returns the folder’s starting index" do
|
222
|
+
folder.begin.should eq 1
|
223
|
+
end
|
224
|
+
end
|
174
225
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
226
|
+
describe "#end" do
|
227
|
+
it "returns the folder’s ending index" do
|
228
|
+
folder.end.should eq 3
|
229
|
+
end
|
230
|
+
end
|
179
231
|
|
180
232
|
describe "#moved?" do
|
181
233
|
it "should return true if the folder has moved" do
|
@@ -222,4 +274,35 @@ describe Hallon::PlaylistContainer do
|
|
222
274
|
end
|
223
275
|
end
|
224
276
|
end
|
277
|
+
|
278
|
+
describe "#unseen_tracks_count_for" do
|
279
|
+
it "returns the number of unseen tracks for the given playlist" do
|
280
|
+
container.unseen_tracks_count_for(playlist).should eq 4
|
281
|
+
end
|
282
|
+
|
283
|
+
it "raises an error if the result was an error" do
|
284
|
+
expect { container.unseen_tracks_count_for(empty_playlist) }.to raise_error(Hallon::OperationFailedError)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
describe "#unseen_tracks_for" do
|
289
|
+
it "returns an array of unseen tracks" do
|
290
|
+
container.unseen_tracks_for(playlist).should eq playlist.tracks.to_a
|
291
|
+
end
|
292
|
+
|
293
|
+
it "returns an array of unseen tracks, no bigger than the given count" do
|
294
|
+
container.unseen_tracks_for(playlist, 2).should eq playlist.tracks.to_a[0, 2]
|
295
|
+
end
|
296
|
+
|
297
|
+
it "raises an error if the result was an error (but count was not)" do
|
298
|
+
Spotify.should_receive(:playlistcontainer_get_unseen_tracks).and_return(4, -1)
|
299
|
+
expect { container.unseen_tracks_for(empty_playlist) }.to raise_error(Hallon::OperationFailedError)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
describe "#clear_unseen_tracks_for" do
|
304
|
+
it "raises an error if the operation failed" do
|
305
|
+
expect { container.clear_unseen_tracks_for(empty_playlist) }.to raise_error(Hallon::OperationFailedError)
|
306
|
+
end
|
307
|
+
end
|
225
308
|
end
|
@@ -2,16 +2,19 @@
|
|
2
2
|
require 'time'
|
3
3
|
|
4
4
|
describe Hallon::Playlist do
|
5
|
-
|
5
|
+
let(:playlist) do
|
6
|
+
Hallon::Playlist.new(mock_playlists[:default])
|
7
|
+
end
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
let(:described_class) { stub_session(Hallon::Playlist) }
|
9
|
+
let(:empty_playlist) do
|
10
|
+
Hallon::Playlist.new(mock_playlists[:empty])
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
specify { playlist.should be_a Hallon::Loadable }
|
14
|
+
|
15
|
+
it_should_behave_like "a Linkable object" do
|
16
|
+
let(:spotify_uri) { "spotify:user:burgestrand:playlist:07AX9IY9Hqmj1RqltcG0fi" }
|
17
|
+
let(:described_class) { Hallon::Playlist }
|
15
18
|
end
|
16
19
|
|
17
20
|
describe ".invalid_name?" do
|
@@ -28,31 +31,164 @@ describe Hallon::Playlist do
|
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
describe "#loaded?" do
|
35
|
+
it "is true when the playlist is loaded" do
|
36
|
+
playlist.should be_loaded
|
37
|
+
end
|
38
|
+
|
39
|
+
it "is false when the playlist is not loaded" do
|
40
|
+
empty_playlist.should_not be_loaded
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#name" do
|
45
|
+
it "returns the playlist’s name as a string" do
|
46
|
+
playlist.name.should eq "Megaplaylist"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "returns an empty string when the playlist is not loaded" do
|
50
|
+
empty_playlist.name.should be_empty
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#owner" do
|
55
|
+
it "returns the playlist’s owner" do
|
56
|
+
playlist.owner.should eq Hallon::User.new(mock_user)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns nil when the playlist is not loaded" do
|
60
|
+
empty_playlist.owner.should be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#description" do
|
65
|
+
it "returns the playlist’s description" do
|
66
|
+
playlist.description.should eq "Playlist description...?"
|
67
|
+
end
|
68
|
+
|
69
|
+
it "returns an empty string if the playlist is not loaded" do
|
70
|
+
empty_playlist.description.should be_empty
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#image" do
|
75
|
+
it "returns the playlists’s image as an image" do
|
76
|
+
playlist.image.should eq Hallon::Image.new("spotify:image:3ad93423add99766e02d563605c6e76ed2b0e400")
|
77
|
+
end
|
78
|
+
|
79
|
+
it "returns nil if the playlist is not loaded" do
|
80
|
+
empty_playlist.image.should be_nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#total_subscribers" do
|
85
|
+
it "returns the total number of subscribers to the playlist" do
|
86
|
+
playlist.total_subscribers.should eq 1000
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns zero if the playlist is not loaded" do
|
90
|
+
empty_playlist.total_subscribers.should eq 0
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#sync_progress" do
|
95
|
+
it "returns the completed percentage of the playlist download" do
|
96
|
+
playlist.sync_progress.should eq 67
|
97
|
+
end
|
98
|
+
|
99
|
+
it "returns zero if the playlist is not loaded" do
|
100
|
+
empty_playlist.sync_progress.should eq 0
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "#size" do
|
105
|
+
it "returns the number of tracks in the playlist" do
|
106
|
+
playlist.size.should eq 4
|
107
|
+
end
|
108
|
+
|
109
|
+
it "returns zero if the playlist is not loaded" do
|
110
|
+
empty_playlist.size.should eq 0
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#collaborative?" do
|
115
|
+
it "is true when the playlist is set to be collaborative" do
|
116
|
+
playlist.should be_collaborative
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#pending?" do
|
121
|
+
it "is false when the playlist does not have pending updates" do
|
122
|
+
playlist.should_not be_pending
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "#in_ram?" do
|
127
|
+
it "is true when the playlist is loaded in memory" do
|
128
|
+
playlist.should be_in_ram
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#available_offline?" do
|
133
|
+
it "is false when the playlist is not enabled for offline use" do
|
134
|
+
playlist.should_not be_available_offline
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe "#tracks" do
|
139
|
+
it "returns an enumerator of the playlist’s tracks" do
|
140
|
+
playlist.tracks.to_a.should eq instantiate(Hallon::Playlist::Track, *(0...4).map { |index| [Spotify.playlist_track!(playlist.pointer, index), playlist.pointer, index] })
|
141
|
+
end
|
142
|
+
|
143
|
+
it "returns an empty enumerator if the playlist has no tracks" do
|
144
|
+
empty_playlist.tracks.should be_empty
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "#tracks entries" do
|
149
|
+
let(:track) do
|
150
|
+
playlist.tracks[0]
|
151
|
+
end
|
152
|
+
|
153
|
+
let(:empty_track) do
|
154
|
+
playlist.tracks[3]
|
155
|
+
end
|
156
|
+
|
157
|
+
describe "#seen?" do
|
158
|
+
it "returns true if the track is seen" do
|
159
|
+
track.should be_seen
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "#create_time" do
|
164
|
+
it "returns the time the track was added to the playlist" do
|
165
|
+
track.added_at.should eq Time.parse("2009-11-04")
|
166
|
+
end
|
36
167
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
its(:total_subscribers) { should eq 1000 }
|
42
|
-
its(:sync_progress) { stub_session { should eq 67 } }
|
43
|
-
its(:size) { should eq 4 }
|
168
|
+
it "returns the time in UTC" do
|
169
|
+
track.added_at.utc_offset.should eq 0
|
170
|
+
end
|
171
|
+
end
|
44
172
|
|
45
|
-
|
46
|
-
|
173
|
+
describe "#creator" do
|
174
|
+
it "returns the track’s creator" do
|
175
|
+
track.adder.should eq Hallon::User.new(mock_user)
|
176
|
+
end
|
47
177
|
|
48
|
-
|
49
|
-
|
50
|
-
|
178
|
+
it "returns nil if there is no track creator available" do
|
179
|
+
empty_track.adder.should be_nil
|
180
|
+
end
|
181
|
+
end
|
51
182
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
183
|
+
describe "#message" do
|
184
|
+
it "returns the message attached to the track" do
|
185
|
+
track.message.should eq "message this, YO!"
|
186
|
+
end
|
187
|
+
|
188
|
+
it "returns an empty message if there is none for the given track" do
|
189
|
+
empty_track.message.should be_empty
|
190
|
+
end
|
191
|
+
end
|
56
192
|
|
57
193
|
describe "#seen=" do
|
58
194
|
it "should raise an error if the track has moved" do
|
@@ -78,34 +214,33 @@ describe Hallon::Playlist do
|
|
78
214
|
end
|
79
215
|
end
|
80
216
|
|
81
|
-
describe "#upload"
|
217
|
+
describe "#upload" do
|
82
218
|
around(:each) do |example|
|
83
|
-
Timeout.timeout(1
|
219
|
+
Timeout.timeout(1, SlowTestError, &example)
|
84
220
|
end
|
85
221
|
|
86
222
|
it "should raise an error if the playlist takes too long to load" do
|
87
223
|
playlist.stub(:pending? => true)
|
88
|
-
expect { playlist.upload(0.
|
224
|
+
expect { playlist.upload(0.1) }.to raise_error(Hallon::TimeoutError)
|
89
225
|
end
|
90
226
|
end
|
91
227
|
|
92
228
|
describe "#subscribers" do
|
93
229
|
it "should return an array of names for the subscribers" do
|
94
|
-
|
230
|
+
playlist.subscribers.should eq %w[Kim Elin Ylva]
|
95
231
|
end
|
96
232
|
|
97
233
|
it "should return an empty array when there are no subscribers" do
|
98
234
|
Spotify.should_receive(:playlist_subscribers).and_return(mock_empty_subscribers)
|
99
|
-
|
235
|
+
playlist.subscribers.should eq []
|
100
236
|
end
|
101
237
|
|
102
|
-
it "should return
|
103
|
-
|
104
|
-
playlist.subscribers.should be_nil
|
238
|
+
it "should return an empty array when subscriber fetching failed" do
|
239
|
+
empty_playlist.subscribers.should eq []
|
105
240
|
end
|
106
241
|
end
|
107
242
|
|
108
|
-
describe "#insert"
|
243
|
+
describe "#insert" do
|
109
244
|
let(:tracks) { instantiate(Hallon::Track, mock_track, mock_track_two) }
|
110
245
|
|
111
246
|
it "should add the given tracks to the playlist at correct index" do
|
@@ -192,7 +327,7 @@ describe Hallon::Playlist do
|
|
192
327
|
end
|
193
328
|
end
|
194
329
|
|
195
|
-
describe "#in_ram="
|
330
|
+
describe "#in_ram=" do
|
196
331
|
it "should set in_ram status" do
|
197
332
|
playlist.should be_in_ram
|
198
333
|
playlist.in_ram = false
|
@@ -200,7 +335,7 @@ describe Hallon::Playlist do
|
|
200
335
|
end
|
201
336
|
end
|
202
337
|
|
203
|
-
describe "#offline_mode="
|
338
|
+
describe "#offline_mode=" do
|
204
339
|
it "should set offline mode" do
|
205
340
|
playlist.should_not be_available_offline
|
206
341
|
playlist.offline_mode = true
|
@@ -208,7 +343,7 @@ describe Hallon::Playlist do
|
|
208
343
|
end
|
209
344
|
end
|
210
345
|
|
211
|
-
describe "#update_subscribers"
|
346
|
+
describe "#update_subscribers" do
|
212
347
|
it "should ask libspotify to update the subscribers" do
|
213
348
|
expect { playlist.update_subscribers }.to_not raise_error
|
214
349
|
end
|
@@ -218,29 +353,29 @@ describe Hallon::Playlist do
|
|
218
353
|
end
|
219
354
|
end
|
220
355
|
|
221
|
-
describe "offline status methods"
|
356
|
+
describe "offline status methods" do
|
222
357
|
def symbol_for(number)
|
223
358
|
Spotify.enum_type(:playlist_offline_status)[number]
|
224
359
|
end
|
225
360
|
|
226
361
|
specify "#available_offline?" do
|
227
362
|
Spotify.should_receive(:playlist_get_offline_status).and_return symbol_for(1)
|
228
|
-
should be_available_offline
|
363
|
+
playlist.should be_available_offline
|
229
364
|
end
|
230
365
|
|
231
366
|
specify "#syncing?" do
|
232
367
|
Spotify.should_receive(:playlist_get_offline_status).and_return symbol_for(2)
|
233
|
-
should be_syncing
|
368
|
+
playlist.should be_syncing
|
234
369
|
end
|
235
370
|
|
236
371
|
specify "#waiting?" do
|
237
372
|
Spotify.should_receive(:playlist_get_offline_status).and_return symbol_for(3)
|
238
|
-
should be_waiting
|
373
|
+
playlist.should be_waiting
|
239
374
|
end
|
240
375
|
|
241
376
|
specify "#offline_mode?" do
|
242
377
|
Spotify.should_receive(:playlist_get_offline_status).and_return symbol_for(0)
|
243
|
-
should_not be_offline_mode
|
378
|
+
playlist.should_not be_offline_mode
|
244
379
|
end
|
245
380
|
end
|
246
381
|
end
|