helix 0.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,419 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'helix'
3
+
4
+ describe Helix::Config do
5
+
6
+ def set_stubs(obj, even_sig=false)
7
+ obj.instance_variable_set(:@attributes, {})
8
+ obj.stub(:media_type_sym) { :video }
9
+ obj.stub(:plural_media_type) { 'videos' }
10
+ obj.stub(:guid) { 'some_guid' }
11
+ obj.stub(:signature) { 'some_sig' } if even_sig
12
+ end
13
+
14
+ let(:klass) { Helix::Config }
15
+ let(:obj) { klass.instance }
16
+
17
+ subject { klass }
18
+
19
+ its(:ancestors) { should include(Singleton) }
20
+
21
+ describe "Constants" do
22
+ describe "DEFAULT_FILENAME" do
23
+ subject { klass::DEFAULT_FILENAME }
24
+ it { should eq('./helix.yml') }
25
+ end
26
+ describe "SCOPES" do
27
+ subject { klass::SCOPES }
28
+ it { should eq(%w(reseller company library)) }
29
+ end
30
+ describe "VALID_SIG_TYPES" do
31
+ subject { klass::VALID_SIG_TYPES }
32
+ it { should eq([:ingest, :update, :view]) }
33
+ end
34
+ end
35
+
36
+ describe ".load" do
37
+ let(:meth) { :load }
38
+ let(:mock_obj) { mock(klass) }
39
+ let(:mock_file) { mock(File) }
40
+ let(:mock_cred) { :credentials }
41
+ before(:each) do
42
+ klass.stub(:instance) { mock_obj }
43
+ File.stub(:open) { mock_file }
44
+ YAML.stub(:load) { mock_cred }
45
+ mock_obj.stub(:instance_variable_set).with(:@credentials, anything)
46
+ end
47
+ context "when given no arg" do
48
+ before(:each) do mock_obj.stub(:instance_variable_set).with(:@filename, klass::DEFAULT_FILENAME) end
49
+ it "should get the instance" do
50
+ klass.should_receive(:instance) { mock_obj }
51
+ klass.send(meth)
52
+ end
53
+ it "should set @filename to DEFAULT_FILENAME" do
54
+ mock_obj.should_receive(:instance_variable_set).with(:@filename, klass::DEFAULT_FILENAME)
55
+ klass.send(meth)
56
+ end
57
+ it "should File.open(@filename) -> f" do
58
+ File.should_receive(:open).with(klass::DEFAULT_FILENAME) { mock_file }
59
+ klass.send(meth)
60
+ end
61
+ it "should YAML.load(f) -> cred" do
62
+ YAML.should_receive(:load).with(mock_file) { mock_cred }
63
+ klass.send(meth)
64
+ end
65
+ it "should set @credentials to cred" do
66
+ File.stub(:open).with(klass::DEFAULT_FILENAME) { mock_file }
67
+ YAML.stub(:load).with(mock_file) { mock_cred }
68
+ mock_obj.should_receive(:instance_variable_set).with(:@credentials, mock_cred)
69
+ klass.send(meth)
70
+ end
71
+ it "should return the instance" do
72
+ expect(klass.send(meth)).to be(mock_obj)
73
+ end
74
+ end
75
+ context "when given the arg 'some_file.yml'" do
76
+ let(:yaml_arg) { 'some_file.yml' }
77
+ before(:each) do mock_obj.stub(:instance_variable_set).with(:@filename, yaml_arg) end
78
+ it "should get the instance" do
79
+ klass.should_receive(:instance) { mock_obj }
80
+ klass.send(meth, yaml_arg)
81
+ end
82
+ it "should set @filename to DEFAULT_FILENAME" do
83
+ mock_obj.should_receive(:instance_variable_set).with(:@filename, yaml_arg)
84
+ klass.send(meth, yaml_arg)
85
+ end
86
+ it "should File.open(@filename) -> f" do
87
+ File.should_receive(:open).with(yaml_arg) { mock_file }
88
+ klass.send(meth, yaml_arg)
89
+ end
90
+ it "should YAML.load(f) -> cred" do
91
+ YAML.should_receive(:load).with(mock_file) { mock_cred }
92
+ klass.send(meth, yaml_arg)
93
+ end
94
+ it "should set @credentials to cred" do
95
+ File.stub(:open).with(klass::DEFAULT_FILENAME) { mock_file }
96
+ YAML.stub(:load).with(mock_file) { mock_cred }
97
+ mock_obj.should_receive(:instance_variable_set).with(:@credentials, mock_cred)
98
+ klass.send(meth, yaml_arg)
99
+ end
100
+ it "should return the instance" do
101
+ expect(klass.send(meth, yaml_arg)).to be(mock_obj)
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#build_url" do
107
+ site = 'http://example.com'
108
+ let(:meth) { :build_url }
109
+ subject { obj.method(meth) }
110
+ its(:arity) { should be(-1) }
111
+ before(:each) do
112
+ obj.credentials = {'site' => site}
113
+ end
114
+ shared_examples_for "reads scope from credentials for build_url" do |media_type,format,more_opts|
115
+ more_opts ||= {}
116
+ guid = more_opts[:guid]
117
+ action = more_opts[:action]
118
+ before(:each) do obj.credentials = {'site' => 'http://example.com'} end
119
+ context "and credentials has a key for 'reseller'" do
120
+ before(:each) do obj.credentials.merge!('reseller' => 're_id') end
121
+ context "and credentials has a key for 'company'" do
122
+ before(:each) do obj.credentials.merge!('company' => 'co_id') end
123
+ context "and credentials has a key for 'library'" do
124
+ before(:each) do obj.credentials.merge!('library' => 'lib_id') end
125
+ expected_url = "#{site}/resellers/re_id/companies/co_id/libraries/lib_id/#{media_type}"
126
+ expected_url += "/the_guid" if guid
127
+ expected_url += "/#{action}" if action
128
+ expected_url += ".#{format}"
129
+ it { should eq(expected_url) }
130
+ end
131
+ context "and credentials does NOT have a key for 'library'" do
132
+ before(:each) do obj.credentials.delete('library') end
133
+ expected_url = "#{site}/resellers/re_id/companies/co_id/#{media_type}"
134
+ expected_url += "/the_guid" if guid
135
+ expected_url += "/#{action}" if action
136
+ expected_url += ".#{format}"
137
+ it { should eq(expected_url) }
138
+ end
139
+ end
140
+ context "and credentials does NOT have a key for 'company'" do
141
+ before(:each) do obj.credentials.delete('company') end
142
+ expected_url = "#{site}/resellers/re_id/#{media_type}"
143
+ expected_url += "/the_guid" if guid
144
+ expected_url += "/#{action}" if action
145
+ expected_url += ".#{format}"
146
+ it { should eq(expected_url) }
147
+ end
148
+ end
149
+ context "and credentials does NOT have a key for 'reseller'" do
150
+ before(:each) do obj.credentials.delete('reseller') end
151
+ context "and credentials has a key for 'company'" do
152
+ before(:each) do obj.credentials['company'] = 'co_id' end
153
+ context "and credentials has a key for 'library'" do
154
+ before(:each) do obj.credentials['library'] = 'lib_id' end
155
+ expected_url = "#{site}/companies/co_id/libraries/lib_id/#{media_type}"
156
+ expected_url += "/the_guid" if guid
157
+ expected_url += "/#{action}" if action
158
+ expected_url += ".#{format}"
159
+ it { should eq(expected_url) }
160
+ end
161
+ end
162
+ end
163
+ end
164
+ context "when given NO opts" do
165
+ subject { obj.send(meth) }
166
+ it_behaves_like "reads scope from credentials for build_url", :videos, :json
167
+ end
168
+ context "when given opts of {}" do
169
+ subject { obj.send(meth, {}) }
170
+ it_behaves_like "reads scope from credentials for build_url", :videos, :json
171
+ end
172
+ context "when given opts of {guid: :the_guid}" do
173
+ subject { obj.send(meth, {guid: :the_guid}) }
174
+ it_behaves_like "reads scope from credentials for build_url", :videos, :json, {guid: :the_guid}
175
+ end
176
+ context "when given opts of {action: :the_action}" do
177
+ subject { obj.send(meth, {action: :the_action}) }
178
+ it_behaves_like "reads scope from credentials for build_url", :videos, :json, {action: :the_action}
179
+ end
180
+ context "when given opts of {guid: :the_guid, action: :the_action}" do
181
+ subject { obj.send(meth, {guid: :the_guid, action: :the_action}) }
182
+ it_behaves_like "reads scope from credentials for build_url", :videos, :json, {guid: :the_guid, action: :the_action}
183
+ end
184
+ [ :videos, :tracks ].each do |media_type|
185
+ context "when given opts[:media_type] of :#{media_type}" do
186
+ subject { obj.send(meth, media_type: media_type) }
187
+ it_behaves_like "reads scope from credentials for build_url", media_type, :json
188
+ end
189
+ context "when given opts[:media_type] of :#{media_type} and opts[:guid] of :the_guid" do
190
+ subject { obj.send(meth, media_type: media_type, guid: :the_guid) }
191
+ it_behaves_like "reads scope from credentials for build_url", media_type, :json, {guid: :the_guid}
192
+ end
193
+ context "when given opts[:media_type] of :#{media_type} and opts[:action] of :the_action" do
194
+ subject { obj.send(meth, media_type: media_type, action: :the_action) }
195
+ it_behaves_like "reads scope from credentials for build_url", media_type, :json, {action: :the_action}
196
+ end
197
+ context "when given opts[:media_type] of :#{media_type}, opts[:guid] of :the_guid, opts[:action] of :the_action" do
198
+ subject { obj.send(meth, media_type: media_type, guid: :the_guid, action: :the_action) }
199
+ it_behaves_like "reads scope from credentials for build_url", media_type, :json, {guid: :the_guid, action: :the_action}
200
+ end
201
+ end
202
+ [ :json, :xml ].each do |format|
203
+ context "when given opts[:format] of :#{format}" do
204
+ subject { obj.send(meth, format: format) }
205
+ it_behaves_like "reads scope from credentials for build_url", :videos, format
206
+ end
207
+ context "when given opts[:format] of :#{format} and opts[:guid] of :the_guid" do
208
+ subject { obj.send(meth, format: format, guid: :the_guid) }
209
+ it_behaves_like "reads scope from credentials for build_url", :videos, format, {guid: :the_guid}
210
+ end
211
+ context "when given opts[:format] of :#{format} and opts[:action] of :the_action" do
212
+ subject { obj.send(meth, format: format, action: :the_action) }
213
+ it_behaves_like "reads scope from credentials for build_url", :videos, format, {action: :the_action}
214
+ end
215
+ context "when given opts[:format] of :#{format}, opts[:guid] of :the_guid, and opts[:action] of :the_action" do
216
+ subject { obj.send(meth, format: format, guid: :the_guid, action: :the_action) }
217
+ it_behaves_like "reads scope from credentials for build_url", :videos, format, {guid: :the_guid, action: :the_action}
218
+ end
219
+ [ :videos, :tracks ].each do |media_type|
220
+ context "when given opts[:format] of :#{format} and opts[:media_type] of :#{media_type}" do
221
+ subject { obj.send(meth, format: format, media_type: media_type) }
222
+ it_behaves_like "reads scope from credentials for build_url", media_type, format
223
+ end
224
+ context "when given opts[:format] of :#{format}, opts[:guid] of :the_guid, and opts[:media_type] of :#{media_type}" do
225
+ subject { obj.send(meth, format: format, guid: :the_guid, media_type: media_type) }
226
+ it_behaves_like "reads scope from credentials for build_url", media_type, format, {guid: :the_guid}
227
+ end
228
+ context "when given opts[:format] of :#{format}, opts[:action] of :the_action, and opts[:media_type] of :#{media_type}" do
229
+ subject { obj.send(meth, format: format, action: :the_action, media_type: media_type) }
230
+ it_behaves_like "reads scope from credentials for build_url", media_type, format, {action: :the_action}
231
+ end
232
+ context "when given opts[:format] of :#{format}, opts[:guid] of :the_guid, opts[:action] of :the_action, and opts[:media_type] of :#{media_type}" do
233
+ subject { obj.send(meth, format: format, guid: :the_guid, action: :the_action, media_type: media_type) }
234
+ it_behaves_like "reads scope from credentials for build_url", media_type, format, {guid: :the_guid, action: :the_action}
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ describe "#existing_sig_for" do
241
+ let(:meth) { :existing_sig_for }
242
+
243
+ subject { obj.method(meth) }
244
+ its(:arity) { should eq(1) }
245
+
246
+ context "when given a sig_type" do
247
+ let(:sig_type) { :a_sig_type }
248
+ subject { obj.send(meth, sig_type) }
249
+ context "and sig_expired_for?(sig_type) is true" do
250
+ before(:each) do obj.stub(:sig_expired_for?).with(sig_type) { true } end
251
+ it { should be(nil) }
252
+ end
253
+ context "and sig_expired_for?(sig_type) is false" do
254
+ let(:license_key) { :a_license_key }
255
+ before(:each) do
256
+ obj.stub(:sig_expired_for?).with(sig_type) { false }
257
+ obj.stub(:license_key) { license_key }
258
+ end
259
+ it "should return @signature_for[license_key][sig_type]" do
260
+ mock_sig_for = {}
261
+ mock_sig_for_lk = {}
262
+ obj.instance_variable_set(:@signature_for, mock_sig_for)
263
+ mock_sig_for.should_receive(:[]).with(license_key) { mock_sig_for_lk }
264
+ mock_sig_for_lk.should_receive(:[]).with(sig_type) { :memoized_sig }
265
+ expect(obj.send(meth, sig_type)).to be(:memoized_sig)
266
+ end
267
+ end
268
+ end
269
+ end
270
+
271
+ describe "#get_response" do
272
+ let(:meth) { :get_response }
273
+ subject { obj.method(meth) }
274
+ its(:arity) { should eq(-2) }
275
+ context "when given a url and options" do
276
+ let(:string) { String.new }
277
+ let(:opts) { {sig_type: :the_sig_type} }
278
+ let(:params) { { params: { signature: string } } }
279
+ let(:returned_json) { '{"key": "val"}' }
280
+ let(:json_parsed) { { "key" => "val" } }
281
+ it "should call RestClient.get and return a hash from parsed JSON" do
282
+ obj.stub(:signature).with(:the_sig_type, opts) { string }
283
+ RestClient.should_receive(:get).with(string, params) { returned_json }
284
+ expect(obj.send(meth, string, opts)).to eq(json_parsed)
285
+ end
286
+ end
287
+ end
288
+
289
+ describe "#license_key" do
290
+ let(:meth) { :license_key }
291
+ subject { obj.method(meth) }
292
+ its(:arity) { should eq(0) }
293
+ it "should return @credentials['license_key']" do
294
+ obj.instance_variable_set(:@credentials, {'license_key' => :lk})
295
+ expect(obj.send(meth)).to be(:lk)
296
+ end
297
+ end
298
+
299
+ describe "#prepare_signature_memoization" do
300
+ let(:meth) { :prepare_signature_memoization }
301
+ subject { obj.method(meth) }
302
+ its(:arity) { should eq(0) }
303
+ before(:each) do obj.stub(:license_key) { :lk } end
304
+ it "should set @signature_for[license_key] to {}" do
305
+ obj.send(meth)
306
+ expect(obj.instance_variable_get(:@signature_for)).to eq(lk: {})
307
+ end
308
+ it "should set @signature_expiration_for[license_key] to {}" do
309
+ obj.send(meth)
310
+ expect(obj.instance_variable_get(:@signature_expiration_for)).to eq(lk: {})
311
+ end
312
+ end
313
+
314
+ describe "#signature" do
315
+ let(:meth) { :signature }
316
+
317
+ subject { obj.method(meth) }
318
+ its(:arity) { should eq(-2) }
319
+
320
+ it "should prepare_signature_memoization" do
321
+ obj.should_receive(:prepare_signature_memoization)
322
+ obj.stub(:existing_sig_for) { :some_sig }
323
+ obj.send(meth, :any_sig_type)
324
+ end
325
+
326
+ let(:license_key) { :lk }
327
+ before(:each) do
328
+ obj.stub(:license_key) { license_key }
329
+ obj.stub(:prepare_signature_memoization)
330
+ end
331
+
332
+ let(:mock_response) { mock(Object) }
333
+ context "when given :some_invalid_sig_type" do
334
+ let(:sig_type) { :some_invalid_sig_type }
335
+ it "should raise an ArgumentError" do
336
+ obj.stub(:existing_sig_for) { nil }
337
+ msg = "I don't understand 'some_invalid_sig_type'. Please give me one of :ingest, :update, or :view."
338
+ expect(lambda { obj.send(meth, sig_type) }).to raise_error(ArgumentError, msg)
339
+ end
340
+ end
341
+ shared_examples_for "gets fresh sig" do |sig_type,url|
342
+ let(:sig_for) { {license_key => {}} }
343
+ let(:sig_exp_for) { {license_key => {}} }
344
+ before(:each) do
345
+ obj.instance_variable_set(:@signature_for, sig_for)
346
+ obj.instance_variable_set(:@signature_expiration_for, sig_exp_for)
347
+ RestClient.stub(:get) { :fresh_sig }
348
+ end
349
+ it "should call RestClient.get(#{url})" do
350
+ set_stubs(obj)
351
+ url = "#{obj.credentials['site']}/api/#{sig_type}_key?licenseKey=#{license_key}&duration=1200"
352
+ RestClient.should_receive(:get).with(url) { :fresh_sig }
353
+ expect(obj.send(meth, sig_type)).to be(:fresh_sig)
354
+ end
355
+ it "sets a new sig expiration time" do
356
+ mock_time = mock(Time)
357
+ Time.should_receive(:now) { mock_time }
358
+ mock_time.should_receive(:+).with(klass::TIME_OFFSET) { :new_time }
359
+ obj.send(meth, sig_type)
360
+ expect(obj.instance_variable_get(:@signature_expiration_for)[license_key][sig_type]).to eq(:new_time)
361
+ end
362
+ it "memoizes the freshly-acquired sig" do
363
+ obj.send(meth, sig_type)
364
+ expect(obj.instance_variable_get(:@signature_for)[license_key][sig_type]).to eq(:fresh_sig)
365
+ end
366
+ end
367
+ [ :ingest, :update, :view ].each do |sig_type|
368
+ context "when given :#{sig_type}" do
369
+ url = %q[#{self.credentials['site']}/api/] + sig_type.to_s +
370
+ %q[_key?licenseKey=#{self.license_key}&duration=1200]
371
+ context "and there is an existing_sig_for(sig_type)" do
372
+ before(:each) do obj.stub(:existing_sig_for).with(sig_type) { :memoized_sig } end
373
+ it "should return the existing sig" do
374
+ RestClient.should_not_receive(:get)
375
+ expect(obj.send(meth, sig_type)).to be(:memoized_sig)
376
+ end
377
+ end
378
+ context "and there is NOT an existing_sig_for(sig_type)" do
379
+ before(:each) do obj.stub(:existing_sig_for).with(sig_type) { nil } end
380
+ it_behaves_like "gets fresh sig", sig_type, url
381
+ end
382
+ end
383
+ end
384
+ end
385
+
386
+ describe "#sig_expired_for?" do
387
+ let(:meth) { :sig_expired_for? }
388
+ let(:license_key) { :a_license_key }
389
+ before(:each) do obj.stub(:license_key) { :a_license_key } end
390
+
391
+ subject { obj.method(meth) }
392
+ its(:arity) { should be(1) }
393
+
394
+ context "when given a sig_type" do
395
+ let(:sig_type) { :a_sig_type }
396
+ let(:mock_expired) { mock(Time) }
397
+ let(:mock_now) { mock(Time) }
398
+ subject { obj.send(meth, sig_type) }
399
+ context "when @signature_expiration_for[license_key][sig_type] is nil" do
400
+ before(:each) do obj.instance_variable_set(:@signature_expiration_for, {license_key => {sig_type => nil}}) end
401
+ it { should be true }
402
+ end
403
+ context "when @signature_expiration_for[license_key][sig_type] is NOT nil" do
404
+ before(:each) do
405
+ obj.instance_variable_set(:@signature_expiration_for, {license_key => {sig_type => mock_expired}})
406
+ Time.stub(:now) { mock_now }
407
+ end
408
+ context "when @signature_expiration_for[license_key][sig_type] <= Time.now is false" do
409
+ before(:each) do mock_expired.should_receive(:<=).with(mock_now) { false } end
410
+ it { should be false }
411
+ end
412
+ context "when @signature_expiration_for[license_key][sig_type] <= Time.now is true" do
413
+ before(:each) do mock_expired.should_receive(:<=).with(mock_now) { true } end
414
+ it { should be true }
415
+ end
416
+ end
417
+ end
418
+ end
419
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'helix'
3
+
4
+ describe Helix::Image do
5
+ let(:klass) { Helix::Image }
6
+
7
+ subject { klass }
8
+ its(:ancestors) { should include(Helix::Base) }
9
+ its(:guid_name) { should eq('image_id') }
10
+ its(:media_type_sym) { should be(:image) }
11
+ its(:plural_media_type) { should eq('images') }
12
+
13
+ describe "Constants"
14
+
15
+ describe "an instance" do
16
+ let(:obj) { klass.new({'image_id' => 'some_image_guid'}) }
17
+ subject { obj }
18
+ its(:media_type_sym) { should be(:image) }
19
+ end
20
+
21
+ end
@@ -0,0 +1,5 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start 'rails'
5
+
@@ -0,0 +1,158 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'helix'
3
+
4
+ STATS_IMAGE_TYPES = %w(album image)
5
+ STATS_MEDIA_TYPES = STATS_IMAGE_TYPES + %w(audio video)
6
+ STATS_TYPES = %w(delivery ingest storage)
7
+ MEDIA_NAME_OF = {
8
+ 'album' => 'image',
9
+ 'audio' => 'track'
10
+ }
11
+ INGEST_NAME_OF = {
12
+ 'video' => 'publish'
13
+ }
14
+
15
+ describe Helix::Statistics do
16
+ let(:mod) { Helix::Statistics }
17
+
18
+ describe "Constants"
19
+
20
+ STATS_TYPES.each do |stats_type|
21
+ STATS_MEDIA_TYPES.each do |media_type|
22
+
23
+ next if STATS_IMAGE_TYPES.include?(media_type) and stats_type == 'ingest'
24
+
25
+ describe ".#{media_type}_#{stats_type}" do
26
+ let(:meth) { "#{media_type}_#{stats_type}" }
27
+ let(:mock_config) { mock(Helix::Config, build_url: :built_url, get_response: :response) }
28
+ before(:each) do Helix::Config.stub(:instance) { mock_config } end
29
+
30
+ subject { mod.method(meth) }
31
+ its(:arity) { should eq(-1) }
32
+
33
+ if stats_type == 'delivery'
34
+ media_name = MEDIA_NAME_OF[media_type] || media_type
35
+ context "when given opts containing a :#{media_name}_id" do
36
+ let(:opts) { {group: :daily, "#{media_name}_id".to_sym => "the_#{media_name}_id".to_sym} }
37
+ it "should refer to the Helix::Config instance" do
38
+ Helix::Config.should_receive(:instance) { mock_config }
39
+ mod.send(meth, opts)
40
+ end
41
+ it "should delete :#{media_name}_id from opts" do
42
+ opts.should_receive(:delete).with("#{media_name}_id".to_sym) { "the_#{media_name}_id".to_sym }
43
+ mod.send(meth, opts)
44
+ end
45
+ it "should call config.build_url(guid: the_#{media_name}_id, media_type: :#{media_name}s, action: :statistics)" do
46
+ mock_config.should_receive(:build_url).with({guid: "the_#{media_name}_id".to_sym, media_type: "#{media_name}s".to_sym, action: :statistics}) { :built_url }
47
+ mod.send(meth, opts)
48
+ end
49
+ it "should return config.get_response(built_url, opts.merge(sig_type: :view)" do
50
+ mock_config.should_receive(:get_response).with(:built_url, {group: :daily, sig_type: :view}) { :response }
51
+ expect(mod.send(meth, opts)).to eq(:response)
52
+ end
53
+ end
54
+ context "when given opts NOT containing a :#{media_name}_id" do
55
+ let(:opts) { {group: :daily} }
56
+ it "should refer to the Helix::Config instance" do
57
+ Helix::Config.should_receive(:instance) { mock_config }
58
+ mod.send(meth, opts)
59
+ end
60
+ it "should (fail to) delete :#{media_name}_id from opts" do
61
+ opts.should_receive(:delete).with("#{media_name}_id".to_sym) { nil }
62
+ mod.send(meth, opts)
63
+ end
64
+ it "should call config.build_url(media_type: :statistics, action: :#{media_name}_delivery)" do
65
+ mock_config.should_receive(:build_url).with({media_type: :statistics, action: "#{media_name}_delivery".to_sym}) { :built_url }
66
+ mod.send(meth, opts)
67
+ end
68
+ it "should return config.get_response(built_url, opts.merge(sig_type: :view)" do
69
+ mock_config.should_receive(:get_response).with(:built_url, {group: :daily, sig_type: :view}) { :response }
70
+ expect(mod.send(meth, opts)).to eq(:response)
71
+ end
72
+ end
73
+ end
74
+ if stats_type == 'storage'
75
+ media_name = MEDIA_NAME_OF[media_type] || media_type
76
+ publish_name = INGEST_NAME_OF[media_type] || 'ingest'
77
+ context "when given opts" do
78
+ let(:opts) { {group: :daily} }
79
+ it "should refer to the Helix::Config instance" do
80
+ Helix::Config.should_receive(:instance) { mock_config }
81
+ mod.send(meth, opts)
82
+ end
83
+ it "should call config.build_url(media_type: :statistics, action: :#{media_name}_#{publish_name}/disk_usage)" do
84
+ mock_config.should_receive(:build_url).with({media_type: :statistics, action: "#{media_name}_#{publish_name}/disk_usage".to_sym}) { :built_url }
85
+ mod.send(meth, opts)
86
+ end
87
+ it "should return config.get_response(built_url, opts.merge(sig_type: :view)" do
88
+ mock_config.should_receive(:get_response).with(:built_url, {group: :daily, sig_type: :view}) { :response }
89
+ expect(mod.send(meth, opts)).to eq(:response)
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+
97
+ describe ".track_#{stats_type}" do
98
+ let(:meth) { "track_#{stats_type}" }
99
+
100
+ subject { mod.method(meth) }
101
+ its(:arity) { should eq(-1) }
102
+
103
+ context "when given no arg" do
104
+ it "should call audio_#{stats_type}({})" do
105
+ mod.should_receive("audio_#{stats_type}").with({}) { :expected }
106
+ expect(mod.send(meth)).to be(:expected)
107
+ end
108
+ end
109
+
110
+ context "when given {}" do
111
+ it "should call audio_#{stats_type}({})" do
112
+ mod.should_receive("audio_#{stats_type}").with({}) { :expected }
113
+ expect(mod.send(meth, {})).to be(:expected)
114
+ end
115
+ end
116
+
117
+ context "when given :some_opts" do
118
+ it "should call audio_#{stats_type}(:some_opts)" do
119
+ mod.should_receive("audio_#{stats_type}").with(:some_opts) { :expected }
120
+ expect(mod.send(meth, :some_opts)).to be(:expected)
121
+ end
122
+ end
123
+
124
+ end
125
+
126
+ next if stats_type == 'ingest'
127
+ describe ".album_#{stats_type}" do
128
+ let(:meth) { "album_#{stats_type}" }
129
+
130
+ subject { mod.method(meth) }
131
+ its(:arity) { should eq(-1) }
132
+
133
+ context "when given no arg" do
134
+ it "should call image_#{stats_type}({})" do
135
+ mod.should_receive("image_#{stats_type}").with({}) { :expected }
136
+ expect(mod.send(meth)).to be(:expected)
137
+ end
138
+ end
139
+
140
+ context "when given {}" do
141
+ it "should call image_#{stats_type}({})" do
142
+ mod.should_receive("image_#{stats_type}").with({}) { :expected }
143
+ expect(mod.send(meth, {})).to be(:expected)
144
+ end
145
+ end
146
+
147
+ context "when given :some_opts" do
148
+ it "should call image_#{stats_type}(:some_opts)" do
149
+ mod.should_receive("image_#{stats_type}").with(:some_opts) { :expected }
150
+ expect(mod.send(meth, :some_opts)).to be(:expected)
151
+ end
152
+ end
153
+
154
+ end
155
+
156
+ end
157
+
158
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'helix'
3
+
4
+ describe Helix::Track do
5
+ let(:klass) { Helix::Track }
6
+
7
+ subject { klass }
8
+ its(:ancestors) { should include(Helix::Base) }
9
+ its(:guid_name) { should eq('track_id') }
10
+ its(:media_type_sym) { should be(:track) }
11
+ its(:plural_media_type) { should eq('tracks') }
12
+
13
+ describe "Constants"
14
+
15
+ describe "an instance" do
16
+ let(:obj) { klass.new({'track_id' => 'some_track_guid'}) }
17
+ subject { obj }
18
+ its(:media_type_sym) { should be(:track) }
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'helix'
3
+
4
+ describe Helix::Video do
5
+ let(:klass) { Helix::Video }
6
+
7
+ subject { klass }
8
+ its(:ancestors) { should include(Helix::Base) }
9
+ its(:guid_name) { should eq('video_id') }
10
+ its(:media_type_sym) { should be(:video) }
11
+ its(:plural_media_type) { should eq('videos') }
12
+
13
+ describe "Constants"
14
+
15
+ describe "an instance" do
16
+ let(:obj) { klass.new({'video_id' => 'some_video_guid'}) }
17
+ subject { obj }
18
+ its(:media_type_sym) { should be(:video) }
19
+ end
20
+
21
+ end