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
@@ -1,21 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
require './test/helper'
|
2
|
+
require 'spec_helper'
|
4
3
|
require 'open-uri'
|
5
4
|
|
6
|
-
|
5
|
+
describe 'Paperclip' do
|
7
6
|
context "Many models at once" do
|
8
|
-
|
7
|
+
before do
|
9
8
|
rebuild_model
|
10
|
-
@file
|
9
|
+
@file = File.new(fixture_file("5k.png"), 'rb')
|
11
10
|
300.times do |i|
|
12
|
-
Dummy.create! :
|
11
|
+
Dummy.create! avatar: @file
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
16
|
-
|
15
|
+
after { @file.close }
|
17
16
|
|
18
|
-
|
17
|
+
it "does not exceed the open file limit" do
|
19
18
|
assert_nothing_raised do
|
20
19
|
Dummy.all.each { |dummy| dummy.avatar }
|
21
20
|
end
|
@@ -23,24 +22,24 @@ class IntegrationTest < Test::Unit::TestCase
|
|
23
22
|
end
|
24
23
|
|
25
24
|
context "An attachment" do
|
26
|
-
|
27
|
-
rebuild_model :
|
25
|
+
before do
|
26
|
+
rebuild_model styles: { thumb: "50x50#" }
|
28
27
|
@dummy = Dummy.new
|
29
28
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
30
29
|
@dummy.avatar = @file
|
31
30
|
assert @dummy.save
|
32
31
|
end
|
33
32
|
|
34
|
-
|
33
|
+
after { @file.close }
|
35
34
|
|
36
|
-
|
35
|
+
it "creates its thumbnails properly" do
|
37
36
|
assert_match(/\b50x50\b/, `identify "#{@dummy.avatar.path(:thumb)}"`)
|
38
37
|
end
|
39
38
|
|
40
39
|
context 'reprocessing with unreadable original' do
|
41
|
-
|
40
|
+
before { File.chmod(0000, @dummy.avatar.path) }
|
42
41
|
|
43
|
-
|
42
|
+
it "does not raise an error" do
|
44
43
|
assert_nothing_raised do
|
45
44
|
silence_stream(STDERR) do
|
46
45
|
@dummy.avatar.reprocess!
|
@@ -48,19 +47,19 @@ class IntegrationTest < Test::Unit::TestCase
|
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
51
|
-
|
50
|
+
it "returns false" do
|
52
51
|
silence_stream(STDERR) do
|
53
52
|
assert !@dummy.avatar.reprocess!
|
54
53
|
end
|
55
54
|
end
|
56
55
|
|
57
|
-
|
56
|
+
after { File.chmod(0644, @dummy.avatar.path) }
|
58
57
|
end
|
59
58
|
|
60
59
|
context "redefining its attachment styles" do
|
61
|
-
|
60
|
+
before do
|
62
61
|
Dummy.class_eval do
|
63
|
-
has_attached_file :avatar, :
|
62
|
+
has_attached_file :avatar, styles: { thumb: "150x25#", dynamic: lambda { |a| '50x50#' } }
|
64
63
|
end
|
65
64
|
@d2 = Dummy.find(@dummy.id)
|
66
65
|
@original_timestamp = @d2.avatar_updated_at
|
@@ -68,37 +67,37 @@ class IntegrationTest < Test::Unit::TestCase
|
|
68
67
|
@d2.save
|
69
68
|
end
|
70
69
|
|
71
|
-
|
70
|
+
it "creates its thumbnails properly" do
|
72
71
|
assert_match(/\b150x25\b/, `identify "#{@dummy.avatar.path(:thumb)}"`)
|
73
72
|
assert_match(/\b50x50\b/, `identify "#{@dummy.avatar.path(:dynamic)}"`)
|
74
73
|
end
|
75
74
|
|
76
|
-
|
75
|
+
it "changes the timestamp" do
|
77
76
|
assert_not_equal @original_timestamp, @d2.avatar_updated_at
|
78
77
|
end
|
79
78
|
end
|
80
79
|
end
|
81
80
|
|
82
81
|
context "Attachment" do
|
83
|
-
|
82
|
+
before do
|
84
83
|
@thumb_path = "tmp/public/system/dummies/avatars/000/000/001/thumb/5k.png"
|
85
|
-
File.delete(@thumb_path) if File.
|
86
|
-
rebuild_model :
|
84
|
+
File.delete(@thumb_path) if File.exist?(@thumb_path)
|
85
|
+
rebuild_model styles: { thumb: "50x50#" }
|
87
86
|
@dummy = Dummy.new
|
88
87
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
89
88
|
|
90
89
|
end
|
91
90
|
|
92
|
-
|
91
|
+
after { @file.close }
|
93
92
|
|
94
|
-
|
93
|
+
it "does not create the thumbnails upon saving when post-processing is disabled" do
|
95
94
|
@dummy.avatar.post_processing = false
|
96
95
|
@dummy.avatar = @file
|
97
96
|
assert @dummy.save
|
98
97
|
assert_file_not_exists @thumb_path
|
99
98
|
end
|
100
99
|
|
101
|
-
|
100
|
+
it "creates the thumbnails upon saving when post_processing is enabled" do
|
102
101
|
@dummy.avatar.post_processing = true
|
103
102
|
@dummy.avatar = @file
|
104
103
|
assert @dummy.save
|
@@ -107,12 +106,12 @@ class IntegrationTest < Test::Unit::TestCase
|
|
107
106
|
end
|
108
107
|
|
109
108
|
context "Attachment with no generated thumbnails" do
|
110
|
-
|
109
|
+
before do
|
111
110
|
@thumb_small_path = "tmp/public/system/dummies/avatars/000/000/001/thumb_small/5k.png"
|
112
111
|
@thumb_large_path = "tmp/public/system/dummies/avatars/000/000/001/thumb_large/5k.png"
|
113
|
-
File.delete(@thumb_small_path) if File.
|
114
|
-
File.delete(@thumb_large_path) if File.
|
115
|
-
rebuild_model :
|
112
|
+
File.delete(@thumb_small_path) if File.exist?(@thumb_small_path)
|
113
|
+
File.delete(@thumb_large_path) if File.exist?(@thumb_large_path)
|
114
|
+
rebuild_model styles: { thumb_small: "50x50#", thumb_large: "60x60#" }
|
116
115
|
@dummy = Dummy.new
|
117
116
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
118
117
|
|
@@ -122,9 +121,9 @@ class IntegrationTest < Test::Unit::TestCase
|
|
122
121
|
@dummy.avatar.post_processing = true
|
123
122
|
end
|
124
123
|
|
125
|
-
|
124
|
+
after { @file.close }
|
126
125
|
|
127
|
-
|
126
|
+
it "allows us to create all thumbnails in one go" do
|
128
127
|
assert_file_not_exists(@thumb_small_path)
|
129
128
|
assert_file_not_exists(@thumb_large_path)
|
130
129
|
|
@@ -134,7 +133,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
134
133
|
assert_file_exists(@thumb_large_path)
|
135
134
|
end
|
136
135
|
|
137
|
-
|
136
|
+
it "allows us to selectively create each thumbnail" do
|
138
137
|
assert_file_not_exists(@thumb_small_path)
|
139
138
|
assert_file_not_exists(@thumb_large_path)
|
140
139
|
|
@@ -148,59 +147,65 @@ class IntegrationTest < Test::Unit::TestCase
|
|
148
147
|
end
|
149
148
|
|
150
149
|
context "A model that modifies its original" do
|
151
|
-
|
152
|
-
rebuild_model :
|
150
|
+
before do
|
151
|
+
rebuild_model styles: { original: "2x2#" }
|
153
152
|
@dummy = Dummy.new
|
154
153
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
155
154
|
@dummy.avatar = @file
|
156
155
|
end
|
157
156
|
|
158
|
-
|
157
|
+
it "reports the file size of the processed file and not the original" do
|
159
158
|
assert_not_equal File.size(@file.path), @dummy.avatar.size
|
160
159
|
end
|
161
160
|
|
162
|
-
|
161
|
+
after { @file.close }
|
163
162
|
end
|
164
163
|
|
165
164
|
context "A model with attachments scoped under an id" do
|
166
|
-
|
167
|
-
rebuild_model :
|
168
|
-
:
|
169
|
-
:
|
165
|
+
before do
|
166
|
+
rebuild_model styles: { large: "100x100",
|
167
|
+
medium: "50x50" },
|
168
|
+
path: ":rails_root/tmp/:id/:attachments/:style.:extension"
|
170
169
|
@dummy = Dummy.new
|
171
170
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
172
171
|
@dummy.avatar = @file
|
173
172
|
end
|
174
173
|
|
175
|
-
|
174
|
+
after { @file.close }
|
176
175
|
|
177
176
|
context "when saved" do
|
178
|
-
|
177
|
+
before do
|
179
178
|
@dummy.save
|
180
179
|
@saved_path = @dummy.avatar.path(:large)
|
181
180
|
end
|
182
181
|
|
183
|
-
|
182
|
+
it "has a large file in the right place" do
|
184
183
|
assert_file_exists(@dummy.avatar.path(:large))
|
185
184
|
end
|
186
185
|
|
187
186
|
context "and deleted" do
|
188
|
-
|
187
|
+
before do
|
189
188
|
@dummy.avatar.clear
|
190
189
|
@dummy.save
|
191
190
|
end
|
192
191
|
|
193
|
-
|
192
|
+
it "does not have a large file in the right place anymore" do
|
194
193
|
assert_file_not_exists(@saved_path)
|
195
194
|
end
|
196
195
|
|
197
|
-
|
196
|
+
it "does not have its next two parent directories" do
|
198
197
|
assert_file_not_exists(File.dirname(@saved_path))
|
199
198
|
assert_file_not_exists(File.dirname(File.dirname(@saved_path)))
|
200
199
|
end
|
200
|
+
end
|
201
201
|
|
202
|
-
|
202
|
+
context 'and deleted where the delete fails' do
|
203
|
+
it "does not die if an unexpected SystemCallError happens" do
|
203
204
|
FileUtils.stubs(:rmdir).raises(Errno::EPIPE)
|
205
|
+
assert_nothing_raised do
|
206
|
+
@dummy.avatar.clear
|
207
|
+
@dummy.save
|
208
|
+
end
|
204
209
|
end
|
205
210
|
end
|
206
211
|
end
|
@@ -208,19 +213,19 @@ class IntegrationTest < Test::Unit::TestCase
|
|
208
213
|
|
209
214
|
[000,002,022].each do |umask|
|
210
215
|
context "when the umask is #{umask}" do
|
211
|
-
|
216
|
+
before do
|
212
217
|
rebuild_model
|
213
218
|
@dummy = Dummy.new
|
214
219
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
215
220
|
@umask = File.umask(umask)
|
216
221
|
end
|
217
222
|
|
218
|
-
|
223
|
+
after do
|
219
224
|
File.umask @umask
|
220
225
|
@file.close
|
221
226
|
end
|
222
227
|
|
223
|
-
|
228
|
+
it "respects the current umask" do
|
224
229
|
@dummy.avatar = @file
|
225
230
|
@dummy.save
|
226
231
|
assert_equal 0666&~umask, 0666&File.stat(@dummy.avatar.path).mode
|
@@ -230,17 +235,17 @@ class IntegrationTest < Test::Unit::TestCase
|
|
230
235
|
|
231
236
|
[0666,0664,0640].each do |perms|
|
232
237
|
context "when the perms are #{perms}" do
|
233
|
-
|
234
|
-
rebuild_model :
|
238
|
+
before do
|
239
|
+
rebuild_model override_file_permissions: perms
|
235
240
|
@dummy = Dummy.new
|
236
241
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
237
242
|
end
|
238
243
|
|
239
|
-
|
244
|
+
after do
|
240
245
|
@file.close
|
241
246
|
end
|
242
247
|
|
243
|
-
|
248
|
+
it "respects the current perms" do
|
244
249
|
@dummy.avatar = @file
|
245
250
|
@dummy.save
|
246
251
|
assert_equal perms, File.stat(@dummy.avatar.path).mode & 0777
|
@@ -248,23 +253,23 @@ class IntegrationTest < Test::Unit::TestCase
|
|
248
253
|
end
|
249
254
|
end
|
250
255
|
|
251
|
-
|
256
|
+
it "skips chmod operation, when override_file_permissions is set to false (e.g. useful when using CIFS mounts)" do
|
252
257
|
FileUtils.expects(:chmod).never
|
253
258
|
|
254
|
-
rebuild_model :
|
259
|
+
rebuild_model override_file_permissions: false
|
255
260
|
dummy = Dummy.create!
|
256
261
|
dummy.avatar = @file
|
257
262
|
dummy.save
|
258
263
|
end
|
259
264
|
|
260
265
|
context "A model with a filesystem attachment" do
|
261
|
-
|
262
|
-
rebuild_model :
|
263
|
-
:
|
264
|
-
:
|
265
|
-
:
|
266
|
-
:
|
267
|
-
:
|
266
|
+
before do
|
267
|
+
rebuild_model styles: { large: "300x300>",
|
268
|
+
medium: "100x100",
|
269
|
+
thumb: ["32x32#", :gif] },
|
270
|
+
default_style: :medium,
|
271
|
+
url: "/:attachment/:class/:style/:id/:basename.:extension",
|
272
|
+
path: ":rails_root/tmp/:attachment/:class/:style/:id/:basename.:extension"
|
268
273
|
@dummy = Dummy.new
|
269
274
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
270
275
|
@bad_file = File.new(fixture_file("bad.png"), 'rb')
|
@@ -274,9 +279,9 @@ class IntegrationTest < Test::Unit::TestCase
|
|
274
279
|
assert @dummy.save
|
275
280
|
end
|
276
281
|
|
277
|
-
|
282
|
+
after { [@file, @bad_file].each(&:close) }
|
278
283
|
|
279
|
-
|
284
|
+
it "writes and delete its files" do
|
280
285
|
[["434x66", :original],
|
281
286
|
["300x46", :large],
|
282
287
|
["100x15", :medium],
|
@@ -314,7 +319,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
314
319
|
assert_nil @d2.avatar_file_name
|
315
320
|
end
|
316
321
|
|
317
|
-
|
322
|
+
it "works exactly the same when new as when reloaded" do
|
318
323
|
@d2 = Dummy.find(@dummy.id)
|
319
324
|
|
320
325
|
assert_equal @dummy.avatar_file_name, @d2.avatar_file_name
|
@@ -332,18 +337,18 @@ class IntegrationTest < Test::Unit::TestCase
|
|
332
337
|
end
|
333
338
|
end
|
334
339
|
|
335
|
-
|
340
|
+
it "does not abide things that don't have adapters" do
|
336
341
|
assert_raises(Paperclip::AdapterRegistry::NoHandlerError) do
|
337
342
|
@dummy.avatar = "not a file"
|
338
343
|
end
|
339
344
|
end
|
340
345
|
|
341
|
-
|
346
|
+
it "is not ok with bad files" do
|
342
347
|
@dummy.avatar = @bad_file
|
343
348
|
assert ! @dummy.valid?
|
344
349
|
end
|
345
350
|
|
346
|
-
|
351
|
+
it "knows the difference between good files, bad files, and not files when validating" do
|
347
352
|
Dummy.validates_attachment_presence :avatar
|
348
353
|
@d2 = Dummy.find(@dummy.id)
|
349
354
|
@d2.avatar = @file
|
@@ -352,7 +357,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
352
357
|
assert ! @d2.valid?
|
353
358
|
end
|
354
359
|
|
355
|
-
|
360
|
+
it "is able to reload without saving and not have the file disappear" do
|
356
361
|
@dummy.avatar = @file
|
357
362
|
assert @dummy.save, @dummy.errors.full_messages.inspect
|
358
363
|
@dummy.avatar.clear
|
@@ -362,33 +367,33 @@ class IntegrationTest < Test::Unit::TestCase
|
|
362
367
|
end
|
363
368
|
|
364
369
|
context "that is assigned its file from another Paperclip attachment" do
|
365
|
-
|
370
|
+
before do
|
366
371
|
@dummy2 = Dummy.new
|
367
|
-
@file2
|
368
|
-
assert
|
372
|
+
@file2 = File.new(fixture_file("12k.png"), 'rb')
|
373
|
+
assert @dummy2.avatar = @file2
|
369
374
|
@dummy2.save
|
370
375
|
end
|
371
376
|
|
372
|
-
|
377
|
+
after { @file2.close }
|
373
378
|
|
374
|
-
|
379
|
+
it "works when assigned a file" do
|
375
380
|
assert_not_equal `identify -format "%wx%h" "#{@dummy.avatar.path(:original)}"`,
|
376
|
-
|
381
|
+
`identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
|
377
382
|
|
378
383
|
assert @dummy.avatar = @dummy2.avatar
|
379
384
|
@dummy.save
|
380
385
|
assert_equal @dummy.avatar_file_name, @dummy2.avatar_file_name
|
381
386
|
assert_equal `identify -format "%wx%h" "#{@dummy.avatar.path(:original)}"`,
|
382
|
-
|
387
|
+
`identify -format "%wx%h" "#{@dummy2.avatar.path(:original)}"`
|
383
388
|
end
|
384
389
|
end
|
385
390
|
|
386
391
|
end
|
387
392
|
|
388
393
|
context "A model with an attachments association and a Paperclip attachment" do
|
389
|
-
|
394
|
+
before do
|
390
395
|
Dummy.class_eval do
|
391
|
-
has_many :attachments, :
|
396
|
+
has_many :attachments, class_name: 'Dummy'
|
392
397
|
end
|
393
398
|
|
394
399
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
@@ -396,45 +401,45 @@ class IntegrationTest < Test::Unit::TestCase
|
|
396
401
|
@dummy.avatar = @file
|
397
402
|
end
|
398
403
|
|
399
|
-
|
404
|
+
after { @file.close }
|
400
405
|
|
401
|
-
|
406
|
+
it "does not error when saving" do
|
402
407
|
@dummy.save!
|
403
408
|
end
|
404
409
|
end
|
405
410
|
|
406
411
|
context "A model with an attachment with hash in file name" do
|
407
|
-
|
408
|
-
@settings = { :
|
409
|
-
:
|
410
|
-
:
|
411
|
-
:
|
412
|
+
before do
|
413
|
+
@settings = { styles: { thumb: "50x50#" },
|
414
|
+
path: ":rails_root/public/system/:attachment/:id_partition/:style/:hash.:extension",
|
415
|
+
url: "/system/:attachment/:id_partition/:style/:hash.:extension",
|
416
|
+
hash_secret: "somesecret" }
|
412
417
|
|
413
418
|
rebuild_model @settings
|
414
419
|
|
415
420
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
416
|
-
@dummy = Dummy.create! :
|
421
|
+
@dummy = Dummy.create! avatar: @file
|
417
422
|
end
|
418
423
|
|
419
|
-
|
424
|
+
after do
|
420
425
|
@file.close
|
421
426
|
end
|
422
427
|
|
423
|
-
|
428
|
+
it "is accessible" do
|
424
429
|
assert_file_exists(@dummy.avatar.path(:original))
|
425
430
|
assert_file_exists(@dummy.avatar.path(:thumb))
|
426
431
|
end
|
427
432
|
|
428
433
|
context "when new style is added" do
|
429
|
-
|
434
|
+
before do
|
430
435
|
@dummy.avatar.options[:styles][:mini] = "25x25#"
|
431
436
|
@dummy.avatar.instance_variable_set :@normalized_styles, nil
|
432
|
-
Time.stubs(:
|
437
|
+
Time.stubs(now: Time.now + 10)
|
433
438
|
@dummy.avatar.reprocess!
|
434
439
|
@dummy.reload
|
435
440
|
end
|
436
441
|
|
437
|
-
|
442
|
+
it "makes all the styles accessible" do
|
438
443
|
assert_file_exists(@dummy.avatar.path(:original))
|
439
444
|
assert_file_exists(@dummy.avatar.path(:thumb))
|
440
445
|
assert_file_exists(@dummy.avatar.path(:mini))
|
@@ -464,22 +469,25 @@ class IntegrationTest < Test::Unit::TestCase
|
|
464
469
|
end
|
465
470
|
|
466
471
|
context "A model with an S3 attachment" do
|
467
|
-
|
468
|
-
rebuild_model
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
472
|
+
before do
|
473
|
+
rebuild_model(
|
474
|
+
styles: {
|
475
|
+
large: "300x300>",
|
476
|
+
medium: "100x100",
|
477
|
+
thumb: ["32x32#", :gif],
|
478
|
+
custom: {
|
479
|
+
geometry: "32x32#",
|
480
|
+
s3_headers: { 'Cache-Control' => 'max-age=31557600' },
|
481
|
+
s3_metadata: { 'foo' => 'bar'}
|
482
|
+
}
|
483
|
+
},
|
484
|
+
storage: :s3,
|
485
|
+
s3_credentials: File.new(fixture_file('s3.yml')),
|
486
|
+
s3_options: { logger: Paperclip.logger },
|
487
|
+
default_style: :medium,
|
488
|
+
bucket: ENV['S3_BUCKET'],
|
489
|
+
path: ":class/:attachment/:id/:style/:basename.:extension"
|
490
|
+
)
|
483
491
|
|
484
492
|
@dummy = Dummy.new
|
485
493
|
@file = File.new(fixture_file('5k.png'), 'rb')
|
@@ -492,29 +500,29 @@ class IntegrationTest < Test::Unit::TestCase
|
|
492
500
|
@files_on_s3 = s3_files_for(@dummy.avatar)
|
493
501
|
end
|
494
502
|
|
495
|
-
|
503
|
+
after do
|
496
504
|
@file.close
|
497
505
|
@bad_file.close
|
498
506
|
@files_on_s3.values.each(&:close) if @files_on_s3
|
499
507
|
end
|
500
508
|
|
501
509
|
context 'assigning itself to a new model' do
|
502
|
-
|
510
|
+
before do
|
503
511
|
@d2 = Dummy.new
|
504
512
|
@d2.avatar = @dummy.avatar
|
505
513
|
@d2.save
|
506
514
|
end
|
507
515
|
|
508
|
-
|
516
|
+
it "has the same name as the old file" do
|
509
517
|
assert_equal @d2.avatar.original_filename, @dummy.avatar.original_filename
|
510
518
|
end
|
511
519
|
end
|
512
520
|
|
513
|
-
|
521
|
+
it "has the same contents as the original" do
|
514
522
|
assert_equal @file.read, @files_on_s3[:original].read
|
515
523
|
end
|
516
524
|
|
517
|
-
|
525
|
+
it "writes and delete its files" do
|
518
526
|
[["434x66", :original],
|
519
527
|
["300x46", :large],
|
520
528
|
["100x15", :medium],
|
@@ -546,7 +554,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
546
554
|
assert_nil @d2.avatar_file_name
|
547
555
|
end
|
548
556
|
|
549
|
-
|
557
|
+
it "works exactly the same when new as when reloaded" do
|
550
558
|
@d2 = Dummy.find(@dummy.id)
|
551
559
|
|
552
560
|
assert_equal @dummy.avatar_file_name, @d2.avatar_file_name
|
@@ -570,7 +578,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
570
578
|
end
|
571
579
|
end
|
572
580
|
|
573
|
-
|
581
|
+
it "knows the difference between good files, bad files, and nil" do
|
574
582
|
@dummy.avatar = @bad_file
|
575
583
|
assert ! @dummy.valid?
|
576
584
|
@dummy.avatar = nil
|
@@ -586,7 +594,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
586
594
|
assert ! @d2.valid?
|
587
595
|
end
|
588
596
|
|
589
|
-
|
597
|
+
it "is able to reload without saving and not have the file disappear" do
|
590
598
|
@dummy.avatar = @file
|
591
599
|
assert @dummy.save
|
592
600
|
@dummy.avatar = nil
|
@@ -595,28 +603,28 @@ class IntegrationTest < Test::Unit::TestCase
|
|
595
603
|
assert_equal "5k.png", @dummy.avatar_file_name
|
596
604
|
end
|
597
605
|
|
598
|
-
|
606
|
+
it "has the right content type" do
|
599
607
|
headers = s3_headers_for(@dummy.avatar, :original)
|
600
608
|
assert_equal 'image/png', headers['content-type']
|
601
609
|
end
|
602
610
|
|
603
|
-
|
611
|
+
it "has the right style-specific headers" do
|
604
612
|
headers = s3_headers_for(@dummy.avatar, :custom)
|
605
613
|
assert_equal 'max-age=31557600', headers['cache-control']
|
606
614
|
end
|
607
615
|
|
608
|
-
|
616
|
+
it "has the right style-specific metadata" do
|
609
617
|
headers = s3_headers_for(@dummy.avatar, :custom)
|
610
618
|
assert_equal 'bar', headers['x-amz-meta-foo']
|
611
619
|
end
|
612
620
|
|
613
621
|
context "with non-english character in the file name" do
|
614
|
-
|
622
|
+
before do
|
615
623
|
@file.stubs(:original_filename).returns("クリップ.png")
|
616
624
|
@dummy.avatar = @file
|
617
625
|
end
|
618
626
|
|
619
|
-
|
627
|
+
it "does not raise any error" do
|
620
628
|
@dummy.save!
|
621
629
|
end
|
622
630
|
end
|
@@ -624,14 +632,14 @@ class IntegrationTest < Test::Unit::TestCase
|
|
624
632
|
end
|
625
633
|
|
626
634
|
context "Copying attachments between models" do
|
627
|
-
|
635
|
+
before do
|
628
636
|
rebuild_model
|
629
637
|
@file = File.new(fixture_file("5k.png"), 'rb')
|
630
638
|
end
|
631
639
|
|
632
|
-
|
640
|
+
after { @file.close }
|
633
641
|
|
634
|
-
|
642
|
+
it "succeeds when original attachment is a file" do
|
635
643
|
original = Dummy.new
|
636
644
|
original.avatar = @file
|
637
645
|
assert original.save
|
@@ -643,7 +651,7 @@ class IntegrationTest < Test::Unit::TestCase
|
|
643
651
|
assert copy.avatar.present?
|
644
652
|
end
|
645
653
|
|
646
|
-
|
654
|
+
it "succeeds when original attachment is empty" do
|
647
655
|
original = Dummy.create!
|
648
656
|
|
649
657
|
copy = Dummy.new
|