paperclip 3.5.4 → 4.3.7

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 (198) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -6
  3. data/.hound.yml +1066 -0
  4. data/.rubocop.yml +1 -0
  5. data/.travis.yml +11 -17
  6. data/Appraisals +6 -14
  7. data/CONTRIBUTING.md +13 -8
  8. data/Gemfile +16 -3
  9. data/LICENSE +1 -3
  10. data/NEWS +167 -49
  11. data/README.md +294 -75
  12. data/RELEASING.md +17 -0
  13. data/Rakefile +6 -8
  14. data/features/basic_integration.feature +24 -6
  15. data/features/step_definitions/attachment_steps.rb +30 -22
  16. data/features/step_definitions/html_steps.rb +2 -2
  17. data/features/step_definitions/rails_steps.rb +44 -14
  18. data/features/step_definitions/web_steps.rb +1 -103
  19. data/features/support/env.rb +2 -2
  20. data/features/support/file_helpers.rb +2 -2
  21. data/features/support/fixtures/gemfile.txt +1 -1
  22. data/features/support/rails.rb +2 -1
  23. data/gemfiles/3.2.gemfile +14 -6
  24. data/gemfiles/4.1.gemfile +19 -0
  25. data/gemfiles/4.2.gemfile +19 -0
  26. data/lib/generators/paperclip/paperclip_generator.rb +0 -2
  27. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
  28. data/lib/paperclip/attachment.rb +132 -38
  29. data/lib/paperclip/attachment_registry.rb +1 -1
  30. data/lib/paperclip/callbacks.rb +11 -1
  31. data/lib/paperclip/content_type_detector.rb +25 -22
  32. data/lib/paperclip/deprecations.rb +42 -0
  33. data/lib/paperclip/errors.rb +5 -0
  34. data/lib/paperclip/file_command_content_type_detector.rb +6 -8
  35. data/lib/paperclip/geometry_detector_factory.rb +3 -1
  36. data/lib/paperclip/geometry_parser_factory.rb +1 -1
  37. data/lib/paperclip/has_attached_file.rb +10 -0
  38. data/lib/paperclip/interpolations/plural_cache.rb +6 -5
  39. data/lib/paperclip/interpolations.rb +25 -12
  40. data/lib/paperclip/io_adapters/abstract_adapter.rb +3 -1
  41. data/lib/paperclip/io_adapters/attachment_adapter.rb +4 -4
  42. data/lib/paperclip/io_adapters/data_uri_adapter.rb +5 -10
  43. data/lib/paperclip/io_adapters/stringio_adapter.rb +6 -10
  44. data/lib/paperclip/io_adapters/uri_adapter.rb +30 -11
  45. data/lib/paperclip/locales/de.yml +18 -0
  46. data/lib/paperclip/locales/en.yml +1 -0
  47. data/lib/paperclip/locales/es.yml +18 -0
  48. data/lib/paperclip/locales/ja.yml +18 -0
  49. data/lib/paperclip/locales/pt-BR.yml +18 -0
  50. data/lib/paperclip/locales/zh-CN.yml +18 -0
  51. data/lib/paperclip/locales/zh-HK.yml +18 -0
  52. data/lib/paperclip/locales/zh-TW.yml +18 -0
  53. data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
  54. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
  55. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
  56. data/lib/paperclip/media_type_spoof_detector.rb +89 -0
  57. data/lib/paperclip/processor.rb +0 -37
  58. data/lib/paperclip/processor_helpers.rb +50 -0
  59. data/lib/paperclip/rails_environment.rb +25 -0
  60. data/lib/paperclip/schema.rb +10 -2
  61. data/lib/paperclip/storage/filesystem.rb +1 -1
  62. data/lib/paperclip/storage/fog.rb +18 -7
  63. data/lib/paperclip/storage/s3.rb +53 -22
  64. data/lib/paperclip/style.rb +8 -2
  65. data/lib/paperclip/tempfile_factory.rb +5 -1
  66. data/lib/paperclip/thumbnail.rb +12 -10
  67. data/lib/paperclip/url_generator.rb +11 -3
  68. data/lib/paperclip/validators/attachment_content_type_validator.rb +4 -0
  69. data/lib/paperclip/validators/attachment_file_name_validator.rb +80 -0
  70. data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +29 -0
  71. data/lib/paperclip/validators/attachment_presence_validator.rb +4 -0
  72. data/lib/paperclip/validators/attachment_size_validator.rb +11 -3
  73. data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
  74. data/lib/paperclip/validators.rb +10 -3
  75. data/lib/paperclip/version.rb +1 -1
  76. data/lib/paperclip.rb +26 -8
  77. data/lib/tasks/paperclip.rake +17 -2
  78. data/paperclip.gemspec +16 -14
  79. data/shoulda_macros/paperclip.rb +0 -1
  80. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  81. data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
  82. data/spec/paperclip/attachment_registry_spec.rb +130 -0
  83. data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +438 -397
  84. data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +16 -19
  85. data/spec/paperclip/deprecations_spec.rb +65 -0
  86. data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -6
  87. data/spec/paperclip/filename_cleaner_spec.rb +14 -0
  88. data/spec/paperclip/geometry_detector_spec.rb +39 -0
  89. data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
  90. data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +50 -52
  91. data/spec/paperclip/glue_spec.rb +44 -0
  92. data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +45 -28
  93. data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
  94. data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +70 -46
  95. data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
  96. data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
  97. data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +26 -17
  98. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  99. data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +36 -40
  100. data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +31 -29
  101. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  102. data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
  103. data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
  104. data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +20 -17
  105. data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
  106. data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +53 -28
  107. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  108. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
  109. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  110. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  111. data/spec/paperclip/media_type_spoof_detector_spec.rb +79 -0
  112. data/spec/paperclip/meta_class_spec.rb +30 -0
  113. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
  114. data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +53 -48
  115. data/spec/paperclip/plural_cache_spec.rb +37 -0
  116. data/spec/paperclip/processor_helpers_spec.rb +57 -0
  117. data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
  118. data/spec/paperclip/rails_environment_spec.rb +33 -0
  119. data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
  120. data/spec/paperclip/schema_spec.rb +248 -0
  121. data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
  122. data/spec/paperclip/storage/fog_spec.rb +535 -0
  123. data/spec/paperclip/storage/s3_live_spec.rb +182 -0
  124. data/spec/paperclip/storage/s3_spec.rb +1526 -0
  125. data/spec/paperclip/style_spec.rb +255 -0
  126. data/spec/paperclip/tempfile_factory_spec.rb +33 -0
  127. data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +123 -107
  128. data/spec/paperclip/url_generator_spec.rb +211 -0
  129. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  130. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
  131. data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +20 -20
  132. data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
  133. data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +52 -0
  134. data/spec/paperclip/validators_spec.rb +164 -0
  135. data/spec/spec_helper.rb +43 -0
  136. data/spec/support/assertions.rb +71 -0
  137. data/spec/support/deprecations.rb +9 -0
  138. data/spec/support/fake_model.rb +25 -0
  139. data/spec/support/fake_rails.rb +12 -0
  140. data/spec/support/fixtures/empty.html +1 -0
  141. data/spec/support/fixtures/empty.xlsx +0 -0
  142. data/spec/support/fixtures/spaced file.jpg +0 -0
  143. data/spec/support/matchers/accept.rb +5 -0
  144. data/spec/support/matchers/exist.rb +5 -0
  145. data/spec/support/matchers/have_column.rb +23 -0
  146. data/spec/support/model_reconstruction.rb +60 -0
  147. data/spec/support/rails_helpers.rb +7 -0
  148. data/spec/support/test_data.rb +13 -0
  149. data/spec/support/version_helper.rb +9 -0
  150. metadata +334 -219
  151. data/RUNNING_TESTS.md +0 -4
  152. data/gemfiles/3.0.gemfile +0 -11
  153. data/gemfiles/3.1.gemfile +0 -11
  154. data/gemfiles/4.0.gemfile +0 -11
  155. data/test/attachment_definitions_test.rb +0 -12
  156. data/test/attachment_registry_test.rb +0 -88
  157. data/test/filename_cleaner_test.rb +0 -14
  158. data/test/generator_test.rb +0 -84
  159. data/test/geometry_detector_test.rb +0 -24
  160. data/test/helper.rb +0 -232
  161. data/test/io_adapters/abstract_adapter_test.rb +0 -58
  162. data/test/io_adapters/empty_string_adapter_test.rb +0 -18
  163. data/test/io_adapters/identity_adapter_test.rb +0 -8
  164. data/test/matchers/have_attached_file_matcher_test.rb +0 -24
  165. data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -110
  166. data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -69
  167. data/test/matchers/validate_attachment_size_matcher_test.rb +0 -86
  168. data/test/meta_class_test.rb +0 -32
  169. data/test/paperclip_missing_attachment_styles_test.rb +0 -90
  170. data/test/plural_cache_test.rb +0 -36
  171. data/test/schema_test.rb +0 -200
  172. data/test/storage/fog_test.rb +0 -473
  173. data/test/storage/s3_live_test.rb +0 -179
  174. data/test/storage/s3_test.rb +0 -1356
  175. data/test/style_test.rb +0 -213
  176. data/test/support/mock_model.rb +0 -2
  177. data/test/tempfile_factory_test.rb +0 -17
  178. data/test/url_generator_test.rb +0 -187
  179. data/test/validators/attachment_content_type_validator_test.rb +0 -324
  180. data/test/validators_test.rb +0 -61
  181. /data/{test → spec}/database.yml +0 -0
  182. /data/{test → spec/support}/fixtures/12k.png +0 -0
  183. /data/{test → spec/support}/fixtures/50x50.png +0 -0
  184. /data/{test → spec/support}/fixtures/5k.png +0 -0
  185. /data/{test → spec/support}/fixtures/animated +0 -0
  186. /data/{test → spec/support}/fixtures/animated.gif +0 -0
  187. /data/{test → spec/support}/fixtures/animated.unknown +0 -0
  188. /data/{test → spec/support}/fixtures/bad.png +0 -0
  189. /data/{test → spec/support}/fixtures/fog.yml +0 -0
  190. /data/{test → spec/support}/fixtures/rotated.jpg +0 -0
  191. /data/{test → spec/support}/fixtures/s3.yml +0 -0
  192. /data/{test → spec/support}/fixtures/spaced file.png +0 -0
  193. /data/{test → spec/support}/fixtures/text.txt +0 -0
  194. /data/{test → spec/support}/fixtures/twopage.pdf +0 -0
  195. /data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
  196. /data/{test → spec}/support/mock_attachment.rb +0 -0
  197. /data/{test → spec}/support/mock_interpolator.rb +0 -0
  198. /data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
