paperclip 4.1.1 → 4.2.0

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

Potentially problematic release.


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

Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -6
  3. data/.travis.yml +4 -13
  4. data/Appraisals +0 -10
  5. data/CONTRIBUTING.md +10 -5
  6. data/Gemfile +8 -4
  7. data/NEWS +1 -1
  8. data/README.md +51 -10
  9. data/Rakefile +6 -8
  10. data/features/basic_integration.feature +5 -5
  11. data/features/step_definitions/attachment_steps.rb +4 -4
  12. data/features/step_definitions/rails_steps.rb +4 -4
  13. data/features/step_definitions/web_steps.rb +2 -2
  14. data/features/support/env.rb +2 -2
  15. data/features/support/fixtures/gemfile.txt +1 -1
  16. data/features/support/rails.rb +2 -1
  17. data/gemfiles/3.2.gemfile +5 -3
  18. data/gemfiles/4.0.gemfile +5 -3
  19. data/gemfiles/4.1.gemfile +5 -3
  20. data/lib/generators/paperclip/paperclip_generator.rb +0 -2
  21. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
  22. data/lib/paperclip.rb +4 -1
  23. data/lib/paperclip/attachment.rb +90 -29
  24. data/lib/paperclip/content_type_detector.rb +1 -1
  25. data/lib/paperclip/geometry_detector_factory.rb +3 -1
  26. data/lib/paperclip/has_attached_file.rb +2 -1
  27. data/lib/paperclip/interpolations.rb +8 -0
  28. data/lib/paperclip/io_adapters/abstract_adapter.rb +1 -1
  29. data/lib/paperclip/io_adapters/data_uri_adapter.rb +1 -1
  30. data/lib/paperclip/io_adapters/stringio_adapter.rb +5 -11
  31. data/lib/paperclip/locales/de.yml +18 -0
  32. data/lib/paperclip/locales/es.yml +18 -0
  33. data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
  34. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
  35. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
  36. data/lib/paperclip/media_type_spoof_detector.rb +10 -2
  37. data/lib/paperclip/storage/filesystem.rb +1 -1
  38. data/lib/paperclip/storage/s3.rb +26 -4
  39. data/lib/paperclip/style.rb +1 -1
  40. data/lib/paperclip/thumbnail.rb +6 -6
  41. data/lib/paperclip/validators.rb +5 -3
  42. data/lib/paperclip/validators/attachment_size_validator.rb +7 -3
  43. data/lib/paperclip/version.rb +1 -1
  44. data/lib/tasks/paperclip.rake +1 -2
  45. data/paperclip.gemspec +5 -3
  46. data/shoulda_macros/paperclip.rb +0 -1
  47. data/{test → spec}/database.yml +0 -0
  48. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  49. data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
  50. data/{test/attachment_registry_test.rb → spec/paperclip/attachment_registry_spec.rb} +10 -11
  51. data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +367 -360
  52. data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +8 -8
  53. data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -5
  54. data/spec/paperclip/filename_cleaner_spec.rb +14 -0
  55. data/spec/paperclip/geometry_detector_spec.rb +39 -0
  56. data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
  57. data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +49 -51
  58. data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +18 -27
  59. data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
  60. data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +54 -40
  61. data/{test/io_adapters/abstract_adapter_test.rb → spec/paperclip/io_adapters/abstract_adapter_spec.rb} +21 -10
  62. data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
  63. data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +22 -18
  64. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  65. data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +32 -28
  66. data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +22 -22
  67. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  68. data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
  69. data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
  70. data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +16 -17
  71. data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
  72. data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +22 -22
  73. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  74. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
  75. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  76. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  77. data/{test/media_type_spoof_detector_test.rb → spec/paperclip/media_type_spoof_detector_spec.rb} +13 -8
  78. data/spec/paperclip/meta_class_spec.rb +30 -0
  79. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
  80. data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +47 -47
  81. data/{test/plural_cache_test.rb → spec/paperclip/plural_cache_spec.rb} +6 -6
  82. data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
  83. data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
  84. data/spec/paperclip/schema_spec.rb +206 -0
  85. data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
  86. data/{test/storage/fog_test.rb → spec/paperclip/storage/fog_spec.rb} +145 -140
  87. data/spec/paperclip/storage/s3_live_spec.rb +182 -0
  88. data/spec/paperclip/storage/s3_spec.rb +1475 -0
  89. data/spec/paperclip/style_spec.rb +255 -0
  90. data/spec/paperclip/tempfile_factory_spec.rb +29 -0
  91. data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +107 -107
  92. data/{test/url_generator_test.rb → spec/paperclip/url_generator_spec.rb} +55 -56
  93. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  94. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
  95. data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +19 -19
  96. data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
  97. data/{test/validators/media_type_spoof_detection_validator_test.rb → spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb} +8 -8
  98. data/spec/paperclip/validators_spec.rb +164 -0
  99. data/spec/spec_helper.rb +40 -0
  100. data/spec/support/assertions.rb +71 -0
  101. data/spec/support/fake_model.rb +21 -0
  102. data/spec/support/fake_rails.rb +12 -0
  103. data/{test → spec/support}/fixtures/12k.png +0 -0
  104. data/{test → spec/support}/fixtures/50x50.png +0 -0
  105. data/{test → spec/support}/fixtures/5k.png +0 -0
  106. data/{test → spec/support}/fixtures/animated +0 -0
  107. data/{test → spec/support}/fixtures/animated.gif +0 -0
  108. data/{test → spec/support}/fixtures/animated.unknown +0 -0
  109. data/{test → spec/support}/fixtures/bad.png +0 -0
  110. data/{test → spec/support}/fixtures/empty.html +0 -0
  111. data/{test → spec/support}/fixtures/fog.yml +0 -0
  112. data/{test → spec/support}/fixtures/rotated.jpg +0 -0
  113. data/{test → spec/support}/fixtures/s3.yml +0 -0
  114. data/spec/support/fixtures/spaced file.jpg +0 -0
  115. data/test/fixtures/spaced file.png b/data/spec/support/fixtures/spaced → file.png +0 -0
  116. data/{test → spec/support}/fixtures/text.txt +0 -0
  117. data/{test → spec/support}/fixtures/twopage.pdf +0 -0
  118. data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
  119. data/spec/support/matchers/accept.rb +5 -0
  120. data/spec/support/matchers/exist.rb +5 -0
  121. data/{test → spec}/support/mock_attachment.rb +0 -0
  122. data/{test → spec}/support/mock_interpolator.rb +0 -0
  123. data/{test → spec}/support/mock_model.rb +0 -0
  124. data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
  125. data/spec/support/model_reconstruction.rb +60 -0
  126. data/spec/support/rails_helpers.rb +7 -0
  127. data/spec/support/test_data.rb +13 -0
  128. data/spec/support/version_helper.rb +9 -0
  129. metadata +256 -210
  130. data/gemfiles/3.0.gemfile +0 -11
  131. data/gemfiles/3.1.gemfile +0 -11
  132. data/test/attachment_definitions_test.rb +0 -13
  133. data/test/filename_cleaner_test.rb +0 -14
  134. data/test/generator_test.rb +0 -84
  135. data/test/geometry_detector_test.rb +0 -24
  136. data/test/helper.rb +0 -239
  137. data/test/io_adapters/empty_string_adapter_test.rb +0 -18
  138. data/test/io_adapters/identity_adapter_test.rb +0 -8
  139. data/test/matchers/have_attached_file_matcher_test.rb +0 -25
  140. data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -111
  141. data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -70
  142. data/test/matchers/validate_attachment_size_matcher_test.rb +0 -87
  143. data/test/meta_class_test.rb +0 -32
  144. data/test/paperclip_missing_attachment_styles_test.rb +0 -90
  145. data/test/schema_test.rb +0 -206
  146. data/test/storage/s3_live_test.rb +0 -179
  147. data/test/storage/s3_test.rb +0 -1357
  148. data/test/style_test.rb +0 -251
  149. data/test/tempfile_factory_test.rb +0 -29
  150. data/test/validators/attachment_content_type_validator_test.rb +0 -324
  151. data/test/validators/attachment_file_name_validator_test.rb +0 -162
  152. data/test/validators_test.rb +0 -101
