radiant-page_attachments-extension 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/.gitignore +5 -0
  2. data/LICENSE +20 -0
  3. data/README.md +129 -0
  4. data/Rakefile +57 -0
  5. data/VERSION +1 -0
  6. data/app/models/observe_page_attachments.rb +5 -0
  7. data/app/models/page_attachment.rb +28 -0
  8. data/app/models/page_attachment_associations.rb +20 -0
  9. data/app/models/page_attachment_tags.rb +261 -0
  10. data/app/models/page_attachments_interface.rb +19 -0
  11. data/app/views/admin/pages/_attachment.html.haml +12 -0
  12. data/app/views/admin/pages/_attachments_box.html.haml +12 -0
  13. data/db/migrate/001_create_page_attachments_extension_schema.rb +22 -0
  14. data/db/migrate/002_add_page_attachments_fields.rb +23 -0
  15. data/features/attachments.feature +42 -0
  16. data/features/step_definitions/attachment_steps.rb +61 -0
  17. data/features/support/env.rb +57 -0
  18. data/features/support/paths.rb +14 -0
  19. data/lib/difference_test_helper.rb +20 -0
  20. data/lib/radiant-page_attachments-extension.rb +0 -0
  21. data/lib/tasks/page_attachments_extension_tasks.rake +28 -0
  22. data/page_attachments_extension.rb +27 -0
  23. data/public/images/admin/drag_order.png +0 -0
  24. data/public/javascripts/admin/page_attachments.js +30 -0
  25. data/public/stylesheets/admin/page_attachments.css +133 -0
  26. data/radiant-page_attachments-extension.gemspec +139 -0
  27. data/spec/controllers/pages_controller_spec.rb +10 -0
  28. data/spec/datasets/page_attachments_dataset.rb +31 -0
  29. data/spec/fixtures/foo.txt +1 -0
  30. data/spec/fixtures/rails.png +0 -0
  31. data/spec/models/observe_page_attachments_spec.rb +14 -0
  32. data/spec/models/page_attachment_spec.rb +18 -0
  33. data/spec/models/page_attachment_tags_spec.rb +172 -0
  34. data/spec/models/page_spec.rb +32 -0
  35. data/spec/spec.opts +6 -0
  36. data/spec/spec_helper.rb +39 -0
  37. data/vendor/plugins/acts_as_list/README +23 -0
  38. data/vendor/plugins/acts_as_list/init.rb +3 -0
  39. data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
  40. data/vendor/plugins/acts_as_list/test/list_test.rb +332 -0
  41. data/vendor/plugins/attachment_fu/CHANGELOG +35 -0
  42. data/vendor/plugins/attachment_fu/LICENSE +20 -0
  43. data/vendor/plugins/attachment_fu/README +193 -0
  44. data/vendor/plugins/attachment_fu/Rakefile +22 -0
  45. data/vendor/plugins/attachment_fu/amazon_s3.yml.tpl +17 -0
  46. data/vendor/plugins/attachment_fu/init.rb +16 -0
  47. data/vendor/plugins/attachment_fu/install.rb +7 -0
  48. data/vendor/plugins/attachment_fu/lib/geometry.rb +93 -0
  49. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/cloud_file_backend.rb +211 -0
  50. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/db_file_backend.rb +39 -0
  51. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/file_system_backend.rb +126 -0
  52. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/s3_backend.rb +394 -0
  53. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/core_image_processor.rb +59 -0
  54. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/gd2_processor.rb +54 -0
  55. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb +61 -0
  56. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/mini_magick_processor.rb +132 -0
  57. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/rmagick_processor.rb +57 -0
  58. data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb +514 -0
  59. data/vendor/plugins/attachment_fu/rackspace_cloudfiles.yml.tpl +14 -0
  60. data/vendor/plugins/attachment_fu/test/backends/db_file_test.rb +16 -0
  61. data/vendor/plugins/attachment_fu/test/backends/file_system_test.rb +143 -0
  62. data/vendor/plugins/attachment_fu/test/backends/remote/cloudfiles_test.rb +102 -0
  63. data/vendor/plugins/attachment_fu/test/backends/remote/s3_test.rb +119 -0
  64. data/vendor/plugins/attachment_fu/test/base_attachment_tests.rb +77 -0
  65. data/vendor/plugins/attachment_fu/test/basic_test.rb +70 -0
  66. data/vendor/plugins/attachment_fu/test/database.yml +18 -0
  67. data/vendor/plugins/attachment_fu/test/extra_attachment_test.rb +67 -0
  68. data/vendor/plugins/attachment_fu/test/fixtures/attachment.rb +226 -0
  69. data/vendor/plugins/attachment_fu/test/fixtures/files/fake/rails.png +0 -0
  70. data/vendor/plugins/attachment_fu/test/fixtures/files/foo.txt +1 -0
  71. data/vendor/plugins/attachment_fu/test/fixtures/files/rails.png +0 -0
  72. data/vendor/plugins/attachment_fu/test/geometry_test.rb +108 -0
  73. data/vendor/plugins/attachment_fu/test/processors/core_image_test.rb +37 -0
  74. data/vendor/plugins/attachment_fu/test/processors/gd2_test.rb +31 -0
  75. data/vendor/plugins/attachment_fu/test/processors/image_science_test.rb +31 -0
  76. data/vendor/plugins/attachment_fu/test/processors/mini_magick_test.rb +103 -0
  77. data/vendor/plugins/attachment_fu/test/processors/rmagick_test.rb +255 -0
  78. data/vendor/plugins/attachment_fu/test/schema.rb +134 -0
  79. data/vendor/plugins/attachment_fu/test/test_helper.rb +150 -0
  80. data/vendor/plugins/attachment_fu/test/validation_test.rb +55 -0
  81. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/color.rb +27 -0
  82. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/effects.rb +31 -0
  83. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/perspective.rb +25 -0
  84. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/quality.rb +25 -0
  85. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/scale.rb +47 -0
  86. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/watermark.rb +32 -0
  87. data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/processor.rb +123 -0
  88. metadata +178 -0
