paperclip 4.1.1 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of paperclip might be problematic. Click here for more details.

Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -6
  3. data/.travis.yml +4 -13
  4. data/Appraisals +0 -10
  5. data/CONTRIBUTING.md +10 -5
  6. data/Gemfile +8 -4
  7. data/NEWS +1 -1
  8. data/README.md +51 -10
  9. data/Rakefile +6 -8
  10. data/features/basic_integration.feature +5 -5
  11. data/features/step_definitions/attachment_steps.rb +4 -4
  12. data/features/step_definitions/rails_steps.rb +4 -4
  13. data/features/step_definitions/web_steps.rb +2 -2
  14. data/features/support/env.rb +2 -2
  15. data/features/support/fixtures/gemfile.txt +1 -1
  16. data/features/support/rails.rb +2 -1
  17. data/gemfiles/3.2.gemfile +5 -3
  18. data/gemfiles/4.0.gemfile +5 -3
  19. data/gemfiles/4.1.gemfile +5 -3
  20. data/lib/generators/paperclip/paperclip_generator.rb +0 -2
  21. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
  22. data/lib/paperclip.rb +4 -1
  23. data/lib/paperclip/attachment.rb +90 -29
  24. data/lib/paperclip/content_type_detector.rb +1 -1
  25. data/lib/paperclip/geometry_detector_factory.rb +3 -1
  26. data/lib/paperclip/has_attached_file.rb +2 -1
  27. data/lib/paperclip/interpolations.rb +8 -0
  28. data/lib/paperclip/io_adapters/abstract_adapter.rb +1 -1
  29. data/lib/paperclip/io_adapters/data_uri_adapter.rb +1 -1
  30. data/lib/paperclip/io_adapters/stringio_adapter.rb +5 -11
  31. data/lib/paperclip/locales/de.yml +18 -0
  32. data/lib/paperclip/locales/es.yml +18 -0
  33. data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
  34. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
  35. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
  36. data/lib/paperclip/media_type_spoof_detector.rb +10 -2
  37. data/lib/paperclip/storage/filesystem.rb +1 -1
  38. data/lib/paperclip/storage/s3.rb +26 -4
  39. data/lib/paperclip/style.rb +1 -1
  40. data/lib/paperclip/thumbnail.rb +6 -6
  41. data/lib/paperclip/validators.rb +5 -3
  42. data/lib/paperclip/validators/attachment_size_validator.rb +7 -3
  43. data/lib/paperclip/version.rb +1 -1
  44. data/lib/tasks/paperclip.rake +1 -2
  45. data/paperclip.gemspec +5 -3
  46. data/shoulda_macros/paperclip.rb +0 -1
  47. data/{test → spec}/database.yml +0 -0
  48. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  49. data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
  50. data/{test/attachment_registry_test.rb → spec/paperclip/attachment_registry_spec.rb} +10 -11
  51. data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +367 -360
  52. data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +8 -8
  53. data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -5
  54. data/spec/paperclip/filename_cleaner_spec.rb +14 -0
  55. data/spec/paperclip/geometry_detector_spec.rb +39 -0
  56. data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
  57. data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +49 -51
  58. data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +18 -27
  59. data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
  60. data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +54 -40
  61. data/{test/io_adapters/abstract_adapter_test.rb → spec/paperclip/io_adapters/abstract_adapter_spec.rb} +21 -10
  62. data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
  63. data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +22 -18
  64. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  65. data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +32 -28
  66. data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +22 -22
  67. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  68. data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
  69. data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
  70. data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +16 -17
  71. data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
  72. data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +22 -22
  73. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  74. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
  75. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  76. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  77. data/{test/media_type_spoof_detector_test.rb → spec/paperclip/media_type_spoof_detector_spec.rb} +13 -8
  78. data/spec/paperclip/meta_class_spec.rb +30 -0
  79. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
  80. data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +47 -47
  81. data/{test/plural_cache_test.rb → spec/paperclip/plural_cache_spec.rb} +6 -6
  82. data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
  83. data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
  84. data/spec/paperclip/schema_spec.rb +206 -0
  85. data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
  86. data/{test/storage/fog_test.rb → spec/paperclip/storage/fog_spec.rb} +145 -140
  87. data/spec/paperclip/storage/s3_live_spec.rb +182 -0
  88. data/spec/paperclip/storage/s3_spec.rb +1475 -0
  89. data/spec/paperclip/style_spec.rb +255 -0
  90. data/spec/paperclip/tempfile_factory_spec.rb +29 -0
  91. data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +107 -107
  92. data/{test/url_generator_test.rb → spec/paperclip/url_generator_spec.rb} +55 -56
  93. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  94. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
  95. data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +19 -19
  96. data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
  97. data/{test/validators/media_type_spoof_detection_validator_test.rb → spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb} +8 -8
  98. data/spec/paperclip/validators_spec.rb +164 -0
  99. data/spec/spec_helper.rb +40 -0
  100. data/spec/support/assertions.rb +71 -0
  101. data/spec/support/fake_model.rb +21 -0
  102. data/spec/support/fake_rails.rb +12 -0
  103. data/{test → spec/support}/fixtures/12k.png +0 -0
  104. data/{test → spec/support}/fixtures/50x50.png +0 -0
  105. data/{test → spec/support}/fixtures/5k.png +0 -0
  106. data/{test → spec/support}/fixtures/animated +0 -0
  107. data/{test → spec/support}/fixtures/animated.gif +0 -0
  108. data/{test → spec/support}/fixtures/animated.unknown +0 -0
  109. data/{test → spec/support}/fixtures/bad.png +0 -0
  110. data/{test → spec/support}/fixtures/empty.html +0 -0
  111. data/{test → spec/support}/fixtures/fog.yml +0 -0
  112. data/{test → spec/support}/fixtures/rotated.jpg +0 -0
  113. data/{test → spec/support}/fixtures/s3.yml +0 -0
  114. data/spec/support/fixtures/spaced file.jpg +0 -0
  115. data/test/fixtures/spaced file.png b/data/spec/support/fixtures/spaced → file.png +0 -0
  116. data/{test → spec/support}/fixtures/text.txt +0 -0
  117. data/{test → spec/support}/fixtures/twopage.pdf +0 -0
  118. data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
  119. data/spec/support/matchers/accept.rb +5 -0
  120. data/spec/support/matchers/exist.rb +5 -0
  121. data/{test → spec}/support/mock_attachment.rb +0 -0
  122. data/{test → spec}/support/mock_interpolator.rb +0 -0
  123. data/{test → spec}/support/mock_model.rb +0 -0
  124. data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
  125. data/spec/support/model_reconstruction.rb +60 -0
  126. data/spec/support/rails_helpers.rb +7 -0
  127. data/spec/support/test_data.rb +13 -0
  128. data/spec/support/version_helper.rb +9 -0
  129. metadata +256 -210
  130. data/gemfiles/3.0.gemfile +0 -11
  131. data/gemfiles/3.1.gemfile +0 -11
  132. data/test/attachment_definitions_test.rb +0 -13
  133. data/test/filename_cleaner_test.rb +0 -14
  134. data/test/generator_test.rb +0 -84
  135. data/test/geometry_detector_test.rb +0 -24
  136. data/test/helper.rb +0 -239
  137. data/test/io_adapters/empty_string_adapter_test.rb +0 -18
  138. data/test/io_adapters/identity_adapter_test.rb +0 -8
  139. data/test/matchers/have_attached_file_matcher_test.rb +0 -25
  140. data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -111
  141. data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -70
  142. data/test/matchers/validate_attachment_size_matcher_test.rb +0 -87
  143. data/test/meta_class_test.rb +0 -32
  144. data/test/paperclip_missing_attachment_styles_test.rb +0 -90
  145. data/test/schema_test.rb +0 -206
  146. data/test/storage/s3_live_test.rb +0 -179
  147. data/test/storage/s3_test.rb +0 -1357
  148. data/test/style_test.rb +0 -251
  149. data/test/tempfile_factory_test.rb +0 -29
  150. data/test/validators/attachment_content_type_validator_test.rb +0 -324
  151. data/test/validators/attachment_file_name_validator_test.rb +0 -162
  152. data/test/validators_test.rb +0 -101
