waz-storage 1.2.0 → 1.3.0

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 (40) hide show
  1. data/.gitignore +9 -9
  2. data/CHANGELOG.rdoc +72 -72
  3. data/Gemfile +4 -4
  4. data/Gemfile.lock +46 -40
  5. data/LICENSE +18 -18
  6. data/README.rdoc +310 -310
  7. data/lib/waz-blobs.rb +4 -4
  8. data/lib/waz-queues.rb +6 -6
  9. data/lib/waz-storage.rb +39 -39
  10. data/lib/waz-tables.rb +4 -4
  11. data/lib/waz/blobs/blob_object.rb +122 -122
  12. data/lib/waz/blobs/container.rb +172 -161
  13. data/lib/waz/blobs/exceptions.rb +10 -10
  14. data/lib/waz/blobs/service.rb +181 -156
  15. data/lib/waz/queues/exceptions.rb +28 -28
  16. data/lib/waz/queues/message.rb +64 -64
  17. data/lib/waz/queues/queue.rb +164 -164
  18. data/lib/waz/queues/service.rb +105 -105
  19. data/lib/waz/storage/base.rb +70 -70
  20. data/lib/waz/storage/exceptions.rb +33 -33
  21. data/lib/waz/storage/validation_rules.rb +25 -25
  22. data/lib/waz/tables/edm_type_helper.rb +44 -44
  23. data/lib/waz/tables/exceptions.rb +44 -44
  24. data/lib/waz/tables/service.rb +178 -178
  25. data/lib/waz/tables/table.rb +74 -74
  26. data/lib/waz/tables/table_array.rb +10 -10
  27. data/rakefile +8 -21
  28. data/{tests → spec}/configuration.rb +22 -22
  29. data/{tests/waz/blobs/blob_object_test.rb → spec/waz/blobs/blob_object_spec.rb} +80 -80
  30. data/{tests/waz/blobs/container_test.rb → spec/waz/blobs/container_spec.rb} +175 -162
  31. data/{tests/waz/blobs/service_test.rb → spec/waz/blobs/service_spec.rb} +336 -282
  32. data/{tests/waz/queues/message_test.rb → spec/waz/queues/message_spec.rb} +32 -32
  33. data/{tests/waz/queues/queue_test.rb → spec/waz/queues/queue_spec.rb} +205 -205
  34. data/{tests/waz/queues/service_test.rb → spec/waz/queues/service_spec.rb} +298 -298
  35. data/{tests → spec}/waz/storage/base_tests.rb +81 -81
  36. data/{tests/waz/storage/shared_key_core_service_test.rb → spec/waz/storage/shared_key_core_service_spec.rb} +141 -141
  37. data/{tests/waz/tables/service_test.rb → spec/waz/tables/service_spec.rb} +613 -613
  38. data/{tests/waz/tables/table_test.rb → spec/waz/tables/table_spec.rb} +97 -97
  39. data/waz-storage.gemspec +29 -27
  40. metadata +47 -26
