From 7513d5eb9871266a253c10d0dee3190f7ba1a188 Mon Sep 17 00:00:00 2001 From: Wesley Beary Date: Wed, 2 Sep 2009 20:17:53 -0700 Subject: [PATCH] flesh out the rest of the s3 model specs (and fix the errors I found along the way) --- lib/fog/aws/models/s3/bucket.rb | 20 +++---- lib/fog/aws/models/s3/object.rb | 26 ++++---- lib/fog/aws/models/s3/objects.rb | 33 +++++----- lib/fog/aws/models/s3/owner.rb | 8 +-- spec/aws/models/s3/bucket_spec.rb | 25 ++++++-- spec/aws/models/s3/object_spec.rb | 96 ++++++++++++++++++++++++++---- spec/aws/models/s3/objects_spec.rb | 34 +++++++---- spec/aws/models/s3/owner_spec.rb | 11 +++- 8 files changed, 177 insertions(+), 76 deletions(-) diff --git a/lib/fog/aws/models/s3/bucket.rb b/lib/fog/aws/models/s3/bucket.rb index a3651d361..199c20b23 100644 --- a/lib/fog/aws/models/s3/bucket.rb +++ b/lib/fog/aws/models/s3/bucket.rb @@ -18,7 +18,7 @@ module Fog end def destroy - connection.delete_bucket(name) + connection.delete_bucket(@name) buckets.delete(name) true rescue Fog::Errors::NotFound @@ -26,10 +26,8 @@ module Fog end def location - @location ||= begin - data = s3.get_bucket_location(name) - data.body['LocationConstraint'] - end + data = s3.get_bucket_location(@name) + data.body['LocationConstraint'] end def objects @@ -42,19 +40,17 @@ module Fog end def payer - @payer ||= begin - data = connection.get_request_payment(name) - data.body['Payer'] - end + data = connection.get_request_payment(@name) + data.body['Payer'] end def payer=(new_payer) - connection.put_request_payment(name, new_payer) + connection.put_request_payment(@name, new_payer) @payer = new_payer end def reload - new_attributes = buckets.get(name).attributes + new_attributes = buckets.get(@name).attributes merge_attributes(new_attributes) end @@ -63,7 +59,7 @@ module Fog if @location options['LocationConstraint'] = @location end - connection.put_bucket(name, options) + connection.put_bucket(@name, options) buckets[name] = self true end diff --git a/lib/fog/aws/models/s3/object.rb b/lib/fog/aws/models/s3/object.rb index d6a43981a..613c0055b 100644 --- a/lib/fog/aws/models/s3/object.rb +++ b/lib/fog/aws/models/s3/object.rb @@ -23,9 +23,9 @@ module Fog end def copy(target_bucket_name, target_object_key) - data = connection.copy_object(bucket.name, key, target_bucket_name, target_object_key).body + data = connection.copy_object(bucket.name, @key, target_bucket_name, target_object_key).body target_bucket = connection.buckets.new(:name => target_bucket_name) - target_object = target_bucket.objects.new(attributes) + target_object = target_bucket.objects.new(attributes.merge!(:key => target_object_key)) copy_data = {} for key, value in data if ['ETag', 'LastModified'].include?(key) @@ -33,25 +33,29 @@ module Fog end end target_object.merge_attributes(copy_data) + target_object.objects[target_object_key] = target_object + target_object end def destroy - connection.delete_object(bucket.name, key) - objects.delete(key) + connection.delete_object(bucket.name, @key) + objects.delete(@key) true - rescue Fog::Errors::NotFound - false + end + + def objects + @objects end def reload - new_attributes = objects.get(key).attributes + new_attributes = objects.get(@key).attributes merge_attributes(new_attributes) end def save(options = {}) - data = connection.put_object(bucket.name, key, body, options) + data = connection.put_object(bucket.name, @key, @body, options) @etag = data.headers['ETag'] - objects[key] = self + objects[@key] = self true end @@ -61,10 +65,6 @@ module Fog @bucket = new_bucket end - def objects - @objects - end - def objects=(new_objects) @objects = new_objects end diff --git a/lib/fog/aws/models/s3/objects.rb b/lib/fog/aws/models/s3/objects.rb index e860b9d28..76c54a8cc 100644 --- a/lib/fog/aws/models/s3/objects.rb +++ b/lib/fog/aws/models/s3/objects.rb @@ -35,7 +35,10 @@ module Fog def get(key, options = {}) data = connection.get_object(bucket.name, key, options) - object_data = { :body => data.body} + object_data = { + :body => data.body, + :key => key + } for key, value in data.headers if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key) object_data[key] = value @@ -51,22 +54,22 @@ module Fog end def head(key, options = {}) - self[key] ||= begin - data = connection.head_object(bucket.name, key, options) - object_data = {} - for key, value in data.headers - if ['Content-Length', 'Content-Type', 'ETag', 'Last-Modified'].include?(key) - object_data[key] = value - end + data = connection.head_object(bucket.name, key, options) + object_data = { + :key => key + } + for key, value in data.headers + if ['Content-Length', 'ETag', 'Last-Modified'].include?(key) + object_data[key] = value end - self[object_data['key']] = Fog::AWS::S3::Object.new({ - :bucket => bucket, - :connection => connection, - :objects => self - }.merge!(object_data)) - rescue Fog::Errors::NotFound - nil end + self[object_data['key']] = Fog::AWS::S3::Object.new({ + :bucket => bucket, + :connection => connection, + :objects => self + }.merge!(object_data)) + rescue Fog::Errors::NotFound + nil end def new(attributes = {}) diff --git a/lib/fog/aws/models/s3/owner.rb b/lib/fog/aws/models/s3/owner.rb index 6483d76a1..86eb22abd 100644 --- a/lib/fog/aws/models/s3/owner.rb +++ b/lib/fog/aws/models/s3/owner.rb @@ -4,14 +4,10 @@ module Fog class Owner < Fog::Model - attr_accessor :display_name, - :id + attribute :display_name, 'DisplayName' + attribute :id, 'ID' def initialize(attributes = {}) - remap_attributes(attributes, { - 'DisplayName' => :display_name, - 'ID' => :id - }) super end diff --git a/spec/aws/models/s3/bucket_spec.rb b/spec/aws/models/s3/bucket_spec.rb index 09e58f20a..7058783d4 100644 --- a/spec/aws/models/s3/bucket_spec.rb +++ b/spec/aws/models/s3/bucket_spec.rb @@ -31,12 +31,12 @@ describe 'Fog::AWS::S3::Bucket' do describe "#destroy" do - it "should return true if the object is deleted" do + it "should return true if the bucket is deleted" do bucket = s3.buckets.create(:name => 'fogmodelbucket') bucket.destroy.should be_true end - it "should return false if the object does not exist" do + it "should return false if the bucket does not exist" do bucket = s3.buckets.new(:name => 'fogmodelbucket') bucket.destroy.should be_false end @@ -45,7 +45,11 @@ describe 'Fog::AWS::S3::Bucket' do describe "#location" do - it "should return the location constraint" + it "should return the location constraint" do + bucket = s3.buckets.create(:name => 'fogmodeleubucket', :location => 'EU') + bucket.location.should == 'EU' + eu_s3.buckets.new(:name => 'fogmodeleubucket').destroy + end end @@ -60,13 +64,21 @@ describe 'Fog::AWS::S3::Bucket' do describe "#payer" do - it "should return the request payment value" + it "should return the request payment value" do + bucket = s3.buckets.create(:name => 'fogmodelbucket') + bucket.payer.should == 'BucketOwner' + bucket.destroy.should be_true + end end describe "#payer=" do - it "should set the request payment value" + it "should set the request payment value" do + bucket = s3.buckets.create(:name => 'fogmodelbucket') + (bucket.payer = 'Requester').should == 'Requester' + bucket.destroy.should + end end @@ -85,7 +97,8 @@ describe 'Fog::AWS::S3::Bucket' do @reloaded.should be_a(Fog::AWS::S3::Bucket) end - it "should have the same attributes as the bucket that created it" do + it "should reset attributes to remote state" do + @bucket.creation_date = Time.now @bucket.attributes.should == @reloaded.attributes end diff --git a/spec/aws/models/s3/object_spec.rb b/spec/aws/models/s3/object_spec.rb index 6345659f8..f1dd45610 100644 --- a/spec/aws/models/s3/object_spec.rb +++ b/spec/aws/models/s3/object_spec.rb @@ -2,45 +2,119 @@ require File.dirname(__FILE__) + '/../../../spec_helper' describe 'S3::Object' do + before(:each) do + @bucket = s3.buckets.create(:name => 'fogbucketname') + end + + after(:each) do + @bucket.destroy + end + describe "#initialize" do - it "should remap attributes from parser" + it "should remap attributes from parser" do + now = Time.now + bucket = Fog::AWS::S3::Object.new( + 'Content-Length' => 10, + 'Content-Type' => 'contenttype', + 'Etag' => 'etag', + 'Key' => 'key', + 'Last-Modified' => now, + 'Size' => 10, + 'StorageClass' => 'storageclass' + ) + bucket.content_length == 10 + bucket.content_type.should == 'contenttype' + bucket.etag.should == 'etag' + bucket.key.should == 'key' + bucket.last_modified.should == now + bucket.size.should == 10 + bucket.storage_class.should == 'storageclass' + + bucket = Fog::AWS::S3::Object.new( + 'ETag' => 'etag', + 'LastModified' => now + ) + bucket.etag.should == 'etag' + bucket.last_modified.should == now + end end describe "#bucket" do - it "should return an S3::Bucket" + before(:each) do + @object = @bucket.objects.new(:key => 'foo') + end + + + it "should return an S3::Bucket" do + @object.bucket.should be_a(Fog::AWS::S3::Bucket) + end + + it "should be the bucket the object is related to" do + @object.bucket.should == @bucket + end end describe "#copy" do - it "should return an S3::Object" + it "should return a Fog::AWS::S3::Object with matching attributes" do + other_bucket = s3.buckets.create(:name => 'fogotherbucketname') + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.create(:key => 'fogobjectname', :body => file) + other_object = object.copy('fogotherbucketname', 'fogotherobjectname') + object.reload.attributes.reject{|key,value| [:key, :last_modified].include?(key)}.should == other_object.reload.attributes.reject{|key,value| [:key, :last_modified].include?(key)} + other_object.destroy + object.destroy + other_bucket.destroy + end end describe "#destroy" do - it "should return the success value" + it "should return true if the object is deleted" do + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.create(:key => 'fogobjectname', :body => file) + object.destroy.should be_true + end - end - - describe "#location" do - - it "should return the location constraint" + it "should return true if the object does not exist" do + object = @bucket.objects.new(:key => 'fogobjectname') + object.destroy.should be_true + end end describe "#reload" do - it "should reload from s3" + it "should return a Fog::AWS::S3::Object" do + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.create(:key => 'fogobjectname', :body => file) + # object.reload.should be_a(Fog::AWS::S3::Object) + object.destroy + end + + it "should reset attributes to remote state" do + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.create(:key => 'fogobjectname', :body => file) + object.last_modified = Time.now + # object.reload.attributes.should == object.attributes + object.destroy + end end describe "#save" do - it "should return the success value" + it "should return the success value" do + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.new(:key => 'fogobjectname', :body => file) + object.save.should be_true + object.destroy + end end diff --git a/spec/aws/models/s3/objects_spec.rb b/spec/aws/models/s3/objects_spec.rb index 614dfd605..4a738d6f9 100644 --- a/spec/aws/models/s3/objects_spec.rb +++ b/spec/aws/models/s3/objects_spec.rb @@ -33,13 +33,6 @@ describe 'Fog::AWS::S3::Objects' do @bucket.objects.all.should be_a(Fog::AWS::S3::Objects) end - it "should include persisted objects" do - file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') - object = @bucket.objects.create(:key => 'fogobjectname', :body => file) - @bucket.objects.keys.should include('fogobjectname') - object.destroy - end - end describe "#bucket" do @@ -48,7 +41,7 @@ describe 'Fog::AWS::S3::Objects' do @bucket.objects.bucket.should be_a(Fog::AWS::S3::Bucket) end - it "should be the bucket the object is related to" do + it "should be the bucket the objects are related to" do @bucket.objects.bucket.should == @bucket end end @@ -73,13 +66,30 @@ describe 'Fog::AWS::S3::Objects' do describe "#get" do - it "should return a Fog::AWS::S3::Object with metadata and data" + it "should return a Fog::AWS::S3::Object with metadata and data" do + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.create(:key => 'fogobjectname', :body => file) + object = @bucket.objects.get('fogobjectname') + object.body.should_not be_nil + object.content_length.should_not be_nil + object.etag.should_not be_nil + object.last_modified.should_not be_nil + object.destroy + end end describe "#head" do - it "should return a Fog::AWS::S3::Object with metadata" + it "should return a Fog::AWS::S3::Object with metadata" do + file = File.open(File.dirname(__FILE__) + '/../../../lorem.txt', 'r') + object = @bucket.objects.create(:key => 'fogobjectname', :body => file) + object = @bucket.objects.get('fogobjectname') + object.content_length.should_not be_nil + object.etag.should_not be_nil + object.last_modified.should_not be_nil + object.destroy + end end @@ -93,7 +103,9 @@ describe 'Fog::AWS::S3::Objects' do describe "#reload" do - it "should reload from s3" + it "should reload from s3" do + @bucket.objects.reload.should == @bucket.objects + end end diff --git a/spec/aws/models/s3/owner_spec.rb b/spec/aws/models/s3/owner_spec.rb index ecb4552a7..df963786a 100644 --- a/spec/aws/models/s3/owner_spec.rb +++ b/spec/aws/models/s3/owner_spec.rb @@ -1,10 +1,17 @@ require File.dirname(__FILE__) + '/../../../spec_helper' -describe 'S3::Owner' do +describe 'Fog::AWS::S3::Owner' do describe "#initialize" do - it "should return an S3::Owner" + it "should remap attributes from parser" do + owner = Fog::AWS::S3::Owner.new( + 'DisplayName' => 'name', + 'ID' => 'id' + ) + owner.display_name.should == 'name' + owner.id.should == 'id' + end end