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.
- checksums.yaml +4 -4
- data/.gitignore +0 -6
- data/.hound.yml +1066 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +11 -17
- data/Appraisals +6 -14
- data/CONTRIBUTING.md +13 -8
- data/Gemfile +16 -3
- data/LICENSE +1 -3
- data/NEWS +167 -49
- data/README.md +294 -75
- data/RELEASING.md +17 -0
- data/Rakefile +6 -8
- data/features/basic_integration.feature +24 -6
- data/features/step_definitions/attachment_steps.rb +30 -22
- data/features/step_definitions/html_steps.rb +2 -2
- data/features/step_definitions/rails_steps.rb +44 -14
- data/features/step_definitions/web_steps.rb +1 -103
- data/features/support/env.rb +2 -2
- data/features/support/file_helpers.rb +2 -2
- data/features/support/fixtures/gemfile.txt +1 -1
- data/features/support/rails.rb +2 -1
- data/gemfiles/3.2.gemfile +14 -6
- data/gemfiles/4.1.gemfile +19 -0
- data/gemfiles/4.2.gemfile +19 -0
- data/lib/generators/paperclip/paperclip_generator.rb +0 -2
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
- data/lib/paperclip/attachment.rb +132 -38
- data/lib/paperclip/attachment_registry.rb +1 -1
- data/lib/paperclip/callbacks.rb +11 -1
- data/lib/paperclip/content_type_detector.rb +25 -22
- data/lib/paperclip/deprecations.rb +42 -0
- data/lib/paperclip/errors.rb +5 -0
- data/lib/paperclip/file_command_content_type_detector.rb +6 -8
- data/lib/paperclip/geometry_detector_factory.rb +3 -1
- data/lib/paperclip/geometry_parser_factory.rb +1 -1
- data/lib/paperclip/has_attached_file.rb +10 -0
- data/lib/paperclip/interpolations/plural_cache.rb +6 -5
- data/lib/paperclip/interpolations.rb +25 -12
- data/lib/paperclip/io_adapters/abstract_adapter.rb +3 -1
- data/lib/paperclip/io_adapters/attachment_adapter.rb +4 -4
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +5 -10
- data/lib/paperclip/io_adapters/stringio_adapter.rb +6 -10
- data/lib/paperclip/io_adapters/uri_adapter.rb +30 -11
- data/lib/paperclip/locales/de.yml +18 -0
- data/lib/paperclip/locales/en.yml +1 -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/matchers/have_attached_file_matcher.rb +2 -1
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
- data/lib/paperclip/media_type_spoof_detector.rb +89 -0
- data/lib/paperclip/processor.rb +0 -37
- data/lib/paperclip/processor_helpers.rb +50 -0
- data/lib/paperclip/rails_environment.rb +25 -0
- data/lib/paperclip/schema.rb +10 -2
- data/lib/paperclip/storage/filesystem.rb +1 -1
- data/lib/paperclip/storage/fog.rb +18 -7
- data/lib/paperclip/storage/s3.rb +53 -22
- data/lib/paperclip/style.rb +8 -2
- data/lib/paperclip/tempfile_factory.rb +5 -1
- data/lib/paperclip/thumbnail.rb +12 -10
- data/lib/paperclip/url_generator.rb +11 -3
- data/lib/paperclip/validators/attachment_content_type_validator.rb +4 -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 +4 -0
- data/lib/paperclip/validators/attachment_size_validator.rb +11 -3
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
- data/lib/paperclip/validators.rb +10 -3
- data/lib/paperclip/version.rb +1 -1
- data/lib/paperclip.rb +26 -8
- data/lib/tasks/paperclip.rake +17 -2
- data/paperclip.gemspec +16 -14
- data/shoulda_macros/paperclip.rb +0 -1
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
- data/spec/paperclip/attachment_registry_spec.rb +130 -0
- data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +438 -397
- data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +16 -19
- data/spec/paperclip/deprecations_spec.rb +65 -0
- data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -6
- data/spec/paperclip/filename_cleaner_spec.rb +14 -0
- data/spec/paperclip/geometry_detector_spec.rb +39 -0
- data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
- data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +50 -52
- data/spec/paperclip/glue_spec.rb +44 -0
- data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +45 -28
- data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
- data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +70 -46
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
- data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
- data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +26 -17
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
- data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +36 -40
- data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +31 -29
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
- data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
- data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
- data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +20 -17
- data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
- data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +53 -28
- 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/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +53 -48
- data/spec/paperclip/plural_cache_spec.rb +37 -0
- data/spec/paperclip/processor_helpers_spec.rb +57 -0
- data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
- data/spec/paperclip/rails_environment_spec.rb +33 -0
- data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
- data/spec/paperclip/schema_spec.rb +248 -0
- data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
- 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/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +123 -107
- 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/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +20 -20
- data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
- 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/empty.html +1 -0
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/spaced file.jpg +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/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 +334 -219
- data/RUNNING_TESTS.md +0 -4
- data/gemfiles/3.0.gemfile +0 -11
- data/gemfiles/3.1.gemfile +0 -11
- data/gemfiles/4.0.gemfile +0 -11
- data/test/attachment_definitions_test.rb +0 -12
- data/test/attachment_registry_test.rb +0 -88
- data/test/filename_cleaner_test.rb +0 -14
- data/test/generator_test.rb +0 -84
- data/test/geometry_detector_test.rb +0 -24
- data/test/helper.rb +0 -232
- data/test/io_adapters/abstract_adapter_test.rb +0 -58
- data/test/io_adapters/empty_string_adapter_test.rb +0 -18
- data/test/io_adapters/identity_adapter_test.rb +0 -8
- data/test/matchers/have_attached_file_matcher_test.rb +0 -24
- data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -110
- data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -69
- data/test/matchers/validate_attachment_size_matcher_test.rb +0 -86
- data/test/meta_class_test.rb +0 -32
- data/test/paperclip_missing_attachment_styles_test.rb +0 -90
- data/test/plural_cache_test.rb +0 -36
- data/test/schema_test.rb +0 -200
- data/test/storage/fog_test.rb +0 -473
- data/test/storage/s3_live_test.rb +0 -179
- data/test/storage/s3_test.rb +0 -1356
- data/test/style_test.rb +0 -213
- data/test/support/mock_model.rb +0 -2
- data/test/tempfile_factory_test.rb +0 -17
- data/test/url_generator_test.rb +0 -187
- data/test/validators/attachment_content_type_validator_test.rb +0 -324
- data/test/validators_test.rb +0 -61
- /data/{test → spec}/database.yml +0 -0
- /data/{test → spec/support}/fixtures/12k.png +0 -0
- /data/{test → spec/support}/fixtures/50x50.png +0 -0
- /data/{test → spec/support}/fixtures/5k.png +0 -0
- /data/{test → spec/support}/fixtures/animated +0 -0
- /data/{test → spec/support}/fixtures/animated.gif +0 -0
- /data/{test → spec/support}/fixtures/animated.unknown +0 -0
- /data/{test → spec/support}/fixtures/bad.png +0 -0
- /data/{test → spec/support}/fixtures/fog.yml +0 -0
- /data/{test → spec/support}/fixtures/rotated.jpg +0 -0
- /data/{test → spec/support}/fixtures/s3.yml +0 -0
- /data/{test → spec/support}/fixtures/spaced file.png +0 -0
- /data/{test → spec/support}/fixtures/text.txt +0 -0
- /data/{test → spec/support}/fixtures/twopage.pdf +0 -0
- /data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
- /data/{test → spec}/support/mock_attachment.rb +0 -0
- /data/{test → spec}/support/mock_interpolator.rb +0 -0
- /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
|
+
|