зеркало из https://github.com/github/aws-s3.git
205 строки
6.4 KiB
Ruby
205 строки
6.4 KiB
Ruby
require File.dirname(__FILE__) + '/test_helper'
|
|
|
|
class ObjectTest < Test::Unit::TestCase
|
|
def setup
|
|
bucket = Bucket.new(Parsing::XmlParser.new(Fixtures::Buckets.bucket_with_one_key))
|
|
@object = bucket.objects.first
|
|
end
|
|
|
|
def test_header_settings_reader_and_writer
|
|
headers = {'content-type' => 'text/plain'}
|
|
mock_connection_for(S3Object, :returns => {:headers => headers})
|
|
|
|
assert_nothing_raised do
|
|
@object.content_type
|
|
end
|
|
|
|
assert_equal 'text/plain', @object.content_type
|
|
|
|
assert_nothing_raised do
|
|
@object.content_type = 'image/jpg'
|
|
end
|
|
|
|
assert_equal 'image/jpg', @object.content_type
|
|
|
|
assert_raises(NoMethodError) do
|
|
@object.non_existant_header_setting
|
|
end
|
|
end
|
|
|
|
def test_key_name_validation
|
|
assert_raises(InvalidKeyName) do
|
|
S3Object.create(nil, '', 'marcel')
|
|
end
|
|
|
|
assert_raises(InvalidKeyName) do
|
|
huge_name = 'a' * 1500
|
|
S3Object.create(huge_name, '', 'marcel')
|
|
end
|
|
end
|
|
|
|
def test_content_type_inference
|
|
[
|
|
['foo.jpg', {}, 'image/jpeg'],
|
|
['foo.txt', {}, 'text/plain'],
|
|
['foo', {}, nil],
|
|
['foo.asdf', {}, nil],
|
|
['foo.jpg', {:content_type => nil}, nil],
|
|
['foo', {:content_type => 'image/jpg'}, 'image/jpg'],
|
|
['foo.jpg', {:content_type => 'image/png'}, 'image/png'],
|
|
['foo.asdf', {:content_type => 'image/jpg'}, 'image/jpg']
|
|
].each do |key, options, content_type|
|
|
S3Object.send(:infer_content_type!, key, options)
|
|
assert_equal content_type, options[:content_type]
|
|
end
|
|
end
|
|
|
|
def test_object_has_owner
|
|
assert_kind_of Owner, @object.owner
|
|
end
|
|
|
|
def test_owner_attributes_are_accessible
|
|
owner = @object.owner
|
|
assert owner.id
|
|
assert owner.display_name
|
|
assert_equal 'bb2041a25975c3d4ce9775fe9e93e5b77a6a9fad97dc7e00686191f3790b13f1', owner.id
|
|
assert_equal 'mmolina@onramp.net', owner.display_name
|
|
end
|
|
|
|
def test_only_valid_attributes_accessible
|
|
assert_raises(NoMethodError) do
|
|
@object.owner.foo
|
|
end
|
|
end
|
|
|
|
def test_fetching_object_value_generates_value_object
|
|
mock_connection_for(S3Object, :returns => {:body => 'hello!'})
|
|
value = S3Object.value('foo', 'bar')
|
|
assert_kind_of S3Object::Value, value
|
|
assert_equal 'hello!', value
|
|
end
|
|
|
|
def test_fetching_file_by_name_raises_when_heuristic_fails
|
|
mock_connection_for(Bucket, :returns => {:body => Fixtures::Buckets.bucket_with_one_key})
|
|
assert_raises(NoSuchKey) do
|
|
S3Object.find('not_tongue_overload.jpg', 'marcel_molina')
|
|
end
|
|
|
|
object = nil # Block scoping
|
|
assert_nothing_raised do
|
|
object = S3Object.find('tongue_overload.jpg', 'marcel_molina')
|
|
end
|
|
assert_kind_of S3Object, object
|
|
assert_equal 'tongue_overload.jpg', object.key
|
|
end
|
|
|
|
def test_about
|
|
headers = {'content-size' => '12345', 'date' => Time.now.httpdate, 'content-type' => 'application/xml'}
|
|
mock_connection_for(S3Object, :returns => [
|
|
{:headers => headers},
|
|
{:code => 404}
|
|
]
|
|
)
|
|
about = S3Object.about('foo', 'bar')
|
|
assert_kind_of S3Object::About, about
|
|
assert_equal headers, about
|
|
|
|
assert_raises(NoSuchKey) do
|
|
S3Object.about('foo', 'bar')
|
|
end
|
|
end
|
|
|
|
def test_can_tell_that_an_s3object_does_not_exist
|
|
mock_connection_for(S3Object, :returns => {:code => 404})
|
|
assert_equal false, S3Object.exists?('foo', 'bar')
|
|
end
|
|
|
|
def test_can_tell_that_an_s3object_exists
|
|
mock_connection_for(S3Object, :returns => {:code => 200})
|
|
assert_equal true, S3Object.exists?('foo', 'bar')
|
|
end
|
|
|
|
def test_s3object_equality
|
|
mock_connection_for(Bucket, :returns => {:body => Fixtures::Buckets.bucket_with_more_than_one_key})
|
|
file1, file2 = Bucket.objects('does not matter')
|
|
assert file1 == file1
|
|
assert file2 == file2
|
|
assert !(file1 == file2) # /!\ Parens required /!\
|
|
end
|
|
|
|
def test_inspect
|
|
mock_connection_for(Bucket, :returns => {:body => Fixtures::Buckets.bucket_with_one_key})
|
|
object = S3Object.find('tongue_overload.jpg', 'bucket does not matter')
|
|
assert object.path
|
|
assert_nothing_raised { object.inspect }
|
|
assert object.inspect[object.path]
|
|
end
|
|
|
|
def test_etag
|
|
mock_connection_for(Bucket, :returns => {:body => Fixtures::Buckets.bucket_with_one_key})
|
|
file = S3Object.find('tongue_overload.jpg', 'bucket does not matter')
|
|
assert file.etag
|
|
assert_equal 'f21f7c4e8ea6e34b268887b07d6da745', file.etag
|
|
end
|
|
|
|
def test_fetching_information_about_an_object_that_does_not_exist_raises_no_such_key
|
|
mock_connection_for(S3Object, :returns => {:body => '', :code => 404})
|
|
assert_raises(NoSuchKey) do
|
|
S3Object.about('asdfasdfasdfas-this-does-not-exist', 'bucket does not matter')
|
|
end
|
|
end
|
|
end
|
|
|
|
class MetadataTest < Test::Unit::TestCase
|
|
def setup
|
|
@metadata = S3Object::Metadata.new(Fixtures::Headers.headers_including_one_piece_of_metadata)
|
|
end
|
|
|
|
def test_only_metadata_is_extracted
|
|
assert @metadata.to_headers.size == 1
|
|
assert @metadata.to_headers['x-amz-meta-test']
|
|
assert_equal 'foo', @metadata.to_headers['x-amz-meta-test']
|
|
end
|
|
|
|
def test_setting_new_metadata_normalizes_name
|
|
@metadata[:bar] = 'baz'
|
|
assert @metadata.to_headers.include?('x-amz-meta-bar')
|
|
@metadata['baz'] = 'quux'
|
|
assert @metadata.to_headers.include?('x-amz-meta-baz')
|
|
@metadata['x-amz-meta-quux'] = 'whatever'
|
|
assert @metadata.to_headers.include?('x-amz-meta-quux')
|
|
end
|
|
|
|
def test_clobbering_existing_header
|
|
@metadata[:bar] = 'baz'
|
|
assert_equal 'baz', @metadata.to_headers['x-amz-meta-bar']
|
|
@metadata[:bar] = 'quux'
|
|
assert_equal 'quux', @metadata.to_headers['x-amz-meta-bar']
|
|
@metadata['bar'] = 'foo'
|
|
assert_equal 'foo', @metadata.to_headers['x-amz-meta-bar']
|
|
@metadata['x-amz-meta-bar'] = 'bar'
|
|
assert_equal 'bar', @metadata.to_headers['x-amz-meta-bar']
|
|
end
|
|
|
|
def test_invalid_metadata
|
|
@metadata[:invalid_header] = ' ' * (S3Object::Metadata::SIZE_LIMIT + 1)
|
|
assert_raises InvalidMetadataValue do
|
|
@metadata.to_headers
|
|
end
|
|
end
|
|
end
|
|
|
|
class ValueTest < Test::Unit::TestCase
|
|
def setup
|
|
@response = FakeResponse.new(:body => 'hello there')
|
|
@value = S3Object::Value.new(@response)
|
|
end
|
|
|
|
def test_value_is_set_to_response_body
|
|
assert_equal @response.body, @value
|
|
end
|
|
|
|
def test_response_is_accessible_from_value_object
|
|
assert_equal @response, @value.response
|
|
end
|
|
end |