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,61 +1,60 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::StringioAdapter do
|
4
4
|
context "a new instance" do
|
5
|
-
|
5
|
+
before do
|
6
6
|
@contents = "abc123"
|
7
7
|
@stringio = StringIO.new(@contents)
|
8
8
|
@subject = Paperclip.io_adapters.for(@stringio)
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
assert_equal "data
|
11
|
+
it "returns a file name" do
|
12
|
+
assert_equal "data", @subject.original_filename
|
13
13
|
end
|
14
14
|
|
15
|
-
|
15
|
+
it "returns a content type" do
|
16
16
|
assert_equal "text/plain", @subject.content_type
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it "returns the size of the data" do
|
20
20
|
assert_equal 6, @subject.size
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "generates an MD5 hash of the contents" do
|
24
24
|
assert_equal Digest::MD5.hexdigest(@contents), @subject.fingerprint
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
it "generates correct fingerprint after read" do
|
28
28
|
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
29
29
|
assert_equal fingerprint, @subject.fingerprint
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
it "generates same fingerprint" do
|
33
33
|
assert_equal @subject.fingerprint, @subject.fingerprint
|
34
34
|
end
|
35
35
|
|
36
|
-
|
36
|
+
it "returns the data contained in the StringIO" do
|
37
37
|
assert_equal "abc123", @subject.read
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
it 'accepts a content_type' do
|
41
41
|
@subject.content_type = 'image/png'
|
42
42
|
assert_equal 'image/png', @subject.content_type
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
it 'accepts an original_filename' do
|
46
46
|
@subject.original_filename = 'image.png'
|
47
47
|
assert_equal 'image.png', @subject.original_filename
|
48
48
|
end
|
49
49
|
|
50
|
-
|
50
|
+
it "does not generate filenames that include restricted characters" do
|
51
51
|
@subject.original_filename = 'image:restricted.png'
|
52
52
|
assert_equal 'image_restricted.png', @subject.original_filename
|
53
53
|
end
|
54
54
|
|
55
|
-
|
55
|
+
it "does not generate paths that include restricted characters" do
|
56
56
|
@subject.original_filename = 'image:restricted.png'
|
57
|
-
|
57
|
+
expect(@subject.path).to_not match(/:/)
|
58
58
|
end
|
59
|
-
|
60
59
|
end
|
61
60
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::UploadedFileAdapter do
|
4
4
|
context "a new instance" do
|
5
5
|
context "with UploadedFile responding to #tempfile" do
|
6
|
-
|
6
|
+
before do
|
7
7
|
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
8
8
|
|
9
9
|
class UploadedFile < OpenStruct; end
|
@@ -11,41 +11,41 @@ class UploadedFileAdapterTest < Test::Unit::TestCase
|
|
11
11
|
tempfile.binmode
|
12
12
|
|
13
13
|
@file = UploadedFile.new(
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
14
|
+
original_filename: "5k.png",
|
15
|
+
content_type: "image/x-png-by-browser\r",
|
16
|
+
head: "",
|
17
|
+
tempfile: tempfile,
|
18
|
+
path: tempfile.path
|
19
19
|
)
|
20
20
|
@subject = Paperclip.io_adapters.for(@file)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
it "gets the right filename" do
|
24
24
|
assert_equal "5k.png", @subject.original_filename
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
it "forces binmode on tempfile" do
|
28
28
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
it "gets the content type" do
|
32
32
|
assert_equal "image/x-png-by-browser", @subject.content_type
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
it "gets the file's size" do
|
36
36
|
assert_equal 4456, @subject.size
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
it "returns false for a call to nil?" do
|
40
40
|
assert ! @subject.nil?
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
it "generates a MD5 hash of the contents" do
|
44
44
|
expected = Digest::MD5.file(@file.tempfile.path).to_s
|
45
45
|
assert_equal expected, @subject.fingerprint
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
it "reads the contents of the file" do
|
49
49
|
expected = @file.tempfile.read
|
50
50
|
assert expected.length > 0
|
51
51
|
assert_equal expected, @subject.read
|
@@ -53,68 +53,68 @@ class UploadedFileAdapterTest < Test::Unit::TestCase
|
|
53
53
|
end
|
54
54
|
|
55
55
|
context "with UploadedFile that has restricted characters" do
|
56
|
-
|
56
|
+
before do
|
57
57
|
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
58
58
|
|
59
59
|
class UploadedFile < OpenStruct; end
|
60
60
|
@file = UploadedFile.new(
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
61
|
+
original_filename: "image:restricted.gif",
|
62
|
+
content_type: "image/x-png-by-browser",
|
63
|
+
head: "",
|
64
|
+
path: fixture_file("5k.png")
|
65
65
|
)
|
66
66
|
@subject = Paperclip.io_adapters.for(@file)
|
67
67
|
end
|
68
68
|
|
69
|
-
|
70
|
-
|
69
|
+
it "does not generate paths that include restricted characters" do
|
70
|
+
expect(@subject.path).to_not match(/:/)
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
it "does not generate filenames that include restricted characters" do
|
74
74
|
assert_equal 'image_restricted.gif', @subject.original_filename
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
context "with UploadFile responding to #path" do
|
79
|
-
|
79
|
+
before do
|
80
80
|
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
81
81
|
|
82
82
|
class UploadedFile < OpenStruct; end
|
83
83
|
@file = UploadedFile.new(
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
87
|
-
:
|
84
|
+
original_filename: "5k.png",
|
85
|
+
content_type: "image/x-png-by-browser",
|
86
|
+
head: "",
|
87
|
+
path: fixture_file("5k.png")
|
88
88
|
)
|
89
89
|
@subject = Paperclip.io_adapters.for(@file)
|
90
90
|
end
|
91
91
|
|
92
|
-
|
92
|
+
it "gets the right filename" do
|
93
93
|
assert_equal "5k.png", @subject.original_filename
|
94
94
|
end
|
95
95
|
|
96
|
-
|
96
|
+
it "forces binmode on tempfile" do
|
97
97
|
assert @subject.instance_variable_get("@tempfile").binmode?
|
98
98
|
end
|
99
99
|
|
100
|
-
|
100
|
+
it "gets the content type" do
|
101
101
|
assert_equal "image/x-png-by-browser", @subject.content_type
|
102
102
|
end
|
103
103
|
|
104
|
-
|
104
|
+
it "gets the file's size" do
|
105
105
|
assert_equal 4456, @subject.size
|
106
106
|
end
|
107
107
|
|
108
|
-
|
108
|
+
it "returns false for a call to nil?" do
|
109
109
|
assert ! @subject.nil?
|
110
110
|
end
|
111
111
|
|
112
|
-
|
112
|
+
it "generates a MD5 hash of the contents" do
|
113
113
|
expected = Digest::MD5.file(@file.path).to_s
|
114
114
|
assert_equal expected, @subject.fingerprint
|
115
115
|
end
|
116
116
|
|
117
|
-
|
117
|
+
it "reads the contents of the file" do
|
118
118
|
expected_file = File.new(@file.path)
|
119
119
|
expected_file.binmode
|
120
120
|
expected = expected_file.read
|
@@ -123,21 +123,21 @@ class UploadedFileAdapterTest < Test::Unit::TestCase
|
|
123
123
|
end
|
124
124
|
|
125
125
|
context "don't trust client-given MIME type" do
|
126
|
-
|
126
|
+
before do
|
127
127
|
Paperclip::UploadedFileAdapter.content_type_detector =
|
128
128
|
Paperclip::FileCommandContentTypeDetector
|
129
129
|
|
130
130
|
class UploadedFile < OpenStruct; end
|
131
131
|
@file = UploadedFile.new(
|
132
|
-
:
|
133
|
-
:
|
134
|
-
:
|
135
|
-
:
|
132
|
+
original_filename: "5k.png",
|
133
|
+
content_type: "image/x-png-by-browser",
|
134
|
+
head: "",
|
135
|
+
path: fixture_file("5k.png")
|
136
136
|
)
|
137
137
|
@subject = Paperclip.io_adapters.for(@file)
|
138
138
|
end
|
139
139
|
|
140
|
-
|
140
|
+
it "gets the content type" do
|
141
141
|
assert_equal "image/png", @subject.content_type
|
142
142
|
end
|
143
143
|
end
|
data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb}
RENAMED
@@ -1,8 +1,8 @@
|
|
1
|
-
require '
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
|
-
|
3
|
+
describe Paperclip::UriAdapter do
|
4
4
|
context "a new instance" do
|
5
|
-
|
5
|
+
before do
|
6
6
|
@open_return = StringIO.new("xxx")
|
7
7
|
@open_return.stubs(:content_type).returns("image/png")
|
8
8
|
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(@open_return)
|
@@ -10,45 +10,45 @@ class UriProxyTest < Test::Unit::TestCase
|
|
10
10
|
@subject = Paperclip.io_adapters.for(@uri)
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
it "returns a file name" do
|
14
14
|
assert_equal "thoughtbot-logo.png", @subject.original_filename
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
it 'closes open handle after reading' do
|
18
18
|
assert_equal true, @open_return.closed?
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
it "returns a content type" do
|
22
22
|
assert_equal "image/png", @subject.content_type
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
it "returns the size of the data" do
|
26
26
|
assert_equal @open_return.size, @subject.size
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
it "generates an MD5 hash of the contents" do
|
30
30
|
assert_equal Digest::MD5.hexdigest("xxx"), @subject.fingerprint
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
it "generates correct fingerprint after read" do
|
34
34
|
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
35
35
|
assert_equal fingerprint, @subject.fingerprint
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
it "generates same fingerprint" do
|
39
39
|
assert_equal @subject.fingerprint, @subject.fingerprint
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
it "returns the data contained in the StringIO" do
|
43
43
|
assert_equal "xxx", @subject.read
|
44
44
|
end
|
45
45
|
|
46
|
-
|
46
|
+
it 'accepts a content_type' do
|
47
47
|
@subject.content_type = 'image/png'
|
48
48
|
assert_equal 'image/png', @subject.content_type
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
it 'accepts an orgiginal_filename' do
|
52
52
|
@subject.original_filename = 'image.png'
|
53
53
|
assert_equal 'image.png', @subject.original_filename
|
54
54
|
end
|
@@ -56,46 +56,46 @@ class UriProxyTest < Test::Unit::TestCase
|
|
56
56
|
end
|
57
57
|
|
58
58
|
context "a directory index url" do
|
59
|
-
|
59
|
+
before do
|
60
60
|
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
|
61
61
|
@uri = URI.parse("http://thoughtbot.com")
|
62
62
|
@subject = Paperclip.io_adapters.for(@uri)
|
63
63
|
end
|
64
64
|
|
65
|
-
|
65
|
+
it "returns a file name" do
|
66
66
|
assert_equal "index.html", @subject.original_filename
|
67
67
|
end
|
68
68
|
|
69
|
-
|
69
|
+
it "returns a content type" do
|
70
70
|
assert_equal "text/html", @subject.content_type
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
context "a url with query params" do
|
75
|
-
|
75
|
+
before do
|
76
76
|
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
|
77
77
|
@uri = URI.parse("https://github.com/thoughtbot/paperclip?file=test")
|
78
78
|
@subject = Paperclip.io_adapters.for(@uri)
|
79
79
|
end
|
80
80
|
|
81
|
-
|
81
|
+
it "returns a file name" do
|
82
82
|
assert_equal "paperclip", @subject.original_filename
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
86
|
context "a url with restricted characters in the filename" do
|
87
|
-
|
87
|
+
before do
|
88
88
|
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
|
89
89
|
@uri = URI.parse("https://github.com/thoughtbot/paper:clip.jpg")
|
90
90
|
@subject = Paperclip.io_adapters.for(@uri)
|
91
91
|
end
|
92
92
|
|
93
|
-
|
93
|
+
it "does not generate filenames that include restricted characters" do
|
94
94
|
assert_equal "paper_clip.jpg", @subject.original_filename
|
95
95
|
end
|
96
96
|
|
97
|
-
|
98
|
-
|
97
|
+
it "does not generate paths that include restricted characters" do
|
98
|
+
expect(@subject.path).to_not match(/:/)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'paperclip/matchers'
|
3
|
+
|
4
|
+
describe Paperclip::Shoulda::Matchers::HaveAttachedFileMatcher do
|
5
|
+
extend Paperclip::Shoulda::Matchers
|
6
|
+
|
7
|
+
it "rejects the dummy class if it has no attachment" do
|
8
|
+
reset_table "dummies"
|
9
|
+
reset_class "Dummy"
|
10
|
+
matcher = self.class.have_attached_file(:avatar)
|
11
|
+
expect(matcher).to_not accept(Dummy)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'accepts the dummy class if it has an attachment' do
|
15
|
+
rebuild_model
|
16
|
+
matcher = self.class.have_attached_file(:avatar)
|
17
|
+
expect(matcher).to accept(Dummy)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'paperclip/matchers'
|
3
|
+
|
4
|
+
describe Paperclip::Shoulda::Matchers::ValidateAttachmentContentTypeMatcher do
|
5
|
+
extend Paperclip::Shoulda::Matchers
|
6
|
+
|
7
|
+
before do
|
8
|
+
reset_table("dummies") do |d|
|
9
|
+
d.string :title
|
10
|
+
d.string :avatar_file_name
|
11
|
+
d.string :avatar_content_type
|
12
|
+
end
|
13
|
+
reset_class "Dummy"
|
14
|
+
Dummy.do_not_validate_attachment_file_type :avatar
|
15
|
+
Dummy.has_attached_file :avatar
|
16
|
+
end
|
17
|
+
|
18
|
+
it "rejects a class with no validation" do
|
19
|
+
expect(matcher).to_not accept(Dummy)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'rejects a class when the validation fails' do
|
23
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*}
|
24
|
+
expect(matcher).to_not accept(Dummy)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "accepts a class with a matching validation" do
|
28
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
29
|
+
expect(matcher).to accept(Dummy)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "accepts a class with other validations but matching types" do
|
33
|
+
Dummy.validates_presence_of :title
|
34
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
35
|
+
expect(matcher).to accept(Dummy)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "accepts a class that matches and a matcher that only specifies 'allowing'" do
|
39
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
40
|
+
matcher = plain_matcher.allowing(%w(image/png image/jpeg))
|
41
|
+
|
42
|
+
expect(matcher).to accept(Dummy)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "rejects a class that does not match and a matcher that only specifies 'allowing'" do
|
46
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*}
|
47
|
+
matcher = plain_matcher.allowing(%w(image/png image/jpeg))
|
48
|
+
|
49
|
+
expect(matcher).to_not accept(Dummy)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "accepts a class that matches and a matcher that only specifies 'rejecting'" do
|
53
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
54
|
+
matcher = plain_matcher.rejecting(%w(audio/mp3 application/octet-stream))
|
55
|
+
|
56
|
+
expect(matcher).to accept(Dummy)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "rejects a class that does not match and a matcher that only specifies 'rejecting'" do
|
60
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*}
|
61
|
+
matcher = plain_matcher.rejecting(%w(audio/mp3 application/octet-stream))
|
62
|
+
|
63
|
+
expect(matcher).to_not accept(Dummy)
|
64
|
+
end
|
65
|
+
|
66
|
+
context "using an :if to control the validation" do
|
67
|
+
before do
|
68
|
+
Dummy.class_eval do
|
69
|
+
validates_attachment_content_type :avatar, content_type: %r{image/*} , if: :go
|
70
|
+
attr_accessor :go
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it "runs the validation if the control is true" do
|
75
|
+
dummy = Dummy.new
|
76
|
+
dummy.go = true
|
77
|
+
expect(matcher).to accept(dummy)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "does not run the validation if the control is false" do
|
81
|
+
dummy = Dummy.new
|
82
|
+
dummy.go = false
|
83
|
+
expect(matcher).to_not accept(dummy)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def plain_matcher
|
90
|
+
self.class.validate_attachment_content_type(:avatar)
|
91
|
+
end
|
92
|
+
|
93
|
+
def matcher
|
94
|
+
plain_matcher.
|
95
|
+
allowing(%w(image/png image/jpeg)).
|
96
|
+
rejecting(%w(audio/mp3 application/octet-stream))
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|