1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionpack/test/dispatch/uploaded_file_test.rb

120 lines
3.7 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
require "abstract_unit"
2010-10-04 19:30:16 -04:00
module ActionDispatch
class UploadedFileTest < ActiveSupport::TestCase
def test_constructor_with_argument_error
assert_raises(ArgumentError) do
Http::UploadedFile.new({})
end
end
2010-10-04 19:30:16 -04:00
def test_original_filename
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(filename: "foo", tempfile: Object.new)
assert_equal "foo", uf.original_filename
2010-10-04 19:30:16 -04:00
end
def test_filename_is_different_object
file_str = "foo"
uf = Http::UploadedFile.new(filename: file_str, tempfile: Object.new)
assert_not_equal file_str.object_id, uf.original_filename.object_id
end
def test_filename_should_be_in_utf_8
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(filename: "foo", tempfile: Object.new)
assert_equal "UTF-8", uf.original_filename.encoding.to_s
end
2010-10-04 19:30:16 -04:00
def test_filename_should_always_be_in_utf_8
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(filename: "foo".encode(Encoding::SHIFT_JIS),
tempfile: Object.new)
assert_equal "UTF-8", uf.original_filename.encoding.to_s
end
2010-10-04 19:30:16 -04:00
def test_content_type
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(type: "foo", tempfile: Object.new)
assert_equal "foo", uf.content_type
2010-10-04 19:30:16 -04:00
end
def test_headers
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(head: "foo", tempfile: Object.new)
assert_equal "foo", uf.headers
2010-10-04 19:30:16 -04:00
end
def test_tempfile
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: "foo")
assert_equal "foo", uf.tempfile
2010-10-04 19:30:16 -04:00
end
2014-04-17 13:49:02 -04:00
def test_to_io_returns_the_tempfile
tf = Object.new
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf)
assert_equal tf, uf.to_io
end
def test_delegates_path_to_tempfile
tf = Class.new { def path; "thunderhorse" end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal "thunderhorse", uf.path
end
def test_delegates_open_to_tempfile
tf = Class.new { def open; "thunderhorse" end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal "thunderhorse", uf.open
end
def test_delegates_close_to_tempfile
tf = Class.new { def close(unlink_now = false); "thunderhorse" end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal "thunderhorse", uf.close
end
def test_close_accepts_parameter
tf = Class.new { def close(unlink_now = false); "thunderhorse: #{unlink_now}" end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal "thunderhorse: true", uf.close(true)
end
2012-09-22 18:50:30 -04:00
def test_delegates_read_to_tempfile
tf = Class.new { def read(length = nil, buffer = nil); "thunderhorse" end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal "thunderhorse", uf.read
end
2012-09-22 18:50:30 -04:00
def test_delegates_read_to_tempfile_with_params
tf = Class.new { def read(length = nil, buffer = nil); [length, buffer] end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal %w{ thunder horse }, uf.read(*%w{ thunder horse })
end
2010-10-04 20:11:50 -04:00
def test_delegate_respects_respond_to?
tf = Class.new { def read; yield end; private :read }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
2010-10-04 20:11:50 -04:00
assert_raises(NoMethodError) do
uf.read
2010-10-04 20:11:50 -04:00
end
end
def test_delegate_eof_to_tempfile
tf = Class.new { def eof?; true end; }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_predicate uf, :eof?
end
Add implicit to path conversion to uploaded file (#28676) * Add implicit to path conversion to uploaded file Ruby has a few implicit conversion protocols (e.g. `to_hash`, `to_str`, `to_path`, etc.). These are considered implicit conversion protocols because in certain instances Ruby (MRI core objects) will check if an argument responds to the appropriate protocol and automatically convert it when it does; this is why you can provide a `Pathname` instance into `File.read` without having to explicitly call `to_s`. ```ruby a_file_path = 'some/path/file.ext' File.write a_file_path, 'String Path Content' File.read a_file_path a_pathname = Pathname(a_file_path) File.write core_file, 'Pathname Content' File.read a_file_path core_file = File.new(a_pathname) File.write core_file, 'File Content' File.read core_file tmp_file = Tempfile.new('example') File.write tmp_file, 'Tempfile Content' File.read tmp_file ``` So how does an uploaded file work in such cases? ```ruby tmp_file = Tempfile.new('example') File.write tmp_file, 'Uploaded Content' uploaded_file = ActionDispatch::Http::UploadedFile.new(tempfile: tmp_file) File.read uploaded_file ``` It fails with a `TypeError`: no implicit conversion of ActionDispatch::Http::UploadedFile into String In order to make an uploaded file work it must be explicitly converted to a file path using `path`. ```ruby File.read uploaded_file.path ``` This requires any code that expects path/file like objects to either special case an uploaded file, re-implement the path conversion protocol to use `path`, or forces the developer to explicitly cast uploaded files to paths. This last option can sometimes be difficult to do when such calls are deep within the inner workings of libraries. Since an uploaded file already has a path it makes sense to implement the implicit "path" conversion protocol (just like `File` and `Tempfile`). This change allows uploaded file content to be treated more closely to regular file content, without requiring any special case handling or explicit conversion for common file utilities. * Note uploaded file path delegation in CHANGELOG
2018-07-22 04:00:40 -04:00
def test_delegate_to_path_to_tempfile
tf = Class.new { def to_path; "/any/file/path" end; }
uf = Http::UploadedFile.new(tempfile: tf.new)
assert_equal "/any/file/path", uf.to_path
end
2010-10-04 20:11:50 -04:00
def test_respond_to?
tf = Class.new { def read; yield end }
2016-08-06 13:35:13 -04:00
uf = Http::UploadedFile.new(tempfile: tf.new)
2018-01-24 21:14:10 -05:00
assert_respond_to uf, :headers
assert_respond_to uf, :read
2010-10-04 20:11:50 -04:00
end
2010-10-04 19:30:16 -04:00
end
end