aeolus-image 0.0.1 → 0.4.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 (63) hide show
  1. data/COPYING +161 -0
  2. data/Rakefile +32 -19
  3. data/lib/aeolus_image.rb +35 -0
  4. data/lib/aeolus_image/active_resource_oauth_client.rb +62 -0
  5. data/lib/aeolus_image/import.rb +44 -0
  6. data/lib/aeolus_image/model/factory/base.rb +93 -0
  7. data/lib/aeolus_image/model/factory/build.rb +23 -0
  8. data/lib/aeolus_image/model/factory/builder.rb +46 -0
  9. data/lib/aeolus_image/model/factory/image.rb +23 -0
  10. data/lib/aeolus_image/model/factory/provider_image.rb +35 -0
  11. data/lib/aeolus_image/model/factory/target_image.rb +45 -0
  12. data/lib/aeolus_image/model/warehouse/icicle.rb +60 -0
  13. data/lib/aeolus_image/model/warehouse/image.rb +135 -0
  14. data/lib/aeolus_image/model/warehouse/image_build.rb +60 -0
  15. data/lib/aeolus_image/model/warehouse/provider_image.rb +36 -0
  16. data/lib/aeolus_image/model/warehouse/target_image.rb +53 -0
  17. data/lib/aeolus_image/model/warehouse/template.rb +35 -0
  18. data/lib/aeolus_image/model/warehouse/warehouse_client.rb +201 -0
  19. data/lib/aeolus_image/model/warehouse/warehouse_model.rb +236 -0
  20. data/spec/aeolus_image/model/factory/provider_image_spec.rb +12 -0
  21. data/spec/models/factory/base_spec.rb +94 -0
  22. data/spec/models/factory/builder_spec.rb +31 -0
  23. data/spec/models/factory/provider_image_spec.rb +21 -0
  24. data/spec/models/factory/target_image_spec.rb +21 -0
  25. data/spec/models/warehouse/image_build_spec.rb +189 -0
  26. data/spec/models/warehouse/image_spec.rb +241 -0
  27. data/spec/models/warehouse/provider_image_spec.rb +115 -0
  28. data/spec/models/warehouse/target_image_spec.rb +180 -0
  29. data/spec/models/warehouse/template_spec.rb +76 -0
  30. data/spec/models/warehouse/warehouse_client_spec.rb +445 -0
  31. data/spec/models/warehouse/warehouse_model_spec.rb +94 -0
  32. data/spec/spec_helper.rb +34 -47
  33. data/spec/vcr/cassettes/builder.yml +24 -0
  34. data/spec/vcr/cassettes/oauth.yml +80 -0
  35. data/spec/vcr/cassettes/oauth_fail_invalid.yml +30 -0
  36. data/spec/vcr/cassettes/oauth_fail_no.yml +22 -0
  37. data/spec/vcr/cassettes/oauth_success_valid.yml +30 -0
  38. data/spec/vcr_setup.rb +26 -0
  39. metadata +70 -46
  40. data/bin/aeolus-image +0 -6
  41. data/examples/aeolus-cli +0 -9
  42. data/examples/custom_repo.tdl +0 -18
  43. data/examples/image_description.xml +0 -3
  44. data/examples/tdl.rng +0 -207
  45. data/lib/base_command.rb +0 -134
  46. data/lib/build_command.rb +0 -68
  47. data/lib/config_parser.rb +0 -212
  48. data/lib/delete_command.rb +0 -9
  49. data/lib/import_command.rb +0 -44
  50. data/lib/list_command.rb +0 -141
  51. data/lib/push_command.rb +0 -72
  52. data/man/aeolus-image-build.1 +0 -36
  53. data/man/aeolus-image-import.1 +0 -57
  54. data/man/aeolus-image-list.1 +0 -80
  55. data/man/aeolus-image-push.1 +0 -40
  56. data/man/aeolus-image.1 +0 -16
  57. data/spec/base_command_spec.rb +0 -76
  58. data/spec/build_command_spec.rb +0 -63
  59. data/spec/config_parser_spec.rb +0 -82
  60. data/spec/import_command_spec.rb +0 -43
  61. data/spec/list_command_spec.rb +0 -21
  62. data/spec/push_command_spec.rb +0 -56
  63. data/spec/spec.opts +0 -3