@@ -1,75 +1,75 @@
1
- module WAZ
2
- module Tables
3
- # This class represents a Table on Windows Azure Tables API. These are the methods implemented from Microsoft's API description
4
- # available on MSDN at http://msdn.microsoft.com/en-us/library/dd179423.aspx
5
- #
6
- # # list available tables
7
- # tables = WAZ::Tables::Table.list
8
- #
9
- # # list more tables
10
- # WAZ::Tables::Table.list(tables.continuation_token)
11
- #
12
- # # get a specific table
13
- # my_table = WAZ::Tables::Table.find('my-table')
14
- #
15
- # # delete table
16
- # my_table.destroy!
17
- #
18
- # # create a new table
19
- # WAZ::Tables::Table.create('new-table')
20
- #
21
- class Table
22
- class << self
23
- INVALID_TABLE_ERROR_MESSAGE = "must start with at least one lower/upper characted, can have character or any digit starting from the second position, must be from 3 through 63 characters long"
24
-
25
- # Finds a table by name. It will return nil if no table was found.
26
- def find(table_name)
27
- raise WAZ::Storage::InvalidParameterValue, {:name => table_name, :values => [INVALID_TABLE_ERROR_MESSAGE]} unless WAZ::Storage::ValidationRules.valid_table_name?(table_name)
28
- begin
29
- WAZ::Tables::Table.new(service_instance.get_table(table_name))
30
- rescue WAZ::Tables::TableDoesNotExist
31
- return nil
32
- end
33
- end
34
-
35
- # Returns an array of the existing tables (WAZ::Tables::Table) on the current
36
- # Windows Azure Storage account.
37
- def list(continuation_token = {})
38
- table_list, next_table_name = service_instance.list_tables(continuation_token['NextTableName'])
39
- tables = TableArray.new(table_list.map { |table| WAZ::Tables::Table.new({ :name => table[:name], :url => table[:url] }) })
40
- tables.continuation_token = {'NextTableName' => next_table_name} unless next_table_name.nil?
41
- return tables
42
- end
43
-
44
- # Creates a table on the current account.
45
- def create(table_name)
46
- raise WAZ::Storage::InvalidParameterValue, {:name => table_name, :values => [INVALID_TABLE_ERROR_MESSAGE]} unless WAZ::Storage::ValidationRules.valid_table_name?(table_name)
47
- WAZ::Tables::Table.new(service_instance.create_table(table_name))
48
- end
49
-
50
- # This method is internally used by this class. It's the way we keep a single instance of the
51
- # service that wraps the calls the Windows Azure Tables API. It's initialized with the values
52
- # from the default_connection on WAZ::Storage::Base initialized thru establish_connection!
53
- def service_instance
54
- options = WAZ::Storage::Base.default_connection.merge(:type_of_service => "table")
55
- (@service_instances ||= {})[options[:account_name]] ||= Service.new(options)
56
- end
57
- end
58
-
59
- attr_accessor :name, :url
60
-
61
- def initialize(options = {})
62
- raise WAZ::Storage::InvalidOption, :name unless options.keys.include?(:name) and !options[:name].empty?
63
- raise WAZ::Storage::InvalidOption, :url unless options.keys.include?(:url) and !options[:url].empty?
64
- raise WAZ::Storage::InvalidParameterValue, {:name => options[:name], :values => [INVALID_TABLE_ERROR_MESSAGE]} unless WAZ::Storage::ValidationRules.valid_table_name?(options[:name])
65
- self.name = options[:name]
66
- self.url = options[:url]
67
- end
68
-
69
- # Removes the table from the current account.
70
- def destroy!
71
- self.class.service_instance.delete_table(self.name)
72
- end
73
- end
74
- end
1
+ module WAZ
2
+ module Tables
3
+ # This class represents a Table on Windows Azure Tables API. These are the methods implemented from Microsoft's API description
4
+ # available on MSDN at http://msdn.microsoft.com/en-us/library/dd179423.aspx
5
+ #
6
+ # # list available tables
7
+ # tables = WAZ::Tables::Table.list
8
+ #
9
+ # # list more tables
10
+ # WAZ::Tables::Table.list(tables.continuation_token)
11
+ #
12
+ # # get a specific table
13
+ # my_table = WAZ::Tables::Table.find('my-table')
14
+ #
15
+ # # delete table
16
+ # my_table.destroy!
17
+ #
18
+ # # create a new table
19
+ # WAZ::Tables::Table.create('new-table')
20
+ #
21
+ class Table
22
+ class << self
23
+ INVALID_TABLE_ERROR_MESSAGE = "must start with at least one lower/upper characted, can have character or any digit starting from the second position, must be from 3 through 63 characters long"
24
+
25
+ # Finds a table by name. It will return nil if no table was found.
26
+ def find(table_name)
27
+ raise WAZ::Storage::InvalidParameterValue, {:name => table_name, :values => [INVALID_TABLE_ERROR_MESSAGE]} unless WAZ::Storage::ValidationRules.valid_table_name?(table_name)
28
+ begin
29
+ WAZ::Tables::Table.new(service_instance.get_table(table_name))
30
+ rescue WAZ::Tables::TableDoesNotExist
31
+ return nil
32
+ end
33
+ end
34
+
35
+ # Returns an array of the existing tables (WAZ::Tables::Table) on the current
36
+ # Windows Azure Storage account.
37
+ def list(continuation_token = {})
38
+ table_list, next_table_name = service_instance.list_tables(continuation_token['NextTableName'])
39
+ tables = TableArray.new(table_list.map { |table| WAZ::Tables::Table.new({ :name => table[:name], :url => table[:url] }) })
40
+ tables.continuation_token = {'NextTableName' => next_table_name} unless next_table_name.nil?
41
+ return tables
42
+ end
43
+
44
+ # Creates a table on the current account.
45
+ def create(table_name)
46
+ raise WAZ::Storage::InvalidParameterValue, {:name => table_name, :values => [INVALID_TABLE_ERROR_MESSAGE]} unless WAZ::Storage::ValidationRules.valid_table_name?(table_name)
47
+ WAZ::Tables::Table.new(service_instance.create_table(table_name))
48
+ end
49
+
50
+ # This method is internally used by this class. It's the way we keep a single instance of the
51
+ # service that wraps the calls the Windows Azure Tables API. It's initialized with the values
52
+ # from the default_connection on WAZ::Storage::Base initialized thru establish_connection!
53
+ def service_instance
54
+ options = WAZ::Storage::Base.default_connection.merge(:type_of_service => "table")
55
+ (@service_instances ||= {})[options[:account_name]] ||= Service.new(options)
56
+ end
57
+ end
58
+
59
+ attr_accessor :name, :url
60
+
61
+ def initialize(options = {})
62
+ raise WAZ::Storage::InvalidOption, :name unless options.keys.include?(:name) and !options[:name].empty?
63
+ raise WAZ::Storage::InvalidOption, :url unless options.keys.include?(:url) and !options[:url].empty?
64
+ raise WAZ::Storage::InvalidParameterValue, {:name => options[:name], :values => [INVALID_TABLE_ERROR_MESSAGE]} unless WAZ::Storage::ValidationRules.valid_table_name?(options[:name])
65
+ self.name = options[:name]
66
+ self.url = options[:url]
67
+ end
68
+
69
+ # Removes the table from the current account.
70
+ def destroy!
71
+ self.class.service_instance.delete_table(self.name)
72
+ end
73
+ end
74
+ end
75
75
  end