@@ -1,251 +0,0 @@
1
- # encoding: utf-8
2
- require './test/helper'
3
-
4
- class StyleTest < Test::Unit::TestCase
5
-
6
- context "A style rule" do
7
- setup do
8
- @attachment = attachment :path => ":basename.:extension",
9
- :styles => { :foo => {:geometry => "100x100#", :format => :png} },
10
- :whiny => true
11
- @style = @attachment.styles[:foo]
12
- end
13
-
14
- should "be held as a Style object" do
15
- assert_kind_of Paperclip::Style, @style
16
- end
17
-
18
- should "get processors from the attachment definition" do
19
- assert_equal [:thumbnail], @style.processors
20
- end
21
-
22
- should "have the right geometry" do
23
- assert_equal "100x100#", @style.geometry
24
- end
25
-
26
- should "be whiny if the attachment is" do
27
- assert @style.whiny?
28
- end
29
-
30
- should "respond to hash notation" do
31
- assert_equal [:thumbnail], @style[:processors]
32
- assert_equal "100x100#", @style[:geometry]
33
- end
34
- end
35
-
36
- context "A style rule with properties supplied as procs" do
37
- setup do
38
- @attachment = attachment :path => ":basename.:extension",
39
- :whiny_thumbnails => true,
40
- :processors => lambda {|a| [:test]},
41
- :styles => {
42
- :foo => lambda{|a| "300x300#"},
43
- :bar => {
44
- :geometry => lambda{|a| "300x300#"},
45
- :convert_options => lambda{|a| "-do_stuff"},
46
- :source_file_options => lambda{|a| "-do_extra_stuff"}
47
- }
48
- }
49
- end
50
-
51
- should "call procs when they are needed" do
52
- assert_equal "300x300#", @attachment.styles[:foo].geometry
53
- assert_equal "300x300#", @attachment.styles[:bar].geometry
54
- assert_equal [:test], @attachment.styles[:foo].processors
55
- assert_equal [:test], @attachment.styles[:bar].processors
56
- assert_equal "-do_stuff", @attachment.styles[:bar].convert_options
57
- assert_equal "-do_extra_stuff", @attachment.styles[:bar].source_file_options
58
- end
59
- end
60
-
61
- context "An attachment with style rules in various forms" do
62
- setup do
63
- styles = {}
64
- styles[:aslist] = ["100x100", :png]
65
- styles[:ashash] = {:geometry => "100x100", :format => :png}
66
- styles[:asstring] = "100x100"
67
- @attachment = attachment :path => ":basename.:extension",
68
- :styles => styles
69
- end
70
- should "have the right number of styles" do
71
- assert_kind_of Hash, @attachment.styles
72
- assert_equal 3, @attachment.styles.size
73
- end
74
-
75
- should "have styles as Style objects" do
76
- [:aslist, :ashash, :aslist].each do |s|
77
- assert_kind_of Paperclip::Style, @attachment.styles[s]
78
- end
79
- end
80
-
81
- should "have the right geometries" do
82
- [:aslist, :ashash, :aslist].each do |s|
83
- assert_equal @attachment.styles[s].geometry, "100x100"
84
- end
85
- end
86
-
87
- should "have the right formats" do
88
- assert_equal @attachment.styles[:aslist].format, :png
89
- assert_equal @attachment.styles[:ashash].format, :png
90
- assert_nil @attachment.styles[:asstring].format
91
- end
92
-
93
- should "retain order" do
94
- assert_equal [:aslist, :ashash, :asstring], @attachment.styles.keys
95
- end
96
- end
97
-
98
- context "An attachment with :convert_options" do
99
- should "not have called extra_options_for(:thumb/:large) on initialization" do
100
- @attachment = attachment :path => ":basename.:extension",
101
- :styles => {:thumb => "100x100", :large => "400x400"},
102
- :convert_options => {:all => "-do_stuff", :thumb => "-thumbnailize"}
103
- @attachment.expects(:extra_options_for).never
104
- @style = @attachment.styles[:thumb]
105
- end
106
-
107
- should "call extra_options_for(:thumb/:large) when convert options are requested" do
108
- @attachment = attachment :path => ":basename.:extension",
109
- :styles => {:thumb => "100x100", :large => "400x400"},
110
- :convert_options => {:all => "-do_stuff", :thumb => "-thumbnailize"}
111
- @style = @attachment.styles[:thumb]
112
- @file = StringIO.new("...")
113
- @file.stubs(:original_filename).returns("file.jpg")
114
-
115
- @attachment.expects(:extra_options_for).with(:thumb)
116
- @attachment.styles[:thumb].convert_options
117
- end
118
- end
119
-
120
- context "An attachment with :source_file_options" do
121
- should "not have called extra_source_file_options_for(:thumb/:large) on initialization" do
122
- @attachment = attachment :path => ":basename.:extension",
123
- :styles => {:thumb => "100x100", :large => "400x400"},
124
- :source_file_options => {:all => "-density 400", :thumb => "-depth 8"}
125
- @attachment.expects(:extra_source_file_options_for).never
126
- @style = @attachment.styles[:thumb]
127
- end
128
-
129
- should "call extra_options_for(:thumb/:large) when convert options are requested" do
130
- @attachment = attachment :path => ":basename.:extension",
131
- :styles => {:thumb => "100x100", :large => "400x400"},
132
- :source_file_options => {:all => "-density 400", :thumb => "-depth 8"}
133
- @style = @attachment.styles[:thumb]
134
- @file = StringIO.new("...")
135
- @file.stubs(:original_filename).returns("file.jpg")
136
-
137
- @attachment.expects(:extra_source_file_options_for).with(:thumb)
138
- @attachment.styles[:thumb].source_file_options
139
- end
140
- end
141
-
142
- context "A style rule with its own :processors" do
143
- setup do
144
- @attachment = attachment :path => ":basename.:extension",
145
- :styles => {
146
- :foo => {
147
- :geometry => "100x100#",
148
- :format => :png,
149
- :processors => [:test]
150
- }
151
- },
152
- :processors => [:thumbnail]
153
- @style = @attachment.styles[:foo]
154
- end
155
-
156
- should "not get processors from the attachment" do
157
- @attachment.expects(:processors).never
158
- assert_not_equal [:thumbnail], @style.processors
159
- end
160
-
161
- should "report its own processors" do
162
- assert_equal [:test], @style.processors
163
- end
164
-
165
- end
166
-
167
- context "A style rule with :processors supplied as procs" do
168
- setup do
169
- @attachment = attachment :path => ":basename.:extension",
170
- :styles => {
171
- :foo => {
172
- :geometry => "100x100#",
173
- :format => :png,
174
- :processors => lambda{|a| [:test]}
175
- }
176
- },
177
- :processors => [:thumbnail]
178
- end
179
-
180
- should "defer processing of procs until they are needed" do
181
- assert_kind_of Proc, @attachment.styles[:foo].instance_variable_get("@processors")
182
- end
183
-
184
- should "call procs when they are needed" do
185
- assert_equal [:test], @attachment.styles[:foo].processors
186
- end
187
- end
188
-
189
- context "An attachment with :convert_options and :source_file_options in :styles" do
190
- setup do
191
- @attachment = attachment :path => ":basename.:extension",
192
- :styles => {
193
- :thumb => "100x100",
194
- :large => {:geometry => "400x400",
195
- :convert_options => "-do_stuff",
196
- :source_file_options => "-do_extra_stuff"
197
- }
198
- }
199
- @file = StringIO.new("...")
200
- @file.stubs(:original_filename).returns("file.jpg")
201
- end
202
-
203
- should "have empty options for :thumb style" do
204
- assert_equal "", @attachment.styles[:thumb].processor_options[:convert_options]
205
- assert_equal "", @attachment.styles[:thumb].processor_options[:source_file_options]
206
- end
207
-
208
- should "have the right options for :large style" do
209
- assert_equal "-do_stuff", @attachment.styles[:large].processor_options[:convert_options]
210
- assert_equal "-do_extra_stuff", @attachment.styles[:large].processor_options[:source_file_options]
211
- end
212
- end
213
-
214
- context "A style rule supplied with default format" do
215
- setup do
216
- @attachment = attachment :default_format => :png,
217
- :styles => {
218
- :asstring => "300x300#",
219
- :aslist => ["300x300#", :jpg],
220
- :ashash => {
221
- :geometry => "300x300#",
222
- :convert_options => "-do_stuff"
223
- }
224
- }
225
- end
226
-
227
- should "have the right number of styles" do
228
- assert_kind_of Hash, @attachment.styles
229
- assert_equal 3, @attachment.styles.size
230
- end
231
-
232
- should "have styles as Style objects" do
233
- [:aslist, :ashash, :aslist].each do |s|
234
- assert_kind_of Paperclip::Style, @attachment.styles[s]
235
- end
236
- end
237
-
238
- should "have the right geometries" do
239
- [:aslist, :ashash, :aslist].each do |s|
240
- assert_equal @attachment.styles[s].geometry, "300x300#"
241
- end
242
- end
243
-
244
- should "have the right formats" do
245
- assert_equal @attachment.styles[:aslist].format, :jpg
246
- assert_equal @attachment.styles[:ashash].format, :png
247
- assert_equal @attachment.styles[:asstring].format, :png
248
- end
249
-
250
- end
251
- end
@@ -1,29 +0,0 @@
1
- require './test/helper'
2
-
3
- class Paperclip::TempfileFactoryTest < Test::Unit::TestCase
4
- should "be able to generate a tempfile with the right name" do
5
- file = subject.generate("omg.png")
6
- assert File.extname(file.path), "png"
7
- end
8
-
9
- should "be able to generate a tempfile with the right name with a tilde at the beginning" do
10
- file = subject.generate("~omg.png")
11
- assert File.extname(file.path), "png"
12
- end
13
-
14
- should "be able to generate a tempfile with the right name with a tilde at the end" do
15
- file = subject.generate("omg.png~")
16
- assert File.extname(file.path), "png"
17
- end
18
-
19
- should "be able to generate a tempfile from a file with a really long name" do
20
- filename = "#{"longfilename" * 100}.png"
21
- file = subject.generate(filename)
22
- assert File.extname(file.path), "png"
23
- end
24
-
25
- should 'be able to take nothing as a parameter and not error' do
26
- file = subject.generate
27
- assert File.exists?(file.path)
28
- end
29
- end
@@ -1,324 +0,0 @@
1
- require './test/helper'
2
-
3
- class AttachmentContentTypeValidatorTest < Test::Unit::TestCase
4
- def setup
5
- rebuild_model
6
- @dummy = Dummy.new
7
- super
8
- end
9
-
10
- def build_validator(options)
11
- @validator = Paperclip::Validators::AttachmentContentTypeValidator.new(options.merge(
12
- :attributes => :avatar
13
- ))
14
- end
15
-
16
- context "with a nil content type" do
17
- setup do
18
- build_validator :content_type => "image/jpg"
19
- @dummy.stubs(:avatar_content_type => nil)
20
- @validator.validate(@dummy)
21
- end
22
-
23
- should "not set an error message" do
24
- assert @dummy.errors[:avatar_content_type].blank?
25
- end
26
- end
27
-
28
- context "with :allow_nil option" do
29
- context "as true" do
30
- setup do
31
- build_validator :content_type => "image/png", :allow_nil => true
32
- @dummy.stubs(:avatar_content_type => nil)
33
- @validator.validate(@dummy)
34
- end
35
-
36
- should "allow avatar_content_type as nil" do
37
- assert @dummy.errors[:avatar_content_type].blank?
38
- end
39
- end
40
-
41
- context "as false" do
42
- setup do
43
- build_validator :content_type => "image/png", :allow_nil => false
44
- @dummy.stubs(:avatar_content_type => nil)
45
- @validator.validate(@dummy)
46
- end
47
-
48
- should "not allow avatar_content_type as nil" do
49
- assert @dummy.errors[:avatar_content_type].present?
50
- end
51
- end
52
- end
53
-
54
- context "with a failing validation" do
55
- setup do
56
- build_validator :content_type => "image/png", :allow_nil => false
57
- @dummy.stubs(:avatar_content_type => nil)
58
- @validator.validate(@dummy)
59
- end
60
-
61
- should "add error to the base object" do
62
- assert @dummy.errors[:avatar].present?,
63
- "Error not added to base attribute"
64
- end
65
-
66
- should "add error to base object as a string" do
67
- assert_kind_of String, @dummy.errors[:avatar].first,
68
- "Error added to base attribute as something other than a String"
69
- end
70
- end
71
-
72
- context "with a successful validation" do
73
- setup do
74
- build_validator :content_type => "image/png", :allow_nil => false
75
- @dummy.stubs(:avatar_content_type => "image/png")
76
- @validator.validate(@dummy)
77
- end
78
-
79
- should "not add error to the base object" do
80
- assert @dummy.errors[:avatar].blank?,
81
- "Error was added to base attribute"
82
- end
83
- end
84
-
85
- context "with :allow_blank option" do
86
- context "as true" do
87
- setup do
88
- build_validator :content_type => "image/png", :allow_blank => true
89
- @dummy.stubs(:avatar_content_type => "")
90
- @validator.validate(@dummy)
91
- end
92
-
93
- should "allow avatar_content_type as blank" do
94
- assert @dummy.errors[:avatar_content_type].blank?
95
- end
96
- end
97
-
98
- context "as false" do
99
- setup do
100
- build_validator :content_type => "image/png", :allow_blank => false
101
- @dummy.stubs(:avatar_content_type => "")
102
- @validator.validate(@dummy)
103
- end
104
-
105
- should "not allow avatar_content_type as blank" do
106
- assert @dummy.errors[:avatar_content_type].present?
107
- end
108
- end
109
- end
110
-
111
- context "whitelist format" do
112
- context "with an allowed type" do
113
- context "as a string" do
114
- setup do
115
- build_validator :content_type => "image/jpg"
116
- @dummy.stubs(:avatar_content_type => "image/jpg")
117
- @validator.validate(@dummy)
118
- end
119
-
120
- should "not set an error message" do
121
- assert @dummy.errors[:avatar_content_type].blank?
122
- end
123
- end
124
-
125
- context "as an regexp" do
126
- setup do
127
- build_validator :content_type => /^image\/.*/
128
- @dummy.stubs(:avatar_content_type => "image/jpg")
129
- @validator.validate(@dummy)
130
- end
131
-
132
- should "not set an error message" do
133
- assert @dummy.errors[:avatar_content_type].blank?
134
- end
135
- end
136
-
137
- context "as a list" do
138
- setup do
139
- build_validator :content_type => ["image/png", "image/jpg", "image/jpeg"]
140
- @dummy.stubs(:avatar_content_type => "image/jpg")
141
- @validator.validate(@dummy)
142
- end
143
-
144
- should "not set an error message" do
145
- assert @dummy.errors[:avatar_content_type].blank?
146
- end
147
- end
148
- end
149
-
150
- context "with a disallowed type" do
151
- context "as a string" do
152
- setup do
153
- build_validator :content_type => "image/png"
154
- @dummy.stubs(:avatar_content_type => "image/jpg")
155
- @validator.validate(@dummy)
156
- end
157
-
158
- should "set a correct default error message" do
159
- assert @dummy.errors[:avatar_content_type].present?
160
- assert_includes @dummy.errors[:avatar_content_type], "is invalid"
161
- end
162
- end
163
-
164
- context "as a regexp" do
165
- setup do
166
- build_validator :content_type => /^text\/.*/
167
- @dummy.stubs(:avatar_content_type => "image/jpg")
168
- @validator.validate(@dummy)
169
- end
170
-
171
- should "set a correct default error message" do
172
- assert @dummy.errors[:avatar_content_type].present?
173
- assert_includes @dummy.errors[:avatar_content_type], "is invalid"
174
- end
175
- end
176
-
177
- context "with :message option" do
178
- context "without interpolation" do
179
- setup do
180
- build_validator :content_type => "image/png", :message => "should be a PNG image"
181
- @dummy.stubs(:avatar_content_type => "image/jpg")
182
- @validator.validate(@dummy)
183
- end
184
-
185
- should "set a correct error message" do
186
- assert_includes @dummy.errors[:avatar_content_type], "should be a PNG image"
187
- end
188
- end
189
-
190
- context "with interpolation" do
191
- setup do
192
- build_validator :content_type => "image/png", :message => "should have content type %{types}"
193
- @dummy.stubs(:avatar_content_type => "image/jpg")
194
- @validator.validate(@dummy)
195
- end
196
-
197
- should "set a correct error message" do
198
- assert_includes @dummy.errors[:avatar_content_type], "should have content type image/png"
199
- end
200
- end
201
- end
202
- end
203
- end
204
-
205
- context "blacklist format" do
206
- context "with an allowed type" do
207
- context "as a string" do
208
- setup do
209
- build_validator :not => "image/gif"
210
- @dummy.stubs(:avatar_content_type => "image/jpg")
211
- @validator.validate(@dummy)
212
- end
213
-
214
- should "not set an error message" do
215
- assert @dummy.errors[:avatar_content_type].blank?
216
- end
217
- end
218
-
219
- context "as an regexp" do
220
- setup do
221
- build_validator :not => /^text\/.*/
222
- @dummy.stubs(:avatar_content_type => "image/jpg")
223
- @validator.validate(@dummy)
224
- end
225
-
226
- should "not set an error message" do
227
- assert @dummy.errors[:avatar_content_type].blank?
228
- end
229
- end
230
-
231
- context "as a list" do
232
- setup do
233
- build_validator :not => ["image/png", "image/jpg", "image/jpeg"]
234
- @dummy.stubs(:avatar_content_type => "image/gif")
235
- @validator.validate(@dummy)
236
- end
237
-
238
- should "not set an error message" do
239
- assert @dummy.errors[:avatar_content_type].blank?
240
- end
241
- end
242
- end
243
-
244
- context "with a disallowed type" do
245
- context "as a string" do
246
- setup do
247
- build_validator :not => "image/png"
248
- @dummy.stubs(:avatar_content_type => "image/png")
249
- @validator.validate(@dummy)
250
- end
251
-
252
- should "set a correct default error message" do
253
- assert @dummy.errors[:avatar_content_type].present?
254
- assert_includes @dummy.errors[:avatar_content_type], "is invalid"
255
- end
256
- end
257
-
258
- context "as a regexp" do
259
- setup do
260
- build_validator :not => /^text\/.*/
261
- @dummy.stubs(:avatar_content_type => "text/plain")
262
- @validator.validate(@dummy)
263
- end
264
-
265
- should "set a correct default error message" do
266
- assert @dummy.errors[:avatar_content_type].present?
267
- assert_includes @dummy.errors[:avatar_content_type], "is invalid"
268
- end
269
- end
270
-
271
- context "with :message option" do
272
- context "without interpolation" do
273
- setup do
274
- build_validator :not => "image/png", :message => "should not be a PNG image"
275
- @dummy.stubs(:avatar_content_type => "image/png")
276
- @validator.validate(@dummy)
277
- end
278
-
279
- should "set a correct error message" do
280
- assert_includes @dummy.errors[:avatar_content_type], "should not be a PNG image"
281
- end
282
- end
283
-
284
- context "with interpolation" do
285
- setup do
286
- build_validator :not => "image/png", :message => "should not have content type %{types}"
287
- @dummy.stubs(:avatar_content_type => "image/png")
288
- @validator.validate(@dummy)
289
- end
290
-
291
- should "set a correct error message" do
292
- assert_includes @dummy.errors[:avatar_content_type], "should not have content type image/png"
293
- end
294
- end
295
- end
296
- end
297
- end
298
-
299
- context "using the helper" do
300
- setup do
301
- Dummy.validates_attachment_content_type :avatar, :content_type => "image/jpg"
302
- end
303
-
304
- should "add the validator to the class" do
305
- assert Dummy.validators_on(:avatar).any?{ |validator| validator.kind == :attachment_content_type }
306
- end
307
- end
308
-
309
- context "given options" do
310
- should "raise argument error if no required argument was given" do
311
- assert_raises(ArgumentError) do
312
- build_validator :message => "Some message"
313
- end
314
- end
315
-
316
- should "not raise argument error if :content_type was given" do
317
- build_validator :content_type => "image/jpg"
318
- end
319
-
320
- should "not raise argument error if :not was given" do
321
- build_validator :not => "image/jpg"
322
- end
323
- end
324
- end