@@ -0,0 +1,211 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Paperclip::UrlGenerator do
5
+ it "uses the given interpolator" do
6
+ expected = "the expected result"
7
+ mock_attachment = MockAttachment.new
8
+ mock_interpolator = MockInterpolator.new(result: expected)
9
+
10
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment,
11
+ { interpolator: mock_interpolator })
12
+ result = url_generator.for(:style_name, {})
13
+
14
+ assert_equal expected, result
15
+ assert mock_interpolator.has_interpolated_attachment?(mock_attachment)
16
+ assert mock_interpolator.has_interpolated_style_name?(:style_name)
17
+ end
18
+
19
+ it "uses the default URL when no file is assigned" do
20
+ mock_attachment = MockAttachment.new
21
+ mock_interpolator = MockInterpolator.new
22
+ default_url = "the default url"
23
+ options = { interpolator: mock_interpolator, default_url: default_url}
24
+
25
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
26
+ url_generator.for(:style_name, {})
27
+
28
+ assert mock_interpolator.has_interpolated_pattern?(default_url),
29
+ "expected the interpolator to be passed #{default_url.inspect} but it wasn't"
30
+ end
31
+
32
+ it "executes the default URL lambda when no file is assigned" do
33
+ mock_attachment = MockAttachment.new
34
+ mock_interpolator = MockInterpolator.new
35
+ default_url = lambda {|attachment| "the #{attachment.class.name} default url" }
36
+ options = { interpolator: mock_interpolator, default_url: default_url}
37
+
38
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
39
+ url_generator.for(:style_name, {})
40
+
41
+ assert mock_interpolator.has_interpolated_pattern?("the MockAttachment default url"),
42
+ %{expected the interpolator to be passed "the MockAttachment default url", but it wasn't}
43
+ end
44
+
45
+ it "executes the method named by the symbol as the default URL when no file is assigned" do
46
+ mock_model = FakeModel.new
47
+ mock_attachment = MockAttachment.new(model: mock_model)
48
+ mock_interpolator = MockInterpolator.new
49
+ default_url = :to_s
50
+ options = { interpolator: mock_interpolator, default_url: default_url}
51
+
52
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
53
+ url_generator.for(:style_name, {})
54
+
55
+ assert mock_interpolator.has_interpolated_pattern?(mock_model.to_s),
56
+ %{expected the interpolator to be passed #{mock_model.to_s}, but it wasn't}
57
+ end
58
+
59
+ it "URL-escapes spaces if asked to" do
60
+ expected = "the expected result"
61
+ mock_attachment = MockAttachment.new
62
+ mock_interpolator = MockInterpolator.new(result: expected)
63
+ options = { interpolator: mock_interpolator }
64
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
65
+
66
+ result = url_generator.for(:style_name, {escape: true})
67
+
68
+ assert_equal "the%20expected%20result", result
69
+ end
70
+
71
+ it "escapes the result of the interpolator using a method on the object, if asked to escape" do
72
+ expected = Class.new do
73
+ def escape
74
+ "the escaped result"
75
+ end
76
+ end.new
77
+ mock_attachment = MockAttachment.new
78
+ mock_interpolator = MockInterpolator.new(result: expected)
79
+ options = { interpolator: mock_interpolator }
80
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
81
+
82
+ result = url_generator.for(:style_name, {escape: true})
83
+
84
+ assert_equal "the escaped result", result
85
+ end
86
+
87
+ it "leaves spaces unescaped as asked to" do
88
+ expected = "the expected result"
89
+ mock_attachment = MockAttachment.new
90
+ mock_interpolator = MockInterpolator.new(result: expected)
91
+ options = { interpolator: mock_interpolator }
92
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
93
+
94
+ result = url_generator.for(:style_name, {escape: false})
95
+
96
+ assert_equal "the expected result", result
97
+ end
98
+
99
+ it "defaults to leaving spaces unescaped" do
100
+ expected = "the expected result"
101
+ mock_attachment = MockAttachment.new
102
+ mock_interpolator = MockInterpolator.new(result: expected)
103
+ options = { interpolator: mock_interpolator }
104
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
105
+
106
+ result = url_generator.for(:style_name, {})
107
+
108
+ assert_equal "the expected result", result
109
+ end
110
+
111
+ it "produces URLs without the updated_at value when the object does not respond to updated_at" do
112
+ expected = "the expected result"
113
+ mock_interpolator = MockInterpolator.new(result: expected)
114
+ mock_attachment = MockAttachment.new(responds_to_updated_at: false)
115
+ options = { interpolator: mock_interpolator }
116
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
117
+
118
+ result = url_generator.for(:style_name, {timestamp: true})
119
+
120
+ assert_equal expected, result
121
+ end
122
+
123
+ it "produces URLs without the updated_at value when the updated_at value is nil" do
124
+ expected = "the expected result"
125
+ mock_interpolator = MockInterpolator.new(result: expected)
126
+ mock_attachment = MockAttachment.new(responds_to_updated_at: true, updated_at: nil)
127
+ options = { interpolator: mock_interpolator }
128
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
129
+
130
+ result = url_generator.for(:style_name, {timestamp: true})
131
+
132
+ assert_equal expected, result
133
+ end
134
+
135
+ it "produces URLs with the updated_at when it exists" do
136
+ expected = "the expected result"
137
+ updated_at = 1231231234
138
+ mock_interpolator = MockInterpolator.new(result: expected)
139
+ mock_attachment = MockAttachment.new(updated_at: updated_at)
140
+ options = { interpolator: mock_interpolator }
141
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
142
+
143
+ result = url_generator.for(:style_name, {timestamp: true})
144
+
145
+ assert_equal "#{expected}?#{updated_at}", result
146
+ end
147
+
148
+ it "produces URLs with the updated_at when it exists, separated with a & if a ? follow by = already exists" do
149
+ expected = "the?expected=result"
150
+ updated_at = 1231231234
151
+ mock_interpolator = MockInterpolator.new(result: expected)
152
+ mock_attachment = MockAttachment.new(updated_at: updated_at)
153
+ options = { interpolator: mock_interpolator }
154
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
155
+
156
+ result = url_generator.for(:style_name, {timestamp: true})
157
+
158
+ assert_equal "#{expected}&#{updated_at}", result
159
+ end
160
+
161
+ it "produces URLs without the updated_at when told to do as much" do
162
+ expected = "the expected result"
163
+ updated_at = 1231231234
164
+ mock_interpolator = MockInterpolator.new(result: expected)
165
+ mock_attachment = MockAttachment.new(updated_at: updated_at)
166
+ options = { interpolator: mock_interpolator }
167
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
168
+
169
+ result = url_generator.for(:style_name, {timestamp: false})
170
+
171
+ assert_equal expected, result
172
+ end
173
+
174
+ it "produces the correct URL when the instance has a file name" do
175
+ expected = "the expected result"
176
+ mock_attachment = MockAttachment.new(original_filename: 'exists')
177
+ mock_interpolator = MockInterpolator.new
178
+ options = { interpolator: mock_interpolator, url: expected}
179
+
180
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
181
+ url_generator.for(:style_name, {})
182
+
183
+ assert mock_interpolator.has_interpolated_pattern?(expected),
184
+ "expected the interpolator to be passed #{expected.inspect} but it wasn't"
185
+ end
186
+
187
+ describe "should be able to escape (, ), [, and ]." do
188
+ def generate(expected, updated_at=nil)
189
+ mock_attachment = MockAttachment.new(updated_at: updated_at)
190
+ mock_interpolator = MockInterpolator.new(result: expected)
191
+ options = { interpolator: mock_interpolator }
192
+ url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
193
+ def url_generator.respond_to(params)
194
+ false if params == :escape
195
+ end
196
+ url_generator.for(:style_name, {escape: true, timestamp: !!updated_at})
197
+ end
198
+
199
+ it "not timestamp" do
200
+ expected = "the(expected)result[]"
201
+ assert_equal "the%28expected%29result%5B%5D", generate(expected)
202
+ end
203
+
204
+ it "timestamp" do
205
+ expected = "the(expected)result[]"
206
+ updated_at = 1231231234
207
+ assert_equal "the%28expected%29result%5B%5D?#{updated_at}",
208
+ generate(expected, updated_at)
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,322 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::Validators::AttachmentContentTypeValidator do
4
+ before do
5
+ rebuild_model
6
+ @dummy = Dummy.new
7
+ end
8
+
9
+ def build_validator(options)
10
+ @validator = Paperclip::Validators::AttachmentContentTypeValidator.new(options.merge(
11
+ attributes: :avatar
12
+ ))
13
+ end
14
+
15
+ context "with a nil content type" do
16
+ before do
17
+ build_validator content_type: "image/jpg"
18
+ @dummy.stubs(avatar_content_type: nil)
19
+ @validator.validate(@dummy)
20
+ end
21
+
22
+ it "does not set an error message" do
23
+ assert @dummy.errors[:avatar_content_type].blank?
24
+ end
25
+ end
26
+
27
+ context "with :allow_nil option" do
28
+ context "as true" do
29
+ before do
30
+ build_validator content_type: "image/png", allow_nil: true
31
+ @dummy.stubs(avatar_content_type: nil)
32
+ @validator.validate(@dummy)
33
+ end
34
+
35
+ it "allows avatar_content_type as nil" do
36
+ assert @dummy.errors[:avatar_content_type].blank?
37
+ end
38
+ end
39
+
40
+ context "as false" do
41
+ before do
42
+ build_validator content_type: "image/png", allow_nil: false
43
+ @dummy.stubs(avatar_content_type: nil)
44
+ @validator.validate(@dummy)
45
+ end
46
+
47
+ it "does not allow avatar_content_type as nil" do
48
+ assert @dummy.errors[:avatar_content_type].present?
49
+ end
50
+ end
51
+ end
52
+
53
+ context "with a failing validation" do
54
+ before do
55
+ build_validator content_type: "image/png", allow_nil: false
56
+ @dummy.stubs(avatar_content_type: nil)
57
+ @validator.validate(@dummy)
58
+ end
59
+
60
+ it "adds error to the base object" do
61
+ assert @dummy.errors[:avatar].present?,
62
+ "Error not added to base attribute"
63
+ end
64
+
65
+ it "adds error to base object as a string" do
66
+ expect(@dummy.errors[:avatar].first).to be_a String
67
+ end
68
+ end
69
+
70
+ context "with a successful validation" do
71
+ before do
72
+ build_validator content_type: "image/png", allow_nil: false
73
+ @dummy.stubs(avatar_content_type: "image/png")
74
+ @validator.validate(@dummy)
75
+ end
76
+
77
+ it "does not add error to the base object" do
78
+ assert @dummy.errors[:avatar].blank?,
79
+ "Error was added to base attribute"
80
+ end
81
+ end
82
+
83
+ context "with :allow_blank option" do
84
+ context "as true" do
85
+ before do
86
+ build_validator content_type: "image/png", allow_blank: true
87
+ @dummy.stubs(avatar_content_type: "")
88
+ @validator.validate(@dummy)
89
+ end
90
+
91
+ it "allows avatar_content_type as blank" do
92
+ assert @dummy.errors[:avatar_content_type].blank?
93
+ end
94
+ end
95
+
96
+ context "as false" do
97
+ before do
98
+ build_validator content_type: "image/png", allow_blank: false
99
+ @dummy.stubs(avatar_content_type: "")
100
+ @validator.validate(@dummy)
101
+ end
102
+
103
+ it "does not allow avatar_content_type as blank" do
104
+ assert @dummy.errors[:avatar_content_type].present?
105
+ end
106
+ end
107
+ end
108
+
109
+ context "whitelist format" do
110
+ context "with an allowed type" do
111
+ context "as a string" do
112
+ before do
113
+ build_validator content_type: "image/jpg"
114
+ @dummy.stubs(avatar_content_type: "image/jpg")
115
+ @validator.validate(@dummy)
116
+ end
117
+
118
+ it "does not set an error message" do
119
+ assert @dummy.errors[:avatar_content_type].blank?
120
+ end
121
+ end
122
+
123
+ context "as an regexp" do
124
+ before do
125
+ build_validator content_type: /^image\/.*/
126
+ @dummy.stubs(avatar_content_type: "image/jpg")
127
+ @validator.validate(@dummy)
128
+ end
129
+
130
+ it "does not set an error message" do
131
+ assert @dummy.errors[:avatar_content_type].blank?
132
+ end
133
+ end
134
+
135
+ context "as a list" do
136
+ before do
137
+ build_validator content_type: ["image/png", "image/jpg", "image/jpeg"]
138
+ @dummy.stubs(avatar_content_type: "image/jpg")
139
+ @validator.validate(@dummy)
140
+ end
141
+
142
+ it "does not set an error message" do
143
+ assert @dummy.errors[:avatar_content_type].blank?
144
+ end
145
+ end
146
+ end
147
+
148
+ context "with a disallowed type" do
149
+ context "as a string" do
150
+ before do
151
+ build_validator content_type: "image/png"
152
+ @dummy.stubs(avatar_content_type: "image/jpg")
153
+ @validator.validate(@dummy)
154
+ end
155
+
156
+ it "sets a correct default error message" do
157
+ assert @dummy.errors[:avatar_content_type].present?
158
+ expect(@dummy.errors[:avatar_content_type]).to include "is invalid"
159
+ end
160
+ end
161
+
162
+ context "as a regexp" do
163
+ before do
164
+ build_validator content_type: /^text\/.*/
165
+ @dummy.stubs(avatar_content_type: "image/jpg")
166
+ @validator.validate(@dummy)
167
+ end
168
+
169
+ it "sets a correct default error message" do
170
+ assert @dummy.errors[:avatar_content_type].present?
171
+ expect(@dummy.errors[:avatar_content_type]).to include "is invalid"
172
+ end
173
+ end
174
+
175
+ context "with :message option" do
176
+ context "without interpolation" do
177
+ before do
178
+ build_validator content_type: "image/png", message: "should be a PNG image"
179
+ @dummy.stubs(avatar_content_type: "image/jpg")
180
+ @validator.validate(@dummy)
181
+ end
182
+
183
+ it "sets a correct error message" do
184
+ expect(@dummy.errors[:avatar_content_type]).to include "should be a PNG image"
185
+ end
186
+ end
187
+
188
+ context "with interpolation" do
189
+ before do
190
+ build_validator content_type: "image/png", message: "should have content type %{types}"
191
+ @dummy.stubs(avatar_content_type: "image/jpg")
192
+ @validator.validate(@dummy)
193
+ end
194
+
195
+ it "sets a correct error message" do
196
+ expect(@dummy.errors[:avatar_content_type]).to include "should have content type image/png"
197
+ end
198
+ end
199
+ end
200
+ end
201
+ end
202
+
203
+ context "blacklist format" do
204
+ context "with an allowed type" do
205
+ context "as a string" do
206
+ before do
207
+ build_validator not: "image/gif"
208
+ @dummy.stubs(avatar_content_type: "image/jpg")
209
+ @validator.validate(@dummy)
210
+ end
211
+
212
+ it "does not set an error message" do
213
+ assert @dummy.errors[:avatar_content_type].blank?
214
+ end
215
+ end
216
+
217
+ context "as an regexp" do
218
+ before do
219
+ build_validator not: /^text\/.*/
220
+ @dummy.stubs(avatar_content_type: "image/jpg")
221
+ @validator.validate(@dummy)
222
+ end
223
+
224
+ it "does not set an error message" do
225
+ assert @dummy.errors[:avatar_content_type].blank?
226
+ end
227
+ end
228
+
229
+ context "as a list" do
230
+ before do
231
+ build_validator not: ["image/png", "image/jpg", "image/jpeg"]
232
+ @dummy.stubs(avatar_content_type: "image/gif")
233
+ @validator.validate(@dummy)
234
+ end
235
+
236
+ it "does not set an error message" do
237
+ assert @dummy.errors[:avatar_content_type].blank?
238
+ end
239
+ end
240
+ end
241
+
242
+ context "with a disallowed type" do
243
+ context "as a string" do
244
+ before do
245
+ build_validator not: "image/png"
246
+ @dummy.stubs(avatar_content_type: "image/png")
247
+ @validator.validate(@dummy)
248
+ end
249
+
250
+ it "sets a correct default error message" do
251
+ assert @dummy.errors[:avatar_content_type].present?
252
+ expect(@dummy.errors[:avatar_content_type]).to include "is invalid"
253
+ end
254
+ end
255
+
256
+ context "as a regexp" do
257
+ before do
258
+ build_validator not: /^text\/.*/
259
+ @dummy.stubs(avatar_content_type: "text/plain")
260
+ @validator.validate(@dummy)
261
+ end
262
+
263
+ it "sets a correct default error message" do
264
+ assert @dummy.errors[:avatar_content_type].present?
265
+ expect(@dummy.errors[:avatar_content_type]).to include "is invalid"
266
+ end
267
+ end
268
+
269
+ context "with :message option" do
270
+ context "without interpolation" do
271
+ before do
272
+ build_validator not: "image/png", message: "should not be a PNG image"
273
+ @dummy.stubs(avatar_content_type: "image/png")
274
+ @validator.validate(@dummy)
275
+ end
276
+
277
+ it "sets a correct error message" do
278
+ expect(@dummy.errors[:avatar_content_type]).to include "should not be a PNG image"
279
+ end
280
+ end
281
+
282
+ context "with interpolation" do
283
+ before do
284
+ build_validator not: "image/png", message: "should not have content type %{types}"
285
+ @dummy.stubs(avatar_content_type: "image/png")
286
+ @validator.validate(@dummy)
287
+ end
288
+
289
+ it "sets a correct error message" do
290
+ expect(@dummy.errors[:avatar_content_type]).to include "should not have content type image/png"
291
+ end
292
+ end
293
+ end
294
+ end
295
+ end
296
+
297
+ context "using the helper" do
298
+ before do
299
+ Dummy.validates_attachment_content_type :avatar, content_type: "image/jpg"
300
+ end
301
+
302
+ it "adds the validator to the class" do
303
+ assert Dummy.validators_on(:avatar).any?{ |validator| validator.kind == :attachment_content_type }
304
+ end
305
+ end
306
+
307
+ context "given options" do
308
+ it "raises argument error if no required argument was given" do
309
+ assert_raises(ArgumentError) do
310
+ build_validator message: "Some message"
311
+ end
312
+ end
313
+
314
+ it "does not raise argument error if :content_type was given" do
315
+ build_validator content_type: "image/jpg"
316
+ end
317
+
318
+ it "does not raise argument error if :not was given" do
319
+ build_validator not: "image/jpg"
320
+ end
321
+ end
322
+ end
@@ -0,0 +1,160 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::Validators::AttachmentFileNameValidator do
4
+ before do
5
+ rebuild_model
6
+ @dummy = Dummy.new
7
+ end
8
+
9
+ def build_validator(options)
10
+ @validator = Paperclip::Validators::AttachmentFileNameValidator.new(options.merge(
11
+ attributes: :avatar
12
+ ))
13
+ end
14
+
15
+ context "with a failing validation" do
16
+ before do
17
+ build_validator matches: /.*\.png$/, allow_nil: false
18
+ @dummy.stubs(avatar_file_name: "data.txt")
19
+ @validator.validate(@dummy)
20
+ end
21
+
22
+ it "adds error to the base object" do
23
+ assert @dummy.errors[:avatar].present?,
24
+ "Error not added to base attribute"
25
+ end
26
+
27
+ it "adds error to base object as a string" do
28
+ expect(@dummy.errors[:avatar].first).to be_a String
29
+ end
30
+ end
31
+
32
+ it "does not add error to the base object with a successful validation" do
33
+ build_validator matches: /.*\.png$/, allow_nil: false
34
+ @dummy.stubs(avatar_file_name: "image.png")
35
+ @validator.validate(@dummy)
36
+
37
+ assert @dummy.errors[:avatar].blank?, "Error was added to base attribute"
38
+ end
39
+
40
+ context "whitelist format" do
41
+ context "with an allowed type" do
42
+ context "as a single regexp" do
43
+ before do
44
+ build_validator matches: /.*\.jpg$/
45
+ @dummy.stubs(avatar_file_name: "image.jpg")
46
+ @validator.validate(@dummy)
47
+ end
48
+
49
+ it "does not set an error message" do
50
+ assert @dummy.errors[:avatar_file_name].blank?
51
+ end
52
+ end
53
+
54
+ context "as a list" do
55
+ before do
56
+ build_validator matches: [/.*\.png$/, /.*\.jpe?g$/]
57
+ @dummy.stubs(avatar_file_name: "image.jpg")
58
+ @validator.validate(@dummy)
59
+ end
60
+
61
+ it "does not set an error message" do
62
+ assert @dummy.errors[:avatar_file_name].blank?
63
+ end
64
+ end
65
+ end
66
+
67
+ context "with a disallowed type" do
68
+ it "sets a correct default error message" do
69
+ build_validator matches: /^text\/.*/
70
+ @dummy.stubs(avatar_file_name: "image.jpg")
71
+ @validator.validate(@dummy)
72
+
73
+ assert @dummy.errors[:avatar_file_name].present?
74
+ expect(@dummy.errors[:avatar_file_name]).to include "is invalid"
75
+ end
76
+
77
+ it "sets a correct custom error message" do
78
+ build_validator matches: /.*\.png$/, message: "should be a PNG image"
79
+ @dummy.stubs(avatar_file_name: "image.jpg")
80
+ @validator.validate(@dummy)
81
+
82
+ expect(@dummy.errors[:avatar_file_name]).to include "should be a PNG image"
83
+ end
84
+ end
85
+ end
86
+
87
+ context "blacklist format" do
88
+ context "with an allowed type" do
89
+ context "as a single regexp" do
90
+ before do
91
+ build_validator not: /^text\/.*/
92
+ @dummy.stubs(avatar_file_name: "image.jpg")
93
+ @validator.validate(@dummy)
94
+ end
95
+
96
+ it "does not set an error message" do
97
+ assert @dummy.errors[:avatar_file_name].blank?
98
+ end
99
+ end
100
+
101
+ context "as a list" do
102
+ before do
103
+ build_validator not: [/.*\.png$/, /.*\.jpe?g$/]
104
+ @dummy.stubs(avatar_file_name: "image.gif")
105
+ @validator.validate(@dummy)
106
+ end
107
+
108
+ it "does not set an error message" do
109
+ assert @dummy.errors[:avatar_file_name].blank?
110
+ end
111
+ end
112
+ end
113
+
114
+ context "with a disallowed type" do
115
+ it "sets a correct default error message" do
116
+ build_validator not: /data.*/
117
+ @dummy.stubs(avatar_file_name: "data.txt")
118
+ @validator.validate(@dummy)
119
+
120
+ assert @dummy.errors[:avatar_file_name].present?
121
+ expect(@dummy.errors[:avatar_file_name]).to include "is invalid"
122
+ end
123
+
124
+ it "sets a correct custom error message" do
125
+ build_validator not: /.*\.png$/, message: "should not be a PNG image"
126
+ @dummy.stubs(avatar_file_name: "image.png")
127
+ @validator.validate(@dummy)
128
+
129
+ expect(@dummy.errors[:avatar_file_name]).to include "should not be a PNG image"
130
+ end
131
+ end
132
+ end
133
+
134
+ context "using the helper" do
135
+ before do
136
+ Dummy.validates_attachment_file_name :avatar, matches: /.*\.jpg$/
137
+ end
138
+
139
+ it "adds the validator to the class" do
140
+ assert Dummy.validators_on(:avatar).any?{ |validator| validator.kind == :attachment_file_name }
141
+ end
142
+ end
143
+
144
+ context "given options" do
145
+ it "raises argument error if no required argument was given" do
146
+ assert_raises(ArgumentError) do
147
+ build_validator message: "Some message"
148
+ end
149
+ end
150
+
151
+ it "does not raise argument error if :matches was given" do
152
+ build_validator matches: /.*\.jpg$/
153
+ end
154
+
155
+ it "does not raise argument error if :not was given" do
156
+ build_validator not: /.*\.jpg$/
157
+ end
158
+ end
159
+ end
160
+