@@ -0,0 +1,14 @@
1
+ development:
2
+ container_name: appname_development
3
+ username:
4
+ api_key:
5
+
6
+ test:
7
+ container_name: appname_test
8
+ username:
9
+ api_key:
10
+
11
+ production:
12
+ container_name: appname_production
13
+ username:
14
+ api_key:
@@ -0,0 +1,16 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
2
+
3
+ class DbFileTest < Test::Unit::TestCase
4
+ include BaseAttachmentTests
5
+ attachment_model Attachment
6
+
7
+ def test_should_call_after_attachment_saved(klass = Attachment)
8
+ attachment_model.saves = 0
9
+ assert_created do
10
+ upload_file :filename => '/files/rails.png'
11
+ end
12
+ assert_equal 1, attachment_model.saves
13
+ end
14
+
15
+ test_against_subclass :test_should_call_after_attachment_saved, Attachment
16
+ end
@@ -0,0 +1,143 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
2
+ require 'digest/sha2'
3
+
4
+ class FileSystemTest < Test::Unit::TestCase
5
+ include BaseAttachmentTests
6
+ attachment_model FileAttachment
7
+
8
+ def test_filesystem_size_for_file_attachment(klass = FileAttachment)
9
+ attachment_model klass
10
+ assert_created 1 do
11
+ attachment = upload_file :filename => '/files/rails.png'
12
+ assert_equal attachment.size, File.open(attachment.full_filename).stat.size
13
+ end
14
+ end
15
+
16
+ test_against_subclass :test_filesystem_size_for_file_attachment, FileAttachment
17
+
18
+ def test_should_not_overwrite_file_attachment(klass = FileAttachment)
19
+ attachment_model klass
20
+ assert_created 2 do
21
+ real = upload_file :filename => '/files/rails.png'
22
+ assert_valid real
23
+ assert !real.new_record?, real.errors.full_messages.join("\n")
24
+ assert !real.size.zero?
25
+
26
+ fake = upload_file :filename => '/files/fake/rails.png'
27
+ assert_valid fake
28
+ assert !fake.size.zero?
29
+
30
+ assert_not_equal File.open(real.full_filename).stat.size, File.open(fake.full_filename).stat.size
31
+ end
32
+ end
33
+
34
+ test_against_subclass :test_should_not_overwrite_file_attachment, FileAttachment
35
+
36
+ def test_should_store_file_attachment_in_filesystem(klass = FileAttachment)
37
+ attachment_model klass
38
+ attachment = nil
39
+ assert_created do
40
+ attachment = upload_file :filename => '/files/rails.png'
41
+ assert_valid attachment
42
+ assert File.exists?(attachment.full_filename), "#{attachment.full_filename} does not exist"
43
+ end
44
+ attachment
45
+ end
46
+
47
+ test_against_subclass :test_should_store_file_attachment_in_filesystem, FileAttachment
48
+
49
+ def test_should_delete_old_file_when_updating(klass = FileAttachment)
50
+ attachment_model klass
51
+ attachment = upload_file :filename => '/files/rails.png'
52
+ old_filename = attachment.full_filename
53
+ assert_not_created do
54
+ use_temp_file 'files/rails.png' do |file|
55
+ attachment.filename = 'rails2.png'
56
+ attachment.temp_paths.unshift File.join(fixture_path, file)
57
+ attachment.save!
58
+ assert File.exists?(attachment.full_filename), "#{attachment.full_filename} does not exist"
59
+ assert !File.exists?(old_filename), "#{old_filename} still exists"
60
+ end
61
+ end
62
+ end
63
+
64
+ test_against_subclass :test_should_delete_old_file_when_updating, FileAttachment
65
+
66
+ def test_should_delete_old_file_when_renaming(klass = FileAttachment)
67
+ attachment_model klass
68
+ attachment = upload_file :filename => '/files/rails.png'
69
+ old_filename = attachment.full_filename
70
+ assert_not_created do
71
+ attachment.filename = 'rails2.png'
72
+ attachment.save
73
+ assert File.exists?(attachment.full_filename), "#{attachment.full_filename} does not exist"
74
+ assert !File.exists?(old_filename), "#{old_filename} still exists"
75
+ assert !attachment.reload.size.zero?
76
+ assert_equal 'rails2.png', attachment.filename
77
+ end
78
+ end
79
+
80
+ test_against_subclass :test_should_delete_old_file_when_renaming, FileAttachment
81
+
82
+ def test_path_partitioning_works_on_integer_id(klass = FileAttachment)
83
+ attachment_model klass
84
+
85
+ # Create a random attachment object, doesn't matter what.
86
+ attachment = upload_file :filename => '/files/rails.png'
87
+ old_id = attachment.id
88
+ attachment.id = 1
89
+
90
+ begin
91
+ assert_equal ["0000", "0001", "bar.txt"], attachment.send(:partitioned_path, "bar.txt")
92
+ ensure
93
+ attachment.id = old_id
94
+ end
95
+ end
96
+
97
+ test_against_subclass :test_path_partitioning_works_on_integer_id, FileAttachment
98
+
99
+ def test_path_partitioning_with_string_id_works_by_generating_hash(klass = FileAttachmentWithStringId)
100
+ attachment_model klass
101
+
102
+ # Create a random attachment object, doesn't matter what.
103
+ attachment = upload_file :filename => '/files/rails.png'
104
+ old_id = attachment.id
105
+ attachment.id = "hello world some long string"
106
+ hash = Digest::SHA512.hexdigest("hello world some long string")
107
+
108
+ begin
109
+ assert_equal [
110
+ hash[0..31],
111
+ hash[32..63],
112
+ hash[64..95],
113
+ hash[96..127],
114
+ "bar.txt"
115
+ ], attachment.send(:partitioned_path, "bar.txt")
116
+ ensure
117
+ attachment.id = old_id
118
+ end
119
+ end
120
+
121
+ test_against_subclass :test_path_partitioning_with_string_id_works_by_generating_hash, FileAttachmentWithStringId
122
+
123
+ def test_path_partition_string_id_hashing_is_turned_off_if_id_is_uuid(klass = FileAttachmentWithUuid)
124
+ attachment_model klass
125
+
126
+ # Create a random attachment object, doesn't matter what.
127
+ attachment = upload_file :filename => '/files/rails.png'
128
+ old_id = attachment.id
129
+ attachment.id = "0c0743b698483569dc65909a8cdb3bf9"
130
+
131
+ begin
132
+ assert_equal [
133
+ "0c0743b698483569",
134
+ "dc65909a8cdb3bf9",
135
+ "bar.txt"
136
+ ], attachment.send(:partitioned_path, "bar.txt")
137
+ ensure
138
+ attachment.id = old_id
139
+ end
140
+ end
141
+
142
+ test_against_subclass :test_path_partition_string_id_hashing_is_turned_off_if_id_is_uuid, FileAttachmentWithUuid
143
+ end
@@ -0,0 +1,102 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
2
+ require 'net/http'
3
+
4
+ class CloudfilesTest < Test::Unit::TestCase
5
+ def self.test_CloudFiles?
6
+ true unless ENV["TEST_CLOUDFILES"] == "false"
7
+ end
8
+
9
+ if test_CloudFiles? && File.exist?(File.join(File.dirname(__FILE__), '../../rackspace_cloudfiles.yml'))
10
+ include BaseAttachmentTests
11
+ attachment_model CloudFilesAttachment
12
+
13
+ def test_should_create_correct_container_name(klass = CloudFilesAttachment)
14
+ attachment_model klass
15
+ attachment = upload_file :filename => '/files/rails.png'
16
+ assert_equal attachment.cloudfiles_config[:container_name], attachment.container_name
17
+ end
18
+
19
+ test_against_subclass :test_should_create_correct_container_name, CloudFilesAttachment
20
+
21
+ def test_should_create_default_path_prefix(klass = CloudFilesAttachment)
22
+ attachment_model klass
23
+ attachment = upload_file :filename => '/files/rails.png'
24
+ assert_equal File.join(attachment_model.table_name, attachment.attachment_path_id), attachment.base_path
25
+ end
26
+
27
+ test_against_subclass :test_should_create_default_path_prefix, CloudFilesAttachment
28
+
29
+ def test_should_create_custom_path_prefix(klass = CloudFilesWithPathPrefixAttachment)
30
+ attachment_model klass
31
+ attachment = upload_file :filename => '/files/rails.png'
32
+ assert_equal File.join('some/custom/path/prefix', attachment.attachment_path_id), attachment.base_path
33
+ end
34
+
35
+ test_against_subclass :test_should_create_custom_path_prefix, CloudFilesWithPathPrefixAttachment
36
+
37
+
38
+ def test_should_create_valid_url(klass = CloudFilesAttachment)
39
+ attachment_model klass
40
+ attachment = upload_file :filename => '/files/rails.png'
41
+ assert_match(%r!http://cdn.cloudfiles.mosso.com/(.*?)/cloud_files_attachments/1/rails.png!, attachment.cloudfiles_url)
42
+ end
43
+
44
+ test_against_subclass :test_should_create_valid_url, CloudFilesAttachment
45
+
46
+ def test_should_save_attachment(klass = CloudFilesAttachment)
47
+ attachment_model klass
48
+ assert_created do
49
+ attachment = upload_file :filename => '/files/rails.png'
50
+ assert_valid attachment
51
+ assert attachment.image?
52
+ assert !attachment.size.zero?
53
+ assert_kind_of Net::HTTPOK, http_response_for(attachment.cloudfiles_url)
54
+ end
55
+ end
56
+
57
+ test_against_subclass :test_should_save_attachment, CloudFilesAttachment
58
+
59
+ def test_should_delete_attachment_from_cloud_files_when_attachment_record_destroyed(klass = CloudFilesAttachment)
60
+ attachment_model klass
61
+ attachment = upload_file :filename => '/files/rails.png'
62
+
63
+ urls = [attachment.cloudfiles_url] + attachment.thumbnails.collect(&:cloudfiles_url)
64
+
65
+ urls.each {|url| assert_kind_of Net::HTTPOK, http_response_for(url) }
66
+ attachment.destroy
67
+ urls.each do |url|
68
+ begin
69
+ http_response_for(url)
70
+ rescue Net::HTTPForbidden, Net::HTTPNotFound
71
+ nil
72
+ end
73
+ end
74
+ end
75
+
76
+ test_against_subclass :test_should_delete_attachment_from_cloud_files_when_attachment_record_destroyed, CloudFilesAttachment
77
+
78
+
79
+
80
+ protected
81
+ def http_response_for(url)
82
+ url = URI.parse(url)
83
+ Net::HTTP.start(url.host, url.port) {|http| http.request_head(url.path) }
84
+ end
85
+
86
+ def s3_protocol
87
+ Technoweenie::AttachmentFu::Backends::S3Backend.protocol
88
+ end
89
+
90
+ def s3_hostname
91
+ Technoweenie::AttachmentFu::Backends::S3Backend.hostname
92
+ end
93
+
94
+ def s3_port_string
95
+ Technoweenie::AttachmentFu::Backends::S3Backend.port_string
96
+ end
97
+ else
98
+ def test_flunk_s3
99
+ puts "s3 config file not loaded, tests not running"
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,119 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
2
+ require 'net/http'
3
+
4
+ class S3Test < Test::Unit::TestCase
5
+ def self.test_S3?
6
+ true unless ENV["TEST_S3"] == "false"
7
+ end
8
+
9
+ if test_S3? && File.exist?(File.join(File.dirname(__FILE__), '../../amazon_s3.yml'))
10
+ include BaseAttachmentTests
11
+ attachment_model S3Attachment
12
+
13
+ def test_should_create_correct_bucket_name(klass = S3Attachment)
14
+ attachment_model klass
15
+ attachment = upload_file :filename => '/files/rails.png'
16
+ assert_equal attachment.s3_config[:bucket_name], attachment.bucket_name
17
+ end
18
+
19
+ test_against_subclass :test_should_create_correct_bucket_name, S3Attachment
20
+
21
+ def test_should_create_default_path_prefix(klass = S3Attachment)
22
+ attachment_model klass
23
+ attachment = upload_file :filename => '/files/rails.png'
24
+ assert_equal File.join(attachment_model.table_name, attachment.attachment_path_id), attachment.base_path
25
+ end
26
+
27
+ test_against_subclass :test_should_create_default_path_prefix, S3Attachment
28
+
29
+ def test_should_create_custom_path_prefix(klass = S3WithPathPrefixAttachment)
30
+ attachment_model klass
31
+ attachment = upload_file :filename => '/files/rails.png'
32
+ assert_equal File.join('some/custom/path/prefix', attachment.attachment_path_id), attachment.base_path
33
+ end
34
+
35
+ test_against_subclass :test_should_create_custom_path_prefix, S3WithPathPrefixAttachment
36
+
37
+ def test_should_create_valid_url(klass = S3Attachment)
38
+ attachment_model klass
39
+ attachment = upload_file :filename => '/files/rails.png'
40
+ assert_equal "#{s3_protocol}#{s3_hostname}#{s3_port_string}/#{attachment.bucket_name}/#{attachment.full_filename}", attachment.s3_url
41
+ end
42
+
43
+ test_against_subclass :test_should_create_valid_url, S3Attachment
44
+
45
+ def test_should_create_authenticated_url(klass = S3Attachment)
46
+ attachment_model klass
47
+ attachment = upload_file :filename => '/files/rails.png'
48
+ assert_match /^http.+AWSAccessKeyId.+Expires.+Signature.+/, attachment.authenticated_s3_url(:use_ssl => true)
49
+ end
50
+
51
+ test_against_subclass :test_should_create_authenticated_url, S3Attachment
52
+
53
+ def test_should_create_authenticated_url_for_thumbnail(klass = S3Attachment)
54
+ attachment_model klass
55
+ attachment = upload_file :filename => '/files/rails.png'
56
+ ['large', :large].each do |thumbnail|
57
+ assert_match(
58
+ /^http.+rails_large\.png.+AWSAccessKeyId.+Expires.+Signature/,
59
+ attachment.authenticated_s3_url(thumbnail),
60
+ "authenticated_s3_url failed with #{thumbnail.class} parameter"
61
+ )
62
+ end
63
+ end
64
+
65
+ def test_should_save_attachment(klass = S3Attachment)
66
+ attachment_model klass
67
+ assert_created do
68
+ attachment = upload_file :filename => '/files/rails.png'
69
+ assert_valid attachment
70
+ assert attachment.image?
71
+ assert !attachment.size.zero?
72
+ assert_kind_of Net::HTTPOK, http_response_for(attachment.s3_url)
73
+ end
74
+ end
75
+
76
+ test_against_subclass :test_should_save_attachment, S3Attachment
77
+
78
+ def test_should_delete_attachment_from_s3_when_attachment_record_destroyed(klass = S3Attachment)
79
+ attachment_model klass
80
+ attachment = upload_file :filename => '/files/rails.png'
81
+
82
+ urls = [attachment.s3_url] + attachment.thumbnails.collect(&:s3_url)
83
+
84
+ urls.each {|url| assert_kind_of Net::HTTPOK, http_response_for(url) }
85
+ attachment.destroy
86
+ urls.each do |url|
87
+ begin
88
+ http_response_for(url)
89
+ rescue Net::HTTPForbidden, Net::HTTPNotFound
90
+ nil
91
+ end
92
+ end
93
+ end
94
+
95
+ test_against_subclass :test_should_delete_attachment_from_s3_when_attachment_record_destroyed, S3Attachment
96
+
97
+ protected
98
+ def http_response_for(url)
99
+ url = URI.parse(url)
100
+ Net::HTTP.start(url.host, url.port) {|http| http.request_head(url.path) }
101
+ end
102
+
103
+ def s3_protocol
104
+ Technoweenie::AttachmentFu::Backends::S3Backend.protocol
105
+ end
106
+
107
+ def s3_hostname
108
+ Technoweenie::AttachmentFu::Backends::S3Backend.hostname
109
+ end
110
+
111
+ def s3_port_string
112
+ Technoweenie::AttachmentFu::Backends::S3Backend.port_string
113
+ end
114
+ else
115
+ def test_flunk_s3
116
+ puts "s3 config file not loaded, tests not running"
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,77 @@
1
+ module BaseAttachmentTests
2
+ def test_should_create_file_from_uploaded_file
3
+ assert_created do
4
+ attachment = upload_file :filename => '/files/foo.txt'
5
+ assert_valid attachment
6
+ assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
7
+ assert attachment.image?
8
+ assert !attachment.size.zero?
9
+ #assert_equal 3, attachment.size
10
+ assert_nil attachment.width
11
+ assert_nil attachment.height
12
+ end
13
+ end
14
+
15
+ def test_should_create_file_from_merb_temp_file
16
+ assert_created do
17
+ attachment = upload_merb_file :filename => '/files/foo.txt'
18
+ assert_valid attachment
19
+ assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
20
+ assert attachment.image?
21
+ assert !attachment.size.zero?
22
+ #assert_equal 3, attachment.size
23
+ assert_nil attachment.width
24
+ assert_nil attachment.height
25
+ end
26
+ end
27
+
28
+ def test_reassign_attribute_data
29
+ assert_created 1 do
30
+ attachment = upload_file :filename => '/files/rails.png'
31
+ assert_valid attachment
32
+ assert attachment.size > 0, "no data was set"
33
+
34
+ attachment.set_temp_data 'wtf'
35
+ assert attachment.save_attachment?
36
+ attachment.save!
37
+
38
+ assert_equal 'wtf', attachment_model.find(attachment.id).send(:current_data)
39
+ end
40
+ end
41
+
42
+ def test_no_reassign_attribute_data_on_nil
43
+ assert_created 1 do
44
+ attachment = upload_file :filename => '/files/rails.png'
45
+ assert_valid attachment
46
+ assert attachment.size > 0, "no data was set"
47
+
48
+ attachment.set_temp_data nil
49
+ assert !attachment.save_attachment?
50
+ end
51
+ end
52
+
53
+ def test_should_overwrite_old_contents_when_updating
54
+ attachment = upload_file :filename => '/files/rails.png'
55
+ assert_not_created do # no new db_file records
56
+ use_temp_file 'files/rails.png' do |file|
57
+ attachment.filename = 'rails2.png'
58
+ attachment.temp_paths.unshift File.join(fixture_path, file)
59
+ attachment.save!
60
+ end
61
+ end
62
+ end
63
+
64
+ def test_should_save_without_updating_file
65
+ attachment = upload_file :filename => '/files/foo.txt'
66
+ assert_valid attachment
67
+ assert !attachment.save_attachment?
68
+ assert_nothing_raised { attachment.save! }
69
+ end
70
+
71
+ def test_should_handle_nil_file_upload
72
+ attachment = attachment_model.create :uploaded_data => ''
73
+ assert_raise ActiveRecord::RecordInvalid do
74
+ attachment.save!
75
+ end
76
+ end
77
+ end