carrierwave_direct 0.0.13 → 0.0.17
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +15 -1
- data/Changelog.md +130 -0
- data/Gemfile +1 -1
- data/README.md +82 -45
- data/carrierwave_direct.gemspec +3 -4
- data/gemfiles/3.2.gemfile +13 -0
- data/gemfiles/4.0.gemfile +13 -0
- data/gemfiles/4.1.gemfile +13 -0
- data/lib/carrierwave_direct/form_builder.rb +48 -11
- data/lib/carrierwave_direct/locale/nl.yml +9 -0
- data/lib/carrierwave_direct/mount.rb +16 -4
- data/lib/carrierwave_direct/orm/activerecord.rb +4 -4
- data/lib/carrierwave_direct/test/capybara_helpers.rb +7 -5
- data/lib/carrierwave_direct/uploader/configuration.rb +4 -2
- data/lib/carrierwave_direct/uploader/content_type.rb +28 -0
- data/lib/carrierwave_direct/uploader/direct_url.rb +15 -0
- data/lib/carrierwave_direct/uploader.rb +79 -68
- data/lib/carrierwave_direct/validations/active_model.rb +5 -4
- data/lib/carrierwave_direct/version.rb +1 -1
- data/lib/carrierwave_direct.rb +6 -8
- data/spec/action_view_extensions/form_helper_spec.rb +4 -5
- data/spec/data/sample_data.rb +41 -0
- data/spec/form_builder_spec.rb +139 -6
- data/spec/mount_spec.rb +13 -26
- data/spec/orm/activerecord_spec.rb +69 -19
- data/spec/spec_helper.rb +16 -2
- data/spec/support/form_builder_helpers.rb +1 -0
- data/spec/support/model_helpers.rb +7 -7
- data/spec/support/view_helpers.rb +12 -2
- data/spec/test/capybara_helpers_spec.rb +28 -26
- data/spec/test/helpers_spec.rb +9 -11
- data/spec/uploader/configuration_spec.rb +46 -0
- data/spec/uploader/content_type_spec.rb +40 -0
- data/spec/uploader/direct_url_spec.rb +26 -0
- data/spec/uploader_spec.rb +145 -184
- metadata +40 -39
data/spec/uploader_spec.rb
CHANGED
@@ -1,87 +1,25 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require 'spec_helper'
|
3
|
+
require 'data/sample_data'
|
4
4
|
|
5
5
|
describe CarrierWaveDirect::Uploader do
|
6
6
|
include UploaderHelpers
|
7
7
|
include ModelHelpers
|
8
8
|
|
9
|
-
SAMPLE_DATA = {
|
10
|
-
:path => "upload_dir/bliind.exe",
|
11
|
-
:path_with_special_chars => "upload_dir/some file & blah.exe",
|
12
|
-
:key => "some key",
|
13
|
-
:guid => "guid",
|
14
|
-
:store_dir => "store_dir",
|
15
|
-
:extension_regexp => "(avi)",
|
16
|
-
:url => "http://example.com/some_url",
|
17
|
-
:expiration => 60,
|
18
|
-
:min_file_size => 1024,
|
19
|
-
:max_file_size => 10485760,
|
20
|
-
:file_url => "http://anyurl.com/any_path/video_dir/filename.avi",
|
21
|
-
:mounted_model_name => "Porno",
|
22
|
-
:mounted_as => :video,
|
23
|
-
:filename => "filename",
|
24
|
-
:extension => ".avi",
|
25
|
-
:version => :thumb,
|
26
|
-
:s3_bucket_url => "https://s3-bucket.s3.amazonaws.com"
|
27
|
-
}
|
28
|
-
|
29
|
-
SAMPLE_DATA.merge!(
|
30
|
-
:stored_filename_base => "#{sample(:guid)}/#{sample(:filename)}"
|
31
|
-
)
|
32
|
-
|
33
|
-
SAMPLE_DATA.merge!(
|
34
|
-
:stored_filename => "#{sample(:stored_filename_base)}#{sample(:extension)}",
|
35
|
-
:stored_version_filename => "#{sample(:stored_filename_base)}_#{sample(:version)}#{sample(:extension)}"
|
36
|
-
)
|
37
|
-
|
38
|
-
SAMPLE_DATA.merge!(
|
39
|
-
:s3_key => "#{sample(:store_dir)}/#{sample(:stored_filename)}"
|
40
|
-
)
|
41
|
-
|
42
|
-
SAMPLE_DATA.merge!(
|
43
|
-
:s3_file_url => "#{sample(:s3_bucket_url)}/#{sample(:s3_key)}"
|
44
|
-
)
|
45
|
-
|
46
|
-
SAMPLE_DATA.freeze
|
47
|
-
|
48
9
|
let(:subject) { DirectUploader.new }
|
49
|
-
let(:mounted_model) {
|
10
|
+
let(:mounted_model) { double(sample(:mounted_model_name), video_identifier: sample(:stored_filename)) }
|
50
11
|
let(:mounted_subject) { DirectUploader.new(mounted_model, sample(:mounted_as)) }
|
51
12
|
let(:direct_subject) { DirectUploader.new }
|
52
13
|
|
53
|
-
describe ".upload_expiration" do
|
54
|
-
it "should be 10 hours" do
|
55
|
-
subject.class.upload_expiration.should == 36000
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe ".min_file_size" do
|
60
|
-
it "should be 1 byte" do
|
61
|
-
subject.class.min_file_size.should == 1
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe ".max_file_size" do
|
66
|
-
it "should be 5 MB" do
|
67
|
-
subject.class.max_file_size.should == 5242880
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe ".use_action_status" do
|
72
|
-
it "should be false" do
|
73
|
-
subject.class.use_action_status.should be_false
|
74
|
-
end
|
75
|
-
end
|
76
14
|
|
77
15
|
DirectUploader.fog_credentials.keys.each do |key|
|
78
16
|
describe "##{key}" do
|
79
17
|
it "should return the #{key.to_s.capitalize}" do
|
80
|
-
subject.send(key).
|
18
|
+
expect(subject.send(key)).to eq subject.class.fog_credentials[key]
|
81
19
|
end
|
82
20
|
|
83
21
|
it "should not be nil" do
|
84
|
-
subject.send(key).
|
22
|
+
expect(subject.send(key)).to_not be_nil
|
85
23
|
end
|
86
24
|
end
|
87
25
|
end
|
@@ -93,13 +31,13 @@ describe CarrierWaveDirect::Uploader do
|
|
93
31
|
before { subject.key = sample(:key) }
|
94
32
|
|
95
33
|
it "should set the key" do
|
96
|
-
subject.key.
|
34
|
+
expect(subject.key).to eq sample(:key)
|
97
35
|
end
|
98
36
|
|
99
37
|
context "the versions keys" do
|
100
38
|
it "should == this subject's key" do
|
101
39
|
subject.versions.each do |name, version_subject|
|
102
|
-
version_subject.key.
|
40
|
+
expect(version_subject.key).to eq subject.key
|
103
41
|
end
|
104
42
|
end
|
105
43
|
end
|
@@ -112,39 +50,40 @@ describe CarrierWaveDirect::Uploader do
|
|
112
50
|
end
|
113
51
|
|
114
52
|
it "should return '*/\#\{guid\}/${filename}'" do
|
115
|
-
mounted_subject.key.
|
53
|
+
expect(mounted_subject.key).to match /#{GUID_REGEXP}\/\$\{filename\}$/
|
116
54
|
end
|
117
55
|
|
118
56
|
context "and #store_dir returns '#{sample(:store_dir)}'" do
|
119
57
|
before do
|
120
|
-
mounted_subject.
|
58
|
+
allow(mounted_subject).to receive(:store_dir).and_return(sample(:store_dir))
|
121
59
|
end
|
122
60
|
|
123
61
|
it "should return '#{sample(:store_dir)}/\#\{guid\}/${filename}'" do
|
124
|
-
mounted_subject.key.
|
62
|
+
expect(mounted_subject.key).to match /^#{sample(:store_dir)}\/#{GUID_REGEXP}\/\$\{filename\}$/
|
125
63
|
end
|
126
64
|
end
|
127
65
|
|
128
66
|
context "and the uploaders url is #default_url" do
|
129
67
|
it "should return '*/\#\{guid\}/${filename}'" do
|
130
|
-
mounted_subject.
|
131
|
-
mounted_subject.
|
132
|
-
mounted_subject.key.
|
68
|
+
allow(mounted_subject).to receive(:url).and_return(sample(:s3_file_url))
|
69
|
+
allow(mounted_subject).to receive(:present?).and_return(false)
|
70
|
+
expect(mounted_subject.key).to match /#{GUID_REGEXP}\/\$\{filename\}$/
|
133
71
|
end
|
134
72
|
end
|
135
73
|
|
136
74
|
context "but the uploaders url is '#{sample(:s3_file_url)}'" do
|
137
75
|
before do
|
138
|
-
mounted_subject.
|
139
|
-
mounted_subject.
|
76
|
+
allow(mounted_subject).to receive(:store_dir).and_return(sample(:store_dir))
|
77
|
+
allow(mounted_subject).to receive(:url).and_return(sample(:s3_file_url))
|
78
|
+
allow(mounted_subject).to receive(:present?).and_return(true)
|
140
79
|
end
|
141
80
|
|
142
81
|
it "should return '#{sample(:s3_key)}'" do
|
143
|
-
mounted_subject.key.
|
82
|
+
expect(mounted_subject.key).to eq sample(:s3_key)
|
144
83
|
end
|
145
84
|
|
146
85
|
it "should set the key explicitly in order to update the version keys" do
|
147
|
-
mounted_subject.
|
86
|
+
expect(mounted_subject).to receive("key=").with(sample(:s3_key))
|
148
87
|
mounted_subject.key
|
149
88
|
end
|
150
89
|
end
|
@@ -154,34 +93,35 @@ describe CarrierWaveDirect::Uploader do
|
|
154
93
|
before { subject.key = sample(:key) }
|
155
94
|
|
156
95
|
it "should return '#{sample(:key)}'" do
|
157
|
-
subject.key.
|
96
|
+
expect(subject.key).to eq sample(:key)
|
158
97
|
end
|
159
98
|
end
|
160
99
|
end
|
161
100
|
|
162
101
|
describe "#url_scheme_white_list" do
|
163
102
|
it "should return nil" do
|
164
|
-
subject.url_scheme_white_list.
|
103
|
+
expect(subject.url_scheme_white_list).to be_nil
|
165
104
|
end
|
166
105
|
end
|
167
106
|
|
168
107
|
describe "#key_regexp" do
|
169
108
|
it "should return a regexp" do
|
170
|
-
subject.key_regexp.
|
109
|
+
expect(subject.key_regexp).to be_a(Regexp)
|
171
110
|
end
|
172
111
|
|
173
112
|
context "where #store_dir returns '#{sample(:store_dir)}'" do
|
174
113
|
before do
|
175
|
-
subject.
|
114
|
+
allow(subject).to receive(:store_dir).and_return(sample(:store_dir))
|
115
|
+
allow(subject).to receive(:cache_dir).and_return(sample(:cache_dir))
|
176
116
|
end
|
177
117
|
|
178
118
|
context "and #extension_regexp returns '#{sample(:extension_regexp)}'" do
|
179
119
|
before do
|
180
|
-
subject.
|
120
|
+
allow(subject).to receive(:extension_regexp).and_return(sample(:extension_regexp))
|
181
121
|
end
|
182
122
|
|
183
|
-
it "should return /\\A#{sample(:store_dir)}\\/#{GUID_REGEXP}\\/.+\\.#{sample(:extension_regexp)}\\z/" do
|
184
|
-
subject.key_regexp.
|
123
|
+
it "should return /\\A(#{sample(:store_dir)}|#{sample(:cache_dir)})\\/#{GUID_REGEXP}\\/.+\\.#{sample(:extension_regexp)}\\z/" do
|
124
|
+
expect(subject.key_regexp).to eq /\A(#{sample(:store_dir)}|#{sample(:cache_dir)})\/#{GUID_REGEXP}\/.+\.(?i)#{sample(:extension_regexp)}(?-i)\z/
|
185
125
|
end
|
186
126
|
end
|
187
127
|
end
|
@@ -190,17 +130,17 @@ describe CarrierWaveDirect::Uploader do
|
|
190
130
|
describe "#extension_regexp" do
|
191
131
|
shared_examples_for "a globally allowed file extension" do
|
192
132
|
it "should return '\\w+'" do
|
193
|
-
subject.extension_regexp.
|
133
|
+
expect(subject.extension_regexp).to eq "\\w+"
|
194
134
|
end
|
195
135
|
end
|
196
136
|
|
197
137
|
it "should return a string" do
|
198
|
-
subject.extension_regexp.
|
138
|
+
expect(subject.extension_regexp).to be_a(String)
|
199
139
|
end
|
200
140
|
|
201
141
|
context "where #extension_white_list returns nil" do
|
202
142
|
before do
|
203
|
-
subject.
|
143
|
+
allow(subject).to receive(:extension_white_list).and_return(nil)
|
204
144
|
end
|
205
145
|
|
206
146
|
it_should_behave_like "a globally allowed file extension"
|
@@ -208,7 +148,7 @@ describe CarrierWaveDirect::Uploader do
|
|
208
148
|
|
209
149
|
context "where #extension_white_list returns []" do
|
210
150
|
before do
|
211
|
-
subject.
|
151
|
+
allow(subject).to receive(:extension_white_list).and_return([])
|
212
152
|
end
|
213
153
|
|
214
154
|
it_should_behave_like "a globally allowed file extension"
|
@@ -217,11 +157,11 @@ describe CarrierWaveDirect::Uploader do
|
|
217
157
|
context "where #extension_white_list returns ['exe', 'bmp']" do
|
218
158
|
|
219
159
|
before do
|
220
|
-
subject.
|
160
|
+
allow(subject).to receive(:extension_white_list).and_return(%w{exe bmp})
|
221
161
|
end
|
222
162
|
|
223
163
|
it "should return '(exe|bmp)'" do
|
224
|
-
subject.extension_regexp.
|
164
|
+
expect(subject.extension_regexp).to eq "(exe|bmp)"
|
225
165
|
end
|
226
166
|
end
|
227
167
|
end
|
@@ -230,7 +170,7 @@ describe CarrierWaveDirect::Uploader do
|
|
230
170
|
context "a key has not been set" do
|
231
171
|
|
232
172
|
it "should return false" do
|
233
|
-
subject.
|
173
|
+
expect(subject).to_not have_key
|
234
174
|
end
|
235
175
|
end
|
236
176
|
|
@@ -238,7 +178,7 @@ describe CarrierWaveDirect::Uploader do
|
|
238
178
|
before { subject.key }
|
239
179
|
|
240
180
|
it "should return false" do
|
241
|
-
subject.
|
181
|
+
expect(subject).to_not have_key
|
242
182
|
end
|
243
183
|
end
|
244
184
|
|
@@ -246,47 +186,14 @@ describe CarrierWaveDirect::Uploader do
|
|
246
186
|
before { subject.key = sample_key }
|
247
187
|
|
248
188
|
it "should return true" do
|
249
|
-
subject.
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
|
254
|
-
describe "#direct_fog_url" do
|
255
|
-
it "should return the result from CarrierWave::Storage::Fog::File#public_url" do
|
256
|
-
subject.direct_fog_url.should == CarrierWave::Storage::Fog::File.new(
|
257
|
-
subject, nil, nil
|
258
|
-
).public_url
|
259
|
-
end
|
260
|
-
|
261
|
-
context ":with_path => true" do
|
262
|
-
|
263
|
-
context "#key is set to '#{sample(:path_with_special_chars)}'" do
|
264
|
-
before { subject.key = sample(:path_with_special_chars) }
|
265
|
-
|
266
|
-
it "should return the full url with '/#{URI.escape(sample(:path_with_special_chars))}' as the path" do
|
267
|
-
direct_fog_url = CarrierWave::Storage::Fog::File.new(
|
268
|
-
subject, nil, nil
|
269
|
-
).public_url
|
270
|
-
subject.direct_fog_url(:with_path => true).should == direct_fog_url + "#{URI.escape(sample(:path_with_special_chars))}"
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
context "#key is set to '#{sample(:path)}'" do
|
275
|
-
before { subject.key = sample(:path) }
|
276
|
-
|
277
|
-
it "should return the full url with '/#{sample(:path)}' as the path" do
|
278
|
-
direct_fog_url = CarrierWave::Storage::Fog::File.new(
|
279
|
-
subject, nil, nil
|
280
|
-
).public_url
|
281
|
-
subject.direct_fog_url(:with_path => true).should == direct_fog_url + "#{sample(:path)}"
|
282
|
-
end
|
189
|
+
expect(subject).to have_key
|
283
190
|
end
|
284
191
|
end
|
285
192
|
end
|
286
193
|
|
287
194
|
describe "#persisted?" do
|
288
195
|
it "should return false" do
|
289
|
-
subject.
|
196
|
+
expect(subject).to_not be_persisted
|
290
197
|
end
|
291
198
|
end
|
292
199
|
|
@@ -295,7 +202,7 @@ describe CarrierWaveDirect::Uploader do
|
|
295
202
|
before { mounted_subject.key = sample(:s3_key) }
|
296
203
|
|
297
204
|
it "should return '#{sample(:stored_filename)}'" do
|
298
|
-
mounted_subject.filename.
|
205
|
+
expect(mounted_subject.filename).to eq sample(:stored_filename)
|
299
206
|
end
|
300
207
|
end
|
301
208
|
|
@@ -303,7 +210,7 @@ describe CarrierWaveDirect::Uploader do
|
|
303
210
|
before { subject.key = sample(:key) }
|
304
211
|
|
305
212
|
it "should return '#{sample(:key)}'" do
|
306
|
-
subject.filename.
|
213
|
+
expect(subject.filename).to eq sample(:key)
|
307
214
|
end
|
308
215
|
end
|
309
216
|
|
@@ -311,51 +218,51 @@ describe CarrierWaveDirect::Uploader do
|
|
311
218
|
context "but the model's remote #{sample(:mounted_as)} url is: '#{sample(:file_url)}'" do
|
312
219
|
|
313
220
|
before do
|
314
|
-
mounted_subject.model.
|
221
|
+
allow(mounted_subject.model).to receive(
|
315
222
|
"remote_#{mounted_subject.mounted_as}_url"
|
316
223
|
).and_return(sample(:file_url))
|
317
224
|
end
|
318
225
|
|
319
226
|
it "should set the key to contain '#{File.basename(sample(:file_url))}'" do
|
320
227
|
mounted_subject.filename
|
321
|
-
mounted_subject.key.
|
228
|
+
expect(mounted_subject.key).to match /#{Regexp.escape(File.basename(sample(:file_url)))}$/
|
322
229
|
end
|
323
230
|
|
324
231
|
it "should return a filename based off the key and remote url" do
|
325
232
|
filename = mounted_subject.filename
|
326
|
-
mounted_subject.key.
|
233
|
+
expect(mounted_subject.key).to match /#{Regexp.escape(filename)}$/
|
327
234
|
end
|
328
235
|
|
329
236
|
# this ensures that the version subject keys are updated
|
330
237
|
# see spec for key= for more details
|
331
238
|
it "should set the key explicitly" do
|
332
|
-
mounted_subject.
|
239
|
+
expect(mounted_subject).to receive(:key=)
|
333
240
|
mounted_subject.filename
|
334
241
|
end
|
335
242
|
end
|
336
243
|
|
337
|
-
context "and the model's remote #{sample(:mounted_as)} url has
|
244
|
+
context "and the model's remote #{sample(:mounted_as)} url has special characters in it" do
|
338
245
|
before do
|
339
|
-
mounted_model.
|
246
|
+
allow(mounted_model).to receive(
|
340
247
|
"remote_#{mounted_subject.mounted_as}_url"
|
341
|
-
).and_return("http://anyurl.com/any_path/video_dir/filename 2.avi")
|
248
|
+
).and_return("http://anyurl.com/any_path/video_dir/filename ()+[]2.avi")
|
342
249
|
end
|
343
250
|
|
344
|
-
it "should be sanitized (
|
251
|
+
it "should be sanitized (special characters replaced with _)" do
|
345
252
|
mounted_subject.filename
|
346
|
-
mounted_subject.key.
|
253
|
+
expect(mounted_subject.key).to match /filename___\+__2.avi$/
|
347
254
|
end
|
348
255
|
end
|
349
256
|
|
350
257
|
context "and the model's remote #{sample(:mounted_as)} url is blank" do
|
351
258
|
before do
|
352
|
-
mounted_model.
|
259
|
+
allow(mounted_model).to receive(
|
353
260
|
"remote_#{mounted_subject.mounted_as}_url"
|
354
261
|
).and_return nil
|
355
262
|
end
|
356
263
|
|
357
264
|
it "should return nil" do
|
358
|
-
mounted_subject.filename.
|
265
|
+
expect(mounted_subject.filename).to be_nil
|
359
266
|
end
|
360
267
|
end
|
361
268
|
end
|
@@ -363,23 +270,52 @@ describe CarrierWaveDirect::Uploader do
|
|
363
270
|
|
364
271
|
describe "#acl" do
|
365
272
|
it "should return the correct s3 access policy" do
|
366
|
-
subject.acl.
|
273
|
+
expect(subject.acl).to eq (subject.fog_public ? 'public-read' : 'private')
|
367
274
|
end
|
368
275
|
end
|
369
276
|
|
370
277
|
# http://aws.amazon.com/articles/1434?_encoding=UTF8
|
371
278
|
describe "#policy" do
|
372
|
-
|
279
|
+
|
280
|
+
|
281
|
+
def decoded_policy(options = {}, &block)
|
373
282
|
instance = options.delete(:subject) || subject
|
374
|
-
JSON.parse(Base64.decode64(instance.policy(options)))
|
283
|
+
JSON.parse(Base64.decode64(instance.policy(options, &block)))
|
284
|
+
end
|
285
|
+
|
286
|
+
context "policy is given a block" do
|
287
|
+
it "should yield the options to the block" do
|
288
|
+
number = 0
|
289
|
+
subject.policy do |conditions|
|
290
|
+
number+=1
|
291
|
+
end
|
292
|
+
expect(number).to eq 1
|
293
|
+
end
|
294
|
+
it "should include new options in the conditions" do
|
295
|
+
policy = subject.policy do |conditions|
|
296
|
+
conditions << {"x-aws-storage-class" => "STANDARD"}
|
297
|
+
end
|
298
|
+
decoded = JSON.parse(Base64.decode64(policy))
|
299
|
+
expect(decoded['conditions'].last['x-aws-storage-class']).to eq "STANDARD"
|
300
|
+
end
|
375
301
|
end
|
376
302
|
|
377
303
|
it "should return Base64-encoded JSON" do
|
378
|
-
decoded_policy.
|
304
|
+
expect(decoded_policy).to be_a(Hash)
|
379
305
|
end
|
380
306
|
|
381
307
|
it "should not contain any new lines" do
|
382
|
-
subject.policy.
|
308
|
+
expect(subject.policy).to_not include("\n")
|
309
|
+
end
|
310
|
+
|
311
|
+
it "should be cached" do
|
312
|
+
Timecop.freeze(Time.now) do
|
313
|
+
@policy_now = subject.policy
|
314
|
+
end
|
315
|
+
Timecop.freeze(1.second.from_now) do
|
316
|
+
@policy_later = subject.policy
|
317
|
+
end
|
318
|
+
expect(@policy_later).to eql @policy_now
|
383
319
|
end
|
384
320
|
|
385
321
|
context "expiration" do
|
@@ -387,29 +323,30 @@ describe CarrierWaveDirect::Uploader do
|
|
387
323
|
decoded_policy(options)["expiration"]
|
388
324
|
end
|
389
325
|
|
326
|
+
# JSON times have no seconds, so accept upto one second inaccuracy
|
390
327
|
def have_expiration(expires_in = DirectUploader.upload_expiration)
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
)
|
328
|
+
be_within(1.second).of (Time.now + expires_in)
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should be valid ISO8601 and not use default Time#to_json" do
|
332
|
+
Time.any_instance.stub(:to_json) { '"Invalid time"' } # JSON gem
|
333
|
+
Time.any_instance.stub(:as_json) { '"Invalid time"' } # Active Support
|
334
|
+
expect { Time.iso8601(expiration) }.to_not raise_error
|
398
335
|
end
|
399
336
|
|
400
337
|
it "should be #{DirectUploader.upload_expiration / 3600} hours from now" do
|
401
338
|
Timecop.freeze(Time.now) do
|
402
|
-
Time.parse(expiration).
|
339
|
+
expect(Time.parse(expiration)).to have_expiration
|
403
340
|
end
|
404
341
|
end
|
405
342
|
|
406
343
|
it "should be encoded as a utc time" do
|
407
|
-
Time.parse(expiration).
|
344
|
+
expect(Time.parse(expiration)).to be_utc
|
408
345
|
end
|
409
346
|
|
410
347
|
it "should be #{sample(:expiration) / 60 } minutes from now when passing {:expiration => #{sample(:expiration)}}" do
|
411
348
|
Timecop.freeze(Time.now) do
|
412
|
-
Time.parse(expiration(:expiration => sample(:expiration))).
|
349
|
+
expect(Time.parse(expiration(:expiration => sample(:expiration)))).to have_expiration(sample(:expiration))
|
413
350
|
end
|
414
351
|
end
|
415
352
|
end
|
@@ -424,40 +361,49 @@ describe CarrierWaveDirect::Uploader do
|
|
424
361
|
end
|
425
362
|
|
426
363
|
context "should include" do
|
427
|
-
|
428
|
-
|
429
|
-
|
364
|
+
it "'utf8' if enforce_ut8 is set" do
|
365
|
+
expect(conditions(enforce_utf8: true)).to have_condition(:utf8)
|
366
|
+
end
|
367
|
+
|
368
|
+
it "'utf8' if enforce_ut8 is set" do
|
369
|
+
expect(conditions).to_not have_condition(:utf8)
|
430
370
|
end
|
431
371
|
|
432
372
|
# S3 conditions
|
433
373
|
it "'key'" do
|
434
|
-
mounted_subject.
|
435
|
-
conditions(
|
374
|
+
allow(mounted_subject).to receive(:key).and_return(sample(:s3_key))
|
375
|
+
expect(conditions(
|
436
376
|
:subject => mounted_subject
|
437
|
-
).
|
377
|
+
)).to have_condition(:key, sample(:s3_key))
|
438
378
|
end
|
439
379
|
|
440
380
|
it "'key' without FILENAME_WILDCARD" do
|
441
|
-
conditions(
|
381
|
+
expect(conditions(
|
442
382
|
:subject => mounted_subject
|
443
|
-
).
|
383
|
+
)).to have_condition(:key, mounted_subject.key.sub("${filename}", ""))
|
444
384
|
end
|
445
385
|
|
446
386
|
it "'bucket'" do
|
447
|
-
conditions.
|
387
|
+
expect(conditions).to have_condition("bucket" => subject.fog_directory)
|
448
388
|
end
|
449
389
|
|
450
390
|
it "'acl'" do
|
451
|
-
conditions.
|
391
|
+
expect(conditions).to have_condition("acl" => subject.acl)
|
452
392
|
end
|
453
393
|
|
454
394
|
it "'success_action_redirect'" do
|
455
395
|
subject.success_action_redirect = "http://example.com/some_url"
|
456
|
-
conditions.
|
396
|
+
expect(conditions).to have_condition("success_action_redirect" => "http://example.com/some_url")
|
457
397
|
end
|
458
398
|
|
459
|
-
it "'content-type'
|
460
|
-
|
399
|
+
it "does not have 'content-type' when will_include_content_type is false" do
|
400
|
+
allow(subject.class).to receive(:will_include_content_type).and_return(false)
|
401
|
+
expect(conditions).to_not have_condition('Content-Type')
|
402
|
+
end
|
403
|
+
|
404
|
+
it "has 'content-type' when will_include_content_type is true" do
|
405
|
+
allow(subject.class).to receive(:will_include_content_type).and_return(true)
|
406
|
+
expect(conditions).to have_condition('Content-Type')
|
461
407
|
end
|
462
408
|
|
463
409
|
context 'when use_action_status is true' do
|
@@ -471,12 +417,12 @@ describe CarrierWaveDirect::Uploader do
|
|
471
417
|
|
472
418
|
it "'success_action_status'" do
|
473
419
|
subject.success_action_status = '200'
|
474
|
-
conditions.
|
420
|
+
expect(conditions).to have_condition("success_action_status" => "200")
|
475
421
|
end
|
476
422
|
|
477
423
|
it "does not have 'success_action_redirect'" do
|
478
424
|
subject.success_action_redirect = "http://example.com/some_url"
|
479
|
-
conditions.
|
425
|
+
expect(conditions).to_not have_condition("success_action_redirect" => "http://example.com/some_url")
|
480
426
|
end
|
481
427
|
end
|
482
428
|
|
@@ -490,53 +436,68 @@ describe CarrierWaveDirect::Uploader do
|
|
490
436
|
end
|
491
437
|
|
492
438
|
it "#{DirectUploader.min_file_size} bytes" do
|
493
|
-
conditions.
|
439
|
+
expect(conditions).to have_content_length_range
|
494
440
|
end
|
495
441
|
|
496
442
|
it "#{DirectUploader.max_file_size} bytes" do
|
497
|
-
conditions.
|
443
|
+
expect(conditions).to have_content_length_range
|
498
444
|
end
|
499
445
|
|
500
446
|
it "#{sample(:min_file_size)} bytes when passing {:min_file_size => #{sample(:min_file_size)}}" do
|
501
|
-
conditions(
|
447
|
+
expect(conditions(
|
502
448
|
:min_file_size => sample(:min_file_size)
|
503
|
-
).
|
449
|
+
)).to have_content_length_range(:min_file_size => sample(:min_file_size))
|
504
450
|
end
|
505
451
|
|
506
452
|
it "#{sample(:max_file_size)} bytes when passing {:max_file_size => #{sample(:max_file_size)}}" do
|
507
|
-
conditions(
|
453
|
+
expect(conditions(
|
508
454
|
:max_file_size => sample(:max_file_size)
|
509
|
-
).
|
455
|
+
)).to have_content_length_range(:max_file_size => sample(:max_file_size))
|
510
456
|
end
|
511
457
|
end
|
512
458
|
end
|
513
459
|
end
|
514
460
|
end
|
515
461
|
|
462
|
+
describe "clear_policy!" do
|
463
|
+
it "should reset the cached policy string" do
|
464
|
+
Timecop.freeze(Time.now) do
|
465
|
+
@policy_now = subject.policy
|
466
|
+
end
|
467
|
+
subject.clear_policy!
|
468
|
+
|
469
|
+
Timecop.freeze(1.second.from_now) do
|
470
|
+
@policy_after_reset = subject.policy
|
471
|
+
end
|
472
|
+
expect(@policy_after_reset).not_to eql @policy_now
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
516
476
|
describe "#signature" do
|
517
477
|
it "should not contain any new lines" do
|
518
|
-
subject.signature.
|
478
|
+
expect(subject.signature).to_not include("\n")
|
519
479
|
end
|
520
480
|
|
521
481
|
it "should return a base64 encoded 'sha1' hash of the secret key and policy document" do
|
522
|
-
Base64.decode64(subject.signature).
|
523
|
-
OpenSSL::Digest
|
482
|
+
expect(Base64.decode64(subject.signature)).to eq OpenSSL::HMAC.digest(
|
483
|
+
OpenSSL::Digest.new('sha1'),
|
524
484
|
subject.aws_secret_access_key, subject.policy
|
525
485
|
)
|
526
486
|
end
|
527
487
|
end
|
528
488
|
|
489
|
+
|
529
490
|
# note that 'video' is hardcoded into the MountedClass support file
|
530
491
|
# so changing the sample will cause the tests to fail
|
531
492
|
context "a class has a '#{sample(:mounted_as)}' mounted" do
|
532
493
|
describe "#{sample(:mounted_as).to_s.capitalize}Uploader" do
|
533
494
|
describe "##{sample(:mounted_as)}" do
|
534
495
|
it "should be defined" do
|
535
|
-
direct_subject.
|
496
|
+
expect(direct_subject).to be_respond_to(sample(:mounted_as))
|
536
497
|
end
|
537
498
|
|
538
499
|
it "should return itself" do
|
539
|
-
direct_subject.send(sample(:mounted_as)).
|
500
|
+
expect(direct_subject.send(sample(:mounted_as))).to eq direct_subject
|
540
501
|
end
|
541
502
|
end
|
542
503
|
|
@@ -556,11 +517,11 @@ describe CarrierWaveDirect::Uploader do
|
|
556
517
|
let(:store_path) { video_subject.send(sample(:version)).store_path }
|
557
518
|
|
558
519
|
it "should be like '#{sample(:stored_version_filename)}'" do
|
559
|
-
store_path.
|
520
|
+
expect(store_path).to match /#{sample(:stored_version_filename)}$/
|
560
521
|
end
|
561
522
|
|
562
523
|
it "should not be like '#{sample(:version)}_#{sample(:stored_filename_base)}'" do
|
563
|
-
store_path.
|
524
|
+
expect(store_path).to_not match /#{sample(:version)}_#{sample(:stored_filename_base)}/
|
564
525
|
end
|
565
526
|
end
|
566
527
|
end
|