panda 0.6.4 → 1.0.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/Gemfile +10 -0
- data/README.md +388 -21
- data/Rakefile +4 -17
- data/VERSION +1 -1
- data/lib/panda.rb +21 -1
- data/lib/panda/api_authentication.rb +4 -4
- data/lib/panda/base.rb +102 -0
- data/lib/panda/connection.rb +189 -0
- data/lib/panda/error.rb +29 -0
- data/lib/panda/modules/associations.rb +55 -0
- data/lib/panda/modules/builders.rb +34 -0
- data/lib/panda/modules/cloud_connection.rb +7 -0
- data/lib/panda/modules/finders.rb +62 -0
- data/lib/panda/modules/router.rb +55 -0
- data/lib/panda/modules/short_status.rb +13 -0
- data/lib/panda/modules/updatable.rb +27 -0
- data/lib/panda/panda.rb +21 -170
- data/lib/panda/proxies/encoding_scope.rb +48 -0
- data/lib/panda/proxies/profile_scope.rb +7 -0
- data/lib/panda/proxies/proxy.rb +25 -0
- data/lib/panda/proxies/scope.rb +87 -0
- data/lib/panda/proxies/video_scope.rb +28 -0
- data/lib/panda/resources/cloud.rb +49 -0
- data/lib/panda/resources/encoding.rb +30 -0
- data/lib/panda/resources/profile.rb +22 -0
- data/lib/panda/resources/resource.rb +52 -0
- data/lib/panda/resources/video.rb +13 -0
- data/panda.gemspec +36 -12
- data/spec/cloud_spec.rb +80 -0
- data/spec/encoding_spec.rb +232 -0
- data/spec/heroku_spec.rb +22 -0
- data/spec/panda_spec.rb +17 -4
- data/spec/profile_spec.rb +117 -0
- data/spec/spec_helper.rb +8 -1
- data/spec/video_spec.rb +305 -0
- metadata +33 -23
- data/log/debug.log +0 -0
@@ -0,0 +1,232 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Panda::Encoding do
|
4
|
+
before(:each) do
|
5
|
+
|
6
|
+
Panda.configure do |c|
|
7
|
+
c.access_key = "my_access_key"
|
8
|
+
c.secret_key = "my_secret_key"
|
9
|
+
c.api_host = "api.example.com"
|
10
|
+
c.cloud_id = 'my_cloud_id'
|
11
|
+
c.api_port = 85
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should find by video_id" do
|
17
|
+
encoding_json = "[{\"abc\":\"efg\",\"id\":456}]"
|
18
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).
|
19
|
+
to_return(:body => encoding_json)
|
20
|
+
Panda::Encoding.find_all_by_video_id("123").first.id.should == 456
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should create an encoding using instance method" do
|
24
|
+
encoding_json = "{\"source_url\":\"my_source_url\",\"id\":\"456\"}"
|
25
|
+
stub_http_request(:post, /api.example.com:85\/v2\/encodings.json/).
|
26
|
+
with(:body => /source_url=my_source_url/).
|
27
|
+
to_return(:body => encoding_json)
|
28
|
+
|
29
|
+
encoding = Panda::Encoding.new(:source_url => "my_source_url", :video_id => "123")
|
30
|
+
encoding.create.should == true
|
31
|
+
encoding.id.should == "456"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should find by encoding_id" do
|
35
|
+
encoding_json = "{\"abc\":\"efg\",\"id\":\"456\"}"
|
36
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings\/456.json/).
|
37
|
+
to_return(:body => encoding_json)
|
38
|
+
encoding = Panda::Encoding.find("456")
|
39
|
+
encoding.id.should == "456"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should find by the video through the association" do
|
43
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
44
|
+
encoding_json = "{\"abc\":\"efg\",\"id\":\"456\", \"video_id\":\"123\"}"
|
45
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings\/456.json/).
|
46
|
+
to_return(:body => encoding_json)
|
47
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
48
|
+
to_return(:body => video_json)
|
49
|
+
encoding = Panda::Encoding.find("456")
|
50
|
+
encoding.video.id.should == "123"
|
51
|
+
encoding.id.should == "456"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should filter on find" do
|
55
|
+
encoding_json = "[{\"source_url\":\"my_source_url\",\"id\":\"456\"}]"
|
56
|
+
|
57
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings.json/).
|
58
|
+
with{|r| r.uri.query =~ /profile_name=my_profile/ && r.uri.query =~ /video_id=123/ }.
|
59
|
+
to_return(:body => encoding_json)
|
60
|
+
|
61
|
+
encodings = Panda::Encoding.all(:video_id => "123", :profile_name => "my_profile")
|
62
|
+
encodings.first.id.should == "456"
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should return the video_url" do
|
66
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"my_cloud_id\"}"
|
67
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/my_cloud_id.json/).
|
68
|
+
to_return(:body => cloud_json)
|
69
|
+
|
70
|
+
encoding = Panda::Encoding.new({:id => "456", :extname => ".ext"})
|
71
|
+
encoding.url.should == "http://s3.amazonaws.com/my_bucket/456.ext"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should generate a screenhost array" do
|
75
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"my_cloud_id\"}"
|
76
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/my_cloud_id.json/).
|
77
|
+
to_return(:body => cloud_json)
|
78
|
+
|
79
|
+
encoding = Panda::Encoding.new({:id => "456", :extname => ".ext", :status => "success"})
|
80
|
+
encoding.screenshots[0].should == "http://s3.amazonaws.com/my_bucket/456_1.jpg"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should generate a screenhost array" do
|
84
|
+
encoding = Panda::Encoding.new({:id => "456", :extname => ".ext", :status => "fail"})
|
85
|
+
encoding.screenshots.should == []
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
it "should create an encoding through the association" do
|
90
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
91
|
+
encoding_json = "{\"abc\":\"efg\",\"id\":\"456\", \"video_id\":\"123\", \"profile_id\":\"901\"}"
|
92
|
+
|
93
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
94
|
+
to_return(:body => video_json)
|
95
|
+
|
96
|
+
stub_http_request(:post, /api.example.com:85\/v2\/encodings.json/).
|
97
|
+
with{|r| r.body =~ /video_id=123/ && r.body =~ /profile_id=901/}.
|
98
|
+
to_return(:body => encoding_json)
|
99
|
+
|
100
|
+
video = Panda::Video.find("123")
|
101
|
+
|
102
|
+
encoding = video.encodings.create(:profile_id => "901")
|
103
|
+
encoding.id.should == "456"
|
104
|
+
encoding.profile_id.should == "901"
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should filter the profile name after triggering the request" do
|
108
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
109
|
+
encodings_1_json = "[{\"id\":\"456\", \"video_id\":\"123\", \"profile_name\":\"h264\"}]"
|
110
|
+
encodings_2_json = "[{\"id\":\"789\", \"video_id\":\"123\", \"profile_name\":\"ogg\"}]"
|
111
|
+
|
112
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
113
|
+
to_return(:body => video_json)
|
114
|
+
|
115
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).
|
116
|
+
with{|r| r.uri.query =~ /profile_name=h264/ }.
|
117
|
+
to_return(:body => encodings_1_json)
|
118
|
+
|
119
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).
|
120
|
+
with{|r| r.uri.query =~ /profile_name=ogg/ }.
|
121
|
+
to_return(:body => encodings_2_json)
|
122
|
+
|
123
|
+
video = Panda::Video.find("123")
|
124
|
+
video.encodings.find_by_profile_name("h264").id.should == "456"
|
125
|
+
video.encodings.find_by_profile_name("ogg").id.should == "789"
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should create an encoding through the association" do
|
129
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
130
|
+
encodings_json = "[{\"abc\":\"efg\",\"id\":\"456\", \"video_id\":\"123\", \"profile_id\":\"901\"}]"
|
131
|
+
|
132
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
133
|
+
to_return(:body => video_json)
|
134
|
+
|
135
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).
|
136
|
+
with{|r| r.uri.query =~ /profile_id=901/}.
|
137
|
+
to_return(:body => encodings_json)
|
138
|
+
|
139
|
+
video = Panda::Video.find("123")
|
140
|
+
encodings = video.encodings.all(:profile_id => "901")
|
141
|
+
encodings.first.id = "456"
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should create an encoding through the association" do
|
145
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
146
|
+
encodings_json = "[{\"abc\":\"efg\",\"id\":\"456\", \"video_id\":\"123\", \"profile_id\":\"901\"}]"
|
147
|
+
|
148
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
149
|
+
to_return(:body => video_json)
|
150
|
+
|
151
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).
|
152
|
+
with{|r| r.uri.query =~ /profile_id=901/}.
|
153
|
+
to_return(:body => encodings_json)
|
154
|
+
|
155
|
+
video = Panda::Video.find("123")
|
156
|
+
encodings = video.encodings.profile("901")
|
157
|
+
encodings.first.id = "456"
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should filter encodings specifying video and status as a method" do
|
161
|
+
encoding_json = "[{\"source_url\":\"my_source_url\",\"id\":\"456\"}]"
|
162
|
+
|
163
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings.json/).
|
164
|
+
with{|r| r.uri.query =~ /status=success/ && r.uri.query =~ /video_id=123/ }.
|
165
|
+
to_return(:body => encoding_json)
|
166
|
+
|
167
|
+
encodings = Panda::Encoding.video(123).status("success").all
|
168
|
+
encodings.first.id.should == "456"
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should filter encodings specifying video and status as a method" do
|
172
|
+
encoding_json = "[{\"source_url\":\"my_source_url\",\"id\":\"456\"}]"
|
173
|
+
|
174
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings.json/).
|
175
|
+
with{|r| r.uri.query =~ /profile_id=prof_1/ && r.uri.query =~ /video_id=123/ }.
|
176
|
+
to_return(:body => encoding_json)
|
177
|
+
|
178
|
+
encodings = Panda::Encoding.video(123).profile("prof_1").all
|
179
|
+
encodings.first.id.should == "456"
|
180
|
+
end
|
181
|
+
|
182
|
+
it "should filter encodings specifying video and profile id as a method" do
|
183
|
+
encoding_json = "[{\"source_url\":\"my_source_url\",\"id\":\"456\"}]"
|
184
|
+
|
185
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings.json/).
|
186
|
+
with{|r| r.uri.query =~ /profile_name=prof_name/ && r.uri.query =~ /video_id=123/ }.
|
187
|
+
to_return(:body => encoding_json)
|
188
|
+
|
189
|
+
encodings = Panda::Encoding.video(123).profile_name("prof_name").all
|
190
|
+
encodings.first.id.should == "456"
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should find an encoding" do
|
194
|
+
encoding_json = "[{\"source_url\":\"my_source_url\",\"id\":\"456\"}]"
|
195
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings\/456.json/).
|
196
|
+
to_return(:body => encoding_json)
|
197
|
+
|
198
|
+
Panda::Encoding.id("456")
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should tell if the encoding is success" do
|
202
|
+
encoding = Panda::Encoding.new({:status => "success"})
|
203
|
+
encoding.success?.should == true
|
204
|
+
encoding.processing?.should == false
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should tell if the encoding is success" do
|
208
|
+
encoding = Panda::Encoding.new({:status => "processing"})
|
209
|
+
encoding.success?.should == false
|
210
|
+
encoding.processing?.should == true
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should tell if the encoding is success" do
|
214
|
+
encoding = Panda::Encoding.new({:status => "fail"})
|
215
|
+
encoding.success?.should == false
|
216
|
+
encoding.fail?.should == true
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should return the most recent updated encoding" do
|
220
|
+
video_json = "[{\"source_url\":\"url_panda.mp4\",\"id\":\"123\"}]"
|
221
|
+
stub_http_request(:get, /api.example.com:85\/v2\/encodings.json/).
|
222
|
+
with{|r| r.uri.query =~ /per_page=1/ }.
|
223
|
+
to_return(:body => video_json)
|
224
|
+
Panda::Encoding.first
|
225
|
+
end
|
226
|
+
|
227
|
+
it "should not delegate scope if the method do not really exist in the scope" do
|
228
|
+
lambda {Panda::Encoding.reload}.should raise_error(NoMethodError)
|
229
|
+
lambda {Panda::Encoding.each}.should raise_error(NoMethodError)
|
230
|
+
lambda {Panda::Encoding.size}.should raise_error(NoMethodError)
|
231
|
+
end
|
232
|
+
end
|
data/spec/heroku_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Panda::Video do
|
4
|
+
before(:each) do
|
5
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"my_cloud_id\"}"
|
6
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/my_cloud_id.json/).
|
7
|
+
to_return(:body => cloud_json)
|
8
|
+
|
9
|
+
my_heroku_url = "http://access_key:secret_key@api.example.com:85/my_cloud_id"
|
10
|
+
Panda.configure do |c|
|
11
|
+
c.heroku = my_heroku_url
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should get all videos" do
|
16
|
+
videos_json = "[]"
|
17
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos.json/).to_return(:body => videos_json)
|
18
|
+
|
19
|
+
Panda::Video.all.should be_empty
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/spec/panda_spec.rb
CHANGED
@@ -2,7 +2,6 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe Panda do
|
4
4
|
before(:each) do
|
5
|
-
Time.stub!(:now).and_return(mock("time", :iso8601 => "2009-11-04T17:54:11+00:00"))
|
6
5
|
end
|
7
6
|
|
8
7
|
describe "when not connected" do
|
@@ -120,14 +119,14 @@ describe Panda do
|
|
120
119
|
before(:each) do
|
121
120
|
@panda = Panda.connect!({:access_key => "my_access_key", :secret_key => "my_secret_key", :api_host => "myapihost", :api_port => 85, :cloud_id => 'my_cloud_id', :format => "json" })
|
122
121
|
end
|
122
|
+
|
123
123
|
it_should_behave_like "Connected"
|
124
124
|
end
|
125
125
|
|
126
126
|
|
127
127
|
describe "Panda.connect with PANDASTREAM_URL" do
|
128
128
|
before(:each) do
|
129
|
-
Panda.connect!('http://my_access_key:my_secret_key@myapihost:85/my_cloud_id', "format" => "json")
|
130
|
-
@panda = Panda
|
129
|
+
@panda = Panda.connect!('http://my_access_key:my_secret_key@myapihost:85/my_cloud_id', "format" => "json")
|
131
130
|
end
|
132
131
|
it_should_behave_like "Connected"
|
133
132
|
end
|
@@ -165,8 +164,22 @@ describe Panda do
|
|
165
164
|
|
166
165
|
ActiveSupport::JSON.should_receive(:decode).with("abc").and_return("blah")
|
167
166
|
@panda.get("/videos").should == "blah"
|
167
|
+
|
168
|
+
Object.send :remove_const, :ActiveSupport
|
168
169
|
end
|
169
170
|
end
|
170
171
|
|
171
|
-
|
172
|
+
describe "parsing" do
|
173
|
+
it "should raise an error if the response is not JSON parsable" do
|
174
|
+
@connection = Panda::Connection.new({"access_key" => "my_access_key", "secret_key" => "my_secret_key", "api_host" => "myapihost", "api_port" => 85, "cloud_id" => 'my_cloud_id' })
|
175
|
+
@connection.raise_error=true
|
176
|
+
|
177
|
+
stub_http_request(:get, //).to_return(:body => "blahblah")
|
178
|
+
|
179
|
+
lambda {
|
180
|
+
@connection.get("/fake")
|
181
|
+
}.should raise_error(Panda::ServiceNotAvailable)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
172
185
|
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Panda::Profile do
|
4
|
+
before(:each) do
|
5
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"my_cloud_id\"}"
|
6
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/my_cloud_id.json/).
|
7
|
+
to_return(:body => cloud_json)
|
8
|
+
|
9
|
+
Panda.configure do |c|
|
10
|
+
c.access_key = "my_access_key"
|
11
|
+
c.secret_key = "my_secret_key"
|
12
|
+
c.api_host = "api.example.com"
|
13
|
+
c.cloud_id = 'my_cloud_id'
|
14
|
+
c.api_port = 85
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should create a profile" do
|
20
|
+
profile_json = "{\"title\":\"my_profile\",\"id\":\"123\"}"
|
21
|
+
stub_http_request(:post, /api.example.com:85\/v2\/profiles.json/).
|
22
|
+
with(:body => /title=my_profile/).
|
23
|
+
to_return(:body => profile_json)
|
24
|
+
|
25
|
+
profile = Panda::Profile.new(:title => "my_profile")
|
26
|
+
|
27
|
+
profile.new?.should == true
|
28
|
+
profile.changed?.should == true
|
29
|
+
profile.save.should == true
|
30
|
+
profile.changed?.should == false
|
31
|
+
profile.id.should == "123"
|
32
|
+
profile.new?.should == false
|
33
|
+
|
34
|
+
profile.changed?.should == false
|
35
|
+
|
36
|
+
profile.title = "new_last_title"
|
37
|
+
profile.changed?.should == true
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
it "should update a profile and sending the changed attributes" do
|
42
|
+
profile_json = "{\"title\":\"my_profile\",\"id\":\"123\"}"
|
43
|
+
stub_http_request(:put, /api.example.com:85\/v2\/profiles\/999.json/).
|
44
|
+
with{|r| !(r.body =~ /title=my_new_profile_title/) && r.body =~ /width=80/}.
|
45
|
+
to_return(:body => profile_json)
|
46
|
+
|
47
|
+
profile = Panda::Profile.new(:id => "999", :title => "my_profile_title")
|
48
|
+
|
49
|
+
profile.width=80
|
50
|
+
profile.new?.should == false
|
51
|
+
profile.save.should == true
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
it "should not call update a profile" do
|
56
|
+
profile_json = "{\"title\":\"my_profile\",\"id\":\"123\"}"
|
57
|
+
stub_http_request(:put, /api.example.com:85\/v2\/profiles\/123.json/).
|
58
|
+
with(:body => /title=my_profile/).
|
59
|
+
to_return(:body => profile_json)
|
60
|
+
|
61
|
+
profile = Panda::Profile.new(:id => "123")
|
62
|
+
profile.title = "my_profile"
|
63
|
+
|
64
|
+
profile.new?.should == false
|
65
|
+
profile.save.should == true
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
it "should have a many relation on encodings" do
|
70
|
+
encoding_json = "[{\"abc\":\"efg\",\"id\":456}]"
|
71
|
+
profile_json = "{\"title\":\"my_profile\",\"id\":\"901\"}"
|
72
|
+
stub_http_request(:get, /api.example.com:85\/v2\/profiles\/901\/encodings.json/).
|
73
|
+
to_return(:body => encoding_json)
|
74
|
+
|
75
|
+
profile = Panda::Profile.new(:title => "my_source_url", :id => "901")
|
76
|
+
profile.encodings.first.id.should == 456
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should reload the object" do
|
80
|
+
profile_json = "{\"title\":\"my_profile\",\"id\":\"123\"}"
|
81
|
+
stub_http_request(:get, /api.example.com:85\/v2\/profiles\/123.json/).
|
82
|
+
to_return(:body => profile_json)
|
83
|
+
|
84
|
+
profile = Panda::Profile.new(:id => "123", :title => "my_new_profile_title")
|
85
|
+
profile.title.should == "my_new_profile_title"
|
86
|
+
profile.reload
|
87
|
+
profile.id.should == "123"
|
88
|
+
profile.title.should == "my_profile"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "shoud raise an exeception if it's a new object" do
|
92
|
+
profile = Panda::Profile.new(:title => "my_new_profile_title")
|
93
|
+
lambda {
|
94
|
+
profile.reload
|
95
|
+
}.should raise_error("RecordNotFound")
|
96
|
+
end
|
97
|
+
|
98
|
+
it "shoud raise an exeception if it's a new object" do
|
99
|
+
profile_json = "{\"title\":\"my_profile\",\"id\":\"123\"}"
|
100
|
+
stub_http_request(:get, /api.example.com:85\/v2\/profiles\/123.json/).
|
101
|
+
to_return(:body => profile_json)
|
102
|
+
|
103
|
+
profile = Panda::Profile.find(123)
|
104
|
+
profile.reload.should == profile
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should not delegate scope if the method do not really exist in the scope" do
|
108
|
+
lambda {Panda::Profile.reload}.should raise_error(NoMethodError)
|
109
|
+
lambda {Panda::Profile.each}.should raise_error(NoMethodError)
|
110
|
+
lambda {Panda::Profile.size}.should raise_error(NoMethodError)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should tell if profile is using a preset" do
|
114
|
+
Panda::Profile.new(:title => "abc").preset?.should be_true
|
115
|
+
Panda::Profile.new(:preset_name => "abc").preset?.should be_false
|
116
|
+
end
|
117
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,14 @@ require 'spec/autorun'
|
|
7
7
|
require 'webmock/rspec'
|
8
8
|
include WebMock
|
9
9
|
|
10
|
+
def hputs(*args)
|
11
|
+
puts ERB::Util.html_escape(args.join("\n")).gsub(/\r?\n/, '<br/>') + '<br/>'
|
12
|
+
end
|
10
13
|
|
11
14
|
Spec::Runner.configure do |config|
|
12
|
-
|
15
|
+
config.before(:each) do
|
16
|
+
Panda.instance_variable_set("@connection", nil)
|
17
|
+
Panda.instance_variable_set("@cloud", nil)
|
18
|
+
Time.stub!(:now).and_return(mock("time", :iso8601 => "2009-11-04T17:54:11+00:00"))
|
19
|
+
end
|
13
20
|
end
|
data/spec/video_spec.rb
ADDED
@@ -0,0 +1,305 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe Panda::Video do
|
4
|
+
before(:each) do
|
5
|
+
|
6
|
+
Panda.configure do |c|
|
7
|
+
c.access_key = "my_access_key"
|
8
|
+
c.secret_key = "my_secret_key"
|
9
|
+
c.api_host = "api.example.com"
|
10
|
+
c.cloud_id = 'my_cloud_id'
|
11
|
+
c.api_port = 85
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should create a video object" do
|
17
|
+
v = Panda::Video.new({ :test => "abc" })
|
18
|
+
v.test.should == "abc"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should tell video is new" do
|
22
|
+
v = Panda::Video.new({ :id => "abc" })
|
23
|
+
v.new?.should be_false
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not tell video is new" do
|
27
|
+
v = Panda::Video.new({ :attr => "abc" })
|
28
|
+
v.new?.should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should find return all videos" do
|
32
|
+
|
33
|
+
videos_json = "[{\"source_url\":\"my_source_url\",\"id\":111},{\"source_url\":\"http://a.b.com/file2.mp4\",\"id\":222}]"
|
34
|
+
|
35
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos.json/).to_return(:body => videos_json)
|
36
|
+
|
37
|
+
videos = Panda::Video.all
|
38
|
+
videos.first.id.should == 111
|
39
|
+
videos.first.source_url.should == "my_source_url"
|
40
|
+
videos.size.should == 2
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should find a videos having the correct id" do
|
44
|
+
|
45
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
46
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
47
|
+
|
48
|
+
video = Panda::Video.find("123")
|
49
|
+
video.id.should == "123"
|
50
|
+
video.source_url.should == "my_source_url"
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
it "should list all video's encodings" do
|
55
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
56
|
+
encodings_json = "[{\"abc\":\"my_source_url\",\"id\":\"456\"}]"
|
57
|
+
|
58
|
+
encodings = [Panda::Encoding.new({:abc => "my_source_url", :id => "456"})]
|
59
|
+
|
60
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
61
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).to_return(:body => encodings_json)
|
62
|
+
|
63
|
+
video = Panda::Video.find("123")
|
64
|
+
video.encodings.first.attributes.should == encodings.first.attributes
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should delete a video using class" do
|
68
|
+
video_json = "{\"deleted\":\"ok\"}"
|
69
|
+
stub_http_request(:delete, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
70
|
+
|
71
|
+
video = Panda::Video.new(:source_url => "my_source_url", :id => "123")
|
72
|
+
video.cloud
|
73
|
+
video.delete.should == true
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should delete a video using instance" do
|
77
|
+
video_json = "{\"deleted\":\"ok\"}"
|
78
|
+
stub_http_request(:delete, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
79
|
+
|
80
|
+
Panda::Video.delete("123")
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should have an error object if something goes wrong" do
|
84
|
+
response = "{\"message\":\"no-abc\",\"error\":\"error-abc\"}"
|
85
|
+
|
86
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/abc.json/).to_return(:body => response)
|
87
|
+
|
88
|
+
lambda {
|
89
|
+
Panda::Video.find "abc"
|
90
|
+
}.should raise_error("error-abc: no-abc")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should have an error object if something goes wrong" do
|
94
|
+
response = "{\"message\":\"no-abc\",\"error\":\"error-abc\"}"
|
95
|
+
|
96
|
+
stub_http_request(:put, /api.example.com:85\/v2\/profiles\/abc.json/).to_return(:body => response)
|
97
|
+
|
98
|
+
obj = Panda::Profile.new(:id => "abc")
|
99
|
+
original_attrs = obj.attributes
|
100
|
+
obj.save
|
101
|
+
|
102
|
+
obj.errors.size.should == 1
|
103
|
+
obj.errors.first.message.should == "no-abc"
|
104
|
+
obj.errors.first.error_class.should == "error-abc"
|
105
|
+
obj.attributes.should == original_attrs
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should connect to eu" do
|
110
|
+
|
111
|
+
|
112
|
+
Panda.configure do |c|
|
113
|
+
c.access_key = "my_access_key"
|
114
|
+
c.secret_key = "my_secret_key"
|
115
|
+
c.cloud_id = 'my_cloud_id'
|
116
|
+
c.region = "eu"
|
117
|
+
end
|
118
|
+
|
119
|
+
stub_http_request(:get, /api.eu.pandastream.com:80/).
|
120
|
+
to_return(:body => "{\"id\":\"123\"}")
|
121
|
+
Panda::Video.find "123"
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should connect to eu and trigger the request" do
|
125
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"my_cloud_id\"}"
|
126
|
+
stub_http_request(:get, /api.eu.pandastream.com:80\/v2\/clouds\/my_cloud_id.json/).
|
127
|
+
to_return(:body => cloud_json)
|
128
|
+
|
129
|
+
Panda.configure do |c|
|
130
|
+
c.access_key = "my_access_key"
|
131
|
+
c.secret_key = "my_secret_key"
|
132
|
+
c.cloud_id = 'my_cloud_id'
|
133
|
+
c.region = "eu"
|
134
|
+
end
|
135
|
+
|
136
|
+
stub_http_request(:get, /api.eu.pandastream.com:80/).
|
137
|
+
to_return(:body => "{\"id\":\"123\"}")
|
138
|
+
Panda::Video.find "123"
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should use the correct connection" do
|
142
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
143
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"cloud1\"}"
|
144
|
+
cloud2_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"cloud2\"}"
|
145
|
+
|
146
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/cloud1.json/).
|
147
|
+
to_return(:body => cloud_json)
|
148
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/cloud2.json/).
|
149
|
+
to_return(:body => cloud2_json)
|
150
|
+
|
151
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
152
|
+
to_return(:body => video_json)
|
153
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
154
|
+
to_return(:body => video_json)
|
155
|
+
|
156
|
+
cloud = Panda::Cloud.new(:id => "cloud1")
|
157
|
+
|
158
|
+
cloud2 = Panda::Cloud.new(:id => "cloud2")
|
159
|
+
|
160
|
+
video = cloud.videos.find("123")
|
161
|
+
video2 = cloud2.videos.find("123")
|
162
|
+
|
163
|
+
video.cloud.id.should == "cloud1"
|
164
|
+
video2.cloud.id.should == "cloud2"
|
165
|
+
|
166
|
+
Panda::Video.cloud.id.should == "my_cloud_id"
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should create a video using class method" do
|
170
|
+
video_json = "{\"source_url\":\"url_panda.mp4\",\"id\":\"123\"}"
|
171
|
+
|
172
|
+
stub_http_request(:post, /api.example.com:85\/v2\/videos.json/).
|
173
|
+
with(:body => /source_url=url_panda.mp4/).
|
174
|
+
to_return(:body => video_json)
|
175
|
+
|
176
|
+
video = Panda::Video.create(:source_url => "url_panda.mp4")
|
177
|
+
video.id.should == "123"
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should return a json on attributes" do
|
181
|
+
video = Panda::Video.new(:attr => "value")
|
182
|
+
video.to_json.should == video.attributes.to_json
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should create an encoding using video scope" do
|
186
|
+
encoding_json = "{\"source_url\":\"my_source_url\",\"id\":\"678\"}"
|
187
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
188
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
189
|
+
to_return(:body => video_json)
|
190
|
+
|
191
|
+
stub_http_request(:post, /api.example.com:85\/v2\/encodings.json/).
|
192
|
+
with(:body => /profile_id=345/).
|
193
|
+
to_return(:body => encoding_json)
|
194
|
+
|
195
|
+
video = Panda::Video.find "123"
|
196
|
+
encoding = video.encodings.create(:profile_id => "345")
|
197
|
+
encoding.id.should == "678"
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should not create a model having an id" do
|
201
|
+
video = Panda::Video.new(:id => "abc")
|
202
|
+
lambda {
|
203
|
+
video.create
|
204
|
+
}.should raise_error "Can't create attribute. Already have an id=abc"
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should not create a model having an id" do
|
208
|
+
lambda {
|
209
|
+
Panda::Video.create(:id => "abc")
|
210
|
+
}.should raise_error "Can't create attribute. Already have an id=abc"
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should not call the request twice" do
|
214
|
+
video_json = "{\"source_url\":\"url_panda.mp4\",\"id\":\"123\"}"
|
215
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
216
|
+
video = Panda::Video.find("123")
|
217
|
+
|
218
|
+
encodings_json = "[{\"abc\":\"my_source_url\",\"id\":\"456\"}]"
|
219
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).to_return(:body => encodings_json)
|
220
|
+
|
221
|
+
encodings = video.encodings
|
222
|
+
encodings.first
|
223
|
+
encodings.first
|
224
|
+
|
225
|
+
WebMock.should have_requested(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).once
|
226
|
+
end
|
227
|
+
|
228
|
+
it "should call the request if the scope has changed" do
|
229
|
+
video_json = "{\"source_url\":\"url_panda.mp4\",\"id\":\"123\"}"
|
230
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
231
|
+
video = Panda::Video.find("123")
|
232
|
+
|
233
|
+
encodings_json = "[{\"abc\":\"my_source_url\",\"id\":\"456\"}]"
|
234
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).to_return(:body => encodings_json)
|
235
|
+
|
236
|
+
encodings = video.encodings.status("success")
|
237
|
+
|
238
|
+
encodings.first
|
239
|
+
encodings.last
|
240
|
+
|
241
|
+
video.encodings.first
|
242
|
+
|
243
|
+
WebMock.should have_requested(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).once
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should not call the request twice" do
|
247
|
+
video_json = "{\"source_url\":\"url_panda.mp4\",\"id\":\"123\"}"
|
248
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).to_return(:body => video_json)
|
249
|
+
video = Panda::Video.find("123")
|
250
|
+
|
251
|
+
encodings_json = "[{\"abc\":\"my_source_url\",\"id\":\"456\"}]"
|
252
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).to_return(:body => encodings_json)
|
253
|
+
|
254
|
+
encodings = video.encodings
|
255
|
+
encodings.first.id.should == "456"
|
256
|
+
encodings.reload
|
257
|
+
|
258
|
+
WebMock.should have_requested(:get, /api.example.com:85\/v2\/videos\/123\/encodings.json/).twice
|
259
|
+
end
|
260
|
+
|
261
|
+
it "should tell if the video is success" do
|
262
|
+
encoding = Panda::Video.new({:status => "success"})
|
263
|
+
encoding.success?.should == true
|
264
|
+
encoding.processing?.should == false
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should tell if the video is success" do
|
268
|
+
encoding = Panda::Video.new({:status => "processing"})
|
269
|
+
encoding.success?.should == false
|
270
|
+
encoding.processing?.should == true
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should tell if the video is success" do
|
274
|
+
encoding = Panda::Video.new({:status => "fail"})
|
275
|
+
encoding.success?.should == false
|
276
|
+
encoding.fail?.should == true
|
277
|
+
end
|
278
|
+
|
279
|
+
it "should return the most recent updated video" do
|
280
|
+
video_json = "[{\"source_url\":\"url_panda.mp4\",\"id\":\"123\"}]"
|
281
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos.json/).
|
282
|
+
with{|r| r.uri.query =~ /per_page=1/ }.
|
283
|
+
to_return(:body => video_json)
|
284
|
+
Panda::Video.first
|
285
|
+
end
|
286
|
+
|
287
|
+
it "should not delegate scope if the method do not really exist in the scope" do
|
288
|
+
lambda {Panda::Video.reload}.should raise_error(NoMethodError)
|
289
|
+
lambda {Panda::Video.each}.should raise_error(NoMethodError)
|
290
|
+
lambda {Panda::Video.size}.should raise_error(NoMethodError)
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should lazy load the cloud" do
|
294
|
+
cloud_json = "{\"s3_videos_bucket\":\"my_bucket\",\"id\":\"my_cloud_id\"}"
|
295
|
+
stub_http_request(:get, /api.example.com:85\/v2\/clouds\/my_cloud_id.json/).
|
296
|
+
to_return(:body => cloud_json)
|
297
|
+
|
298
|
+
video_json = "{\"source_url\":\"my_source_url\",\"id\":\"123\"}"
|
299
|
+
stub_http_request(:get, /api.example.com:85\/v2\/videos\/123.json/).
|
300
|
+
to_return(:body => video_json)
|
301
|
+
|
302
|
+
video = Panda::Video.find "123"
|
303
|
+
video.cloud.s3_videos_bucket.should == "my_bucket"
|
304
|
+
end
|
305
|
+
end
|