@@ -0,0 +1,115 @@
1
+ # Copyright 2011 Red Hat, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'spec_helper'
16
+
17
+ module Aeolus
18
+ module Image
19
+ module Warehouse
20
+ describe ProviderImage do
21
+ before(:each) do
22
+ @provider_image_attributes = {
23
+ :provider => 'provider',
24
+ :target_image => 'target_image',
25
+ :uuid => 'uuid',
26
+ :other_attribute => 'other_attribute',
27
+ :another_attribute => 'another_attribute'
28
+ }
29
+ @object = mock(Object, :attr_list => @provider_image_attributes.keys, :attrs => @provider_image_attributes)
30
+ @provider_image_attributes.each do |key, value|
31
+ @object.stub(key.to_sym, value)
32
+ end
33
+ @provider_image = ProviderImage.new(@object)
34
+ end
35
+
36
+ context "@bucket_name" do
37
+
38
+ it "should be set correctly" do
39
+ # accessor set in WarehouseModel
40
+ @provider_image.class.bucket_name.should be_eql('provider_images')
41
+ end
42
+
43
+ end
44
+
45
+ context "#initialize" do
46
+
47
+ before(:each) do
48
+ @attr_writers = [ :provider, :target_image ]
49
+ @attr_accessors = @provider_image_attributes.keys - @attr_writers
50
+ end
51
+
52
+ it "should correctly set attribute writers" do
53
+ @attr_writers.each do |writer|
54
+ @provider_image.respond_to?(:"#{writer.to_s}=").should be_true
55
+ end
56
+ end
57
+
58
+ it "should correctly set attribute accessors" do
59
+ @attr_accessors.each do |accessor|
60
+ @provider_image.respond_to?(:"#{accessor.to_s}").should be_true
61
+ @provider_image.respond_to?(:"#{accessor.to_s}=").should be_true
62
+ end
63
+ end
64
+
65
+ it "should set attributes to correct values" do
66
+ @attr_accessors.each do |key|
67
+ @provider_image.send(:"#{key.to_s}").should be_equal(@provider_image_attributes[key])
68
+ end
69
+ end
70
+
71
+ end
72
+
73
+ context "#target_image" do
74
+ context "with @target_image present" do
75
+ before(:each) do
76
+ @target_image_mock = mock(TargetImage)
77
+ TargetImage.stub(:find).and_return(@target_image_mock)
78
+ end
79
+ it "should call TargetImage.find with correct parameter" do
80
+ TargetImage.should_receive(:find).with(@provider_image.instance_variable_get( :@target_image ))
81
+ @provider_image.target_image
82
+ end
83
+
84
+ it "should return found TargetImage" do
85
+ @provider_image.target_image.should be_eql(@target_image_mock)
86
+ end
87
+ end
88
+
89
+ context "with @target_image absent" do
90
+ before(:each) do
91
+ @provider_image.instance_variable_set(:@target_image, nil)
92
+ end
93
+ it "should not call TargetImage.find at all" do
94
+ TargetImage.should_not_receive(:find)
95
+ @provider_image.target_image
96
+ end
97
+ end
98
+ end
99
+
100
+ context "#provider_name" do
101
+ it "should return @provider" do
102
+ @provider_image.provider_name.should be_eql(@provider_image.instance_variable_get(:@provider))
103
+ end
104
+ end
105
+
106
+ context "#delete!" do
107
+ it "should call ProviderImage.delete with @uuid" do
108
+ ProviderImage.should_receive(:delete).with(@provider_image.instance_variable_get(:@uuid))
109
+ @provider_image.delete!
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,180 @@
1
+ # Copyright 2011 Red Hat, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'spec_helper'
16
+
17
+ module Aeolus
18
+ module Image
19
+ module Warehouse
20
+ describe TargetImage do
21
+ before(:each) do
22
+ @target_image_attributes = {
23
+ :build => 'build',
24
+ :uuid => 'uuid',
25
+ :template => 'template',
26
+ :other_attribute => 'other_attribute',
27
+ :another_attribute => 'another_attribute'
28
+ }
29
+ @object = mock(Object, :attr_list => @target_image_attributes.keys, :attrs => @target_image_attributes)
30
+ @target_image_attributes.each do |key, value|
31
+ @object.stub(key.to_sym, value)
32
+ end
33
+ @target_image = TargetImage.new(@object)
34
+
35
+
36
+ @provider_image_mock_with_no_target_image = mock(ProviderImage, :target_image => nil)
37
+ @provider_image_mock_with_correct_target_image = mock(ProviderImage, :target_image => @target_image)
38
+ @other_provider_image_mock_with_correct_target_image = mock(ProviderImage, :target_image => @target_image)
39
+
40
+ @other_target_image_attributes = @target_image_attributes.merge(:uuid => 'other_uuid')
41
+ @other_object = mock(Object, :attr_list => @other_target_image_attributes.keys, :attrs => @other_target_image_attributes)
42
+ @other_target_image_attributes.each do |key, value|
43
+ @other_object.stub(key.to_sym, value)
44
+ end
45
+ @other_target_image = TargetImage.new(@other_object)
46
+ @provider_image_mock_with_other_target_image = mock(ProviderImage, :target_image => @other_target_image)
47
+
48
+ @all_provider_images = [ @provider_image_mock_with_correct_target_image, @other_provider_image_mock_with_correct_target_image, @provider_image_mock_with_other_target_image, @provider_image_mock_with_no_target_image ]
49
+
50
+ @correct_provider_images = [ @provider_image_mock_with_correct_target_image, @other_provider_image_mock_with_correct_target_image ]
51
+
52
+ end
53
+
54
+ context "@bucket_name" do
55
+
56
+ it "should be set correctly" do
57
+ # accessor set in WarehouseModel
58
+ @target_image.class.bucket_name.should be_eql('target_images')
59
+ end
60
+
61
+ end
62
+
63
+ context "#initialize" do
64
+
65
+ before(:each) do
66
+ @attr_writers = [ :build ]
67
+ @attr_accessors = @target_image_attributes.keys - @attr_writers
68
+ end
69
+
70
+ it "should correctly set attribute writers" do
71
+ @attr_writers.each do |writer|
72
+ @target_image.respond_to?(:"#{writer.to_s}=").should be_true
73
+ end
74
+ end
75
+
76
+ it "should correctly set attribute accessors" do
77
+ @attr_accessors.each do |accessor|
78
+ @target_image.respond_to?(:"#{accessor.to_s}").should be_true
79
+ @target_image.respond_to?(:"#{accessor.to_s}=").should be_true
80
+ end
81
+ end
82
+
83
+ it "should set attributes to correct values" do
84
+ @attr_accessors.each do |key|
85
+ @target_image.send(:"#{key.to_s}").should be_equal(@target_image_attributes[key])
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ context "#build" do
92
+ context "with @build present" do
93
+ before(:each) do
94
+ @image_build_mock = mock(ImageBuild)
95
+ ImageBuild.stub(:find).and_return(@image_build_mock)
96
+ end
97
+ it "should call TargetImage.find with correct parameter" do
98
+ ImageBuild.should_receive(:find).with(@target_image.instance_variable_get( :@build ))
99
+ @target_image.build
100
+ end
101
+
102
+ it "should return found TargetImage" do
103
+ @target_image.build.should be_eql(@image_build_mock)
104
+ end
105
+ end
106
+
107
+ context "with @build absent" do
108
+ before(:each) do
109
+ @target_image.instance_variable_set(:@build, nil)
110
+ end
111
+ it "should not call TargetImage.find at all" do
112
+ ImageBuild.should_not_receive(:find)
113
+ @target_image.build
114
+ end
115
+ end
116
+ end
117
+
118
+ context "#provider_images" do
119
+ before(:each) do
120
+ ProviderImage.stub(:where).and_return(@all_provider_images)
121
+ end
122
+
123
+ context "should return collection" do
124
+ it "with correct provider image" do
125
+ @target_image.provider_images.should include(@provider_image_mock_with_correct_target_image)
126
+ end
127
+ it "with other correct provider image" do
128
+ @target_image.provider_images.should include(@other_provider_image_mock_with_correct_target_image)
129
+ end
130
+ end
131
+ end
132
+
133
+ context "#template" do
134
+ context "with @template present" do
135
+ before(:each) do
136
+ @template_mock = mock(Template)
137
+ Template.stub(:find).and_return(@template_mock)
138
+ end
139
+ it "should call Template.find with correct parameter" do
140
+ Template.should_receive(:find).with(@target_image.instance_variable_get( :@template ))
141
+ @target_image.target_template
142
+ end
143
+
144
+ it "should return found Template" do
145
+ @target_image.target_template.should be_eql(@template_mock)
146
+ end
147
+ end
148
+
149
+ context "with @template absent" do
150
+ before(:each) do
151
+ @target_image.instance_variable_set(:@template, nil)
152
+ end
153
+ it "should not call Template.find at all" do
154
+ Template.should_not_receive(:find)
155
+ @target_image.target_template
156
+ end
157
+ end
158
+ end
159
+
160
+ context "#delete!" do
161
+
162
+ before(:each) do
163
+ @correct_provider_images.each{|pi| pi.stub(:delete!)}
164
+ @target_image.stub(:provider_images).and_return(@correct_provider_images)
165
+ TargetImage.stub(:delete)
166
+ end
167
+ it "should delete all associated provider images" do
168
+ @correct_provider_images.each{|pi| pi.should_receive(:delete!)}
169
+ @target_image.delete!
170
+ end
171
+ it "should call TargetImage.delete with @uuid" do
172
+ TargetImage.should_receive(:delete).with(@target_image.instance_variable_get(:@uuid))
173
+ @target_image.delete!
174
+ end
175
+
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,76 @@
1
+ # Copyright 2011 Red Hat, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'spec_helper'
16
+
17
+ module Aeolus
18
+ module Image
19
+ module Warehouse
20
+ describe Template do
21
+ let(:body) { 'body' }
22
+ before(:each) do
23
+ @template_attributes = {
24
+ :attribute => 'attribute',
25
+ :other_attribute => 'other_attribute',
26
+ :another_attribute => 'another_attribute'
27
+ }
28
+ @object = mock(Object, :attr_list => @template_attributes.keys, :attrs => @template_attributes, :body => 'body')
29
+ @template_attributes.each do |key, value|
30
+ @object.stub(key.to_sym, value)
31
+ end
32
+ @template = Template.new(@object)
33
+
34
+ end
35
+
36
+ context "@bucket_name" do
37
+
38
+ it "should be set correctly" do
39
+ # accessor set in WarehouseModel
40
+ @template.class.bucket_name.should be_eql('templates')
41
+ end
42
+
43
+ end
44
+
45
+ context "#initialize" do
46
+
47
+ before(:each) do
48
+ @attr_writers = []
49
+ @attr_accessors = @template_attributes.keys - @attr_writers
50
+ end
51
+
52
+ it "should correctly set attribute writers" do
53
+ @attr_writers.each do |writer|
54
+ @template.respond_to?(:"#{writer.to_s}=").should be_true
55
+ end
56
+ end
57
+
58
+ it "should correctly set attribute accessors" do
59
+ @attr_accessors.each do |accessor|
60
+ @template.respond_to?(:"#{accessor.to_s}").should be_true
61
+ @template.respond_to?(:"#{accessor.to_s}=").should be_true
62
+ end
63
+ end
64
+
65
+ it "should set attributes to correct values" do
66
+ @attr_accessors.each do |key|
67
+ puts @template.send(:"#{key.to_s}")
68
+ @template.send(:"#{key.to_s}").should be_equal(@template_attributes[key])
69
+ end
70
+ end
71
+
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,445 @@
1
+ # Copyright 2011 Red Hat, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'spec_helper'
16
+
17
+ module Aeolus
18
+ module Image
19
+ module Warehouse
20
+ describe BucketObject do
21
+ let(:connection) { 'connection' }
22
+ let(:key) { 'key' }
23
+ let(:bucket) { mock(Bucket, :name => 'bucket_name') }
24
+
25
+ subject { BucketObject.new( connection, key, bucket ) }
26
+
27
+ context "#initialize" do
28
+
29
+ it "should set instance varibales correctly" do
30
+ subject.instance_variable_get(:@connection).should be_eql(connection)
31
+ subject.instance_variable_get(:@key).should be_eql(key)
32
+ subject.instance_variable_get(:@bucket).should be_eql(bucket)
33
+ subject.instance_variable_get(:@path).should be_eql('/bucket_name/key')
34
+ end
35
+ end
36
+
37
+ context ".create" do
38
+
39
+ pending
40
+
41
+ end
42
+
43
+ context "#body" do
44
+
45
+ let(:connection_hash) { { :plain => true } }
46
+
47
+ it "should call @connection.do_request with correct parameters" do
48
+ subject.instance_variable_get(:@connection).should_receive(:do_request).with(subject.instance_variable_get(:@path), connection_hash )
49
+ subject.body
50
+ end
51
+ end
52
+
53
+ context "#set_body" do
54
+
55
+ let(:body) { 'body' }
56
+ let(:connection_hash) { { :content => body, :method => :put } }
57
+
58
+ it "should call @connection.do_request with correct parameters" do
59
+ subject.instance_variable_get(:@connection).should_receive(:do_request).with(subject.instance_variable_get(:@path), connection_hash )
60
+ subject.set_body(body)
61
+ end
62
+
63
+ end
64
+
65
+ context "#attr_list" do
66
+
67
+ let(:connection_hash) { { :content => 'op=parts', :method => :post } }
68
+ let(:do_request_result) { Nokogiri::XML(do_request_result_string) }
69
+ let(:do_request_result_string) { "<object></object>" }
70
+ before(:each) do
71
+ subject.instance_variable_get(:@connection).stub(:do_request).and_return(do_request_result)
72
+ end
73
+
74
+ it "should call @connection.do_request with correct parameters" do
75
+ subject.instance_variable_get(:@connection).should_receive(:do_request).with( subject.instance_variable_get(:@path), connection_hash )
76
+ subject.attr_list
77
+ end
78
+
79
+ context "when @connection.do_request returns good data" do
80
+ let(:do_request_result_string) { "<object><object_attr name='name_1'>value_1</object_attr><object_attr name='name_2'>value_2</object_attr></object>" }
81
+
82
+ it "should return correct values" do
83
+ subject.attr_list.should be_eql(["name_1", "name_2"])
84
+ end
85
+ end
86
+
87
+ context "when @connection.do_request returns bad data" do
88
+ let(:do_request_result_string) { "<object>/<object>" }
89
+
90
+ it "should return correct values" do
91
+ subject.attr_list.should_not be_eql(["name_1", "name_2"])
92
+ subject.attr_list.should be_eql([])
93
+ end
94
+ end
95
+ end
96
+
97
+ context "#attrs" do
98
+
99
+ let(:attrs) { { 'attr1' => 'val1', 'attr2' => 'val2', 'attr_empty' => '', 'attr_nil' => nil, 'attr-dash' => 'dash' } }
100
+ let(:attr_list_without_dash) { attrs.keys - ['attr-dash'] }
101
+ let(:attr_list_with_dash) { attrs.keys - attr_list_without_dash }
102
+ let(:attr_list) { attr_list_with_dash + attr_list_without_dash }
103
+ let(:connection_hash) { { :plain => true } }
104
+ before(:each) do
105
+ attrs.each do |key, value|
106
+ subject.instance_variable_get(:@connection).stub(:do_request).with( "#{subject.instance_variable_get(:@path)}/#{key}", connection_hash ).and_return(value)
107
+ end
108
+ end
109
+
110
+ it "should call @connection.do_request for each attribute without dash" do
111
+ attr_list_without_dash.each do |attr|
112
+ subject.instance_variable_get(:@connection).should_receive(:do_request).with( "#{subject.instance_variable_get(:@path)}/#{attr}", connection_hash )
113
+ end
114
+ attr_list_with_dash.each do |attr|
115
+ subject.instance_variable_get(:@connection).should_not_receive(:do_request).with( "#{subject.instance_variable_get(:@path)}/#{attr}", connection_hash )
116
+ end
117
+ subject.attrs( attr_list )
118
+ end
119
+
120
+ it "should return correct values" do
121
+ subject.attrs(attr_list).should be_eql(attrs.except(*attr_list_with_dash))
122
+ end
123
+
124
+ end
125
+
126
+ context "#attr" do
127
+
128
+ let(:good_attribute_name) { "good_name" }
129
+ let(:good_attribute_value) { "good_value" }
130
+ let(:bad_attribute_name) { "bad_name" }
131
+ before(:each) do
132
+ subject.stub(:attrs).and_return( { good_attribute_name => good_attribute_value } )
133
+ end
134
+
135
+ context "when passed good name of attribute" do
136
+ it "should return correct value" do
137
+ subject.attr(good_attribute_name).should be_eql(good_attribute_value)
138
+ end
139
+ end
140
+
141
+ context "when passed bad name of attribute" do
142
+ it "should return nil" do
143
+ subject.attr(bad_attribute_name).should be_nil
144
+ end
145
+ end
146
+
147
+ context "when passed nil as name of attribute" do
148
+ it "should return nil" do
149
+ subject.attr(nil).should be_nil
150
+ end
151
+ end
152
+
153
+ end
154
+
155
+ context "#set_attrs" do
156
+
157
+ let(:attrs_hash) { { :attr1 => 'value1', :attr2 => 'value2' } }
158
+ before(:each) do
159
+ subject.stub(:set_attr)
160
+ end
161
+ it "should call set_attr with correct parameters for each attribute" do
162
+ attrs_hash.each do |key, value|
163
+ subject.should_receive(:set_attr).with(key, value)
164
+ end
165
+ subject.set_attrs(attrs_hash)
166
+ end
167
+
168
+ end
169
+
170
+ context "#set_attr" do
171
+
172
+ let(:name) { 'name' }
173
+ let(:content) { 'content' }
174
+ let(:connection_hash) { { :method => :put, :content => content } }
175
+ it "should call @connection.do_request with correct parameters" do
176
+ subject.instance_variable_get(:@connection).should_receive(:do_request).with("#{subject.instance_variable_get(:@path)}/#{name}", connection_hash )
177
+ subject.set_attr(name, content)
178
+ end
179
+ end
180
+
181
+ context "#delete!" do
182
+
183
+ let(:connection_hash) { { :method => :delete } }
184
+ before(:each) do
185
+ subject.instance_variable_get(:@connection).stub(:do_request)
186
+ end
187
+ it "should call @connection.do_request with correct parameters" do
188
+ subject.instance_variable_get(:@connection).should_receive(:do_request).with(subject.instance_variable_get(:@path), connection_hash )
189
+ subject.delete!
190
+ end
191
+
192
+ end
193
+ end
194
+
195
+ describe Bucket do
196
+
197
+ subject { bucket }
198
+ let(:name) { 'bucket_name' }
199
+ let(:do_request_result_string) { "<object>/<object>" }
200
+ let(:do_request_result) { Nokogiri::XML(do_request_result_string) }
201
+ let(:connection) { mock(Object, :do_request => do_request_result) }
202
+ let(:bucket) { Bucket.new(name, connection) }
203
+ context "#initialize" do
204
+
205
+ it "should set instance variables correctly" do
206
+ subject.instance_variable_get(:@name).should be_eql(name)
207
+ subject.instance_variable_get(:@connection).should be_eql(connection)
208
+ end
209
+ end
210
+
211
+ context "#to_s" do
212
+
213
+ it "should return correct string" do
214
+ subject.to_s.should be_eql("Bucket: #{name}")
215
+ end
216
+
217
+ end
218
+
219
+ context "#object_names" do
220
+ let(:connection_path) { "/#{name}" }
221
+ let(:do_request_result_string) { "<objects><object><key>name1</key></object><object><key>name2</key></object></objects>" }
222
+
223
+ it "should call @connection.do_request with correct parameters" do
224
+ connection.should_receive(:do_request).with(connection_path)
225
+ subject.object_names
226
+ end
227
+
228
+ it "should return array of object names" do
229
+ puts subject.object_names
230
+ subject.object_names.should be_eql(['name1', 'name2'])
231
+ end
232
+
233
+ end
234
+
235
+ context "#objects" do
236
+ let(:object_names) { %w{ name1 name2 } }
237
+ let(:mock_object) { mock(BucketObject) }
238
+ before(:each) do
239
+ subject.stub(:object_names).and_return(object_names)
240
+ subject.stub(:object).and_return( mock_object )
241
+ end
242
+
243
+ it "should return BucketObject for each object name" do
244
+ subject.objects.should be_eql([mock_object, mock_object])
245
+ end
246
+ end
247
+
248
+ context "#object" do
249
+
250
+ let(:object_name) { 'object_name' }
251
+ let(:mock_object) { mock(BucketObject) }
252
+ before(:each) do
253
+ BucketObject.stub(:new).and_return(mock_object)
254
+ end
255
+ it "should call BucketObject.new with correct parameters" do
256
+ BucketObject.should_receive(:new).with(connection, object_name, subject)
257
+ subject.object(object_name)
258
+ end
259
+
260
+ it "should return new BucketObject" do
261
+ subject.object(object_name).should be_eql(mock_object)
262
+ end
263
+
264
+ end
265
+
266
+ context "#create_object" do
267
+
268
+ let(:object_name) { 'object_name' }
269
+ let(:object_body) { 'object_body' }
270
+ let(:object_attrs) { { :attr1 => 'value1', :attr2 => 'value2' } }
271
+ let(:mock_object) { mock(BucketObject) }
272
+ before(:each) do
273
+ BucketObject.stub(:create).and_return(mock_object)
274
+ end
275
+ it "should call BucketObject.create with correct parameters" do
276
+ BucketObject.should_receive(:create).with(connection, object_name, subject, object_body, object_attrs)
277
+ subject.create_object(object_name, object_body, object_attrs)
278
+ end
279
+
280
+ it "should return new BucketObject" do
281
+ subject.create_object(object_name, object_body, object_attrs).should be_eql(mock_object)
282
+ end
283
+
284
+ end
285
+
286
+ context "#include?" do
287
+
288
+ let(:object_names) { %w{ name1 name2 } }
289
+ before(:each) do
290
+ subject.stub(:object_names).and_return(object_names)
291
+ end
292
+
293
+ context "when passed key of existing object" do
294
+ it { subject.include?('name1').should be_true }
295
+ end
296
+ context "when passed key of nonexisting object" do
297
+ it { subject.include?('name3').should be_false }
298
+ end
299
+
300
+ end
301
+ end
302
+
303
+ describe Connection do
304
+ subject { connection }
305
+
306
+ let(:uri) { 'uri' }
307
+ let(:connection) { Connection.new(uri) }
308
+ context "#initialize" do
309
+
310
+ it "should set up instance variables correctly" do
311
+ subject.instance_variable_get(:@uri).should be_eql(uri)
312
+ end
313
+
314
+ end
315
+
316
+ context "#do_request" do
317
+ let(:path) { 'path' }
318
+ let(:opts) { { :method => 'method', :content => 'content', :plain => false, :headers => {} } }
319
+ let(:result) { 'result' }
320
+ let(:xml_result) { Nokogiri::XML(result) }
321
+
322
+ before(:each) do
323
+ RestClient::Request.stub(:execute).and_return(result)
324
+ end
325
+
326
+ context "with meaningful parameters" do
327
+
328
+ it "should call RestClient::Request.execute with correct parameters" do
329
+ RestClient::Request.should_receive(:execute).with(:method => opts[:method], :url => uri + path, :payload => opts[:content], :headers => opts[:headers])
330
+ subject.do_request(path, opts)
331
+ end
332
+ end
333
+ context "with no parameters" do
334
+
335
+ it "should call RestClient::Request.execute with meaningful defaults" do
336
+ RestClient::Request.should_receive(:execute).with(:method => :get, :url => uri + '/', :payload => '', :headers => {})
337
+ subject.do_request()
338
+ end
339
+ end
340
+
341
+ context "with opts[:plain] = true" do
342
+ let(:opts) { { :method => 'method', :content => 'content', :plain => true, :headers => {} } }
343
+ it "should return plain result" do
344
+ subject.do_request(path, opts).should be_eql(result)
345
+ end
346
+ end
347
+
348
+ context "with opts[:plain] = false" do
349
+ let(:opts) { { :method => 'method', :content => 'content', :plain => false, :headers => {} } }
350
+ it "should return plain result" do
351
+ subject.do_request(path, opts).to_s.should be_eql(xml_result.to_s)
352
+ subject.do_request(path, opts).class.should be_eql(xml_result.class)
353
+ end
354
+ end
355
+ end
356
+
357
+ describe Client do
358
+
359
+ subject { client }
360
+ let(:client) { Client.new(uri) }
361
+ let(:uri) { 'uri' }
362
+ let(:connection) { mock(Object, :do_request => do_request_result) }
363
+ let(:do_request_result) { Nokogiri::XML(do_request_result_string) }
364
+ let(:do_request_result_string) { "<object>/<object>" }
365
+ before(:each) do
366
+ Connection.stub(:new).and_return(connection)
367
+ end
368
+
369
+ context "#initialize" do
370
+
371
+ it "should set instance variables correctly" do
372
+ subject.instance_variable_get(:@connection).should be_eql(connection)
373
+ end
374
+
375
+ end
376
+
377
+ context "#create_bucket" do
378
+ let(:bucket) { mock(Bucket) }
379
+ let(:bucket_name) { 'bucket_name' }
380
+ let(:path) { "/#{bucket_name}" }
381
+ let(:connection_hash) { { :method => :put } }
382
+ before(:each) do
383
+ Bucket.stub(:new).and_return(bucket)
384
+ end
385
+
386
+ it "should call @connection.do_request with correct parameters" do
387
+ connection.should_receive(:do_request).with(path, connection_hash)
388
+ subject.create_bucket(bucket_name)
389
+ end
390
+
391
+ it "should return Bucket object" do
392
+ subject.create_bucket(bucket_name).should be_eql(bucket)
393
+ end
394
+
395
+ end
396
+
397
+ context "#bucket" do
398
+ let(:bucket) { mock(Bucket) }
399
+ let(:bucket_name) { 'bucket_name' }
400
+ before(:each) do
401
+ Bucket.stub(:new).and_return(bucket)
402
+ end
403
+
404
+ it "should return Bucket object" do
405
+ subject.create_bucket(bucket_name).should be_eql(bucket)
406
+ end
407
+
408
+ end
409
+
410
+ context "#buckets" do
411
+ let(:bucket_names) { %w{ bucket1 bucket2 bucket3 } }
412
+ let(:do_request_result_string) { "<api>#{bucket_names.map{|bn| "<link rel='bucket' href='#{bn}'/>"}}</api>" }
413
+ it "should return array of bucket names" do
414
+ subject.buckets.should be_eql(bucket_names)
415
+ end
416
+
417
+ end
418
+
419
+ context "#get_iwhd_version" do
420
+ let(:iwhd_version) { 'iwhd_version' }
421
+ let(:do_request_result_string) { "<api service='image_warehouse' version='#{iwhd_version}'></api>" }
422
+ it "should return iwhd version value" do
423
+ subject.get_iwhd_version.should be_eql(iwhd_version)
424
+ end
425
+
426
+ end
427
+
428
+ context "#query" do
429
+ let(:bucket_name) { 'bucket_name' }
430
+ let(:path) { "/#{bucket_name}/_query" }
431
+ let(:query_string) { "query_string" }
432
+ let(:connection_hash) { { :method => :post, :content => query_string } }
433
+
434
+ it "should call @connection.do_request with correct parameters" do
435
+
436
+ connection.should_receive(:do_request).with(path, connection_hash)
437
+ subject.query(bucket_name, query_string)
438
+ end
439
+
440
+ end
441
+ end
442
+ end
443
+ end
444
+ end
445
+ end