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,61 +1,60 @@
1
- require './test/helper'
1
+ require 'spec_helper'
2
2
 
3
- class StringioFileProxyTest < Test::Unit::TestCase
3
+ describe Paperclip::StringioAdapter do
4
4
  context "a new instance" do
5
- setup do
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
- should "return a file name" do
12
- assert_equal "data.txt", @subject.original_filename
11
+ it "returns a file name" do
12
+ assert_equal "data", @subject.original_filename
13
13
  end
14
14
 
15
- should "return a content type" do
15
+ it "returns a content type" do
16
16
  assert_equal "text/plain", @subject.content_type
17
17
  end
18
18
 
19
- should "return the size of the data" do
19
+ it "returns the size of the data" do
20
20
  assert_equal 6, @subject.size
21
21
  end
22
22
 
23
- should "generate an MD5 hash of the contents" do
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
- should "generate correct fingerprint after read" do
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
- should "generate same fingerprint" do
32
+ it "generates same fingerprint" do
33
33
  assert_equal @subject.fingerprint, @subject.fingerprint
34
34
  end
35
35
 
36
- should "return the data contained in the StringIO" do
36
+ it "returns the data contained in the StringIO" do
37
37
  assert_equal "abc123", @subject.read
38
38
  end
39
39
 
40
- should 'accept a content_type' do
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
- should 'accept an original_filename' do
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
- should "not generate filenames that include restricted characters" do
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
- should "not generate paths that include restricted characters" do
55
+ it "does not generate paths that include restricted characters" do
56
56
  @subject.original_filename = 'image:restricted.png'
57
- assert_no_match /:/, @subject.path
57
+ expect(@subject.path).to_not match(/:/)
58
58
  end
59
-
60
59
  end
61
60
  end
@@ -1,9 +1,9 @@
1
- require './test/helper'
1
+ require 'spec_helper'
2
2
 
3
- class UploadedFileAdapterTest < Test::Unit::TestCase
3
+ describe Paperclip::UploadedFileAdapter do
4
4
  context "a new instance" do
5
5
  context "with UploadedFile responding to #tempfile" do
6
- setup do
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
- :original_filename => "5k.png",
15
- :content_type => "image/x-png-by-browser\r",
16
- :head => "",
17
- :tempfile => tempfile,
18
- :path => tempfile.path
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
- should "get the right filename" do
23
+ it "gets the right filename" do
24
24
  assert_equal "5k.png", @subject.original_filename
25
25
  end
26
26
 
27
- should "force binmode on tempfile" do
27
+ it "forces binmode on tempfile" do
28
28
  assert @subject.instance_variable_get("@tempfile").binmode?
29
29
  end
30
30
 
31
- should "get the content type" do
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
- should "get the file's size" do
35
+ it "gets the file's size" do
36
36
  assert_equal 4456, @subject.size
37
37
  end
38
38
 
39
- should "return false for a call to nil?" do
39
+ it "returns false for a call to nil?" do
40
40
  assert ! @subject.nil?
41
41
  end
42
42
 
43
- should "generate a MD5 hash of the contents" do
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
- should "read the contents of the file" do
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
- setup do
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
- :original_filename => "image:restricted.gif",
62
- :content_type => "image/x-png-by-browser",
63
- :head => "",
64
- :path => fixture_file("5k.png")
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
- should "not generate paths that include restricted characters" do
70
- assert_no_match /:/, @subject.path
69
+ it "does not generate paths that include restricted characters" do
70
+ expect(@subject.path).to_not match(/:/)
71
71
  end
72
72
 
73
- should "not generate filenames that include restricted characters" do
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
- setup do
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
- :original_filename => "5k.png",
85
- :content_type => "image/x-png-by-browser",
86
- :head => "",
87
- :path => fixture_file("5k.png")
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
- should "get the right filename" do
92
+ it "gets the right filename" do
93
93
  assert_equal "5k.png", @subject.original_filename
94
94
  end
95
95
 
96
- should "force binmode on tempfile" do
96
+ it "forces binmode on tempfile" do
97
97
  assert @subject.instance_variable_get("@tempfile").binmode?
98
98
  end
99
99
 
100
- should "get the content type" do
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
- should "get the file's size" do
104
+ it "gets the file's size" do
105
105
  assert_equal 4456, @subject.size
106
106
  end
107
107
 
108
- should "return false for a call to nil?" do
108
+ it "returns false for a call to nil?" do
109
109
  assert ! @subject.nil?
110
110
  end
111
111
 
112
- should "generate a MD5 hash of the contents" do
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
- should "read the contents of the file" do
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
- setup do
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
- :original_filename => "5k.png",
133
- :content_type => "image/x-png-by-browser",
134
- :head => "",
135
- :path => fixture_file("5k.png")
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
- should "get the content type" do
140
+ it "gets the content type" do
141
141
  assert_equal "image/png", @subject.content_type
142
142
  end
143
143
  end
@@ -1,8 +1,8 @@
1
- require './test/helper'
1
+ require 'spec_helper'
2
2
 
3
- class UriProxyTest < Test::Unit::TestCase
3
+ describe Paperclip::UriAdapter do
4
4
  context "a new instance" do
5
- setup do
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
- should "return a file name" do
13
+ it "returns a file name" do
14
14
  assert_equal "thoughtbot-logo.png", @subject.original_filename
15
15
  end
16
16
 
17
- should 'close open handle after reading' do
17
+ it 'closes open handle after reading' do
18
18
  assert_equal true, @open_return.closed?
19
19
  end
20
20
 
21
- should "return a content type" do
21
+ it "returns a content type" do
22
22
  assert_equal "image/png", @subject.content_type
23
23
  end
24
24
 
25
- should "return the size of the data" do
25
+ it "returns the size of the data" do
26
26
  assert_equal @open_return.size, @subject.size
27
27
  end
28
28
 
29
- should "generate an MD5 hash of the contents" do
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
- should "generate correct fingerprint after read" do
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
- should "generate same fingerprint" do
38
+ it "generates same fingerprint" do
39
39
  assert_equal @subject.fingerprint, @subject.fingerprint
40
40
  end
41
41
 
42
- should "return the data contained in the StringIO" do
42
+ it "returns the data contained in the StringIO" do
43
43
  assert_equal "xxx", @subject.read
44
44
  end
45
45
 
46
- should 'accept a content_type' do
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
- should 'accept an orgiginal_filename' do
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
- setup do
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
- should "return a file name" do
65
+ it "returns a file name" do
66
66
  assert_equal "index.html", @subject.original_filename
67
67
  end
68
68
 
69
- should "return a content type" do
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
- setup do
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
- should "return a file name" do
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
- setup do
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
- should "not generate filenames that include restricted characters" do
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
- should "not generate paths that include restricted characters" do
98
- assert_no_match /:/, @subject.path
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