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.
Files changed (190) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +21 -0
  3. data/.hound.yml +1066 -0
  4. data/.rubocop.yml +1 -0
  5. data/.travis.yml +26 -0
  6. data/Appraisals +27 -0
  7. data/CONTRIBUTING.md +86 -0
  8. data/Gemfile +15 -0
  9. data/LICENSE +24 -0
  10. data/NEWS +424 -0
  11. data/README.md +999 -0
  12. data/RELEASING.md +17 -0
  13. data/Rakefile +44 -0
  14. data/UPGRADING +17 -0
  15. data/features/basic_integration.feature +81 -0
  16. data/features/migration.feature +70 -0
  17. data/features/rake_tasks.feature +62 -0
  18. data/features/step_definitions/attachment_steps.rb +110 -0
  19. data/features/step_definitions/html_steps.rb +15 -0
  20. data/features/step_definitions/rails_steps.rb +230 -0
  21. data/features/step_definitions/s3_steps.rb +14 -0
  22. data/features/step_definitions/web_steps.rb +107 -0
  23. data/features/support/env.rb +11 -0
  24. data/features/support/fakeweb.rb +13 -0
  25. data/features/support/file_helpers.rb +34 -0
  26. data/features/support/fixtures/boot_config.txt +15 -0
  27. data/features/support/fixtures/gemfile.txt +5 -0
  28. data/features/support/fixtures/preinitializer.txt +20 -0
  29. data/features/support/paths.rb +28 -0
  30. data/features/support/rails.rb +63 -0
  31. data/features/support/selectors.rb +19 -0
  32. data/gemfiles/4.2.awsv2.0.gemfile +17 -0
  33. data/gemfiles/4.2.awsv2.1.gemfile +17 -0
  34. data/gemfiles/4.2.awsv2.gemfile +20 -0
  35. data/gemfiles/5.0.awsv2.0.gemfile +17 -0
  36. data/gemfiles/5.0.awsv2.1.gemfile +17 -0
  37. data/gemfiles/5.0.awsv2.gemfile +25 -0
  38. data/lib/generators/paperclip/USAGE +8 -0
  39. data/lib/generators/paperclip/paperclip_generator.rb +30 -0
  40. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +15 -0
  41. data/lib/paperclip.rb +211 -0
  42. data/lib/paperclip/attachment.rb +610 -0
  43. data/lib/paperclip/attachment_registry.rb +60 -0
  44. data/lib/paperclip/callbacks.rb +42 -0
  45. data/lib/paperclip/content_type_detector.rb +80 -0
  46. data/lib/paperclip/errors.rb +34 -0
  47. data/lib/paperclip/file_command_content_type_detector.rb +30 -0
  48. data/lib/paperclip/filename_cleaner.rb +16 -0
  49. data/lib/paperclip/geometry.rb +158 -0
  50. data/lib/paperclip/geometry_detector_factory.rb +48 -0
  51. data/lib/paperclip/geometry_parser_factory.rb +31 -0
  52. data/lib/paperclip/glue.rb +17 -0
  53. data/lib/paperclip/has_attached_file.rb +115 -0
  54. data/lib/paperclip/helpers.rb +60 -0
  55. data/lib/paperclip/interpolations.rb +197 -0
  56. data/lib/paperclip/interpolations/plural_cache.rb +18 -0
  57. data/lib/paperclip/io_adapters/abstract_adapter.rb +47 -0
  58. data/lib/paperclip/io_adapters/attachment_adapter.rb +36 -0
  59. data/lib/paperclip/io_adapters/data_uri_adapter.rb +22 -0
  60. data/lib/paperclip/io_adapters/empty_string_adapter.rb +18 -0
  61. data/lib/paperclip/io_adapters/file_adapter.rb +22 -0
  62. data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +15 -0
  63. data/lib/paperclip/io_adapters/identity_adapter.rb +12 -0
  64. data/lib/paperclip/io_adapters/nil_adapter.rb +34 -0
  65. data/lib/paperclip/io_adapters/registry.rb +32 -0
  66. data/lib/paperclip/io_adapters/stringio_adapter.rb +33 -0
  67. data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +42 -0
  68. data/lib/paperclip/io_adapters/uri_adapter.rb +44 -0
  69. data/lib/paperclip/locales/en.yml +18 -0
  70. data/lib/paperclip/logger.rb +21 -0
  71. data/lib/paperclip/matchers.rb +64 -0
  72. data/lib/paperclip/matchers/have_attached_file_matcher.rb +54 -0
  73. data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +100 -0
  74. data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +59 -0
  75. data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +96 -0
  76. data/lib/paperclip/media_type_spoof_detector.rb +89 -0
  77. data/lib/paperclip/missing_attachment_styles.rb +79 -0
  78. data/lib/paperclip/processor.rb +48 -0
  79. data/lib/paperclip/processor_helpers.rb +50 -0
  80. data/lib/paperclip/rails_environment.rb +25 -0
  81. data/lib/paperclip/railtie.rb +31 -0
  82. data/lib/paperclip/schema.rb +77 -0
  83. data/lib/paperclip/storage.rb +4 -0
  84. data/lib/paperclip/storage/database.rb +140 -0
  85. data/lib/paperclip/storage/filesystem.rb +90 -0
  86. data/lib/paperclip/storage/fog.rb +244 -0
  87. data/lib/paperclip/storage/s3.rb +442 -0
  88. data/lib/paperclip/style.rb +109 -0
  89. data/lib/paperclip/tempfile.rb +43 -0
  90. data/lib/paperclip/tempfile_factory.rb +23 -0
  91. data/lib/paperclip/thumbnail.rb +121 -0
  92. data/lib/paperclip/url_generator.rb +72 -0
  93. data/lib/paperclip/validators.rb +74 -0
  94. data/lib/paperclip/validators/attachment_content_type_validator.rb +88 -0
  95. data/lib/paperclip/validators/attachment_file_name_validator.rb +80 -0
  96. data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +29 -0
  97. data/lib/paperclip/validators/attachment_presence_validator.rb +30 -0
  98. data/lib/paperclip/validators/attachment_size_validator.rb +109 -0
  99. data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
  100. data/lib/paperclip/version.rb +3 -0
  101. data/lib/tasks/paperclip.rake +127 -0
  102. data/paperclip.gemspec +54 -0
  103. data/shoulda_macros/paperclip.rb +134 -0
  104. data/spec/database.yml +4 -0
  105. data/spec/paperclip/attachment_definitions_spec.rb +13 -0
  106. data/spec/paperclip/attachment_processing_spec.rb +80 -0
  107. data/spec/paperclip/attachment_registry_spec.rb +158 -0
  108. data/spec/paperclip/attachment_spec.rb +1517 -0
  109. data/spec/paperclip/content_type_detector_spec.rb +48 -0
  110. data/spec/paperclip/file_command_content_type_detector_spec.rb +26 -0
  111. data/spec/paperclip/filename_cleaner_spec.rb +14 -0
  112. data/spec/paperclip/geometry_detector_spec.rb +39 -0
  113. data/spec/paperclip/geometry_parser_spec.rb +73 -0
  114. data/spec/paperclip/geometry_spec.rb +255 -0
  115. data/spec/paperclip/glue_spec.rb +44 -0
  116. data/spec/paperclip/has_attached_file_spec.rb +158 -0
  117. data/spec/paperclip/integration_spec.rb +668 -0
  118. data/spec/paperclip/interpolations_spec.rb +262 -0
  119. data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
  120. data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +139 -0
  121. data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +83 -0
  122. data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
  123. data/spec/paperclip/io_adapters/file_adapter_spec.rb +131 -0
  124. data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +113 -0
  125. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
  126. data/spec/paperclip/io_adapters/nil_adapter_spec.rb +25 -0
  127. data/spec/paperclip/io_adapters/registry_spec.rb +35 -0
  128. data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +64 -0
  129. data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +146 -0
  130. data/spec/paperclip/io_adapters/uri_adapter_spec.rb +102 -0
  131. data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
  132. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +109 -0
  133. data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
  134. data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
  135. data/spec/paperclip/media_type_spoof_detector_spec.rb +70 -0
  136. data/spec/paperclip/meta_class_spec.rb +30 -0
  137. data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
  138. data/spec/paperclip/paperclip_spec.rb +192 -0
  139. data/spec/paperclip/plural_cache_spec.rb +37 -0
  140. data/spec/paperclip/processor_helpers_spec.rb +57 -0
  141. data/spec/paperclip/processor_spec.rb +26 -0
  142. data/spec/paperclip/rails_environment_spec.rb +33 -0
  143. data/spec/paperclip/rake_spec.rb +103 -0
  144. data/spec/paperclip/schema_spec.rb +248 -0
  145. data/spec/paperclip/storage/filesystem_spec.rb +79 -0
  146. data/spec/paperclip/storage/fog_spec.rb +545 -0
  147. data/spec/paperclip/storage/s3_live_spec.rb +186 -0
  148. data/spec/paperclip/storage/s3_spec.rb +1583 -0
  149. data/spec/paperclip/style_spec.rb +255 -0
  150. data/spec/paperclip/tempfile_factory_spec.rb +33 -0
  151. data/spec/paperclip/thumbnail_spec.rb +500 -0
  152. data/spec/paperclip/url_generator_spec.rb +211 -0
  153. data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
  154. data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
  155. data/spec/paperclip/validators/attachment_presence_validator_spec.rb +85 -0
  156. data/spec/paperclip/validators/attachment_size_validator_spec.rb +235 -0
  157. data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +52 -0
  158. data/spec/paperclip/validators_spec.rb +164 -0
  159. data/spec/spec_helper.rb +45 -0
  160. data/spec/support/assertions.rb +78 -0
  161. data/spec/support/fake_model.rb +25 -0
  162. data/spec/support/fake_rails.rb +12 -0
  163. data/spec/support/fixtures/12k.png +0 -0
  164. data/spec/support/fixtures/50x50.png +0 -0
  165. data/spec/support/fixtures/5k.png +0 -0
  166. data/spec/support/fixtures/animated +0 -0
  167. data/spec/support/fixtures/animated.gif +0 -0
  168. data/spec/support/fixtures/animated.unknown +0 -0
  169. data/spec/support/fixtures/bad.png +1 -0
  170. data/spec/support/fixtures/empty.html +1 -0
  171. data/spec/support/fixtures/empty.xlsx +0 -0
  172. data/spec/support/fixtures/fog.yml +8 -0
  173. data/spec/support/fixtures/rotated.jpg +0 -0
  174. data/spec/support/fixtures/s3.yml +8 -0
  175. data/spec/support/fixtures/spaced file.jpg +0 -0
  176. data/spec/support/fixtures/spaced file.png +0 -0
  177. data/spec/support/fixtures/text.txt +1 -0
  178. data/spec/support/fixtures/twopage.pdf +0 -0
  179. data/spec/support/fixtures/uppercase.PNG +0 -0
  180. data/spec/support/matchers/accept.rb +5 -0
  181. data/spec/support/matchers/exist.rb +5 -0
  182. data/spec/support/matchers/have_column.rb +23 -0
  183. data/spec/support/mock_attachment.rb +22 -0
  184. data/spec/support/mock_interpolator.rb +24 -0
  185. data/spec/support/mock_url_generator_builder.rb +27 -0
  186. data/spec/support/model_reconstruction.rb +68 -0
  187. data/spec/support/reporting.rb +11 -0
  188. data/spec/support/test_data.rb +13 -0
  189. data/spec/support/version_helper.rb +9 -0
  190. metadata +713 -0
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::DataUriAdapter do
4
+ after do
5
+ if @subject
6
+ @subject.close
7
+ end
8
+ end
9
+
10
+ it 'allows a missing mime-type' do
11
+ adapter = Paperclip.io_adapters.for("data:;base64,#{original_base64_content}")
12
+ assert_equal Paperclip::DataUriAdapter, adapter.class
13
+ end
14
+
15
+ it 'alows mime type that has dot in it' do
16
+ adapter = Paperclip.io_adapters.for("data:image/vnd.microsoft.icon;base64,#{original_base64_content}")
17
+ assert_equal Paperclip::DataUriAdapter, adapter.class
18
+ end
19
+
20
+ context "a new instance" do
21
+ before do
22
+ @contents = "data:image/png;base64,#{original_base64_content}"
23
+ @subject = Paperclip.io_adapters.for(@contents)
24
+ end
25
+
26
+ it "returns a nondescript file name" do
27
+ assert_equal "data", @subject.original_filename
28
+ end
29
+
30
+ it "returns a content type" do
31
+ assert_equal "image/png", @subject.content_type
32
+ end
33
+
34
+ it "returns the size of the data" do
35
+ assert_equal 4456, @subject.size
36
+ end
37
+
38
+ it "generates a correct MD5 hash of the contents" do
39
+ assert_equal(
40
+ Digest::MD5.hexdigest(Base64.decode64(original_base64_content)),
41
+ @subject.fingerprint
42
+ )
43
+ end
44
+
45
+ it "generates correct fingerprint after read" do
46
+ fingerprint = Digest::MD5.hexdigest(@subject.read)
47
+ assert_equal fingerprint, @subject.fingerprint
48
+ end
49
+
50
+ it "generates same fingerprint" do
51
+ assert_equal @subject.fingerprint, @subject.fingerprint
52
+ end
53
+
54
+ it 'accepts a content_type' do
55
+ @subject.content_type = 'image/png'
56
+ assert_equal 'image/png', @subject.content_type
57
+ end
58
+
59
+ it 'accepts an original_filename' do
60
+ @subject.original_filename = 'image.png'
61
+ assert_equal 'image.png', @subject.original_filename
62
+ end
63
+
64
+ it "does not generate filenames that include restricted characters" do
65
+ @subject.original_filename = 'image:restricted.png'
66
+ assert_equal 'image_restricted.png', @subject.original_filename
67
+ end
68
+
69
+ it "does not generate paths that include restricted characters" do
70
+ @subject.original_filename = 'image:restricted.png'
71
+ expect(@subject.path).to_not match(/:/)
72
+ end
73
+
74
+ end
75
+
76
+ def original_base64_content
77
+ Base64.encode64(original_file_contents)
78
+ end
79
+
80
+ def original_file_contents
81
+ @original_file_contents ||= File.read(fixture_file('5k.png'))
82
+ end
83
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::EmptyStringAdapter do
4
+ context 'a new instance' do
5
+ before do
6
+ @subject = Paperclip.io_adapters.for('')
7
+ end
8
+
9
+ it "returns false for a call to nil?" do
10
+ assert !@subject.nil?
11
+ end
12
+
13
+ it 'returns false for a call to assignment?' do
14
+ assert !@subject.assignment?
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::FileAdapter do
4
+ context "a new instance" do
5
+ context "with normal file" do
6
+ before do
7
+ @file = File.new(fixture_file("5k.png"))
8
+ @file.binmode
9
+ end
10
+
11
+ after do
12
+ @file.close
13
+ @subject.close if @subject
14
+ end
15
+
16
+ context 'doing normal things' do
17
+ before do
18
+ @subject = Paperclip.io_adapters.for(@file)
19
+ end
20
+
21
+ it 'uses the original filename to generate the tempfile' do
22
+ assert @subject.path.ends_with?(".png")
23
+ end
24
+
25
+ it "gets the right filename" do
26
+ assert_equal "5k.png", @subject.original_filename
27
+ end
28
+
29
+ it "forces binmode on tempfile" do
30
+ assert @subject.instance_variable_get("@tempfile").binmode?
31
+ end
32
+
33
+ it "gets the content type" do
34
+ assert_equal "image/png", @subject.content_type
35
+ end
36
+
37
+ it "returns content type as a string" do
38
+ expect(@subject.content_type).to be_a String
39
+ end
40
+
41
+ it "gets the file's size" do
42
+ assert_equal 4456, @subject.size
43
+ end
44
+
45
+ it "returns false for a call to nil?" do
46
+ assert ! @subject.nil?
47
+ end
48
+
49
+ it "generates a MD5 hash of the contents" do
50
+ expected = Digest::MD5.file(@file.path).to_s
51
+ assert_equal expected, @subject.fingerprint
52
+ end
53
+
54
+ it "reads the contents of the file" do
55
+ expected = @file.read
56
+ assert expected.length > 0
57
+ assert_equal expected, @subject.read
58
+ end
59
+ end
60
+
61
+ context "file with multiple possible content type" do
62
+ before do
63
+ MIME::Types.stubs(:type_for).returns([MIME::Type.new('image/x-png'), MIME::Type.new('image/png')])
64
+ @subject = Paperclip.io_adapters.for(@file)
65
+ end
66
+
67
+ it "prefers officially registered mime type" do
68
+ assert_equal "image/png", @subject.content_type
69
+ end
70
+
71
+ it "returns content type as a string" do
72
+ expect(@subject.content_type).to be_a String
73
+ end
74
+ end
75
+
76
+ context "file with content type derived from file contents on *nix" do
77
+ before do
78
+ MIME::Types.stubs(:type_for).returns([])
79
+ Paperclip.stubs(:run).returns("application/vnd.ms-office\n")
80
+ Paperclip::ContentTypeDetector.any_instance
81
+ .stubs(:type_from_mime_magic).returns("application/vnd.ms-office")
82
+
83
+ @subject = Paperclip.io_adapters.for(@file)
84
+ end
85
+
86
+ it "returns content type without newline character" do
87
+ assert_equal "application/vnd.ms-office", @subject.content_type
88
+ end
89
+ end
90
+ end
91
+
92
+ context "filename with restricted characters" do
93
+ before do
94
+ @file = File.open(fixture_file("animated.gif")) do |file|
95
+ StringIO.new(file.read)
96
+ end
97
+ @file.stubs(:original_filename).returns('image:restricted.gif')
98
+ @subject = Paperclip.io_adapters.for(@file)
99
+ end
100
+
101
+ after do
102
+ @file.close
103
+ @subject.close
104
+ end
105
+
106
+ it "does not generate filenames that include restricted characters" do
107
+ assert_equal 'image_restricted.gif', @subject.original_filename
108
+ end
109
+
110
+ it "does not generate paths that include restricted characters" do
111
+ expect(@subject.path).to_not match(/:/)
112
+ end
113
+ end
114
+
115
+ context "empty file" do
116
+ before do
117
+ @file = Tempfile.new("file_adapter_test")
118
+ @subject = Paperclip.io_adapters.for(@file)
119
+ end
120
+
121
+ after do
122
+ @file.close
123
+ @subject.close
124
+ end
125
+
126
+ it "provides correct mime-type" do
127
+ assert_match %r{.*/x-empty}, @subject.content_type
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::HttpUrlProxyAdapter 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::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(@open_return)
9
+ @url = "http://thoughtbot.com/images/thoughtbot-logo.png"
10
+ @subject = Paperclip.io_adapters.for(@url)
11
+ end
12
+
13
+ after do
14
+ @subject.close
15
+ end
16
+
17
+ it "returns a file name" do
18
+ assert_equal "thoughtbot-logo.png", @subject.original_filename
19
+ end
20
+
21
+ it 'closes open handle after reading' do
22
+ assert_equal true, @open_return.closed?
23
+ end
24
+
25
+ it "returns a content type" do
26
+ assert_equal "image/png", @subject.content_type
27
+ end
28
+
29
+ it "returns the size of the data" do
30
+ assert_equal @open_return.size, @subject.size
31
+ end
32
+
33
+ it "generates an MD5 hash of the contents" do
34
+ assert_equal Digest::MD5.hexdigest("xxx"), @subject.fingerprint
35
+ end
36
+
37
+ it "generates correct fingerprint after read" do
38
+ fingerprint = Digest::MD5.hexdigest(@subject.read)
39
+ assert_equal fingerprint, @subject.fingerprint
40
+ end
41
+
42
+ it "generates same fingerprint" do
43
+ assert_equal @subject.fingerprint, @subject.fingerprint
44
+ end
45
+
46
+ it "returns the data contained in the StringIO" do
47
+ assert_equal "xxx", @subject.read
48
+ end
49
+
50
+ it 'accepts a content_type' do
51
+ @subject.content_type = 'image/png'
52
+ assert_equal 'image/png', @subject.content_type
53
+ end
54
+
55
+ it 'accepts an original_filename' do
56
+ @subject.original_filename = 'image.png'
57
+ assert_equal 'image.png', @subject.original_filename
58
+ end
59
+ end
60
+
61
+ context "a url with query params" do
62
+ before do
63
+ Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
64
+ @url = "https://github.com/thoughtbot/paperclip?file=test"
65
+ @subject = Paperclip.io_adapters.for(@url)
66
+ end
67
+
68
+ after do
69
+ @subject.close
70
+ end
71
+
72
+ it "returns a file name" do
73
+ assert_equal "paperclip", @subject.original_filename
74
+ end
75
+ end
76
+
77
+ context "a url with restricted characters in the filename" do
78
+ before do
79
+ Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
80
+ @url = "https://github.com/thoughtbot/paper:clip.jpg"
81
+ @subject = Paperclip.io_adapters.for(@url)
82
+ end
83
+
84
+ after do
85
+ begin
86
+ @subject.close
87
+ rescue Exception
88
+ true
89
+ end
90
+ end
91
+
92
+ it "does not generate filenames that include restricted characters" do
93
+ assert_equal "paper_clip.jpg", @subject.original_filename
94
+ end
95
+
96
+ it "does not generate paths that include restricted characters" do
97
+ expect(@subject.path).to_not match(/:/)
98
+ end
99
+ end
100
+
101
+ context "a url with special characters in the filename" do
102
+ it "returns a encoded filename" do
103
+ Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).
104
+ returns(StringIO.new("x"))
105
+ url = "https://github.com/thoughtbot/paperclip-öäü字´½♥زÈ.png"
106
+ subject = Paperclip.io_adapters.for(url)
107
+ filename = "paperclip-%C3%B6%C3%A4%C3%BC%E5%AD%97%C2%B4%C2%BD%E2%99%A5"\
108
+ "%C3%98%C2%B2%C3%88.png"
109
+
110
+ assert_equal filename, subject.original_filename
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::IdentityAdapter do
4
+ it "responds to #new by returning the argument" do
5
+ adapter = Paperclip::IdentityAdapter.new
6
+ assert_equal :target, adapter.new(:target)
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::NilAdapter do
4
+ context 'a new instance' do
5
+ before do
6
+ @subject = Paperclip.io_adapters.for(nil)
7
+ end
8
+
9
+ it "gets the right filename" do
10
+ assert_equal "", @subject.original_filename
11
+ end
12
+
13
+ it "gets the content type" do
14
+ assert_equal "", @subject.content_type
15
+ end
16
+
17
+ it "gets the file's size" do
18
+ assert_equal 0, @subject.size
19
+ end
20
+
21
+ it "returns true for a call to nil?" do
22
+ assert @subject.nil?
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::AttachmentRegistry do
4
+ context "for" do
5
+ before do
6
+ class AdapterTest
7
+ def initialize(target); end
8
+ end
9
+ @subject = Paperclip::AdapterRegistry.new
10
+ @subject.register(AdapterTest){|t| Symbol === t }
11
+ end
12
+
13
+ it "returns the class registered for the adapted type" do
14
+ assert_equal AdapterTest, @subject.for(:target).class
15
+ end
16
+ end
17
+
18
+ context "registered?" do
19
+ before do
20
+ class AdapterTest
21
+ def initialize(target); end
22
+ end
23
+ @subject = Paperclip::AdapterRegistry.new
24
+ @subject.register(AdapterTest){|t| Symbol === t }
25
+ end
26
+
27
+ it "returns true when the class of this adapter has been registered" do
28
+ assert @subject.registered?(AdapterTest.new(:target))
29
+ end
30
+
31
+ it "returns false when the adapter has not been registered" do
32
+ assert ! @subject.registered?(Object)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Paperclip::StringioAdapter do
4
+ context "a new instance" do
5
+ before do
6
+ @contents = "abc123"
7
+ @stringio = StringIO.new(@contents)
8
+ @subject = Paperclip.io_adapters.for(@stringio)
9
+ end
10
+
11
+ it "returns a file name" do
12
+ assert_equal "data", @subject.original_filename
13
+ end
14
+
15
+ it "returns a content type" do
16
+ assert_equal "text/plain", @subject.content_type
17
+ end
18
+
19
+ it "returns the size of the data" do
20
+ assert_equal 6, @subject.size
21
+ end
22
+
23
+ it "returns the length of the data" do
24
+ assert_equal 6, @subject.length
25
+ end
26
+
27
+ it "generates an MD5 hash of the contents" do
28
+ assert_equal Digest::MD5.hexdigest(@contents), @subject.fingerprint
29
+ end
30
+
31
+ it "generates correct fingerprint after read" do
32
+ fingerprint = Digest::MD5.hexdigest(@subject.read)
33
+ assert_equal fingerprint, @subject.fingerprint
34
+ end
35
+
36
+ it "generates same fingerprint" do
37
+ assert_equal @subject.fingerprint, @subject.fingerprint
38
+ end
39
+
40
+ it "returns the data contained in the StringIO" do
41
+ assert_equal "abc123", @subject.read
42
+ end
43
+
44
+ it 'accepts a content_type' do
45
+ @subject.content_type = 'image/png'
46
+ assert_equal 'image/png', @subject.content_type
47
+ end
48
+
49
+ it 'accepts an original_filename' do
50
+ @subject.original_filename = 'image.png'
51
+ assert_equal 'image.png', @subject.original_filename
52
+ end
53
+
54
+ it "does not generate filenames that include restricted characters" do
55
+ @subject.original_filename = 'image:restricted.png'
56
+ assert_equal 'image_restricted.png', @subject.original_filename
57
+ end
58
+
59
+ it "does not generate paths that include restricted characters" do
60
+ @subject.original_filename = 'image:restricted.png'
61
+ expect(@subject.path).to_not match(/:/)
62
+ end
63
+ end
64
+ end