mender_paperclip 2.4.3

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.
Files changed (70) hide show
  1. data/LICENSE +26 -0
  2. data/README.md +402 -0
  3. data/Rakefile +86 -0
  4. data/generators/paperclip/USAGE +5 -0
  5. data/generators/paperclip/paperclip_generator.rb +27 -0
  6. data/generators/paperclip/templates/paperclip_migration.rb.erb +19 -0
  7. data/init.rb +4 -0
  8. data/lib/generators/paperclip/USAGE +8 -0
  9. data/lib/generators/paperclip/paperclip_generator.rb +33 -0
  10. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +19 -0
  11. data/lib/paperclip/attachment.rb +454 -0
  12. data/lib/paperclip/callback_compatibility.rb +61 -0
  13. data/lib/paperclip/geometry.rb +120 -0
  14. data/lib/paperclip/interpolations.rb +181 -0
  15. data/lib/paperclip/iostream.rb +45 -0
  16. data/lib/paperclip/matchers/have_attached_file_matcher.rb +57 -0
  17. data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +81 -0
  18. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +54 -0
  19. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +95 -0
  20. data/lib/paperclip/matchers.rb +33 -0
  21. data/lib/paperclip/missing_attachment_styles.rb +87 -0
  22. data/lib/paperclip/options.rb +79 -0
  23. data/lib/paperclip/processor.rb +58 -0
  24. data/lib/paperclip/railtie.rb +26 -0
  25. data/lib/paperclip/storage/filesystem.rb +81 -0
  26. data/lib/paperclip/storage/fog.rb +162 -0
  27. data/lib/paperclip/storage/s3.rb +262 -0
  28. data/lib/paperclip/storage.rb +3 -0
  29. data/lib/paperclip/style.rb +95 -0
  30. data/lib/paperclip/thumbnail.rb +105 -0
  31. data/lib/paperclip/upfile.rb +62 -0
  32. data/lib/paperclip/version.rb +3 -0
  33. data/lib/paperclip.rb +478 -0
  34. data/lib/tasks/paperclip.rake +97 -0
  35. data/rails/init.rb +2 -0
  36. data/shoulda_macros/paperclip.rb +124 -0
  37. data/test/attachment_test.rb +1120 -0
  38. data/test/database.yml +4 -0
  39. data/test/fixtures/12k.png +0 -0
  40. data/test/fixtures/50x50.png +0 -0
  41. data/test/fixtures/5k.png +0 -0
  42. data/test/fixtures/animated.gif +0 -0
  43. data/test/fixtures/bad.png +1 -0
  44. data/test/fixtures/fog.yml +8 -0
  45. data/test/fixtures/s3.yml +8 -0
  46. data/test/fixtures/spaced file.png +0 -0
  47. data/test/fixtures/text.txt +1 -0
  48. data/test/fixtures/twopage.pdf +0 -0
  49. data/test/fixtures/uppercase.PNG +0 -0
  50. data/test/fog_test.rb +191 -0
  51. data/test/geometry_test.rb +206 -0
  52. data/test/helper.rb +152 -0
  53. data/test/integration_test.rb +654 -0
  54. data/test/interpolations_test.rb +195 -0
  55. data/test/iostream_test.rb +71 -0
  56. data/test/matchers/have_attached_file_matcher_test.rb +24 -0
  57. data/test/matchers/validate_attachment_content_type_matcher_test.rb +87 -0
  58. data/test/matchers/validate_attachment_presence_matcher_test.rb +26 -0
  59. data/test/matchers/validate_attachment_size_matcher_test.rb +51 -0
  60. data/test/options_test.rb +68 -0
  61. data/test/paperclip_missing_attachment_styles_test.rb +80 -0
  62. data/test/paperclip_test.rb +329 -0
  63. data/test/processor_test.rb +10 -0
  64. data/test/storage/filesystem_test.rb +52 -0
  65. data/test/storage/s3_live_test.rb +51 -0
  66. data/test/storage/s3_test.rb +633 -0
  67. data/test/style_test.rb +180 -0
  68. data/test/thumbnail_test.rb +383 -0
  69. data/test/upfile_test.rb +53 -0
  70. metadata +243 -0
