83 lines
2.4 KiB
Ruby
83 lines
2.4 KiB
Ruby
require 'minitest/autorun'
|
|
require 'prism'
|
|
require 'tmpdir'
|
|
|
|
class HttpRangeTest < Minitest::Test
|
|
def test_no_header_returns_nil
|
|
assert_nil Prism::HttpRange.parse(nil, 100)
|
|
end
|
|
|
|
def test_non_bytes_unit_is_ignored
|
|
assert_nil Prism::HttpRange.parse('items=0-1', 100)
|
|
end
|
|
|
|
def test_multi_range_is_ignored_not_unsatisfiable
|
|
assert_nil Prism::HttpRange.parse('bytes=0-10,20-30', 100)
|
|
end
|
|
|
|
def test_simple_start_end
|
|
result = Prism::HttpRange.parse('bytes=0-9', 100)
|
|
assert_equal 0, result.start
|
|
assert_equal 9, result.finish
|
|
assert_equal 10, result.length
|
|
end
|
|
|
|
def test_open_ended_range_clamps_to_file_size
|
|
result = Prism::HttpRange.parse('bytes=90-', 100)
|
|
assert_equal 90, result.start
|
|
assert_equal 99, result.finish
|
|
assert_equal 10, result.length
|
|
end
|
|
|
|
def test_end_beyond_file_size_is_clamped_not_rejected
|
|
result = Prism::HttpRange.parse('bytes=0-999', 100)
|
|
assert_equal 99, result.finish
|
|
end
|
|
|
|
def test_suffix_range_returns_last_n_bytes
|
|
result = Prism::HttpRange.parse('bytes=-10', 100)
|
|
assert_equal 90, result.start
|
|
assert_equal 99, result.finish
|
|
assert_equal 10, result.length
|
|
end
|
|
|
|
def test_suffix_range_larger_than_file_clamps_to_whole_file
|
|
result = Prism::HttpRange.parse('bytes=-1000', 100)
|
|
assert_equal 0, result.start
|
|
assert_equal 99, result.finish
|
|
end
|
|
|
|
def test_start_beyond_file_size_is_unsatisfiable
|
|
assert_equal :unsatisfiable, Prism::HttpRange.parse('bytes=100-200', 100)
|
|
end
|
|
|
|
def test_start_after_end_is_unsatisfiable
|
|
assert_equal :unsatisfiable, Prism::HttpRange.parse('bytes=50-10', 100)
|
|
end
|
|
|
|
def test_empty_start_and_end_is_unsatisfiable
|
|
assert_equal :unsatisfiable, Prism::HttpRange.parse('bytes=-', 100)
|
|
end
|
|
|
|
def test_garbage_spec_is_unsatisfiable
|
|
assert_equal :unsatisfiable, Prism::HttpRange.parse('bytes=abc-def', 100)
|
|
end
|
|
|
|
def test_zero_length_suffix_is_unsatisfiable
|
|
assert_equal :unsatisfiable, Prism::HttpRange.parse('bytes=-0', 100)
|
|
end
|
|
|
|
def test_empty_file_is_always_unsatisfiable
|
|
assert_equal :unsatisfiable, Prism::HttpRange.parse('bytes=0-0', 0)
|
|
end
|
|
|
|
def test_read_slice_returns_only_the_requested_bytes
|
|
Dir.mktmpdir do |dir|
|
|
path = File.join(dir, 'data.bin')
|
|
File.binwrite(path, '0123456789')
|
|
slice = Prism::HttpRange.parse('bytes=2-5', 10)
|
|
assert_equal '2345', Prism::HttpRange.read_slice(path, slice)
|
|
end
|
|
end
|
|
end
|