@@ -1,15 +1,14 @@
1
1
  # encoding: utf-8
2
- require './test/helper'
3
- require 'paperclip/url_generator'
2
+ require 'spec_helper'
4
3
 
5
- class UrlGeneratorTest < Test::Unit::TestCase
6
- should "use the given interpolator" do
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(:result => expected)
8
+ mock_interpolator = MockInterpolator.new(result: expected)
10
9
 
11
10
  url_generator = Paperclip::UrlGenerator.new(mock_attachment,
12
- { :interpolator => mock_interpolator })
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
- should "use the default URL when no file is assigned" do
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 = { :interpolator => mock_interpolator, :default_url => default_url}
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
- should "execute the default URL lambda when no file is assigned" do
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 = { :interpolator => mock_interpolator, :default_url => default_url}
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
- should "execute the method named by the symbol as the default URL when no file is assigned" do
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(:model => mock_model)
47
+ mock_attachment = MockAttachment.new(model: mock_model)
49
48
  mock_interpolator = MockInterpolator.new
50
49
  default_url = :to_s
51
- options = { :interpolator => mock_interpolator, :default_url => default_url}
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
- should "URL-escape spaces if asked to" do
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(:result => expected)
64
- options = { :interpolator => mock_interpolator }
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, {:escape => true})
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
- should "escape the result of the interpolator using a method on the object, if asked to escape" do
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(:result => expected)
80
- options = { :interpolator => mock_interpolator }
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, {:escape => true})
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
- should "leave spaces unescaped as asked to" do
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(:result => expected)
92
- options = { :interpolator => mock_interpolator }
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, {:escape => false})
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
- should "default to leaving spaces unescaped" do
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(:result => expected)
104
- options = { :interpolator => mock_interpolator }
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
- should "produce URLs without the updated_at value when the object does not respond to updated_at" do
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(:result => expected)
115
- mock_attachment = MockAttachment.new(:responds_to_updated_at => false)
116
- options = { :interpolator => mock_interpolator }
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, {:timestamp => true})
118
+ result = url_generator.for(:style_name, {timestamp: true})
120
119
 
