paperclip-fix 4.3.7
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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.hound.yml +1066 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +22 -0
- data/Appraisals +11 -0
- data/CONTRIBUTING.md +75 -0
- data/Gemfile +21 -0
- data/LICENSE +24 -0
- data/NEWS +420 -0
- data/README.md +979 -0
- data/RELEASING.md +17 -0
- data/Rakefile +44 -0
- data/UPGRADING +14 -0
- data/cucumber/paperclip_steps.rb +6 -0
- data/features/basic_integration.feature +80 -0
- data/features/migration.feature +94 -0
- data/features/rake_tasks.feature +62 -0
- data/features/step_definitions/attachment_steps.rb +110 -0
- data/features/step_definitions/html_steps.rb +15 -0
- data/features/step_definitions/rails_steps.rb +236 -0
- data/features/step_definitions/s3_steps.rb +14 -0
- data/features/step_definitions/web_steps.rb +107 -0
- data/features/support/env.rb +11 -0
- data/features/support/fakeweb.rb +13 -0
- data/features/support/file_helpers.rb +34 -0
- data/features/support/fixtures/boot_config.txt +15 -0
- data/features/support/fixtures/gemfile.txt +5 -0
- data/features/support/fixtures/preinitializer.txt +20 -0
- data/features/support/paths.rb +28 -0
- data/features/support/rails.rb +63 -0
- data/features/support/selectors.rb +19 -0
- data/gemfiles/3.2.gemfile +19 -0
- data/gemfiles/4.1.gemfile +19 -0
- data/gemfiles/4.2.gemfile +19 -0
- data/lib/generators/paperclip/USAGE +8 -0
- data/lib/generators/paperclip/paperclip_generator.rb +30 -0
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +15 -0
- data/lib/paperclip/attachment.rb +608 -0
- data/lib/paperclip/attachment_registry.rb +59 -0
- data/lib/paperclip/callbacks.rb +40 -0
- data/lib/paperclip/content_type_detector.rb +79 -0
- data/lib/paperclip/deprecations.rb +42 -0
- data/lib/paperclip/errors.rb +32 -0
- data/lib/paperclip/file_command_content_type_detector.rb +30 -0
- data/lib/paperclip/filename_cleaner.rb +16 -0
- data/lib/paperclip/geometry.rb +158 -0
- data/lib/paperclip/geometry_detector_factory.rb +48 -0
- data/lib/paperclip/geometry_parser_factory.rb +31 -0
- data/lib/paperclip/glue.rb +17 -0
- data/lib/paperclip/has_attached_file.rb +109 -0
- data/lib/paperclip/helpers.rb +56 -0
- data/lib/paperclip/interpolations/plural_cache.rb +18 -0
- data/lib/paperclip/interpolations.rb +197 -0
- data/lib/paperclip/io_adapters/abstract_adapter.rb +47 -0
- data/lib/paperclip/io_adapters/attachment_adapter.rb +36 -0
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +22 -0
- data/lib/paperclip/io_adapters/empty_string_adapter.rb +18 -0
- data/lib/paperclip/io_adapters/file_adapter.rb +22 -0
- data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +15 -0
- data/lib/paperclip/io_adapters/identity_adapter.rb +12 -0
- data/lib/paperclip/io_adapters/nil_adapter.rb +34 -0
- data/lib/paperclip/io_adapters/registry.rb +32 -0
- data/lib/paperclip/io_adapters/stringio_adapter.rb +33 -0
- data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +42 -0
- data/lib/paperclip/io_adapters/uri_adapter.rb +63 -0
- data/lib/paperclip/locales/de.yml +18 -0
- data/lib/paperclip/locales/en.yml +18 -0
- data/lib/paperclip/locales/es.yml +18 -0
- data/lib/paperclip/locales/ja.yml +18 -0
- data/lib/paperclip/locales/pt-BR.yml +18 -0
- data/lib/paperclip/locales/zh-CN.yml +18 -0
- data/lib/paperclip/locales/zh-HK.yml +18 -0
- data/lib/paperclip/locales/zh-TW.yml +18 -0
- data/lib/paperclip/logger.rb +21 -0
- data/lib/paperclip/matchers/have_attached_file_matcher.rb +54 -0
- data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +100 -0
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +59 -0
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +96 -0
- data/lib/paperclip/matchers.rb +64 -0
- data/lib/paperclip/media_type_spoof_detector.rb +89 -0
- data/lib/paperclip/missing_attachment_styles.rb +79 -0
- data/lib/paperclip/processor.rb +48 -0
- data/lib/paperclip/processor_helpers.rb +50 -0
- data/lib/paperclip/rails_environment.rb +25 -0
- data/lib/paperclip/railtie.rb +31 -0
- data/lib/paperclip/schema.rb +83 -0
- data/lib/paperclip/storage/filesystem.rb +90 -0
- data/lib/paperclip/storage/fog.rb +241 -0
- data/lib/paperclip/storage/s3.rb +440 -0
- data/lib/paperclip/storage.rb +3 -0
- data/lib/paperclip/style.rb +109 -0
- data/lib/paperclip/tempfile.rb +43 -0
- data/lib/paperclip/tempfile_factory.rb +23 -0
- data/lib/paperclip/thumbnail.rb +121 -0
- data/lib/paperclip/url_generator.rb +72 -0
- data/lib/paperclip/validators/attachment_content_type_validator.rb +88 -0
- data/lib/paperclip/validators/attachment_file_name_validator.rb +80 -0
- data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +29 -0
- data/lib/paperclip/validators/attachment_presence_validator.rb +30 -0
- data/lib/paperclip/validators/attachment_size_validator.rb +115 -0
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
- data/lib/paperclip/validators.rb +74 -0
- data/lib/paperclip/version.rb +3 -0
- data/lib/paperclip.rb +213 -0
- data/lib/tasks/paperclip.rake +127 -0
- data/paperclip.gemspec +51 -0
- data/shoulda_macros/paperclip.rb +134 -0
- data/spec/database.yml +4 -0
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/spec/paperclip/attachment_processing_spec.rb +82 -0
- data/spec/paperclip/attachment_registry_spec.rb +130 -0
- data/spec/paperclip/attachment_spec.rb +1494 -0
- data/spec/paperclip/content_type_detector_spec.rb +48 -0
- data/spec/paperclip/deprecations_spec.rb +65 -0
- data/spec/paperclip/file_command_content_type_detector_spec.rb +26 -0
- data/spec/paperclip/filename_cleaner_spec.rb +14 -0
- data/spec/paperclip/geometry_detector_spec.rb +39 -0
- data/spec/paperclip/geometry_parser_spec.rb +73 -0
- data/spec/paperclip/geometry_spec.rb +255 -0
- data/spec/paperclip/glue_spec.rb +44 -0
- data/spec/paperclip/has_attached_file_spec.rb +142 -0
- data/spec/paperclip/integration_spec.rb +667 -0
- data/spec/paperclip/interpolations_spec.rb +262 -0
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
- data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +139 -0
- data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +83 -0
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
- data/spec/paperclip/io_adapters/file_adapter_spec.rb +131 -0
- data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +104 -0
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
- data/spec/paperclip/io_adapters/nil_adapter_spec.rb +25 -0
- data/spec/paperclip/io_adapters/registry_spec.rb +35 -0
- data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +64 -0
- data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +146 -0
- data/spec/paperclip/io_adapters/uri_adapter_spec.rb +127 -0
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
- data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
- data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
- data/spec/paperclip/media_type_spoof_detector_spec.rb +79 -0
- data/spec/paperclip/meta_class_spec.rb +30 -0
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
- data/spec/paperclip/paperclip_spec.rb +222 -0
- data/spec/paperclip/plural_cache_spec.rb +37 -0
- data/spec/paperclip/processor_helpers_spec.rb +57 -0
- data/spec/paperclip/processor_spec.rb +26 -0
- data/spec/paperclip/rails_environment_spec.rb +33 -0
- data/spec/paperclip/rake_spec.rb +103 -0
- data/spec/paperclip/schema_spec.rb +248 -0
- data/spec/paperclip/storage/filesystem_spec.rb +79 -0
- data/spec/paperclip/storage/fog_spec.rb +535 -0
- data/spec/paperclip/storage/s3_live_spec.rb +182 -0
- data/spec/paperclip/storage/s3_spec.rb +1526 -0
- data/spec/paperclip/style_spec.rb +255 -0
- data/spec/paperclip/tempfile_factory_spec.rb +33 -0
- data/spec/paperclip/thumbnail_spec.rb +500 -0
- data/spec/paperclip/url_generator_spec.rb +211 -0
- data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
- data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
- data/spec/paperclip/validators/attachment_presence_validator_spec.rb +85 -0
- data/spec/paperclip/validators/attachment_size_validator_spec.rb +229 -0
- data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +52 -0
- data/spec/paperclip/validators_spec.rb +164 -0
- data/spec/spec_helper.rb +43 -0
- data/spec/support/assertions.rb +71 -0
- data/spec/support/deprecations.rb +9 -0
- data/spec/support/fake_model.rb +25 -0
- data/spec/support/fake_rails.rb +12 -0
- data/spec/support/fixtures/12k.png +0 -0
- data/spec/support/fixtures/50x50.png +0 -0
- data/spec/support/fixtures/5k.png +0 -0
- data/spec/support/fixtures/animated +0 -0
- data/spec/support/fixtures/animated.gif +0 -0
- data/spec/support/fixtures/animated.unknown +0 -0
- data/spec/support/fixtures/bad.png +1 -0
- data/spec/support/fixtures/empty.html +1 -0
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/fog.yml +8 -0
- data/spec/support/fixtures/rotated.jpg +0 -0
- data/spec/support/fixtures/s3.yml +8 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/spec/support/fixtures/spaced file.png +0 -0
- data/spec/support/fixtures/text.txt +1 -0
- data/spec/support/fixtures/twopage.pdf +0 -0
- data/spec/support/fixtures/uppercase.PNG +0 -0
- data/spec/support/matchers/accept.rb +5 -0
- data/spec/support/matchers/exist.rb +5 -0
- data/spec/support/matchers/have_column.rb +23 -0
- data/spec/support/mock_attachment.rb +22 -0
- data/spec/support/mock_interpolator.rb +24 -0
- data/spec/support/mock_url_generator_builder.rb +27 -0
- data/spec/support/model_reconstruction.rb +60 -0
- data/spec/support/rails_helpers.rb +7 -0
- data/spec/support/test_data.rb +13 -0
- data/spec/support/version_helper.rb +9 -0
- metadata +606 -0
|
@@ -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
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Paperclip::Validators::AttachmentPresenceValidator do
|
|
4
|
+
before do
|
|
5
|
+
rebuild_model
|
|
6
|
+
@dummy = Dummy.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def build_validator(options={})
|
|
10
|
+
@validator = Paperclip::Validators::AttachmentPresenceValidator.new(options.merge(
|
|
11
|
+
attributes: :avatar
|
|
12
|
+
))
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "nil attachment" do
|
|
16
|
+
before do
|
|
17
|
+
@dummy.avatar = nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "with default options" do
|
|
21
|
+
before do
|
|
22
|
+
build_validator
|
|
23
|
+
@validator.validate(@dummy)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "adds error on the attachment" do
|
|
27
|
+
assert @dummy.errors[:avatar].present?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "does not add an error on the file_name attribute" do
|
|
31
|
+
assert @dummy.errors[:avatar_file_name].blank?
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "with :if option" do
|
|
36
|
+
context "returning true" do
|
|
37
|
+
before do
|
|
38
|
+
build_validator if: true
|
|
39
|
+
@validator.validate(@dummy)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "performs a validation" do
|
|
43
|
+
assert @dummy.errors[:avatar].present?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "returning false" do
|
|
48
|
+
before do
|
|
49
|
+
build_validator if: false
|
|
50
|
+
@validator.validate(@dummy)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "performs a validation" do
|
|
54
|
+
assert @dummy.errors[:avatar].present?
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "with attachment" do
|
|
61
|
+
before do
|
|
62
|
+
build_validator
|
|
63
|
+
@dummy.avatar = StringIO.new('.\n')
|
|
64
|
+
@validator.validate(@dummy)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "does not add error on the attachment" do
|
|
68
|
+
assert @dummy.errors[:avatar].blank?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "does not add an error on the file_name attribute" do
|
|
72
|
+
assert @dummy.errors[:avatar_file_name].blank?
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
context "using the helper" do
|
|
77
|
+
before do
|
|
78
|
+
Dummy.validates_attachment_presence :avatar
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "adds the validator to the class" do
|
|
82
|
+
assert Dummy.validators_on(:avatar).any?{ |validator| validator.kind == :attachment_presence }
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|