paperclip 4.1.1 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of paperclip might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +0 -6
- data/.travis.yml +4 -13
- data/Appraisals +0 -10
- data/CONTRIBUTING.md +10 -5
- data/Gemfile +8 -4
- data/NEWS +1 -1
- data/README.md +51 -10
- data/Rakefile +6 -8
- data/features/basic_integration.feature +5 -5
- data/features/step_definitions/attachment_steps.rb +4 -4
- data/features/step_definitions/rails_steps.rb +4 -4
- data/features/step_definitions/web_steps.rb +2 -2
- data/features/support/env.rb +2 -2
- data/features/support/fixtures/gemfile.txt +1 -1
- data/features/support/rails.rb +2 -1
- data/gemfiles/3.2.gemfile +5 -3
- data/gemfiles/4.0.gemfile +5 -3
- data/gemfiles/4.1.gemfile +5 -3
- data/lib/generators/paperclip/paperclip_generator.rb +0 -2
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
- data/lib/paperclip.rb +4 -1
- data/lib/paperclip/attachment.rb +90 -29
- data/lib/paperclip/content_type_detector.rb +1 -1
- data/lib/paperclip/geometry_detector_factory.rb +3 -1
- data/lib/paperclip/has_attached_file.rb +2 -1
- data/lib/paperclip/interpolations.rb +8 -0
- data/lib/paperclip/io_adapters/abstract_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +1 -1
- data/lib/paperclip/io_adapters/stringio_adapter.rb +5 -11
- data/lib/paperclip/locales/de.yml +18 -0
- data/lib/paperclip/locales/es.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 +10 -2
- data/lib/paperclip/storage/filesystem.rb +1 -1
- data/lib/paperclip/storage/s3.rb +26 -4
- data/lib/paperclip/style.rb +1 -1
- data/lib/paperclip/thumbnail.rb +6 -6
- data/lib/paperclip/validators.rb +5 -3
- data/lib/paperclip/validators/attachment_size_validator.rb +7 -3
- data/lib/paperclip/version.rb +1 -1
- data/lib/tasks/paperclip.rake +1 -2
- data/paperclip.gemspec +5 -3
- data/shoulda_macros/paperclip.rb +0 -1
- data/{test → spec}/database.yml +0 -0
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
- data/{test/attachment_registry_test.rb → spec/paperclip/attachment_registry_spec.rb} +10 -11
- data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +367 -360
- data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +8 -8
- data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -5
- 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} +49 -51
- data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +18 -27
- data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
- data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +54 -40
- data/{test/io_adapters/abstract_adapter_test.rb → spec/paperclip/io_adapters/abstract_adapter_spec.rb} +21 -10
- 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} +22 -18
- 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} +32 -28
- data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +22 -22
- 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} +16 -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} +22 -22
- 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/{test/media_type_spoof_detector_test.rb → spec/paperclip/media_type_spoof_detector_spec.rb} +13 -8
- 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} +47 -47
- data/{test/plural_cache_test.rb → spec/paperclip/plural_cache_spec.rb} +6 -6
- data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
- data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
- data/spec/paperclip/schema_spec.rb +206 -0
- data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
- data/{test/storage/fog_test.rb → spec/paperclip/storage/fog_spec.rb} +145 -140
- data/spec/paperclip/storage/s3_live_spec.rb +182 -0
- data/spec/paperclip/storage/s3_spec.rb +1475 -0
- data/spec/paperclip/style_spec.rb +255 -0
- data/spec/paperclip/tempfile_factory_spec.rb +29 -0
- data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +107 -107
- data/{test/url_generator_test.rb → spec/paperclip/url_generator_spec.rb} +55 -56
- 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} +19 -19
- data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
- data/{test/validators/media_type_spoof_detection_validator_test.rb → spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb} +8 -8
- data/spec/paperclip/validators_spec.rb +164 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/support/assertions.rb +71 -0
- data/spec/support/fake_model.rb +21 -0
- data/spec/support/fake_rails.rb +12 -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/empty.html +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/spec/support/fixtures/spaced file.jpg +0 -0
- data/test/fixtures/spaced file.png b/data/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/spec/support/matchers/accept.rb +5 -0
- data/spec/support/matchers/exist.rb +5 -0
- data/{test → spec}/support/mock_attachment.rb +0 -0
- data/{test → spec}/support/mock_interpolator.rb +0 -0
- data/{test → spec}/support/mock_model.rb +0 -0
- data/{test → spec}/support/mock_url_generator_builder.rb +0 -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 +256 -210
- data/gemfiles/3.0.gemfile +0 -11
- data/gemfiles/3.1.gemfile +0 -11
- data/test/attachment_definitions_test.rb +0 -13
- 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 -239
- 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 -25
- data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -111
- data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -70
- data/test/matchers/validate_attachment_size_matcher_test.rb +0 -87
- data/test/meta_class_test.rb +0 -32
- data/test/paperclip_missing_attachment_styles_test.rb +0 -90
- data/test/schema_test.rb +0 -206
- data/test/storage/s3_live_test.rb +0 -179
- data/test/storage/s3_test.rb +0 -1357
- data/test/style_test.rb +0 -251
- data/test/tempfile_factory_test.rb +0 -29
- data/test/validators/attachment_content_type_validator_test.rb +0 -324
- data/test/validators/attachment_file_name_validator_test.rb +0 -162
- data/test/validators_test.rb +0 -101
@@ -1,15 +1,14 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require '
|
3
|
-
require 'paperclip/url_generator'
|
2
|
+
require 'spec_helper'
|
4
3
|
|
5
|
-
|
6
|
-
|
4
|
+
describe Paperclip::UrlGenerator do
|
5
|
+
it "uses the given interpolator" do
|
7
6
|
expected = "the expected result"
|
8
7
|
mock_attachment = MockAttachment.new
|
9
|
-
mock_interpolator = MockInterpolator.new(:
|
8
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
10
9
|
|
11
10
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment,
|
12
|
-
{ :
|
11
|
+
{ interpolator: mock_interpolator })
|
13
12
|
result = url_generator.for(:style_name, {})
|
14
13
|
|
15
14
|
assert_equal expected, result
|
@@ -17,11 +16,11 @@ class UrlGeneratorTest < Test::Unit::TestCase
|
|
17
16
|
assert mock_interpolator.has_interpolated_style_name?(:style_name)
|
18
17
|
end
|
19
18
|
|
20
|
-
|
19
|
+
it "uses the default URL when no file is assigned" do
|
21
20
|
mock_attachment = MockAttachment.new
|
22
21
|
mock_interpolator = MockInterpolator.new
|
23
22
|
default_url = "the default url"
|
24
|
-
options = { :
|
23
|
+
options = { interpolator: mock_interpolator, default_url: default_url}
|
25
24
|
|
26
25
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
27
26
|
url_generator.for(:style_name, {})
|
@@ -30,11 +29,11 @@ class UrlGeneratorTest < Test::Unit::TestCase
|
|
30
29
|
"expected the interpolator to be passed #{default_url.inspect} but it wasn't"
|
31
30
|
end
|
32
31
|
|
33
|
-
|
32
|
+
it "executes the default URL lambda when no file is assigned" do
|
34
33
|
mock_attachment = MockAttachment.new
|
35
34
|
mock_interpolator = MockInterpolator.new
|
36
35
|
default_url = lambda {|attachment| "the #{attachment.class.name} default url" }
|
37
|
-
options = { :
|
36
|
+
options = { interpolator: mock_interpolator, default_url: default_url}
|
38
37
|
|
39
38
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
40
39
|
url_generator.for(:style_name, {})
|
@@ -43,12 +42,12 @@ class UrlGeneratorTest < Test::Unit::TestCase
|
|
43
42
|
%{expected the interpolator to be passed "the MockAttachment default url", but it wasn't}
|
44
43
|
end
|
45
44
|
|
46
|
-
|
45
|
+
it "executes the method named by the symbol as the default URL when no file is assigned" do
|
47
46
|
mock_model = MockModel.new
|
48
|
-
mock_attachment = MockAttachment.new(:
|
47
|
+
mock_attachment = MockAttachment.new(model: mock_model)
|
49
48
|
mock_interpolator = MockInterpolator.new
|
50
49
|
default_url = :to_s
|
51
|
-
options = { :
|
50
|
+
options = { interpolator: mock_interpolator, default_url: default_url}
|
52
51
|
|
53
52
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
54
53
|
url_generator.for(:style_name, {})
|
@@ -57,51 +56,51 @@ class UrlGeneratorTest < Test::Unit::TestCase
|
|
57
56
|
%{expected the interpolator to be passed #{mock_model.to_s}, but it wasn't}
|
58
57
|
end
|
59
58
|
|
60
|
-
|
59
|
+
it "URL-escapes spaces if asked to" do
|
61
60
|
expected = "the expected result"
|
62
61
|
mock_attachment = MockAttachment.new
|
63
|
-
mock_interpolator = MockInterpolator.new(:
|
64
|
-
options = { :
|
62
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
63
|
+
options = { interpolator: mock_interpolator }
|
65
64
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
66
65
|
|
67
|
-
result = url_generator.for(:style_name, {:
|
66
|
+
result = url_generator.for(:style_name, {escape: true})
|
68
67
|
|
69
68
|
assert_equal "the%20expected%20result", result
|
70
69
|
end
|
71
70
|
|
72
|
-
|
71
|
+
it "escapes the result of the interpolator using a method on the object, if asked to escape" do
|
73
72
|
expected = Class.new do
|
74
73
|
def escape
|
75
74
|
"the escaped result"
|
76
75
|
end
|
77
76
|
end.new
|
78
77
|
mock_attachment = MockAttachment.new
|
79
|
-
mock_interpolator = MockInterpolator.new(:
|
80
|
-
options = { :
|
78
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
79
|
+
options = { interpolator: mock_interpolator }
|
81
80
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
82
81
|
|
83
|
-
result = url_generator.for(:style_name, {:
|
82
|
+
result = url_generator.for(:style_name, {escape: true})
|
84
83
|
|
85
84
|
assert_equal "the escaped result", result
|
86
85
|
end
|
87
86
|
|
88
|
-
|
87
|
+
it "leaves spaces unescaped as asked to" do
|
89
88
|
expected = "the expected result"
|
90
89
|
mock_attachment = MockAttachment.new
|
91
|
-
mock_interpolator = MockInterpolator.new(:
|
92
|
-
options = { :
|
90
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
91
|
+
options = { interpolator: mock_interpolator }
|
93
92
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
94
93
|
|
95
|
-
result = url_generator.for(:style_name, {:
|
94
|
+
result = url_generator.for(:style_name, {escape: false})
|
96
95
|
|
97
96
|
assert_equal "the expected result", result
|
98
97
|
end
|
99
98
|
|
100
|
-
|
99
|
+
it "defaults to leaving spaces unescaped" do
|
101
100
|
expected = "the expected result"
|
102
101
|
mock_attachment = MockAttachment.new
|
103
|
-
mock_interpolator = MockInterpolator.new(:
|
104
|
-
options = { :
|
102
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
103
|
+
options = { interpolator: mock_interpolator }
|
105
104
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
106
105
|
|
107
106
|
result = url_generator.for(:style_name, {})
|
@@ -109,74 +108,74 @@ class UrlGeneratorTest < Test::Unit::TestCase
|
|
109
108
|
assert_equal "the expected result", result
|
110
109
|
end
|
111
110
|
|
112
|
-
|
111
|
+
it "produces URLs without the updated_at value when the object does not respond to updated_at" do
|
113
112
|
expected = "the expected result"
|
114
|
-
mock_interpolator = MockInterpolator.new(:
|
115
|
-
mock_attachment = MockAttachment.new(:
|
116
|
-
options = { :
|
113
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
114
|
+
mock_attachment = MockAttachment.new(responds_to_updated_at: false)
|
115
|
+
options = { interpolator: mock_interpolator }
|
117
116
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
118
117
|
|
119
|
-
result = url_generator.for(:style_name, {:
|
118
|
+
result = url_generator.for(:style_name, {timestamp: true})
|
120
119
|
|
121
120
|
assert_equal expected, result
|
122
121
|
end
|
123
122
|
|
124
|
-
|
123
|
+
it "produces URLs without the updated_at value when the updated_at value is nil" do
|
125
124
|
expected = "the expected result"
|
126
|
-
mock_interpolator = MockInterpolator.new(:
|
127
|
-
mock_attachment = MockAttachment.new(:
|
128
|
-
options = { :
|
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 }
|
129
128
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
130
129
|
|
131
|
-
result = url_generator.for(:style_name, {:
|
130
|
+
result = url_generator.for(:style_name, {timestamp: true})
|
132
131
|
|
133
132
|
assert_equal expected, result
|
134
133
|
end
|
135
134
|
|
136
|
-
|
135
|
+
it "produces URLs with the updated_at when it exists" do
|
137
136
|
expected = "the expected result"
|
138
137
|
updated_at = 1231231234
|
139
|
-
mock_interpolator = MockInterpolator.new(:
|
140
|
-
mock_attachment = MockAttachment.new(:
|
141
|
-
options = { :
|
138
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
139
|
+
mock_attachment = MockAttachment.new(updated_at: updated_at)
|
140
|
+
options = { interpolator: mock_interpolator }
|
142
141
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
143
142
|
|
144
|
-
result = url_generator.for(:style_name, {:
|
143
|
+
result = url_generator.for(:style_name, {timestamp: true})
|
145
144
|
|
146
145
|
assert_equal "#{expected}?#{updated_at}", result
|
147
146
|
end
|
148
147
|
|
149
|
-
|
148
|
+
it "produces URLs with the updated_at when it exists, separated with a & if a ? follow by = already exists" do
|
150
149
|
expected = "the?expected=result"
|
151
150
|
updated_at = 1231231234
|
152
|
-
mock_interpolator = MockInterpolator.new(:
|
153
|
-
mock_attachment = MockAttachment.new(:
|
154
|
-
options = { :
|
151
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
152
|
+
mock_attachment = MockAttachment.new(updated_at: updated_at)
|
153
|
+
options = { interpolator: mock_interpolator }
|
155
154
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
156
155
|
|
157
|
-
result = url_generator.for(:style_name, {:
|
156
|
+
result = url_generator.for(:style_name, {timestamp: true})
|
158
157
|
|
159
158
|
assert_equal "#{expected}&#{updated_at}", result
|
160
159
|
end
|
161
160
|
|
162
|
-
|
161
|
+
it "produces URLs without the updated_at when told to do as much" do
|
163
162
|
expected = "the expected result"
|
164
163
|
updated_at = 1231231234
|
165
|
-
mock_interpolator = MockInterpolator.new(:
|
166
|
-
mock_attachment = MockAttachment.new(:
|
167
|
-
options = { :
|
164
|
+
mock_interpolator = MockInterpolator.new(result: expected)
|
165
|
+
mock_attachment = MockAttachment.new(updated_at: updated_at)
|
166
|
+
options = { interpolator: mock_interpolator }
|
168
167
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
169
168
|
|
170
|
-
result = url_generator.for(:style_name, {:
|
169
|
+
result = url_generator.for(:style_name, {timestamp: false})
|
171
170
|
|
172
171
|
assert_equal expected, result
|
173
172
|
end
|
174
173
|
|
175
|
-
|
174
|
+
it "produces the correct URL when the instance has a file name" do
|
176
175
|
expected = "the expected result"
|
177
|
-
mock_attachment = MockAttachment.new(:
|
176
|
+
mock_attachment = MockAttachment.new(original_filename: 'exists')
|
178
177
|
mock_interpolator = MockInterpolator.new
|
179
|
-
options = { :
|
178
|
+
options = { interpolator: mock_interpolator, url: expected}
|
180
179
|
|
181
180
|
url_generator = Paperclip::UrlGenerator.new(mock_attachment, options)
|
182
181
|
url_generator.for(:style_name, {})
|
@@ -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
|