@@ -1,11 +1,11 @@
1
- module WAZ
2
- module Tables
3
- class TableArray < Array
4
- attr_accessor :continuation_token
5
-
6
- def initialize(array)
7
- super(array)
8
- end
9
- end
10
- end
1
+ module WAZ
2
+ module Tables
3
+ class TableArray < Array
4
+ attr_accessor :continuation_token
5
+
6
+ def initialize(array)
7
+ super(array)
8
+ end
9
+ end
10
+ end
11
11
  end
data/rakefile CHANGED
@@ -1,21 +1,8 @@
1
- #!/usr/bin/env rake
2
- require 'rspec/core/rake_task'
3
- require 'rake/rdoctask'
4
- require 'bundler/gem_tasks'
5
-
6
- RSpec::Core::RakeTask.new do |t|
7
- t.name = :specs
8
- t.pattern = "tests/**/*_test.rb"
9
- t.rspec_opts = ['-cfn']
10
- end
11
-
12
- namespace :docs do
13
- Rake::RDocTask.new do |t|
14
- t.rdoc_dir = 'rdoc'
15
- t.title = "Windows Azure Storage library - simple gem for accessing WAZ's Storage REST API"
16
- t.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
17
- t.options << '--charset' << 'utf-8'
18
- t.rdoc_files.include('README.rdoc')
19
- t.rdoc_files.include('lib/**/*.rb')
20
- end
21
- end
1
+ #!/usr/bin/env rake
2
+ require 'rspec/core/rake_task'
3
+ require 'bundler/gem_tasks'
4
+
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ t.pattern = "spec/**/*_spec.rb"
7
+ t.rspec_opts = ['-cfn']
8
+ end
@@ -1,22 +1,22 @@
1
- require 'simplecov'
2
- SimpleCov.start do
3
- add_group "Gem files" do |src_file|
4
- lib_path = File.expand_path("../lib", File.dirname(__FILE__))
5
- src_file.filename.start_with?(lib_path)
6
- end
7
- end
8
-
9
- require 'rubygems'
10
- require 'rspec'
11
- require 'rspec/autorun'
12
- require 'mocha'
13
- require 'restclient'
14
- require 'time'
15
- require 'hmac-sha2'
16
- require 'base64'
17
- require 'rexml/document'
18
- require 'rexml/xpath'
19
-
20
- RSpec.configure do |config|
21
- config.mock_with :mocha
22
- end
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_group "Gem files" do |src_file|
4
+ lib_path = File.expand_path("../lib", File.dirname(__FILE__))
5
+ src_file.filename.start_with?(lib_path)
6
+ end
7
+ end
8
+
9
+ require 'rubygems'
10
+ require 'rspec'
11
+ require 'rspec/autorun'
12
+ require 'mocha'
13
+ require 'restclient'
14
+ require 'time'
15
+ require 'hmac-sha2'
16
+ require 'base64'
17
+ require 'rexml/document'
18
+ require 'rexml/xpath'
19
+
20
+ RSpec.configure do |config|
21
+ config.mock_with :mocha
22
+ end
@@ -1,80 +1,80 @@
1
- # enabling the load of files from root (on RSpec)
2
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../../')
3
- require 'tests/configuration'
4
- require 'lib/waz-blobs'
5
-
6
- describe "Windows Azure Blobs interface API" do
7
- it "should return blob path from url" do
8
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
9
- blob.path.should == "container/blob"
10
- end
11
-
12
- it "should return blob metdata" do
13
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
14
- WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container/blob").returns({:x_ms_meta_name => "blob_name"})
15
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
16
- blob.metadata.should == { :x_ms_meta_name => "blob_name" }
17
- end
18
-
19
- it "should put blob metadataa" do
20
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
21
- WAZ::Blobs::Service.any_instance.expects(:set_blob_properties).with("container/blob", {:x_ms_meta_name => "blob_name"})
22
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
23
- blob.put_properties!({ :x_ms_meta_name => "blob_name" })
24
- end
25
-
26
- it "should get blob contents" do
27
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
28
- WAZ::Blobs::Service.any_instance.expects(:get_blob).with("container/blob").returns("this is the blob content")
29
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
30
- blob.value.should == "this is the blob content"
31
- end
32
-
33
- it "should put blob contents" do
34
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
35
- WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container/blob").returns({})
36
- WAZ::Blobs::Service.any_instance.expects(:put_blob).with("container/blob", "my new blob value", "application/xml", {}).returns("this is the blob content")
37
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
38
- blob.value = "my new blob value"
39
- end
40
-
41
- it "should destroy blob" do
42
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
43
- WAZ::Blobs::Service.any_instance.expects(:delete_blob).with("container/blob")
44
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
45
- blob.destroy!
46
- end
47
-
48
- it "should copy blob" do
49
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
50
- WAZ::Blobs::BlobObject.service_instance.expects(:copy_blob).with('container/blob', 'container/blob-copy')
51
- WAZ::Blobs::BlobObject.service_instance.expects(:get_blob_properties).with('container/blob-copy').returns(:content_type => "plain/text")
52
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "plain/text")
53
- copy = blob.copy('container/blob-copy')
54
- copy.path.should == "container/blob-copy"
55
- end
56
-
57
- it "should take a snapshot of a blob" do
58
- mock_time = Time.new
59
- Time.stubs(:new).returns(mock_time)
60
-
61
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
62
- WAZ::Blobs::BlobObject.service_instance.expects(:get_blob_properties).with('container/blob').returns(:content_type => "plain/text")
63
- WAZ::Blobs::BlobObject.service_instance.expects(:snapshot_blob).with('container/blob').returns(mock_time.httpdate)
64
-
65
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "plain/text")
66
- blob_snapshot = blob.snapshot
67
- blob_snapshot.snapshot_date.should === mock_time.httpdate
68
- end
69
-
70
- it "should not allow snapshoted blobs to perform write operations" do
71
- snapshot = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "plain/text", :snapshot_date => Time.new.httpdate)
72
- lambda { snapshot.value = "new-value" }.should raise_error(WAZ::Blobs::InvalidOperation)
73
- lambda { snapshot.put_properties!({:x_ms_meta_name => "foo"}) }.should raise_error(WAZ::Blobs::InvalidOperation)
74
- end
75
-
76
- it "blob path should include snapshot parameter" do
77
- blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob?snapshot=foo", :content_type => "application/xml")
78
- blob.path.should == "container/blob?snapshot=foo"
79
- end
80
- end
1
+ # enabling the load of files from root (on RSpec)
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../../')
3
+ require 'spec/configuration'
4
+ require 'lib/waz-blobs'
5
+
6
+ describe "Windows Azure Blobs interface API" do
7
+ it "should return blob path from url" do
8
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
9
+ blob.path.should == "container/blob"
10
+ end
11
+
12
+ it "should return blob metdata" do
13
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
14
+ WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container/blob").returns({:x_ms_meta_name => "blob_name"})
15
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
16
+ blob.metadata.should == { :x_ms_meta_name => "blob_name" }
17
+ end
18
+
19
+ it "should put blob metadataa" do
20
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
21
+ WAZ::Blobs::Service.any_instance.expects(:set_blob_properties).with("container/blob", {:x_ms_meta_name => "blob_name"})
22
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
23
+ blob.put_properties!({ :x_ms_meta_name => "blob_name" })
24
+ end
25
+
26
+ it "should get blob contents" do
27
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
28
+ WAZ::Blobs::Service.any_instance.expects(:get_blob).with("container/blob").returns("this is the blob content")
29
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
30
+ blob.value.should == "this is the blob content"
31
+ end
32
+
33
+ it "should put blob contents" do
34
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
35
+ WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container/blob").returns({})
36
+ WAZ::Blobs::Service.any_instance.expects(:put_blob).with("container/blob", "my new blob value", "application/xml", {}).returns("this is the blob content")
37
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
38
+ blob.value = "my new blob value"
39
+ end
40
+
41
+ it "should destroy blob" do
42
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
43
+ WAZ::Blobs::Service.any_instance.expects(:delete_blob).with("container/blob")
44
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "application/xml")
45
+ blob.destroy!
46
+ end
47
+
48
+ it "should copy blob" do
49
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
50
+ WAZ::Blobs::BlobObject.service_instance.expects(:copy_blob).with('container/blob', 'container/blob-copy')
51
+ WAZ::Blobs::BlobObject.service_instance.expects(:get_blob_properties).with('container/blob-copy').returns(:content_type => "plain/text")
52
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "plain/text")
53
+ copy = blob.copy('container/blob-copy')
54
+ copy.path.should == "container/blob-copy"
55
+ end
56
+
57
+ it "should take a snapshot of a blob" do
58
+ mock_time = Time.new
59
+ Time.stubs(:new).returns(mock_time)
60
+
61
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
62
+ WAZ::Blobs::BlobObject.service_instance.expects(:get_blob_properties).with('container/blob').returns(:content_type => "plain/text")
63
+ WAZ::Blobs::BlobObject.service_instance.expects(:snapshot_blob).with('container/blob').returns(mock_time.httpdate)
64
+
65
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "plain/text")
66
+ blob_snapshot = blob.snapshot
67
+ blob_snapshot.snapshot_date.should === mock_time.httpdate
68
+ end
69
+
70
+ it "should not allow snapshoted blobs to perform write operations" do
71
+ snapshot = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob", :content_type => "plain/text", :snapshot_date => Time.new.httpdate)
72
+ lambda { snapshot.value = "new-value" }.should raise_error(WAZ::Blobs::InvalidOperation)
73
+ lambda { snapshot.put_properties!({:x_ms_meta_name => "foo"}) }.should raise_error(WAZ::Blobs::InvalidOperation)
74
+ end
75
+
76
+ it "blob path should include snapshot parameter" do
77
+ blob = WAZ::Blobs::BlobObject.new(:name => "blob_name", :url => "http://localhost/container/blob?snapshot=foo", :content_type => "application/xml")
78
+ blob.path.should == "container/blob?snapshot=foo"
79
+ end
80
+ end
@@ -1,162 +1,175 @@
1
- # enabling the load of files from root (on RSpec)
2
- $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../')
3
- require 'tests/configuration'
4
- require 'lib/waz-blobs'
5
-
6
- describe "Windows Azure Containers interface API" do
7
-
8
- it "should should throw when no container name is provided" do
9
- lambda {WAZ::Blobs::Container.new}.should raise_error(WAZ::Storage::InvalidOption)
10
- end
11
-
12
- it "should list containers" do
13
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
14
- WAZ::Blobs::Service.any_instance.expects(:list_containers).returns([{:name => 'my-container'}, {:name => 'other container'}])
15
- containers = WAZ::Blobs::Container.list
16
- containers.size.should == 2
17
- containers.first().name.should == "my-container"
18
- end
19
-
20
- it "should be able to create a container" do
21
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
22
- WAZ::Blobs::Service.any_instance.expects(:create_container).with("my-container")
23
- container = WAZ::Blobs::Container.create('my-container')
24
- container.name.should == 'my-container'
25
- end
26
-
27
- it "should be able to return a container by name" do
28
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
29
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:name => "container-name", :x_ms_meta_name => "container-name"}).twice
30
- container = WAZ::Blobs::Container.find('container-name')
31
- container.metadata[:x_ms_meta_name].should == 'container-name'
32
- end
33
-
34
- it "should be able to return container metadata" do
35
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
36
- WAZ::Blobs::Service.any_instance.expects(:create_container).with("container-name")
37
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
38
- container = WAZ::Blobs::Container.create('container-name')
39
- container.metadata[:x_ms_meta_name].should == 'container-name'
40
- end
41
-
42
- it "should be able to say whether the container is public or not" do
43
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
44
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
45
- WAZ::Blobs::Service.any_instance.expects(:get_container_acl).with("container-name").returns(false)
46
- container = WAZ::Blobs::Container.find("container-name")
47
- container.public_access?.should == false
48
- end
49
-
50
- it "should be able to set whether the container is public or not" do
51
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
52
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
53
- WAZ::Blobs::Service.any_instance.expects(:set_container_acl).with('container-name', false)
54
- container = WAZ::Blobs::Container.find("container-name")
55
- container.public_access = false
56
- end
57
-
58
- it "should be able to set container properties" do
59
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
60
- WAZ::Blobs::Service.any_instance.expects(:set_container_properties).with("container-name", {:x_ms_meta_meta1 => "meta1"}).returns(false)
61
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
62
- container = WAZ::Blobs::Container.find("container-name")
63
- container.put_properties!(:x_ms_meta_meta1 => "meta1")
64
- end
65
-
66
- it "should be able to return a list files within the container" do
67
- expected_blobs = [ {:name => 'blob1', :url => 'url', :content_type => 'app/xml'}, {:name => 'blob2', :url => 'url', :content_type => 'app/xml'} ]
68
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
69
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
70
- WAZ::Blobs::Service.any_instance.expects(:list_blobs).with("container-name").returns(expected_blobs)
71
- container = WAZ::Blobs::Container.find("container-name")
72
- container_blobs = container.blobs
73
- container_blobs.first().name = expected_blobs[0][:name]
74
- container_blobs[1].name = expected_blobs[1][:name]
75
- end
76
-
77
- it "should destroy container" do
78
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
79
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
80
- WAZ::Blobs::Service.any_instance.expects(:delete_container).with("container-name")
81
- container = WAZ::Blobs::Container.find("container-name")
82
- container.destroy!
83
- end
84
-
85
- it "should be able to return null when container not found by name" do
86
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
87
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").raises(RestClient::ResourceNotFound)
88
- container = WAZ::Blobs::Container.find('container-name')
89
- container.nil?.should == true
90
- end
91
-
92
- it "should be able to put blob inside given container" do
93
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
94
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
95
- WAZ::Blobs::Service.any_instance.expects(:put_blob).with("container-name/my_blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
96
- container = WAZ::Blobs::Container.find("container-name")
97
- blob = container.store("my_blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
98
- blob.name.should == "my_blob"
99
- blob.url.should == "http://my_account.blob.core.windows.net/container-name/my_blob"
100
- blob.content_type.should == "text/plain; charset=UTF-8"
101
- end
102
-
103
- it "should be able to upload a stream to a blob inside a given container" do
104
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
105
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
106
- WAZ::Blobs::Service.any_instance.expects(:put_block).with("container-name/my_blob", Base64.encode64('%064d' % 0), "this is the blob content")
107
- WAZ::Blobs::Service.any_instance.expects(:put_block_list).with("container-name/my_blob", [Base64.encode64('%064d' % 0)], "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
108
- container = WAZ::Blobs::Container.find("container-name")
109
- blob = container.upload("my_blob", StringIO.new("this is the blob content"), "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
110
- blob.name.should == "my_blob"
111
- blob.url.should == "http://my_account.blob.core.windows.net/container-name/my_blob"
112
- blob.content_type.should == "text/plain; charset=UTF-8"
113
- end
114
-
115
- it "should be able to put blob inside given container (when simulating fake containers)" do
116
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
117
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
118
- WAZ::Blobs::Service.any_instance.expects(:put_blob).with("container-name/fake-container/blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
119
- container = WAZ::Blobs::Container.find("container-name")
120
- blob = container.store("/fake-container/blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
121
- blob.name.should == "fake-container/blob"
122
- blob.url.should == "http://my_account.blob.core.windows.net/container-name/fake-container/blob"
123
- blob.content_type.should == "text/plain; charset=UTF-8"
124
- end
125
-
126
- it "should return a specific blob for the given container" do
127
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
128
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
129
- WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container-name/my_blob").returns({ :content_type => "application/xml" })
130
- container = WAZ::Blobs::Container.find("container-name")
131
- blob = container['my_blob']
132
- blob.name.should == 'my_blob'
133
- blob.content_type.should == 'application/xml'
134
- blob.url.should == 'http://my_account.blob.core.windows.net/container-name/my_blob'
135
- end
136
-
137
- it "should return nil when the file does not exist" do
138
- WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
139
- WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
140
- WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container-name/my_blob").raises(RestClient::ResourceNotFound)
141
- container = WAZ::Blobs::Container.find('container-name')
142
- blob = container['my_blob']
143
- blob.nil?.should == true
144
- end
145
-
146
- it "should raise an exception when container name starts with - (hypen)" do
147
- lambda { WAZ::Blobs::Container.create('-container') }.should raise_error(WAZ::Storage::InvalidParameterValue)
148
- end
149
-
150
- it "should raise an exception when container name ends with - (hypen)" do
151
- lambda { WAZ::Blobs::Container.create('container-') }.should raise_error(WAZ::Storage::InvalidParameterValue)
152
- end
153
-
154
- it "should raise an exception when container name is less than 3" do
155
- lambda { WAZ::Blobs::Container.create('co') }.should raise_error(WAZ::Storage::InvalidParameterValue)
156
- end
157
-
158
- it "should raise an exception when container name is longer than 63" do
159
- lambda { WAZ::Blobs::Container.create('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') }.should raise_error(WAZ::Storage::InvalidParameterValue)
160
- end
161
-
162
- end
1
+ # enabling the load of files from root (on RSpec)
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../')
3
+ require 'spec/configuration'
4
+ require 'lib/waz-blobs'
5
+
6
+ describe "Windows Azure Containers interface API" do
7
+
8
+ it "should should throw when no container name is provided" do
9
+ lambda {WAZ::Blobs::Container.new}.should raise_error(WAZ::Storage::InvalidOption)
10
+ end
11
+
12
+ it "should list containers" do
13
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
14
+ WAZ::Blobs::Service.any_instance.expects(:list_containers).returns([{:name => 'my-container'}, {:name => 'other container'}])
15
+ containers = WAZ::Blobs::Container.list
16
+ containers.size.should == 2
17
+ containers.first().name.should == "my-container"
18
+ end
19
+
20
+ it "should be able to create a container" do
21
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
22
+ WAZ::Blobs::Service.any_instance.expects(:create_container).with("my-container")
23
+ container = WAZ::Blobs::Container.create('my-container')
24
+ container.name.should == 'my-container'
25
+ end
26
+
27
+ it "should be able to return a container by name" do
28
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
29
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:name => "container-name", :x_ms_meta_name => "container-name"}).twice
30
+ container = WAZ::Blobs::Container.find('container-name')
31
+ container.metadata[:x_ms_meta_name].should == 'container-name'
32
+ end
33
+
34
+ it "should be able to return container metadata" do
35
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
36
+ WAZ::Blobs::Service.any_instance.expects(:create_container).with("container-name")
37
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
38
+ container = WAZ::Blobs::Container.create('container-name')
39
+ container.metadata[:x_ms_meta_name].should == 'container-name'
40
+ end
41
+
42
+ it "should be able to say whether the container is public or not" do
43
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
44
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
45
+ WAZ::Blobs::Service.any_instance.expects(:get_container_acl).with("container-name").returns(false)
46
+ container = WAZ::Blobs::Container.find("container-name")
47
+ container.public_access?.should == false
48
+ end
49
+
50
+ it "should be able to set whether the container is public or not" do
51
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
52
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
53
+ WAZ::Blobs::Service.any_instance.expects(:set_container_acl).with('container-name', false)
54
+ container = WAZ::Blobs::Container.find("container-name")
55
+ container.public_access = false
56
+ end
57
+
58
+ it "should be able to set container properties" do
59
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
60
+ WAZ::Blobs::Service.any_instance.expects(:set_container_properties).with("container-name", {:x_ms_meta_meta1 => "meta1"}).returns(false)
61
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
62
+ container = WAZ::Blobs::Container.find("container-name")
63
+ container.put_properties!(:x_ms_meta_meta1 => "meta1")
64
+ end
65
+
66
+ it "should be able to return a list files within the container" do
67
+ expected_blobs = [ {:name => 'blob1', :url => 'url', :content_type => 'app/xml'}, {:name => 'blob2', :url => 'url', :content_type => 'app/xml'} ]
68
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
69
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
70
+ WAZ::Blobs::Service.any_instance.expects(:list_blobs).with("container-name").returns(expected_blobs)
71
+ container = WAZ::Blobs::Container.find("container-name")
72
+ container_blobs = container.blobs
73
+ container_blobs.first().name = expected_blobs[0][:name]
74
+ container_blobs[1].name = expected_blobs[1][:name]
75
+ end
76
+
77
+ it "should be able to return statistics of the container" do
78
+ options = {:maxresults => 100, :marker => "marker"}
79
+ expected_values = {:size => 200, :files => 100, :next_marker => "next-marker"}
80
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
81
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
82
+ WAZ::Blobs::Service.any_instance.expects(:statistics).with("container-name", options).returns(expected_values)
83
+ container = WAZ::Blobs::Container.find("container-name")
84
+ statistics = container.statistics(options)
85
+ statistics[:size].should == 200
86
+ statistics[:files].should == 100
87
+ statistics[:next_marker].should == "next-marker"
88
+ end
89
+
90
+ it "should destroy container" do
91
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
92
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
93
+ WAZ::Blobs::Service.any_instance.expects(:delete_container).with("container-name")
94
+ container = WAZ::Blobs::Container.find("container-name")
95
+ container.destroy!
96
+ end
97
+
98
+ it "should be able to return null when container not found by name" do
99
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
100
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").raises(RestClient::ResourceNotFound)
101
+ container = WAZ::Blobs::Container.find('container-name')
102
+ container.nil?.should == true
103
+ end
104
+
105
+ it "should be able to put blob inside given container" do
106
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
107
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
108
+ WAZ::Blobs::Service.any_instance.expects(:put_blob).with("container-name/my_blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
109
+ container = WAZ::Blobs::Container.find("container-name")
110
+ blob = container.store("my_blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
111
+ blob.name.should == "my_blob"
112
+ blob.url.should == "http://my_account.blob.core.windows.net/container-name/my_blob"
113
+ blob.content_type.should == "text/plain; charset=UTF-8"
114
+ end
115
+
116
+ it "should be able to upload a stream to a blob inside a given container" do
117
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
118
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
119
+ WAZ::Blobs::Service.any_instance.expects(:put_block).with("container-name/my_blob", Base64.encode64('%064d' % 0), "this is the blob content")
120
+ WAZ::Blobs::Service.any_instance.expects(:put_block_list).with("container-name/my_blob", [Base64.encode64('%064d' % 0)], "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
121
+ container = WAZ::Blobs::Container.find("container-name")
122
+ blob = container.upload("my_blob", StringIO.new("this is the blob content"), "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
123
+ blob.name.should == "my_blob"
124
+ blob.url.should == "http://my_account.blob.core.windows.net/container-name/my_blob"
125
+ blob.content_type.should == "text/plain; charset=UTF-8"
126
+ end
127
+
128
+ it "should be able to put blob inside given container (when simulating fake containers)" do
129
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
130
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
131
+ WAZ::Blobs::Service.any_instance.expects(:put_blob).with("container-name/fake-container/blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
132
+ container = WAZ::Blobs::Container.find("container-name")
133
+ blob = container.store("/fake-container/blob", "this is the blob content", "text/plain; charset=UTF-8", {:x_ms_meta_custom_property => "customValue"})
134
+ blob.name.should == "fake-container/blob"
135
+ blob.url.should == "http://my_account.blob.core.windows.net/container-name/fake-container/blob"
136
+ blob.content_type.should == "text/plain; charset=UTF-8"
137
+ end
138
+
139
+ it "should return a specific blob for the given container" do
140
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
141
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
142
+ WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container-name/my_blob").returns({ :content_type => "application/xml" })
143
+ container = WAZ::Blobs::Container.find("container-name")
144
+ blob = container['my_blob']
145
+ blob.name.should == 'my_blob'
146
+ blob.content_type.should == 'application/xml'
147
+ blob.url.should == 'http://my_account.blob.core.windows.net/container-name/my_blob'
148
+ end
149
+
150
+ it "should return nil when the file does not exist" do
151
+ WAZ::Storage::Base.stubs(:default_connection).returns({:account_name => "my_account", :access_key => "key"})
152
+ WAZ::Blobs::Service.any_instance.expects(:get_container_properties).with("container-name").returns({:x_ms_meta_name => "container-name"})
153
+ WAZ::Blobs::Service.any_instance.expects(:get_blob_properties).with("container-name/my_blob").raises(RestClient::ResourceNotFound)
154
+ container = WAZ::Blobs::Container.find('container-name')
155
+ blob = container['my_blob']
156
+ blob.nil?.should == true
157
+ end
158
+
159
+ it "should raise an exception when container name starts with - (hypen)" do
160
+ lambda { WAZ::Blobs::Container.create('-container') }.should raise_error(WAZ::Storage::InvalidParameterValue)
161
+ end
162
+
163
+ it "should raise an exception when container name ends with - (hypen)" do
164
+ lambda { WAZ::Blobs::Container.create('container-') }.should raise_error(WAZ::Storage::InvalidParameterValue)
165
+ end
166
+
167
+ it "should raise an exception when container name is less than 3" do
168
+ lambda { WAZ::Blobs::Container.create('co') }.should raise_error(WAZ::Storage::InvalidParameterValue)
169
+ end
170
+
171
+ it "should raise an exception when container name is longer than 63" do
172
+ lambda { WAZ::Blobs::Container.create('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') }.should raise_error(WAZ::Storage::InvalidParameterValue)
173
+ end
174
+
175
+ end