summaryrefslogtreecommitdiff
path: root/vendor/plugins/paperclip/test/integration_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/plugins/paperclip/test/integration_test.rb')
-rw-r--r--vendor/plugins/paperclip/test/integration_test.rb481
1 files changed, 0 insertions, 481 deletions
diff --git a/vendor/plugins/paperclip/test/integration_test.rb b/vendor/plugins/paperclip/test/integration_test.rb
deleted file mode 100644
index f7014ac..0000000
--- a/vendor/plugins/paperclip/test/integration_test.rb
+++ /dev/null
@@ -1,481 +0,0 @@
1require 'test/helper'
2
3class IntegrationTest < Test::Unit::TestCase
4 context "Many models at once" do
5 setup do
6 rebuild_model
7 @file = File.new(File.join(FIXTURES_DIR, "5k.png"), 'rb')
8 300.times do |i|
9 Dummy.create! :avatar => @file
10 end
11 end
12
13 should "not exceed the open file limit" do
14 assert_nothing_raised do
15 dummies = Dummy.find(:all)
16 dummies.each { |dummy| dummy.avatar }
17 end
18 end
19 end
20
21 context "An attachment" do
22 setup do
23 rebuild_model :styles => { :thumb => "50x50#" }
24 @dummy = Dummy.new
25 @file = File.new(File.join(File.dirname(__FILE__),
26 "fixtures",
27 "5k.png"), 'rb')
28 @dummy.avatar = @file
29 assert @dummy.save
30 end
31
32 teardown { @file.close }
33
34 should "create its thumbnails properly" do
35 assert_match /\b50x50\b/, `identify "#{@dummy.avatar.path(:thumb)}"`
36 end
37
38 context "redefining its attachment styles" do
39 setup do
40 Dummy.class_eval do
41 has_attached_file :avatar, :styles => { :thumb => "150x25#" }
42 has_attached_file :avatar, :styles => { :thumb => "150x25#", :dynamic => lambda { |a| '50x50#' } }
43 end
44 @d2 = Dummy.find(@dummy.id)
45 @d2.avatar.reprocess!
46 @d2.save
47 end
48
49 should "create its thumbnails properly" do
50 assert_match /\b150x25\b/, `identify "#{@dummy.avatar.path(:thumb)}"`
51 assert_match /\b50x50\b/, `identify "#{@dummy.avatar.path(:dynamic)}"`
52 end
53 end
54 end
55
56 context "A model that modifies its original" do
57 setup do
58 rebuild_model :styles => { :original => "2x2#" }
59 @dummy = Dummy.new
60 @file = File.new(File.join(File.dirname(__FILE__),
61 "fixtures",
62 "5k.png"), 'rb')
63 @dummy.avatar = @file
64 end
65
66 should "report the file size of the processed file and not the original" do
67 assert_not_equal @file.size, @dummy.avatar.size
68 end
69
70 teardown { @file.close }
71 end
72
73 context "A model with attachments scoped under an id" do
74 setup do
75 rebuild_model :styles => { :large => "100x100",
76 :medium => "50x50" },
77 :path => ":rails_root/tmp/:id/:attachments/:style.:extension"
78 @dummy = Dummy.new
79 @file = File.new(File.join(File.dirname(__FILE__),
80 "fixtures",
81 "5k.png"), 'rb')
82 @dummy.avatar = @file
83 end
84
85 teardown { @file.close }
86
87 context "when saved" do
88 setup do
89 @dummy.save
90 @saved_path = @dummy.avatar.path(:large)
91 end
92
93 should "have a large file in the right place" do
94 assert File.exists?(@dummy.avatar.path(:large))
95 end
96
97 context "and deleted" do
98 setup do
99 @dummy.avatar.clear
100 @dummy.save
101 end
102
103 should "not have a large file in the right place anymore" do
104 assert ! File.exists?(@saved_path)
105 end
106
107 should "not have its next two parent directories" do
108 assert ! File.exists?(File.dirname(@saved_path))
109 assert ! File.exists?(File.dirname(File.dirname(@saved_path)))
110 end
111
112 before_should "not die if an unexpected SystemCallError happens" do
113 FileUtils.stubs(:rmdir).raises(Errno::EPIPE)
114 end
115 end
116 end
117 end
118
119 context "A model with no attachment validation" do
120 setup do
121 rebuild_model :styles => { :large => "300x300>",
122 :medium => "100x100",
123 :thumb => ["32x32#", :gif] },
124 :default_style => :medium,
125 :url => "/:attachment/:class/:style/:id/:basename.:extension",
126 :path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
127 @dummy = Dummy.new
128 end
129
130 should "have its definition return false when asked about whiny_thumbnails" do
131 assert ! Dummy.attachment_definitions[:avatar][:whiny_thumbnails]
132 end
133
134 context "when validates_attachment_thumbnails is called" do
135 setup do
136 Dummy.validates_attachment_thumbnails :avatar
137 end
138
139 should "have its definition return true when asked about whiny_thumbnails" do
140 assert_equal true, Dummy.attachment_definitions[:avatar][:whiny_thumbnails]
141 end
142 end
143
144 context "redefined to have attachment validations" do
145 setup do
146 rebuild_model :styles => { :large => "300x300>",
147 :medium => "100x100",
148 :thumb => ["32x32#", :gif] },
149 :whiny_thumbnails => true,
150 :default_style => :medium,
151 :url => "/:attachment/:class/:style/:id/:basename.:extension",
152 :path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
153 end
154
155 should "have its definition return true when asked about whiny_thumbnails" do
156 assert_equal true, Dummy.attachment_definitions[:avatar][:whiny_thumbnails]
157 end
158 end
159 end
160
161 context "A model with no convert_options setting" do
162 setup do
163 rebuild_model :styles => { :large => "300x300>",
164 :medium => "100x100",
165 :thumb => ["32x32#", :gif] },
166 :default_style => :medium,
167 :url => "/:attachment/:class/:style/:id/:basename.:extension",
168 :path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
169 @dummy = Dummy.new
170 end
171
172 should "have its definition return nil when asked about convert_options" do
173 assert ! Dummy.attachment_definitions[:avatar][:convert_options]
174 end
175
176 context "redefined to have convert_options setting" do
177 setup do
178 rebuild_model :styles => { :large => "300x300>",
179 :medium => "100x100",
180 :thumb => ["32x32#", :gif] },
181 :convert_options => "-strip -depth 8",
182 :default_style => :medium,
183 :url => "/:attachment/:class/:style/:id/:basename.:extension",
184 :path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
185 end
186
187 should "have its definition return convert_options value when asked about convert_options" do
188 assert_equal "-strip -depth 8", Dummy.attachment_definitions[:avatar][:convert_options]
189 end
190 end
191 end
192
193 context "A model with a filesystem attachment" do
194 setup do
195 rebuild_model :styles => { :large => "300x300>",
196 :medium => "100x100",
197 :thumb => ["32x32#", :gif] },
198 :whiny_thumbnails => true,
199 :default_style => :medium,
200 :url => "/:attachment/:class/:style/:id/:basename.:extension",
201 :path => ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
202 @dummy = Dummy.new
203 @file = File.new(File.join(FIXTURES_DIR, "5k.png"), 'rb')
204 @bad_file = File.new(File.join(FIXTURES_DIR, "bad.png"), 'rb')
205
206 assert @dummy.avatar = @file
207 assert @dummy.valid?
208 assert @dummy.save
209 end
210
211 should "write and delete its files" do
212 [["434x66", :original],
213 ["300x46", :large],
214 ["100x15", :medium],
215 ["32x32", :thumb]].each do |geo, style|
216 cmd = %Q[identify -format "%wx%h" "#{@dummy.avatar.path(style)}"]
217 assert_equal geo, `#{cmd}`.chomp, cmd
218 end
219
220 saved_paths = [:thumb, :medium, :large, :original].collect{|s| @dummy.avatar.path(s) }
221
222 @d2 = Dummy.find(@dummy.id)
223 assert_equal "100x15", `identify -format "%wx%h" "#{@d2.avatar.path}"`.chomp
224 assert_equal "434x66", `identify -format "%wx%h" "#{@d2.avatar.path(:original)}"`.chomp
225 assert_equal "300x46", `identify -format "%wx%h" "#{@d2.avatar.path(:large)}"`.chomp
226 assert_equal "100x15", `identify -format "%wx%h" "#{@d2.avatar.path(:medium)}"`.chomp
227 assert_equal "32x32", `identify -format "%wx%h" "#{@d2.avatar.path(:thumb)}"`.chomp
228
229 @dummy.avatar = "not a valid file but not nil"
230 assert_equal File.basename(@file.path), @dummy.avatar_file_name
231 assert @dummy.valid?
232 assert @dummy.save
233
234 saved_paths.each do |p|
235 assert File.exists?(p)
236 end
237
238 @dummy.avatar.clear
239 assert_nil @dummy.avatar_file_name
240 assert @dummy.valid?
241 assert @dummy.save
242
243 saved_paths.each do |p|
244 assert ! File.exists?(p)
245 end
246
247 @d2 = Dummy.find(@dummy.id)
248 assert_nil @d2.avatar_file_name
249 end
250
251 should "work exactly the same when new as when reloaded" do
252 @d2 = Dummy.find(@dummy.id)
253
254 assert_equal @dummy.avatar_file_name, @d2.avatar_file_name
255 [:thumb, :medium, :large, :original].each do |style|
256 assert_equal @dummy.avatar.path(style), @d2.avatar.path(style)
257 end
258
259 saved_paths = [:thumb, :medium, :large, :original].collect{|s| @dummy.avatar.path(s) }
260
261 @d2.avatar.clear
262 assert @d2.save
263
264 saved_paths.each do |p|
265 assert ! File.exists?(p)
266 end
267 end
268
269 should "know the difference between good files, bad files, and not files" do
270 expected = @dummy.avatar.to_file
271 @dummy.avatar = "not a file"
272 assert @dummy.valid?
273 assert_equal expected.path, @dummy.avatar.path
274 expected.close
275
276 @dummy.avatar = @bad_file
277 assert ! @dummy.valid?
278 end
279
280 should "know the difference between good files, bad files, and not files when validating" do
281 Dummy.validates_attachment_presence :avatar
282 @d2 = Dummy.find(@dummy.id)
283 @d2.avatar = @file
284 assert @d2.valid?, @d2.errors.full_messages.inspect
285 @d2.avatar = @bad_file
286 assert ! @d2.valid?
287 end
288
289 should "be able to reload without saving and not have the file disappear" do
290 @dummy.avatar = @file
291 assert @dummy.save
292 @dummy.avatar.clear
293 assert_nil @dummy.avatar_file_name
294 @dummy.reload
295 assert_equal "5k.png", @dummy.avatar_file_name
296 end
297
298 context "that is assigned its file from another Paperclip attachment" do
299 setup do
300 @dummy2 = Dummy.new
301 @file2 = File.new(File.join(FIXTURES_DIR, "12k.png"), 'rb')
302 assert @dummy2.avatar = @file2
303 @dummy2.save
304 end
305
306 should "work when assigned a file" do
307 assert_not_equal `identify -format "%wx%h" "#{@dummy.avatar.path(:original)}"`,
308 `identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
309
310 assert @dummy.avatar = @dummy2.avatar
311 @dummy.save
312 assert_equal `identify -format "%wx%h" "#{@dummy.avatar.path(:original)}"`,
313 `identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
314 end
315 end
316
317 end
318
319 context "A model with an attachments association and a Paperclip attachment" do
320 setup do
321 Dummy.class_eval do
322 has_many :attachments, :class_name => 'Dummy'
323 end
324
325 @dummy = Dummy.new
326 @dummy.avatar = File.new(File.join(File.dirname(__FILE__),
327 "fixtures",
328 "5k.png"), 'rb')
329 end
330
331 should "should not error when saving" do
332 assert_nothing_raised do
333 @dummy.save!
334 end
335 end
336 end
337
338 if ENV['S3_TEST_BUCKET']
339 def s3_files_for attachment
340 [:thumb, :medium, :large, :original].inject({}) do |files, style|
341 data = `curl "#{attachment.url(style)}" 2>/dev/null`.chomp
342 t = Tempfile.new("paperclip-test")
343 t.binmode
344 t.write(data)
345 t.rewind
346 files[style] = t
347 files
348 end
349 end
350
351 def s3_headers_for attachment, style
352 `curl --head "#{attachment.url(style)}" 2>/dev/null`.split("\n").inject({}) do |h,head|
353 split_head = head.chomp.split(/\s*:\s*/, 2)
354 h[split_head.first.downcase] = split_head.last unless split_head.empty?
355 h
356 end
357 end
358
359 context "A model with an S3 attachment" do
360 setup do
361 rebuild_model :styles => { :large => "300x300>",
362 :medium => "100x100",
363 :thumb => ["32x32#", :gif] },
364 :storage => :s3,
365 :whiny_thumbnails => true,
366 # :s3_options => {:logger => Logger.new(StringIO.new)},
367 :s3_credentials => File.new(File.join(File.dirname(__FILE__), "s3.yml")),
368 :default_style => :medium,
369 :bucket => ENV['S3_TEST_BUCKET'],
370 :path => ":class/:attachment/:id/:style/:basename.:extension"
371 @dummy = Dummy.new
372 @file = File.new(File.join(FIXTURES_DIR, "5k.png"), 'rb')
373 @bad_file = File.new(File.join(FIXTURES_DIR, "bad.png"), 'rb')
374
375 assert @dummy.avatar = @file
376 assert @dummy.valid?
377 assert @dummy.save
378
379 @files_on_s3 = s3_files_for @dummy.avatar
380 end
381
382 should "write and delete its files" do
383 [["434x66", :original],
384 ["300x46", :large],
385 ["100x15", :medium],
386 ["32x32", :thumb]].each do |geo, style|
387 cmd = %Q[identify -format "%wx%h" "#{@files_on_s3[style].path}"]
388 assert_equal geo, `#{cmd}`.chomp, cmd
389 end
390
391 @d2 = Dummy.find(@dummy.id)
392 @d2_files = s3_files_for @d2.avatar
393 [["434x66", :original],
394 ["300x46", :large],
395 ["100x15", :medium],
396 ["32x32", :thumb]].each do |geo, style|
397 cmd = %Q[identify -format "%wx%h" "#{@d2_files[style].path}"]
398 assert_equal geo, `#{cmd}`.chomp, cmd
399 end
400
401 @dummy.avatar = "not a valid file but not nil"
402 assert_equal File.basename(@file.path), @dummy.avatar_file_name
403 assert @dummy.valid?
404 assert @dummy.save
405
406 saved_keys = [:thumb, :medium, :large, :original].collect{|s| @dummy.avatar.to_file(s) }
407
408 saved_keys.each do |key|
409 assert key.exists?
410 end
411
412 @dummy.avatar.clear
413 assert_nil @dummy.avatar_file_name
414 assert @dummy.valid?
415 assert @dummy.save
416
417 saved_keys.each do |key|
418 assert ! key.exists?
419 end
420
421 @d2 = Dummy.find(@dummy.id)
422 assert_nil @d2.avatar_file_name
423 end
424
425 should "work exactly the same when new as when reloaded" do
426 @d2 = Dummy.find(@dummy.id)
427
428 assert_equal @dummy.avatar_file_name, @d2.avatar_file_name
429 [:thumb, :medium, :large, :original].each do |style|
430 assert_equal @dummy.avatar.to_file(style).to_s, @d2.avatar.to_file(style).to_s
431 end
432
433 saved_keys = [:thumb, :medium, :large, :original].collect{|s| @dummy.avatar.to_file(s) }
434
435 @d2.avatar.clear
436 assert @d2.save
437
438 saved_keys.each do |key|
439 assert ! key.exists?
440 end
441 end
442
443 should "know the difference between good files, bad files, not files, and nil" do
444 expected = @dummy.avatar.to_file
445 @dummy.avatar = "not a file"
446 assert @dummy.valid?
447 assert_equal expected.full_name, @dummy.avatar.to_file.full_name
448
449 @dummy.avatar = @bad_file
450 assert ! @dummy.valid?
451 @dummy.avatar = nil
452 assert @dummy.valid?
453
454 Dummy.validates_attachment_presence :avatar
455 @d2 = Dummy.find(@dummy.id)
456 @d2.avatar = @file
457 assert @d2.valid?
458 @d2.avatar = @bad_file
459 assert ! @d2.valid?
460 @d2.avatar = nil
461 assert ! @d2.valid?
462 end
463
464 should "be able to reload without saving and not have the file disappear" do
465 @dummy.avatar = @file
466 assert @dummy.save
467 @dummy.avatar = nil
468 assert_nil @dummy.avatar_file_name
469 @dummy.reload
470 assert_equal "5k.png", @dummy.avatar_file_name
471 end
472
473 should "have the right content type" do
474 headers = s3_headers_for(@dummy.avatar, :original)
475 p headers
476 assert_equal 'image/png', headers['content-type']
477 end
478 end
479 end
480end
481