file_column_with_s3 0.1.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.
@@ -0,0 +1,652 @@
1
+ require File.dirname(__FILE__) + '/abstract_unit'
2
+
3
+ require File.dirname(__FILE__) + '/fixtures/entry'
4
+
5
+ class Movie < ActiveRecord::Base
6
+ end
7
+
8
+
9
+ class FileColumnTest < Test::Unit::TestCase
10
+
11
+ def setup
12
+ # we define the file_columns here so that we can change
13
+ # settings easily in a single test
14
+
15
+ Entry.file_column :image
16
+ Entry.file_column :file
17
+ Movie.file_column :movie
18
+
19
+ clear_validations
20
+ end
21
+
22
+ def teardown
23
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
24
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/movie/"
25
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/my_store_dir/"
26
+ end
27
+
28
+ def test_column_write_method
29
+ assert Entry.new.respond_to?("image=")
30
+ end
31
+
32
+ def test_column_read_method
33
+ assert Entry.new.respond_to?("image")
34
+ end
35
+
36
+ def test_sanitize_filename
37
+ assert_equal "test.jpg", FileColumn::sanitize_filename("test.jpg")
38
+ assert FileColumn::sanitize_filename("../../very_tricky/foo.bar") !~ /[\\\/]/, "slashes not removed"
39
+ assert_equal "__foo", FileColumn::sanitize_filename('`*foo')
40
+ assert_equal "foo.txt", FileColumn::sanitize_filename('c:\temp\foo.txt')
41
+ assert_equal "_.", FileColumn::sanitize_filename(".")
42
+ end
43
+
44
+ def test_default_options
45
+ e = Entry.new
46
+ assert_match %r{/public/entry/image}, e.image_options[:store_dir]
47
+ assert_match %r{/public/entry/image/tmp}, e.image_options[:tmp_base_dir]
48
+ end
49
+
50
+ def test_assign_without_save_with_tempfile
51
+ do_test_assign_without_save(:tempfile)
52
+ end
53
+
54
+ def test_assign_without_save_with_stringio
55
+ do_test_assign_without_save(:stringio)
56
+ end
57
+
58
+ def do_test_assign_without_save(upload_type)
59
+ e = Entry.new
60
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png", upload_type)
61
+ assert e.image.is_a?(String), "#{e.image.inspect} is not a String"
62
+ assert File.exists?(e.image)
63
+ assert FileUtils.identical?(e.image, file_path("skanthak.png"))
64
+ end
65
+
66
+ def test_filename_preserved
67
+ e = Entry.new
68
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "local_filename.jpg")
69
+ assert_equal "local_filename.jpg", File.basename(e.image)
70
+ end
71
+
72
+ def test_filename_stored_in_attribute
73
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
74
+ assert_equal "kerb.jpg", e["image"]
75
+ end
76
+
77
+ def test_extension_added
78
+ e = Entry.new
79
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "local_filename")
80
+ assert_equal "local_filename.jpg", File.basename(e.image)
81
+ assert_equal "local_filename.jpg", e["image"]
82
+ end
83
+
84
+ def test_no_extension_without_content_type
85
+ e = Entry.new
86
+ e.image = uploaded_file(file_path("kerb.jpg"), "something/unknown", "local_filename")
87
+ assert_equal "local_filename", File.basename(e.image)
88
+ assert_equal "local_filename", e["image"]
89
+ end
90
+
91
+ def test_extension_unknown_type
92
+ e = Entry.new
93
+ e.image = uploaded_file(file_path("kerb.jpg"), "not/known", "local_filename")
94
+ assert_equal "local_filename", File.basename(e.image)
95
+ assert_equal "local_filename", e["image"]
96
+ end
97
+
98
+ def test_extension_unknown_type_with_extension
99
+ e = Entry.new
100
+ e.image = uploaded_file(file_path("kerb.jpg"), "not/known", "local_filename.abc")
101
+ assert_equal "local_filename.abc", File.basename(e.image)
102
+ assert_equal "local_filename.abc", e["image"]
103
+ end
104
+
105
+ def test_extension_corrected
106
+ e = Entry.new
107
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "local_filename.jpeg")
108
+ assert_equal "local_filename.jpg", File.basename(e.image)
109
+ assert_equal "local_filename.jpg", e["image"]
110
+ end
111
+
112
+ def test_double_extension
113
+ e = Entry.new
114
+ e.image = uploaded_file(file_path("kerb.jpg"), "application/x-tgz", "local_filename.tar.gz")
115
+ assert_equal "local_filename.tar.gz", File.basename(e.image)
116
+ assert_equal "local_filename.tar.gz", e["image"]
117
+ end
118
+
119
+ FILE_UTILITY = "/usr/bin/file"
120
+
121
+ def test_get_content_type_with_file
122
+ Entry.file_column :image, :file_exec => FILE_UTILITY
123
+
124
+ # run this test only if the machine we are running on
125
+ # has the file utility installed
126
+ if File.executable?(FILE_UTILITY) && !RUBY_PLATFORM.include?("darwin")
127
+ e = Entry.new
128
+ file = FileColumn::TempUploadedFile.new(e, "image")
129
+ file.instance_variable_set :@dir, File.dirname(file_path("kerb.jpg"))
130
+ file.instance_variable_set :@filename, File.basename(file_path("kerb.jpg"))
131
+
132
+ assert_equal "image/jpeg", file.get_content_type
133
+ else
134
+ puts "Warning: Skipping test_get_content_type_with_file test as '#{FILE_UTILITY}' does not exist"
135
+ end
136
+ end
137
+
138
+ def test_fix_extension_with_file
139
+ Entry.file_column :image, :file_exec => FILE_UTILITY
140
+
141
+ # run this test only if the machine we are running on
142
+ # has the file utility installed
143
+ if File.executable?(FILE_UTILITY) && !RUBY_PLATFORM.include?("darwin")
144
+ e = Entry.new(:image => uploaded_file(file_path("skanthak.png"), "", "skanthak.jpg"))
145
+
146
+ assert_equal "skanthak.png", File.basename(e.image)
147
+ else
148
+ puts "Warning: Skipping test_fix_extension_with_file test as '#{FILE_UTILITY}' does not exist"
149
+ end
150
+ end
151
+
152
+ def test_do_not_fix_file_extensions
153
+ Entry.file_column :image, :fix_file_extensions => false
154
+
155
+ e = Entry.new(:image => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb"))
156
+
157
+ assert_equal "kerb", File.basename(e.image)
158
+ end
159
+
160
+ def test_correct_extension
161
+ e = Entry.new
162
+ file = FileColumn::TempUploadedFile.new(e, "image")
163
+
164
+ assert_equal "filename.jpg", file.correct_extension("filename.jpeg","jpg")
165
+ assert_equal "filename.tar.gz", file.correct_extension("filename.jpg","tar.gz")
166
+ assert_equal "filename.jpg", file.correct_extension("filename.tar.gz","jpg")
167
+ assert_equal "Protokoll_01.09.2005.doc", file.correct_extension("Protokoll_01.09.2005","doc")
168
+ assert_equal "strange.filenames.exist.jpg", file.correct_extension("strange.filenames.exist","jpg")
169
+ assert_equal "another.strange.one.jpg", file.correct_extension("another.strange.one.png","jpg")
170
+ end
171
+
172
+ def test_assign_with_save
173
+ e = Entry.new
174
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
175
+ tmp_file_path = e.image
176
+ assert e.save
177
+ assert File.exists?(e.image)
178
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
179
+
180
+ assert e.image_relative_path.include?(e.id.to_s)
181
+ assert e.image_relative_path.ends_with?("\/kerb.jpg")
182
+
183
+ assert !File.exists?(tmp_file_path), "temporary file '#{tmp_file_path}' not removed"
184
+ assert !File.exists?(File.dirname(tmp_file_path)), "temporary directory '#{File.dirname(tmp_file_path)}' not removed"
185
+
186
+ local_path = e.image
187
+ e = Entry.find(e.id)
188
+ assert_equal local_path, e.image
189
+ end
190
+
191
+ def test_dir_methods
192
+ e = Entry.new
193
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
194
+ e.save
195
+
196
+ assert_equal_paths File.join(RAILS_ROOT, "public", "entry", "image", e.file_column_relative_path_prefix), e.image_dir
197
+ assert_equal File.join(e.file_column_relative_path_prefix), e.image_relative_dir
198
+ end
199
+
200
+ def test_store_dir_callback
201
+ Entry.file_column :image, {:store_dir => :my_store_dir}
202
+ e = Entry.new
203
+
204
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
205
+ assert e.save
206
+
207
+ assert_equal_paths File.join(RAILS_ROOT, "public", "my_store_dir", e.file_column_relative_path_prefix), e.image_dir
208
+ end
209
+
210
+ def test_tmp_dir_with_store_dir_callback
211
+ Entry.file_column :image, {:store_dir => :my_store_dir}
212
+ e = Entry.new
213
+ e.image = upload(f("kerb.jpg"))
214
+
215
+ assert_equal File.expand_path(File.join(RAILS_ROOT, "public", "my_store_dir", "tmp")), File.expand_path(File.join(e.image_dir,".."))
216
+ end
217
+
218
+ def test_invalid_store_dir_callback
219
+ Entry.file_column :image, {:store_dir => :my_store_dir_doesnt_exit}
220
+ e = Entry.new
221
+ assert_raise(ArgumentError) {
222
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
223
+ e.save
224
+ }
225
+ end
226
+
227
+ def test_subdir_parameter
228
+ e = Entry.new
229
+ assert_nil e.image("thumb")
230
+ assert_nil e.image_relative_path("thumb")
231
+ assert_nil e.image(nil)
232
+
233
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
234
+
235
+ assert_equal "kerb.jpg", File.basename(e.image("thumb"))
236
+ assert_equal "kerb.jpg", File.basename(e.image_relative_path("thumb"))
237
+
238
+ assert_equal File.join(e.image_dir,"thumb","kerb.jpg"), e.image("thumb")
239
+ assert_match %r{/thumb/kerb\.jpg$}, e.image_relative_path("thumb")
240
+
241
+ assert_equal e.image, e.image(nil)
242
+ assert_equal e.image_relative_path, e.image_relative_path(nil)
243
+ end
244
+
245
+ def test_cleanup_after_destroy
246
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
247
+ assert e.save
248
+ local_path = e.image
249
+ assert File.exists?(local_path)
250
+ assert e.destroy
251
+ assert !File.exists?(local_path), "'#{local_path}' still exists although entry was destroyed"
252
+ assert !File.exists?(File.dirname(local_path))
253
+ end
254
+
255
+ def test_keep_tmp_image
256
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
257
+ e.validation_should_fail = true
258
+ assert !e.save, "e should not save due to validation errors"
259
+ assert File.exists?(local_path = e.image)
260
+ image_temp = e.image_temp
261
+ e = Entry.new("image_temp" => image_temp)
262
+ assert_equal local_path, e.image
263
+ assert e.save
264
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
265
+ end
266
+
267
+ def test_keep_tmp_image_with_existing_image
268
+ e = Entry.new("image" =>uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
269
+ assert e.save
270
+ assert File.exists?(local_path = e.image)
271
+ e = Entry.find(e.id)
272
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
273
+ e.validation_should_fail = true
274
+ assert !e.save
275
+ temp_path = e.image_temp
276
+ e = Entry.find(e.id)
277
+ e.image_temp = temp_path
278
+ assert e.save
279
+
280
+ assert FileUtils.identical?(e.image, file_path("skanthak.png"))
281
+ assert !File.exists?(local_path), "old image has not been deleted"
282
+ end
283
+
284
+ def test_replace_tmp_image_temp_first
285
+ do_test_replace_tmp_image([:image_temp, :image])
286
+ end
287
+
288
+ def test_replace_tmp_image_temp_last
289
+ do_test_replace_tmp_image([:image, :image_temp])
290
+ end
291
+
292
+ def do_test_replace_tmp_image(order)
293
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
294
+ e.validation_should_fail = true
295
+ assert !e.save
296
+ image_temp = e.image_temp
297
+ temp_path = e.image
298
+ new_img = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
299
+ e = Entry.new
300
+ for method in order
301
+ case method
302
+ when :image_temp then e.image_temp = image_temp
303
+ when :image then e.image = new_img
304
+ end
305
+ end
306
+ assert e.save
307
+ assert FileUtils.identical?(e.image, file_path("skanthak.png")), "'#{e.image}' is not the expected 'skanthak.png'"
308
+ assert !File.exists?(temp_path), "temporary file '#{temp_path}' is not cleaned up"
309
+ assert !File.exists?(File.dirname(temp_path)), "temporary directory not cleaned up"
310
+ assert e.image_just_uploaded?
311
+ end
312
+
313
+ def test_replace_image_on_saved_object
314
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
315
+ assert e.save
316
+ old_file = e.image
317
+ e = Entry.find(e.id)
318
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
319
+ assert e.save
320
+ assert FileUtils.identical?(file_path("skanthak.png"), e.image)
321
+ assert old_file != e.image
322
+ assert !File.exists?(old_file), "'#{old_file}' has not been cleaned up"
323
+ end
324
+
325
+ def test_edit_without_touching_image
326
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
327
+ assert e.save
328
+ e = Entry.find(e.id)
329
+ assert e.save
330
+ assert FileUtils.identical?(file_path("kerb.jpg"), e.image)
331
+ end
332
+
333
+ def test_save_without_image
334
+ e = Entry.new
335
+ assert e.save
336
+ e.reload
337
+ assert_nil e.image
338
+ end
339
+
340
+ def test_delete_saved_image
341
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
342
+ assert e.save
343
+ local_path = e.image
344
+ e.image = nil
345
+ assert_nil e.image
346
+ assert File.exists?(local_path), "file '#{local_path}' should not be deleted until transaction is saved"
347
+ assert e.save
348
+ assert_nil e.image
349
+ assert !File.exists?(local_path)
350
+ e.reload
351
+ assert e["image"].blank?
352
+ e = Entry.find(e.id)
353
+ assert_nil e.image
354
+ end
355
+
356
+ def test_delete_tmp_image
357
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
358
+ local_path = e.image
359
+ e.image = nil
360
+ assert_nil e.image
361
+ assert e["image"].blank?
362
+ assert !File.exists?(local_path)
363
+ end
364
+
365
+ def test_delete_nonexistant_image
366
+ e = Entry.new
367
+ e.image = nil
368
+ assert e.save
369
+ assert_nil e.image
370
+ end
371
+
372
+ def test_delete_image_on_non_null_column
373
+ e = Entry.new("file" => upload(f("skanthak.png")))
374
+ assert e.save
375
+
376
+ local_path = e.file
377
+ assert File.exists?(local_path)
378
+ e.file = nil
379
+ assert e.save
380
+ assert !File.exists?(local_path)
381
+ end
382
+
383
+ def test_ie_filename
384
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'c:\images\kerb.jpg'))
385
+ assert e.image_relative_path =~ /^tmp\/[\d\.]+\/kerb\.jpg$/, "relative path '#{e.image_relative_path}' was not as expected"
386
+ assert File.exists?(e.image)
387
+ end
388
+
389
+ def test_just_uploaded?
390
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'c:\images\kerb.jpg'))
391
+ assert e.image_just_uploaded?
392
+ assert e.save
393
+ assert e.image_just_uploaded?
394
+
395
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'kerb.jpg'))
396
+ temp_path = e.image_temp
397
+ e = Entry.new("image_temp" => temp_path)
398
+ assert !e.image_just_uploaded?
399
+ assert e.save
400
+ assert !e.image_just_uploaded?
401
+ end
402
+
403
+ def test_empty_tmp
404
+ e = Entry.new
405
+ e.image_temp = ""
406
+ assert_nil e.image
407
+ end
408
+
409
+ def test_empty_tmp_with_image
410
+ e = Entry.new
411
+ e.image_temp = ""
412
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'c:\images\kerb.jpg')
413
+ local_path = e.image
414
+ assert File.exists?(local_path)
415
+ e.image_temp = ""
416
+ assert local_path, e.image
417
+ end
418
+
419
+ def test_empty_filename
420
+ e = Entry.new
421
+ assert !e["file"]
422
+ assert_nil e.file
423
+ assert_nil e["image"]
424
+ assert_nil e.image
425
+ end
426
+
427
+ def test_with_two_file_columns
428
+ e = Entry.new
429
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
430
+ e.file = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
431
+ assert e.save
432
+ assert_match %{/entry/image/}, e.image
433
+ assert_match %{/entry/file/}, e.file
434
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
435
+ assert FileUtils.identical?(e.file, file_path("skanthak.png"))
436
+ end
437
+
438
+ def test_with_two_models
439
+ e = Entry.new(:image => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
440
+ m = Movie.new(:movie => uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png"))
441
+ assert e.save
442
+ assert m.save
443
+ assert_match %{/entry/image/}, e.image
444
+ assert_match %{/movie/movie/}, m.movie
445
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
446
+ assert FileUtils.identical?(m.movie, file_path("skanthak.png"))
447
+ end
448
+
449
+ def test_no_file_uploaded
450
+ e = Entry.new
451
+ assert_nothing_raised { e.image =
452
+ uploaded_file(nil, "application/octet-stream", "", :stringio) }
453
+ assert_equal nil, e.image
454
+ end
455
+
456
+ # when safari submits a form where no file has been
457
+ # selected, it does not transmit a content-type and
458
+ # the result is an empty string ""
459
+ def test_no_file_uploaded_with_safari
460
+ e = Entry.new
461
+ assert_nothing_raised { e.image = "" }
462
+ assert_equal nil, e.image
463
+ end
464
+
465
+ def test_detect_wrong_encoding
466
+ e = Entry.new
467
+ assert_raise(TypeError) { e.image ="img42.jpg" }
468
+ end
469
+
470
+ def test_serializable_before_save
471
+ e = Entry.new
472
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
473
+ assert_nothing_raised {
474
+ flash = Marshal.dump(e)
475
+ e = Marshal.load(flash)
476
+ }
477
+ assert File.exists?(e.image)
478
+ end
479
+
480
+ def test_should_call_after_upload_on_new_upload
481
+ Entry.file_column :image, :after_upload => [:after_assign]
482
+ e = Entry.new
483
+ e.image = upload(f("skanthak.png"))
484
+ assert e.after_assign_called?
485
+ end
486
+
487
+ def test_should_call_user_after_save_on_save
488
+ e = Entry.new(:image => upload(f("skanthak.png")))
489
+ assert e.save
490
+
491
+ assert_kind_of FileColumn::PermanentUploadedFile, e.send(:image_state)
492
+ assert e.after_save_called?
493
+ end
494
+
495
+
496
+ def test_assign_standard_files
497
+ e = Entry.new
498
+ e.image = File.new(file_path('skanthak.png'))
499
+
500
+ assert_equal 'skanthak.png', File.basename(e.image)
501
+ assert FileUtils.identical?(file_path('skanthak.png'), e.image)
502
+
503
+ assert e.save
504
+ end
505
+
506
+
507
+ def test_validates_filesize
508
+ Entry.validates_filesize_of :image, :in => 50.kilobytes..100.kilobytes
509
+
510
+ e = Entry.new(:image => upload(f("kerb.jpg")))
511
+ assert e.save
512
+
513
+ e.image = upload(f("skanthak.png"))
514
+ assert !e.save
515
+ assert e.errors.invalid?("image")
516
+ end
517
+
518
+ def test_validates_file_format_simple
519
+ e = Entry.new(:image => upload(f("skanthak.png")))
520
+ assert e.save
521
+
522
+ Entry.validates_file_format_of :image, :in => ["jpg"]
523
+
524
+ e.image = upload(f("kerb.jpg"))
525
+ assert e.save
526
+
527
+ e.image = upload(f("mysql.sql"))
528
+ assert !e.save
529
+ assert e.errors.invalid?("image")
530
+
531
+ end
532
+
533
+ def test_validates_image_size
534
+ Entry.validates_image_size :image, :min => "640x480"
535
+
536
+ e = Entry.new(:image => upload(f("kerb.jpg")))
537
+ assert e.save
538
+
539
+ e = Entry.new(:image => upload(f("skanthak.png")))
540
+ assert !e.save
541
+ assert e.errors.invalid?("image")
542
+ end
543
+
544
+ def do_permission_test(uploaded_file, permissions=0641)
545
+ Entry.file_column :image, :permissions => permissions
546
+
547
+ e = Entry.new(:image => uploaded_file)
548
+ assert e.save
549
+
550
+ assert_equal permissions, (File.stat(e.image).mode & 0777)
551
+ end
552
+
553
+ def test_permissions_with_small_file
554
+ do_permission_test upload(f("skanthak.png"), :guess, :stringio)
555
+ end
556
+
557
+ def test_permission_with_big_file
558
+ do_permission_test upload(f("kerb.jpg"))
559
+ end
560
+
561
+ def test_permission_that_overrides_umask
562
+ do_permission_test upload(f("skanthak.png"), :guess, :stringio), 0666
563
+ do_permission_test upload(f("kerb.jpg")), 0666
564
+ end
565
+
566
+ def test_access_with_empty_id
567
+ # an empty id might happen after a clone or through some other
568
+ # strange event. Since we would create a path that contains nothing
569
+ # where the id would have been, we should fail fast with an exception
570
+ # in this case
571
+
572
+ e = Entry.new(:image => upload(f("skanthak.png")))
573
+ assert e.save
574
+ id = e.id
575
+
576
+ e = Entry.find(id)
577
+
578
+ e["id"] = ""
579
+ assert_raise(RuntimeError) { e.image }
580
+
581
+ e = Entry.find(id)
582
+ e["id"] = nil
583
+ assert_raise(RuntimeError) { e.image }
584
+ end
585
+ end
586
+
587
+ # Tests for moving temp dir to permanent dir
588
+ class FileColumnMoveTest < Test::Unit::TestCase
589
+
590
+ def setup
591
+ # we define the file_columns here so that we can change
592
+ # settings easily in a single test
593
+
594
+ Entry.file_column :image
595
+
596
+ end
597
+
598
+ def teardown
599
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
600
+ end
601
+
602
+ def test_should_move_additional_files_from_tmp
603
+ e = Entry.new
604
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
605
+ FileUtils.cp file_path("kerb.jpg"), File.dirname(e.image)
606
+ assert e.save
607
+ dir = File.dirname(e.image)
608
+ assert File.exists?(File.join(dir, "skanthak.png"))
609
+ assert File.exists?(File.join(dir, "kerb.jpg"))
610
+ end
611
+
612
+ def test_should_move_direcotries_on_save
613
+ e = Entry.new(:image => upload(f("skanthak.png")))
614
+
615
+ FileUtils.mkdir( e.image_dir+"/foo" )
616
+ FileUtils.cp file_path("kerb.jpg"), e.image_dir+"/foo/kerb.jpg"
617
+
618
+ assert e.save
619
+
620
+ assert File.exists?(e.image)
621
+ assert File.exists?(File.dirname(e.image)+"/foo/kerb.jpg")
622
+ end
623
+
624
+ def test_should_overwrite_dirs_with_files_on_reupload
625
+ e = Entry.new(:image => upload(f("skanthak.png")))
626
+
627
+ FileUtils.mkdir( e.image_dir+"/kerb.jpg")
628
+ FileUtils.cp file_path("kerb.jpg"), e.image_dir+"/kerb.jpg/"
629
+ assert e.save
630
+
631
+ e.image = upload(f("kerb.jpg"))
632
+ assert e.save
633
+
634
+ assert File.file?(e.image_dir+"/kerb.jpg")
635
+ end
636
+
637
+ def test_should_overwrite_files_with_dirs_on_reupload
638
+ e = Entry.new(:image => upload(f("skanthak.png")))
639
+
640
+ assert e.save
641
+ assert File.file?(e.image_dir+"/skanthak.png")
642
+
643
+ e.image = upload(f("kerb.jpg"))
644
+ FileUtils.mkdir(e.image_dir+"/skanthak.png")
645
+
646
+ assert e.save
647
+ assert File.file?(e.image_dir+"/kerb.jpg")
648
+ assert !File.file?(e.image_dir+"/skanthak.png")
649
+ assert File.directory?(e.image_dir+"/skanthak.png")
650
+ end
651
+
652
+ end