paperclip_jk 5.0.0.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/.hound.yml +1066 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +26 -0
- data/Appraisals +27 -0
- data/CONTRIBUTING.md +86 -0
- data/Gemfile +15 -0
- data/LICENSE +24 -0
- data/NEWS +424 -0
- data/README.md +999 -0
- data/RELEASING.md +17 -0
- data/Rakefile +44 -0
- data/UPGRADING +17 -0
- data/features/basic_integration.feature +81 -0
- data/features/migration.feature +70 -0
- data/features/rake_tasks.feature +62 -0
- data/features/step_definitions/attachment_steps.rb +110 -0
- data/features/step_definitions/html_steps.rb +15 -0
- data/features/step_definitions/rails_steps.rb +230 -0
- data/features/step_definitions/s3_steps.rb +14 -0
- data/features/step_definitions/web_steps.rb +107 -0
- data/features/support/env.rb +11 -0
- data/features/support/fakeweb.rb +13 -0
- data/features/support/file_helpers.rb +34 -0
- data/features/support/fixtures/boot_config.txt +15 -0
- data/features/support/fixtures/gemfile.txt +5 -0
- data/features/support/fixtures/preinitializer.txt +20 -0
- data/features/support/paths.rb +28 -0
- data/features/support/rails.rb +63 -0
- data/features/support/selectors.rb +19 -0
- data/gemfiles/4.2.awsv2.0.gemfile +17 -0
- data/gemfiles/4.2.awsv2.1.gemfile +17 -0
- data/gemfiles/4.2.awsv2.gemfile +20 -0
- data/gemfiles/5.0.awsv2.0.gemfile +17 -0
- data/gemfiles/5.0.awsv2.1.gemfile +17 -0
- data/gemfiles/5.0.awsv2.gemfile +25 -0
- data/lib/generators/paperclip/USAGE +8 -0
- data/lib/generators/paperclip/paperclip_generator.rb +30 -0
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +15 -0
- data/lib/paperclip.rb +211 -0
- data/lib/paperclip/attachment.rb +610 -0
- data/lib/paperclip/attachment_registry.rb +60 -0
- data/lib/paperclip/callbacks.rb +42 -0
- data/lib/paperclip/content_type_detector.rb +80 -0
- data/lib/paperclip/errors.rb +34 -0
- data/lib/paperclip/file_command_content_type_detector.rb +30 -0
- data/lib/paperclip/filename_cleaner.rb +16 -0
- data/lib/paperclip/geometry.rb +158 -0
- data/lib/paperclip/geometry_detector_factory.rb +48 -0
- data/lib/paperclip/geometry_parser_factory.rb +31 -0
- data/lib/paperclip/glue.rb +17 -0
- data/lib/paperclip/has_attached_file.rb +115 -0
- data/lib/paperclip/helpers.rb +60 -0
- data/lib/paperclip/interpolations.rb +197 -0
- data/lib/paperclip/interpolations/plural_cache.rb +18 -0
- data/lib/paperclip/io_adapters/abstract_adapter.rb +47 -0
- data/lib/paperclip/io_adapters/attachment_adapter.rb +36 -0
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +22 -0
- data/lib/paperclip/io_adapters/empty_string_adapter.rb +18 -0
- data/lib/paperclip/io_adapters/file_adapter.rb +22 -0
- data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +15 -0
- data/lib/paperclip/io_adapters/identity_adapter.rb +12 -0
- data/lib/paperclip/io_adapters/nil_adapter.rb +34 -0
- data/lib/paperclip/io_adapters/registry.rb +32 -0
- data/lib/paperclip/io_adapters/stringio_adapter.rb +33 -0
- data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +42 -0
- data/lib/paperclip/io_adapters/uri_adapter.rb +44 -0
- data/lib/paperclip/locales/en.yml +18 -0
- data/lib/paperclip/logger.rb +21 -0
- data/lib/paperclip/matchers.rb +64 -0
- data/lib/paperclip/matchers/have_attached_file_matcher.rb +54 -0
- data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +100 -0
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +59 -0
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +96 -0
- data/lib/paperclip/media_type_spoof_detector.rb +89 -0
- data/lib/paperclip/missing_attachment_styles.rb +79 -0
- data/lib/paperclip/processor.rb +48 -0
- data/lib/paperclip/processor_helpers.rb +50 -0
- data/lib/paperclip/rails_environment.rb +25 -0
- data/lib/paperclip/railtie.rb +31 -0
- data/lib/paperclip/schema.rb +77 -0
- data/lib/paperclip/storage.rb +4 -0
- data/lib/paperclip/storage/database.rb +140 -0
- data/lib/paperclip/storage/filesystem.rb +90 -0
- data/lib/paperclip/storage/fog.rb +244 -0
- data/lib/paperclip/storage/s3.rb +442 -0
- data/lib/paperclip/style.rb +109 -0
- data/lib/paperclip/tempfile.rb +43 -0
- data/lib/paperclip/tempfile_factory.rb +23 -0
- data/lib/paperclip/thumbnail.rb +121 -0
- data/lib/paperclip/url_generator.rb +72 -0
- data/lib/paperclip/validators.rb +74 -0
- data/lib/paperclip/validators/attachment_content_type_validator.rb +88 -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 +30 -0
- data/lib/paperclip/validators/attachment_size_validator.rb +109 -0
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
- data/lib/paperclip/version.rb +3 -0
- data/lib/tasks/paperclip.rake +127 -0
- data/paperclip.gemspec +54 -0
- data/shoulda_macros/paperclip.rb +134 -0
- data/spec/database.yml +4 -0
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/spec/paperclip/attachment_processing_spec.rb +80 -0
- data/spec/paperclip/attachment_registry_spec.rb +158 -0
- data/spec/paperclip/attachment_spec.rb +1517 -0
- data/spec/paperclip/content_type_detector_spec.rb +48 -0
- data/spec/paperclip/file_command_content_type_detector_spec.rb +26 -0
- data/spec/paperclip/filename_cleaner_spec.rb +14 -0
- data/spec/paperclip/geometry_detector_spec.rb +39 -0
- data/spec/paperclip/geometry_parser_spec.rb +73 -0
- data/spec/paperclip/geometry_spec.rb +255 -0
- data/spec/paperclip/glue_spec.rb +44 -0
- data/spec/paperclip/has_attached_file_spec.rb +158 -0
- data/spec/paperclip/integration_spec.rb +668 -0
- data/spec/paperclip/interpolations_spec.rb +262 -0
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
- data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +139 -0
- data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +83 -0
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
- data/spec/paperclip/io_adapters/file_adapter_spec.rb +131 -0
- data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +113 -0
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
- data/spec/paperclip/io_adapters/nil_adapter_spec.rb +25 -0
- data/spec/paperclip/io_adapters/registry_spec.rb +35 -0
- data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +64 -0
- data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +146 -0
- data/spec/paperclip/io_adapters/uri_adapter_spec.rb +102 -0
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +109 -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 +70 -0
- data/spec/paperclip/meta_class_spec.rb +30 -0
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
- data/spec/paperclip/paperclip_spec.rb +192 -0
- data/spec/paperclip/plural_cache_spec.rb +37 -0
- data/spec/paperclip/processor_helpers_spec.rb +57 -0
- data/spec/paperclip/processor_spec.rb +26 -0
- data/spec/paperclip/rails_environment_spec.rb +33 -0
- data/spec/paperclip/rake_spec.rb +103 -0
- data/spec/paperclip/schema_spec.rb +248 -0
- data/spec/paperclip/storage/filesystem_spec.rb +79 -0
- data/spec/paperclip/storage/fog_spec.rb +545 -0
- data/spec/paperclip/storage/s3_live_spec.rb +186 -0
- data/spec/paperclip/storage/s3_spec.rb +1583 -0
- data/spec/paperclip/style_spec.rb +255 -0
- data/spec/paperclip/tempfile_factory_spec.rb +33 -0
- data/spec/paperclip/thumbnail_spec.rb +500 -0
- 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/spec/paperclip/validators/attachment_presence_validator_spec.rb +85 -0
- data/spec/paperclip/validators/attachment_size_validator_spec.rb +235 -0
- 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 +45 -0
- data/spec/support/assertions.rb +78 -0
- data/spec/support/fake_model.rb +25 -0
- data/spec/support/fake_rails.rb +12 -0
- data/spec/support/fixtures/12k.png +0 -0
- data/spec/support/fixtures/50x50.png +0 -0
- data/spec/support/fixtures/5k.png +0 -0
- data/spec/support/fixtures/animated +0 -0
- data/spec/support/fixtures/animated.gif +0 -0
- data/spec/support/fixtures/animated.unknown +0 -0
- data/spec/support/fixtures/bad.png +1 -0
- data/spec/support/fixtures/empty.html +1 -0
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/fog.yml +8 -0
- data/spec/support/fixtures/rotated.jpg +0 -0
- data/spec/support/fixtures/s3.yml +8 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/spec/support/fixtures/spaced file.png +0 -0
- data/spec/support/fixtures/text.txt +1 -0
- data/spec/support/fixtures/twopage.pdf +0 -0
- data/spec/support/fixtures/uppercase.PNG +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/mock_attachment.rb +22 -0
- data/spec/support/mock_interpolator.rb +24 -0
- data/spec/support/mock_url_generator_builder.rb +27 -0
- data/spec/support/model_reconstruction.rb +68 -0
- data/spec/support/reporting.rb +11 -0
- data/spec/support/test_data.rb +13 -0
- data/spec/support/version_helper.rb +9 -0
- metadata +713 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Paperclip::UploadedFileAdapter do
|
|
4
|
+
context "a new instance" do
|
|
5
|
+
context "with UploadedFile responding to #tempfile" do
|
|
6
|
+
before do
|
|
7
|
+
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
|
8
|
+
|
|
9
|
+
class UploadedFile < OpenStruct; end
|
|
10
|
+
tempfile = File.new(fixture_file("5k.png"))
|
|
11
|
+
tempfile.binmode
|
|
12
|
+
|
|
13
|
+
@file = UploadedFile.new(
|
|
14
|
+
original_filename: "5k.png",
|
|
15
|
+
content_type: "image/x-png-by-browser\r",
|
|
16
|
+
head: "",
|
|
17
|
+
tempfile: tempfile,
|
|
18
|
+
path: tempfile.path
|
|
19
|
+
)
|
|
20
|
+
@subject = Paperclip.io_adapters.for(@file)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "gets the right filename" do
|
|
24
|
+
assert_equal "5k.png", @subject.original_filename
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "forces binmode on tempfile" do
|
|
28
|
+
assert @subject.instance_variable_get("@tempfile").binmode?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "gets the content type" do
|
|
32
|
+
assert_equal "image/x-png-by-browser", @subject.content_type
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "gets the file's size" do
|
|
36
|
+
assert_equal 4456, @subject.size
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "returns false for a call to nil?" do
|
|
40
|
+
assert ! @subject.nil?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "generates a MD5 hash of the contents" do
|
|
44
|
+
expected = Digest::MD5.file(@file.tempfile.path).to_s
|
|
45
|
+
assert_equal expected, @subject.fingerprint
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "reads the contents of the file" do
|
|
49
|
+
expected = @file.tempfile.read
|
|
50
|
+
assert expected.length > 0
|
|
51
|
+
assert_equal expected, @subject.read
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
context "with UploadedFile that has restricted characters" do
|
|
56
|
+
before do
|
|
57
|
+
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
|
58
|
+
|
|
59
|
+
class UploadedFile < OpenStruct; end
|
|
60
|
+
@file = UploadedFile.new(
|
|
61
|
+
original_filename: "image:restricted.gif",
|
|
62
|
+
content_type: "image/x-png-by-browser",
|
|
63
|
+
head: "",
|
|
64
|
+
path: fixture_file("5k.png")
|
|
65
|
+
)
|
|
66
|
+
@subject = Paperclip.io_adapters.for(@file)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "does not generate paths that include restricted characters" do
|
|
70
|
+
expect(@subject.path).to_not match(/:/)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "does not generate filenames that include restricted characters" do
|
|
74
|
+
assert_equal 'image_restricted.gif', @subject.original_filename
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
context "with UploadFile responding to #path" do
|
|
79
|
+
before do
|
|
80
|
+
Paperclip::UploadedFileAdapter.content_type_detector = nil
|
|
81
|
+
|
|
82
|
+
class UploadedFile < OpenStruct; end
|
|
83
|
+
@file = UploadedFile.new(
|
|
84
|
+
original_filename: "5k.png",
|
|
85
|
+
content_type: "image/x-png-by-browser",
|
|
86
|
+
head: "",
|
|
87
|
+
path: fixture_file("5k.png")
|
|
88
|
+
)
|
|
89
|
+
@subject = Paperclip.io_adapters.for(@file)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "gets the right filename" do
|
|
93
|
+
assert_equal "5k.png", @subject.original_filename
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "forces binmode on tempfile" do
|
|
97
|
+
assert @subject.instance_variable_get("@tempfile").binmode?
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "gets the content type" do
|
|
101
|
+
assert_equal "image/x-png-by-browser", @subject.content_type
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "gets the file's size" do
|
|
105
|
+
assert_equal 4456, @subject.size
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "returns false for a call to nil?" do
|
|
109
|
+
assert ! @subject.nil?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "generates a MD5 hash of the contents" do
|
|
113
|
+
expected = Digest::MD5.file(@file.path).to_s
|
|
114
|
+
assert_equal expected, @subject.fingerprint
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "reads the contents of the file" do
|
|
118
|
+
expected_file = File.new(@file.path)
|
|
119
|
+
expected_file.binmode
|
|
120
|
+
expected = expected_file.read
|
|
121
|
+
assert expected.length > 0
|
|
122
|
+
assert_equal expected, @subject.read
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context "don't trust client-given MIME type" do
|
|
126
|
+
before do
|
|
127
|
+
Paperclip::UploadedFileAdapter.content_type_detector =
|
|
128
|
+
Paperclip::FileCommandContentTypeDetector
|
|
129
|
+
|
|
130
|
+
class UploadedFile < OpenStruct; end
|
|
131
|
+
@file = UploadedFile.new(
|
|
132
|
+
original_filename: "5k.png",
|
|
133
|
+
content_type: "image/x-png-by-browser",
|
|
134
|
+
head: "",
|
|
135
|
+
path: fixture_file("5k.png")
|
|
136
|
+
)
|
|
137
|
+
@subject = Paperclip.io_adapters.for(@file)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "gets the content type" do
|
|
141
|
+
assert_equal "image/png", @subject.content_type
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Paperclip::UriAdapter do
|
|
4
|
+
context "a new instance" do
|
|
5
|
+
before do
|
|
6
|
+
@open_return = StringIO.new("xxx")
|
|
7
|
+
@open_return.stubs(:content_type).returns("image/png")
|
|
8
|
+
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(@open_return)
|
|
9
|
+
@uri = URI.parse("http://thoughtbot.com/images/thoughtbot-logo.png")
|
|
10
|
+
@subject = Paperclip.io_adapters.for(@uri)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "returns a file name" do
|
|
14
|
+
assert_equal "thoughtbot-logo.png", @subject.original_filename
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'closes open handle after reading' do
|
|
18
|
+
assert_equal true, @open_return.closed?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "returns a content type" do
|
|
22
|
+
assert_equal "image/png", @subject.content_type
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "returns the size of the data" do
|
|
26
|
+
assert_equal @open_return.size, @subject.size
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "generates an MD5 hash of the contents" do
|
|
30
|
+
assert_equal Digest::MD5.hexdigest("xxx"), @subject.fingerprint
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "generates correct fingerprint after read" do
|
|
34
|
+
fingerprint = Digest::MD5.hexdigest(@subject.read)
|
|
35
|
+
assert_equal fingerprint, @subject.fingerprint
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "generates same fingerprint" do
|
|
39
|
+
assert_equal @subject.fingerprint, @subject.fingerprint
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "returns the data contained in the StringIO" do
|
|
43
|
+
assert_equal "xxx", @subject.read
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'accepts a content_type' do
|
|
47
|
+
@subject.content_type = 'image/png'
|
|
48
|
+
assert_equal 'image/png', @subject.content_type
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'accepts an orgiginal_filename' do
|
|
52
|
+
@subject.original_filename = 'image.png'
|
|
53
|
+
assert_equal 'image.png', @subject.original_filename
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "a directory index url" do
|
|
59
|
+
before do
|
|
60
|
+
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
|
|
61
|
+
@uri = URI.parse("http://thoughtbot.com")
|
|
62
|
+
@subject = Paperclip.io_adapters.for(@uri)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "returns a file name" do
|
|
66
|
+
assert_equal "index.html", @subject.original_filename
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "returns a content type" do
|
|
70
|
+
assert_equal "text/html", @subject.content_type
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "a url with query params" do
|
|
75
|
+
before do
|
|
76
|
+
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
|
|
77
|
+
@uri = URI.parse("https://github.com/thoughtbot/paperclip?file=test")
|
|
78
|
+
@subject = Paperclip.io_adapters.for(@uri)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "returns a file name" do
|
|
82
|
+
assert_equal "paperclip", @subject.original_filename
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "a url with restricted characters in the filename" do
|
|
87
|
+
before do
|
|
88
|
+
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
|
|
89
|
+
@uri = URI.parse("https://github.com/thoughtbot/paper:clip.jpg")
|
|
90
|
+
@subject = Paperclip.io_adapters.for(@uri)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "does not generate filenames that include restricted characters" do
|
|
94
|
+
assert_equal "paper_clip.jpg", @subject.original_filename
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "does not generate paths that include restricted characters" do
|
|
98
|
+
expect(@subject.path).to_not match(/:/)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
|
@@ -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,109 @@
|
|
|
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
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'rejects a class when the validation fails' do
|
|
24
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*}
|
|
25
|
+
expect(matcher).to_not accept(Dummy)
|
|
26
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "accepts a class with a matching validation" do
|
|
30
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
|
31
|
+
expect(matcher).to accept(Dummy)
|
|
32
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "accepts a class with other validations but matching types" do
|
|
36
|
+
Dummy.validates_presence_of :title
|
|
37
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
|
38
|
+
expect(matcher).to accept(Dummy)
|
|
39
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "accepts a class that matches and a matcher that only specifies 'allowing'" do
|
|
43
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
|
44
|
+
matcher = plain_matcher.allowing(%w(image/png image/jpeg))
|
|
45
|
+
|
|
46
|
+
expect(matcher).to accept(Dummy)
|
|
47
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "rejects a class that does not match and a matcher that only specifies 'allowing'" do
|
|
51
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*}
|
|
52
|
+
matcher = plain_matcher.allowing(%w(image/png image/jpeg))
|
|
53
|
+
|
|
54
|
+
expect(matcher).to_not accept(Dummy)
|
|
55
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "accepts a class that matches and a matcher that only specifies 'rejecting'" do
|
|
59
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{image/.*}
|
|
60
|
+
matcher = plain_matcher.rejecting(%w(audio/mp3 application/octet-stream))
|
|
61
|
+
|
|
62
|
+
expect(matcher).to accept(Dummy)
|
|
63
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "rejects a class that does not match and a matcher that only specifies 'rejecting'" do
|
|
67
|
+
Dummy.validates_attachment_content_type :avatar, content_type: %r{audio/.*}
|
|
68
|
+
matcher = plain_matcher.rejecting(%w(audio/mp3 application/octet-stream))
|
|
69
|
+
|
|
70
|
+
expect(matcher).to_not accept(Dummy)
|
|
71
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context "using an :if to control the validation" do
|
|
75
|
+
before do
|
|
76
|
+
Dummy.class_eval do
|
|
77
|
+
validates_attachment_content_type :avatar, content_type: %r{image/*} , if: :go
|
|
78
|
+
attr_accessor :go
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "runs the validation if the control is true" do
|
|
83
|
+
dummy = Dummy.new
|
|
84
|
+
dummy.go = true
|
|
85
|
+
expect(matcher).to accept(dummy)
|
|
86
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "does not run the validation if the control is false" do
|
|
90
|
+
dummy = Dummy.new
|
|
91
|
+
dummy.go = false
|
|
92
|
+
expect(matcher).to_not accept(dummy)
|
|
93
|
+
expect { matcher.failure_message }.to_not raise_error
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
private
|
|
98
|
+
|
|
99
|
+
def plain_matcher
|
|
100
|
+
self.class.validate_attachment_content_type(:avatar)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def matcher
|
|
104
|
+
plain_matcher.
|
|
105
|
+
allowing(%w(image/png image/jpeg)).
|
|
106
|
+
rejecting(%w(audio/mp3 application/octet-stream))
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'paperclip/matchers'
|
|
3
|
+
|
|
4
|
+
describe Paperclip::Shoulda::Matchers::ValidateAttachmentPresenceMatcher do
|
|
5
|
+
extend Paperclip::Shoulda::Matchers
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
reset_table("dummies") do |d|
|
|
9
|
+
d.string :avatar_file_name
|
|
10
|
+
end
|
|
11
|
+
reset_class "Dummy"
|
|
12
|
+
Dummy.has_attached_file :avatar
|
|
13
|
+
Dummy.do_not_validate_attachment_file_type :avatar
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "rejects a class with no validation" do
|
|
17
|
+
expect(matcher).to_not accept(Dummy)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "accepts a class with a matching validation" do
|
|
21
|
+
Dummy.validates_attachment_presence :avatar
|
|
22
|
+
expect(matcher).to accept(Dummy)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "accepts an instance with other attachment validations" do
|
|
26
|
+
reset_table("dummies") do |d|
|
|
27
|
+
d.string :avatar_file_name
|
|
28
|
+
d.string :avatar_content_type
|
|
29
|
+
end
|
|
30
|
+
Dummy.class_eval do
|
|
31
|
+
validates_attachment_presence :avatar
|
|
32
|
+
validates_attachment_content_type :avatar, content_type: 'image/gif'
|
|
33
|
+
end
|
|
34
|
+
dummy = Dummy.new
|
|
35
|
+
|
|
36
|
+
dummy.avatar = File.new fixture_file('5k.png')
|
|
37
|
+
|
|
38
|
+
expect(matcher).to accept(dummy)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "using an :if to control the validation" do
|
|
42
|
+
before do
|
|
43
|
+
Dummy.class_eval do
|
|
44
|
+
validates_attachment_presence :avatar, if: :go
|
|
45
|
+
attr_accessor :go
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "runs the validation if the control is true" do
|
|
50
|
+
dummy = Dummy.new
|
|
51
|
+
dummy.avatar = nil
|
|
52
|
+
dummy.go = true
|
|
53
|
+
expect(matcher).to accept(dummy)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "does not run the validation if the control is false" do
|
|
57
|
+
dummy = Dummy.new
|
|
58
|
+
dummy.avatar = nil
|
|
59
|
+
dummy.go = false
|
|
60
|
+
expect(matcher).to_not accept(dummy)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def matcher
|
|
67
|
+
self.class.validate_attachment_presence(:avatar)
|
|
68
|
+
end
|
|
69
|
+
end
|