121
120
  assert_equal expected, result
122
121
  end
123
122
 
124
- should "produce URLs without the updated_at value when the updated_at value is nil" do
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(:result => expected)
127
- mock_attachment = MockAttachment.new(:responds_to_updated_at => true, :updated_at => nil)
128
- options = { :interpolator => mock_interpolator }
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, {:timestamp => true})
130
+ result = url_generator.for(:style_name, {timestamp: true})
132
131
 
133
132
  assert_equal expected, result
134
133
  end
135
134
 
136
- should "produce URLs with the updated_at when it exists" do
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(:result => expected)
140
- mock_attachment = MockAttachment.new(:updated_at => updated_at)
141
- options = { :interpolator => mock_interpolator }
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, {:timestamp => true})
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
- should "produce URLs with the updated_at when it exists, separated with a & if a ? follow by = already exists" do
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(:result => expected)
153
- mock_attachment = MockAttachment.new(:updated_at => updated_at)
154
- options = { :interpolator => mock_interpolator }
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, {:timestamp => true})
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
- should "produce URLs without the updated_at when told to do as much" do
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(:result => expected)
166
- mock_attachment = MockAttachment.new(:updated_at => updated_at)
167
- options = { :interpolator => mock_interpolator }
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, {:timestamp => false})
169
+ result = url_generator.for(:style_name, {timestamp: false})
171
170
 
172
171
  assert_equal expected, result
173
172
  end
174
173
 
175
- should "produce the correct URL when the instance has a file name" do
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(:original_filename => 'exists')
176
+ mock_attachment = MockAttachment.new(original_filename: 'exists')
178
177
  mock_interpolator = MockInterpolator.new
179
- options = { :interpolator => mock_interpolator, :url => expected}
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