@@ -0,0 +1,633 @@
1
+ require './test/helper'
2
+ require 'aws/s3'
3
+
4
+ class S3Test < Test::Unit::TestCase
5
+ def rails_env(env)
6
+ silence_warnings do
7
+ Object.const_set(:Rails, stub('Rails', :env => env))
8
+ end
9
+ end
10
+
11
+ context "Parsing S3 credentials" do
12
+ setup do
13
+ @proxy_settings = {:host => "127.0.0.1", :port => 8888, :user => "foo", :password => "bar"}
14
+ AWS::S3::Base.stubs(:establish_connection!)
15
+ rebuild_model :storage => :s3,
16
+ :bucket => "testing",
17
+ :http_proxy => @proxy_settings,
18
+ :s3_credentials => {:not => :important}
19
+
20
+ @dummy = Dummy.new
21
+ @avatar = @dummy.avatar
22
+ end
23
+
24
+ should "get the correct credentials when RAILS_ENV is production" do
25
+ rails_env("production")
26
+ assert_equal({:key => "12345"},
27
+ @avatar.parse_credentials('production' => {:key => '12345'},
28
+ :development => {:key => "54321"}))
29
+ end
30
+
31
+ should "get the correct credentials when RAILS_ENV is development" do
32
+ rails_env("development")
33
+ assert_equal({:key => "54321"},
34
+ @avatar.parse_credentials('production' => {:key => '12345'},
35
+ :development => {:key => "54321"}))
36
+ end
37
+
38
+ should "return the argument if the key does not exist" do
39
+ rails_env("not really an env")
40
+ assert_equal({:test => "12345"}, @avatar.parse_credentials(:test => "12345"))
41
+ end
42
+
43
+ should "support HTTP proxy settings" do
44
+ rails_env("development")
45
+ assert_equal(true, @avatar.using_http_proxy?)
46
+ assert_equal(@proxy_settings[:host], @avatar.http_proxy_host)
47
+ assert_equal(@proxy_settings[:port], @avatar.http_proxy_port)
48
+ assert_equal(@proxy_settings[:user], @avatar.http_proxy_user)
49
+ assert_equal(@proxy_settings[:password], @avatar.http_proxy_password)
50
+ end
51
+
52
+ end
53
+
54
+ context "" do
55
+ setup do
56
+ AWS::S3::Base.stubs(:establish_connection!)
57
+ rebuild_model :storage => :s3,
58
+ :s3_credentials => {},
59
+ :bucket => "bucket",
60
+ :path => ":attachment/:basename.:extension",
61
+ :url => ":s3_path_url"
62
+ @dummy = Dummy.new
63
+ @dummy.avatar = StringIO.new(".")
64
+ end
65
+
66
+ should "return a url based on an S3 path" do
67
+ assert_match %r{^http://s3.amazonaws.com/bucket/avatars/stringio.txt}, @dummy.avatar.url
68
+ end
69
+ end
70
+
71
+ context "s3_host_name" do
72
+ setup do
73
+ AWS::S3::Base.stubs(:establish_connection!)
74
+ rebuild_model :storage => :s3,
75
+ :s3_credentials => {},
76
+ :bucket => "bucket",
77
+ :path => ":attachment/:basename.:extension",
78
+ :s3_host_name => "s3-ap-northeast-1.amazonaws.com"
79
+ @dummy = Dummy.new
80
+ @dummy.avatar = StringIO.new(".")
81
+ end
82
+
83
+ should "return a url based on an :s3_host_name path" do
84
+ assert_match %r{^http://s3-ap-northeast-1.amazonaws.com/bucket/avatars/stringio.txt}, @dummy.avatar.url
85
+ end
86
+ end
87
+
88
+ context "An attachment that uses S3 for storage and has styles that return different file types" do
89
+ setup do
90
+ AWS::S3::Base.stubs(:establish_connection!)
91
+ rebuild_model :styles => { :large => ['500x500#', :jpg] },
92
+ :storage => :s3,
93
+ :bucket => "bucket",
94
+ :path => ":attachment/:basename.:extension",
95
+ :s3_credentials => {
96
+ 'access_key_id' => "12345",
97
+ 'secret_access_key' => "54321"
98
+ }
99
+
100
+ @dummy = Dummy.new
101
+ @dummy.avatar = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', '5k.png'), 'rb')
102
+ end
103
+
104
+ should "return a url containing the correct original file mime type" do
105
+ assert_match /.+\/5k.png/, @dummy.avatar.url
106
+ end
107
+
108
+ should "return a url containing the correct processed file mime type" do
109
+ assert_match /.+\/5k.jpg/, @dummy.avatar.url(:large)
110
+ end
111
+ end
112
+
113
+ context "An attachment that uses S3 for storage and has spaces in file name" do
114
+ setup do
115
+ AWS::S3::Base.stubs(:establish_connection!)
116
+ rebuild_model :styles => { :large => ['500x500#', :jpg] },
117
+ :storage => :s3,
118
+ :bucket => "bucket",
119
+ :path => ":attachment/:basename.:extension",
120
+ :s3_credentials => {
121
+ 'access_key_id' => "12345",
122
+ 'secret_access_key' => "54321"
123
+ }
124
+
125
+ @dummy = Dummy.new
126
+ @dummy.avatar = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', 'spaced file.png'), 'rb')
127
+ end
128
+
129
+ should "return an escaped version of url" do
130
+ assert_match /.+\/spaced%20file\.png/, @dummy.avatar.url
131
+ end
132
+ end
133
+
134
+ context "" do
135
+ setup do
136
+ AWS::S3::Base.stubs(:establish_connection!)
137
+ rebuild_model :storage => :s3,
138
+ :s3_credentials => {},
139
+ :bucket => "bucket",
140
+ :path => ":attachment/:basename.:extension",
141
+ :url => ":s3_domain_url"
142
+ @dummy = Dummy.new
143
+ @dummy.avatar = StringIO.new(".")
144
+ end
145
+
146
+ should "return a url based on an S3 subdomain" do
147
+ assert_match %r{^http://bucket.s3.amazonaws.com/avatars/stringio.txt}, @dummy.avatar.url
148
+ end
149
+ end
150
+
151
+ context "" do
152
+ setup do
153
+ AWS::S3::Base.stubs(:establish_connection!)
154
+ rebuild_model :storage => :s3,
155
+ :s3_credentials => {
156
+ :production => { :bucket => "prod_bucket" },
157
+ :development => { :bucket => "dev_bucket" }
158
+ },
159
+ :s3_host_alias => "something.something.com",
160
+ :path => ":attachment/:basename.:extension",
161
+ :url => ":s3_alias_url"
162
+ @dummy = Dummy.new
163
+ @dummy.avatar = StringIO.new(".")
164
+ end
165
+
166
+ should "return a url based on the host_alias" do
167
+ assert_match %r{^http://something.something.com/avatars/stringio.txt}, @dummy.avatar.url
168
+ end
169
+ end
170
+
171
+ context "generating a url with a proc as the host alias" do
172
+ setup do
173
+ AWS::S3::Base.stubs(:establish_connection!)
174
+ rebuild_model :storage => :s3,
175
+ :s3_credentials => { :bucket => "prod_bucket" },
176
+ :s3_host_alias => Proc.new{|atch| "cdn#{atch.instance.counter % 4}.example.com"},
177
+ :path => ":attachment/:basename.:extension",
178
+ :url => ":s3_alias_url"
179
+ Dummy.class_eval do
180
+ def counter
181
+ @counter ||= 0
182
+ @counter += 1
183
+ @counter
184
+ end
185
+ end
186
+ @dummy = Dummy.new
187
+ @dummy.avatar = StringIO.new(".")
188
+ end
189
+
190
+ should "return a url based on the host_alias" do
191
+ assert_match %r{^http://cdn1.example.com/avatars/stringio.txt}, @dummy.avatar.url
192
+ assert_match %r{^http://cdn2.example.com/avatars/stringio.txt}, @dummy.avatar.url
193
+ end
194
+
195
+ should "still return the bucket name" do
196
+ assert_equal "prod_bucket", @dummy.avatar.bucket_name
197
+ end
198
+
199
+ end
200
+
201
+ context "" do
202
+ setup do
203
+ AWS::S3::Base.stubs(:establish_connection!)
204
+ rebuild_model :storage => :s3,
205
+ :s3_credentials => {},
206
+ :bucket => "bucket",
207
+ :path => ":attachment/:basename.:extension",
208
+ :url => ":asset_host"
209
+ @dummy = Dummy.new
210
+ @dummy.avatar = StringIO.new(".")
211
+ end
212
+
213
+ should "return a relative URL for Rails to calculate assets host" do
214
+ assert_match %r{^avatars/stringio\.txt}, @dummy.avatar.url
215
+ end
216
+ end
217
+
218
+ context "Generating a secure url with an expiration" do
219
+ setup do
220
+ AWS::S3::Base.stubs(:establish_connection!)
221
+ rebuild_model :storage => :s3,
222
+ :s3_credentials => {
223
+ :production => { :bucket => "prod_bucket" },
224
+ :development => { :bucket => "dev_bucket" }
225
+ },
226
+ :s3_host_alias => "something.something.com",
227
+ :s3_permissions => "private",
228
+ :path => ":attachment/:basename.:extension",
229
+ :url => ":s3_alias_url"
230
+
231
+ rails_env("production")
232
+
233
+ @dummy = Dummy.new
234
+ @dummy.avatar = StringIO.new(".")
235
+
236
+ AWS::S3::S3Object.expects(:url_for).with("avatars/stringio.txt", "prod_bucket", { :expires_in => 3600, :use_ssl => true })
237
+
238
+ @dummy.avatar.expiring_url
239
+ end
240
+
241
+ should "should succeed" do
242
+ assert true
243
+ end
244
+ end
245
+
246
+ context "Generating a url with an expiration" do
247
+ setup do
248
+ AWS::S3::Base.stubs(:establish_connection!)
249
+ rebuild_model :storage => :s3,
250
+ :s3_credentials => {
251
+ :production => { :bucket => "prod_bucket" },
252
+ :development => { :bucket => "dev_bucket" }
253
+ },
254
+ :s3_permissions => :private,
255
+ :s3_host_alias => "something.something.com",
256
+ :path => ":attachment/:style/:basename.:extension",
257
+ :url => ":s3_alias_url"
258
+
259
+ rails_env("production")
260
+
261
+ @dummy = Dummy.new
262
+ @dummy.avatar = StringIO.new(".")
263
+
264
+ AWS::S3::S3Object.expects(:url_for).with("avatars/original/stringio.txt", "prod_bucket", { :expires_in => 3600, :use_ssl => true })
265
+ @dummy.avatar.expiring_url
266
+
267
+ AWS::S3::S3Object.expects(:url_for).with("avatars/thumb/stringio.txt", "prod_bucket", { :expires_in => 1800, :use_ssl => true })
268
+ @dummy.avatar.expiring_url(1800, :thumb)
269
+ end
270
+
271
+ should "should succeed" do
272
+ assert true
273
+ end
274
+ end
275
+
276
+ context "Parsing S3 credentials with a bucket in them" do
277
+ setup do
278
+ AWS::S3::Base.stubs(:establish_connection!)
279
+ rebuild_model :storage => :s3,
280
+ :s3_credentials => {
281
+ :production => { :bucket => "prod_bucket" },
282
+ :development => { :bucket => "dev_bucket" }
283
+ }
284
+ @dummy = Dummy.new
285
+ end
286
+
287
+ should "get the right bucket in production" do
288
+ rails_env("production")
289
+ assert_equal "prod_bucket", @dummy.avatar.bucket_name
290
+ end
291
+
292
+ should "get the right bucket in development" do
293
+ rails_env("development")
294
+ assert_equal "dev_bucket", @dummy.avatar.bucket_name
295
+ end
296
+ end
297
+
298
+ context "Parsing S3 credentials with a s3_host_name in them" do
299
+ setup do
300
+ AWS::S3::Base.stubs(:establish_connection!)
301
+ rebuild_model :storage => :s3,
302
+ :s3_credentials => {
303
+ :production => { :s3_host_name => "s3-world-end.amazonaws.com" },
304
+ :development => { :s3_host_name => "s3-ap-northeast-1.amazonaws.com" }
305
+ }
306
+ @dummy = Dummy.new
307
+ end
308
+
309
+ should "get the right s3_host_name in production" do
310
+ rails_env("production")
311
+ assert_match %r{^s3-world-end.amazonaws.com}, @dummy.avatar.s3_host_name
312
+ end
313
+
314
+ should "get the right s3_host_name in development" do
315
+ rails_env("development")
316
+ assert_match %r{^s3-ap-northeast-1.amazonaws.com}, @dummy.avatar.s3_host_name
317
+ end
318
+
319
+ should "get the right s3_host_name if the key does not exist" do
320
+ rails_env("test")
321
+ assert_match %r{^s3.amazonaws.com}, @dummy.avatar.s3_host_name
322
+ end
323
+ end
324
+
325
+ context "An attachment with S3 storage" do
326
+ setup do
327
+ rebuild_model :storage => :s3,
328
+ :bucket => "testing",
329
+ :path => ":attachment/:style/:basename.:extension",
330
+ :s3_credentials => {
331
+ 'access_key_id' => "12345",
332
+ 'secret_access_key' => "54321"
333
+ }
334
+ end
335
+
336
+ should "be extended by the S3 module" do
337
+ assert Dummy.new.avatar.is_a?(Paperclip::Storage::S3)
338
+ end
339
+
340
+ should "not be extended by the Filesystem module" do
341
+ assert ! Dummy.new.avatar.is_a?(Paperclip::Storage::Filesystem)
342
+ end
343
+
344
+ context "when assigned" do
345
+ setup do
346
+ @file = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', '5k.png'), 'rb')
347
+ @dummy = Dummy.new
348
+ @dummy.avatar = @file
349
+ end
350
+
351
+ teardown { @file.close }
352
+
353
+ should "not get a bucket to get a URL" do
354
+ @dummy.avatar.expects(:s3).never
355
+ @dummy.avatar.expects(:s3_bucket).never
356
+ assert_match %r{^http://s3\.amazonaws\.com/testing/avatars/original/5k\.png}, @dummy.avatar.url
357
+ end
358
+
359
+ context "and saved" do
360
+ setup do
361
+ AWS::S3::S3Object.stubs(:store).with(@dummy.avatar.path, anything, 'testing', :content_type => 'image/png', :access => :public_read)
362
+ @dummy.save
363
+ end
364
+
365
+ should "succeed" do
366
+ assert true
367
+ end
368
+ end
369
+
370
+ should "delete tempfiles" do
371
+ AWS::S3::S3Object.stubs(:store).with(@dummy.avatar.path, anything, 'testing', :content_type => 'image/png', :access => :public_read)
372
+ File.stubs(:exist?).returns(true)
373
+ Paperclip::Tempfile.any_instance.expects(:close).at_least_once()
374
+ Paperclip::Tempfile.any_instance.expects(:unlink).at_least_once()
375
+
376
+ @dummy.save!
377
+ end
378
+
379
+ context "and saved without a bucket" do
380
+ setup do
381
+ class AWS::S3::NoSuchBucket < AWS::S3::ResponseError
382
+ # Force the class to be created as a proper subclass of ResponseError thanks to AWS::S3's autocreation of exceptions
383
+ end
384
+ AWS::S3::Bucket.expects(:create).with("testing")
385
+ AWS::S3::S3Object.stubs(:store).raises(AWS::S3::NoSuchBucket.new(:message, :response)).then.returns(true)
386
+ @dummy.save
387
+ end
388
+
389
+ should "succeed" do
390
+ assert true
391
+ end
392
+ end
393
+
394
+ context "and remove" do
395
+ setup do
396
+ AWS::S3::S3Object.stubs(:exists?).returns(true)
397
+ AWS::S3::S3Object.stubs(:delete)
398
+ @dummy.destroy_attached_files
399
+ end
400
+
401
+ should "succeed" do
402
+ assert true
403
+ end
404
+ end
405
+ end
406
+ end
407
+
408
+ context "An attachment with S3 storage and bucket defined as a Proc" do
409
+ setup do
410
+ AWS::S3::Base.stubs(:establish_connection!)
411
+ rebuild_model :storage => :s3,
412
+ :bucket => lambda { |attachment| "bucket_#{attachment.instance.other}" },
413
+ :s3_credentials => {:not => :important}
414
+ end
415
+
416
+ should "get the right bucket name" do
417
+ assert "bucket_a", Dummy.new(:other => 'a').avatar.bucket_name
418
+ assert "bucket_b", Dummy.new(:other => 'b').avatar.bucket_name
419
+ end
420
+ end
421
+
422
+ context "An attachment with S3 storage and specific s3 headers set" do
423
+ setup do
424
+ AWS::S3::Base.stubs(:establish_connection!)
425
+ rebuild_model :storage => :s3,
426
+ :bucket => "testing",
427
+ :path => ":attachment/:style/:basename.:extension",
428
+ :s3_credentials => {
429
+ 'access_key_id' => "12345",
430
+ 'secret_access_key' => "54321"
431
+ },
432
+ :s3_headers => {'Cache-Control' => 'max-age=31557600'}
433
+ end
434
+
435
+ context "when assigned" do
436
+ setup do
437
+ @file = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', '5k.png'), 'rb')
438
+ @dummy = Dummy.new
439
+ @dummy.avatar = @file
440
+ end
441
+
442
+ teardown { @file.close }
443
+
444
+ context "and saved" do
445
+ setup do
446
+ AWS::S3::Base.stubs(:establish_connection!)
447
+ AWS::S3::S3Object.stubs(:store).with(@dummy.avatar.path,
448
+ anything,
449
+ 'testing',
450
+ :content_type => 'image/png',
451
+ :access => :public_read,
452
+ 'Cache-Control' => 'max-age=31557600')
453
+ @dummy.save
454
+ end
455
+
456
+ should "succeed" do
457
+ assert true
458
+ end
459
+ end
460
+ end
461
+ end
462
+
463
+ context "with S3 credentials supplied as Pathname" do
464
+ setup do
465
+ ENV['S3_KEY'] = 'pathname_key'
466
+ ENV['S3_BUCKET'] = 'pathname_bucket'
467
+ ENV['S3_SECRET'] = 'pathname_secret'
468
+
469
+ rails_env('test')
470
+
471
+ rebuild_model :storage => :s3,
472
+ :s3_credentials => Pathname.new(File.join(File.dirname(__FILE__))).join("../fixtures/s3.yml")
473
+
474
+ Dummy.delete_all
475
+ @dummy = Dummy.new
476
+ end
477
+
478
+ should "parse the credentials" do
479
+ assert_equal 'pathname_bucket', @dummy.avatar.bucket_name
480
+ assert_equal 'pathname_key', AWS::S3::Base.connection.options[:access_key_id]
481
+ assert_equal 'pathname_secret', AWS::S3::Base.connection.options[:secret_access_key]
482
+ end
483
+ end
484
+
485
+ context "with S3 credentials in a YAML file" do
486
+ setup do
487
+ ENV['S3_KEY'] = 'env_key'
488
+ ENV['S3_BUCKET'] = 'env_bucket'
489
+ ENV['S3_SECRET'] = 'env_secret'
490
+
491
+ rails_env('test')
492
+
493
+ rebuild_model :storage => :s3,
494
+ :s3_credentials => File.new(File.join(File.dirname(__FILE__), "../fixtures/s3.yml"))
495
+
496
+ Dummy.delete_all
497
+
498
+ @dummy = Dummy.new
499
+ end
500
+
501
+ should "run the file through ERB" do
502
+ assert_equal 'env_bucket', @dummy.avatar.bucket_name
503
+ assert_equal 'env_key', AWS::S3::Base.connection.options[:access_key_id]
504
+ assert_equal 'env_secret', AWS::S3::Base.connection.options[:secret_access_key]
505
+ end
506
+ end
507
+
508
+ context "S3 Permissions" do
509
+ context "defaults to public-read" do
510
+ setup do
511
+ rebuild_model :storage => :s3,
512
+ :bucket => "testing",
513
+ :path => ":attachment/:style/:basename.:extension",
514
+ :s3_credentials => {
515
+ 'access_key_id' => "12345",
516
+ 'secret_access_key' => "54321"
517
+ }
518
+ end
519
+
520
+ context "when assigned" do
521
+ setup do
522
+ @file = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', '5k.png'), 'rb')
523
+ @dummy = Dummy.new
524
+ @dummy.avatar = @file
525
+ end
526
+
527
+ teardown { @file.close }
528
+
529
+ context "and saved" do
530
+ setup do
531
+ AWS::S3::Base.stubs(:establish_connection!)
532
+ AWS::S3::S3Object.expects(:store).with(@dummy.avatar.path,
533
+ anything,
534
+ 'testing',
535
+ :content_type => 'image/png',
536
+ :access => :public_read)
537
+ @dummy.save
538
+ end
539
+
540
+ should "succeed" do
541
+ assert true
542
+ end
543
+ end
544
+ end
545
+ end
546
+
547
+ context "string permissions set" do
548
+ setup do
549
+ rebuild_model :storage => :s3,
550
+ :bucket => "testing",
551
+ :path => ":attachment/:style/:basename.:extension",
552
+ :s3_credentials => {
553
+ 'access_key_id' => "12345",
554
+ 'secret_access_key' => "54321"
555
+ },
556
+ :s3_permissions => 'private'
557
+ end
558
+
559
+ context "when assigned" do
560
+ setup do
561
+ @file = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', '5k.png'), 'rb')
562
+ @dummy = Dummy.new
563
+ @dummy.avatar = @file
564
+ end
565
+
566
+ teardown { @file.close }
567
+
568
+ context "and saved" do
569
+ setup do
570
+ AWS::S3::Base.stubs(:establish_connection!)
571
+ AWS::S3::S3Object.expects(:store).with(@dummy.avatar.path,
572
+ anything,
573
+ 'testing',
574
+ :content_type => 'image/png',
575
+ :access => 'private')
576
+ @dummy.save
577
+ end
578
+
579
+ should "succeed" do
580
+ assert true
581
+ end
582
+ end
583
+ end
584
+ end
585
+
586
+ context "hash permissions set" do
587
+ setup do
588
+ rebuild_model :storage => :s3,
589
+ :bucket => "testing",
590
+ :path => ":attachment/:style/:basename.:extension",
591
+ :styles => {
592
+ :thumb => "80x80>"
593
+ },
594
+ :s3_credentials => {
595
+ 'access_key_id' => "12345",
596
+ 'secret_access_key' => "54321"
597
+ },
598
+ :s3_permissions => {
599
+ :original => 'private',
600
+ :thumb => 'public-read'
601
+ }
602
+ end
603
+
604
+ context "when assigned" do
605
+ setup do
606
+ @file = File.new(File.join(File.dirname(__FILE__), '..', 'fixtures', '5k.png'), 'rb')
607
+ @dummy = Dummy.new
608
+ @dummy.avatar = @file
609
+ end
610
+
611
+ teardown { @file.close }
612
+
613
+ context "and saved" do
614
+ setup do
615
+ AWS::S3::Base.stubs(:establish_connection!)
616
+ [:thumb, :original].each do |style|
617
+ AWS::S3::S3Object.expects(:store).with("avatars/#{style}/5k.png",
618
+ anything,
619
+ 'testing',
620
+ :content_type => 'image/png',
621
+ :access => style == :thumb ? 'public-read' : 'private')
622
+ end
623
+ @dummy.save
624
+ end
625
+
626
+ should "succeed" do
627
+ assert true
628
+ end
629
+ end
630
+ end
631
+ end
632
+ end
633
+ end