stratus 1.0.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.
@@ -0,0 +1,18 @@
1
+ module Stratus::AWS::IAM
2
+ class Client
3
+ def initialize(access_key_id, secret_access_key)
4
+ @base = Stratus::AWS::IAM::Base.new(access_key_id, secret_access_key)
5
+ end
6
+
7
+ # @return [Array<Stratus::AWS::IAM::Group>]
8
+ def groups
9
+ groups = []
10
+
11
+ @base.list_groups['ListGroupsResult']['Groups']['member'].each do |i|
12
+ groups << Group.new(i)
13
+ end
14
+
15
+ return groups
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,12 @@
1
+ require 'ostruct'
2
+ require 'active_support/inflector'
3
+
4
+ module Stratus::AWS::IAM
5
+ class Group < OpenStruct
6
+ def initialize(params)
7
+ attributes = {}
8
+ params.each { |k, v| attributes[k.underscore] = v }
9
+ super(attributes)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'stratus'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../lib/stratus')
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../lib/stratus/aws')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../lib/stratus/aws/iam')
5
+
6
+ class IAMBaseStub
7
+ def list_groups
8
+ {"ListGroupsResult"=>
9
+ {"IsTruncated"=>"false",
10
+ "Groups"=>
11
+ {"member"=>
12
+ [{"GroupId"=>"AGPAI5CJDQYAAILTSCKWM",
13
+ "Arn"=>"arn:aws:iam::763958113208:group/Administrator",
14
+ "Path"=>"/",
15
+ "GroupName"=>"Administrator"},
16
+ {"GroupId"=>"AGPAJXMNNTLP6O6CIWNCW",
17
+ "Arn"=>"arn:aws:iam::763958113208:group/Developer/Developer",
18
+ "Path"=>"/Developer/",
19
+ "GroupName"=>"Developer"}]}},
20
+ "ResponseMetadata"=>{"RequestId"=>"b2fc292f-c09e-11df-b52e-932157311353"},
21
+ "xmlns"=>"https://iam.amazonaws.com/doc/2010-05-08/"}
22
+ end
23
+ end
24
+
25
+ describe "Stratus::AWS::IAM::Client::Base" do
26
+ before(:each) do
27
+ Stratus::AWS::IAM::Base.should_receive(:new).and_return(IAMBaseStub.new)
28
+ @iam = Stratus::AWS::IAM::Client.new('aaa', 'bbb')
29
+ end
30
+
31
+ context "#groups" do
32
+ it "should return a list of groups" do
33
+ @iam.groups.should have(2).groups
34
+ end
35
+
36
+ it "should contain a group which has group attributes" do
37
+ @iam.groups.first.group_id.should == 'AGPAI5CJDQYAAILTSCKWM'
38
+ @iam.groups.first.arn.should == 'arn:aws:iam::763958113208:group/Administrator'
39
+ @iam.groups.first.path.should == '/'
40
+ @iam.groups.first.group_name.should == 'Administrator'
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../lib/stratus')
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../lib/stratus/aws')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../../../../lib/stratus/aws/iam')
5
+
6
+ describe "Stratus::AWS::IAM::Group" do
7
+ context "#initialize" do
8
+ it "should store parameters as attributes with camelized attribute name" do
9
+ group = Stratus::AWS::IAM::Group.new({
10
+ 'GroupId' => 'AGPAI5CJDQYAAILTSCKWM',
11
+ "Arn" => "arn:aws:iam::763958113208:group/Administrator",
12
+ "Path" => "/",
13
+ "GroupName" => "Test",
14
+ })
15
+ group.group_id = 'AGPAI5CJDQYAAILTSCKWM'
16
+ group.arn = 'arn:aws:iam::763958113208:group/Administrator'
17
+ group.path = '/'
18
+ group.group_name = 'Test'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,1224 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require File.expand_path(File.dirname(__FILE__) + '/../../../lib/stratus')
3
+ require File.expand_path(File.dirname(__FILE__) + '/../../../lib/stratus/aws')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../../../lib/stratus/aws/iam')
5
+
6
+ describe "Stratus::AWS::IAM::Base" do
7
+ before(:each) do
8
+ @iam = Stratus::AWS::IAM::Base.new('aaa', 'bbb')
9
+ end
10
+
11
+ context "#get_group" do
12
+ before(:each) do
13
+ response = stub(RestClient::Response, :code => '200', :to_str => get_group_response, :empty? => false)
14
+ RestClient.stub!(:get).and_return(response)
15
+ end
16
+
17
+ it "must be able to get a intended group attributes." do
18
+ result = @iam.get_group(:group_name => 'NewGroup1')
19
+ result.should have_key('GetGroupResult')
20
+ result['GetGroupResult'].should have_key('Users')
21
+ result['GetGroupResult'].should have_key('Group')
22
+ users = result['GetGroupResult']['Users']
23
+ users.should be_nil
24
+ group = result['GetGroupResult']['Group']
25
+ group.should have_key('GroupId')
26
+ group.should have_key('GroupName')
27
+ group.should have_key('Path')
28
+ group.should have_key('Arn')
29
+ end
30
+
31
+ it "must raise ArgumentError if the group_name parameter haven't been passed." do
32
+ lambda { @iam.get_group }.should raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+
37
+ context "#create_group" do
38
+ before(:each) do
39
+ response = stub(RestClient::Response, :code => '200', :to_str => create_group_response, :empty? => false)
40
+ RestClient.stub!(:get).and_return(response)
41
+ end
42
+
43
+ it "must be able to create a new group" do
44
+ result = @iam.create_group(:group_name => 'NewGroup1')
45
+ result.should have_key('CreateGroupResult')
46
+ result['CreateGroupResult'].should have_key('Group')
47
+ group = result['CreateGroupResult']['Group']
48
+ group.should have_key('GroupId')
49
+ group.should have_key('GroupName')
50
+ group.should have_key('Path')
51
+ group.should have_key('Arn')
52
+ end
53
+
54
+ it "must raise ArgumentError if the group_name parameter haven't been passed." do
55
+ lambda { @iam.create_group }.should raise_error(ArgumentError)
56
+ end
57
+ end
58
+
59
+ context "#delete_group" do
60
+ before(:each) do
61
+ response = stub(RestClient::Response, :code => '200', :to_str => delete_group_response, :empty? => false)
62
+ RestClient.stub!(:get).and_return(response)
63
+ end
64
+
65
+ it "must be able to delete a intended group" do
66
+ result = @iam.delete_group(:group_name => 'NewGroup1')
67
+ result.should have_key('ResponseMetadata')
68
+ end
69
+
70
+ it "must raise ArgumentError if the group_name parameter haven't been passed." do
71
+ lambda { @iam.delete_group }.should raise_error(ArgumentError)
72
+ end
73
+ end
74
+
75
+ it "#list_groups" do
76
+ response = stub(RestClient::Response, :code => '200', :to_str => list_groups_response, :empty? => false)
77
+ RestClient.stub!(:get).and_return(response)
78
+ result = @iam.list_groups
79
+ result['ListGroupsResult']['Groups']['member'].should have(1).groups
80
+ end
81
+
82
+ context "#update_group" do
83
+ before(:each) do
84
+ response = stub(RestClient::Response, :code => '200', :to_str => update_group_response, :empty? => false)
85
+ RestClient.stub!(:get).and_return(response)
86
+ end
87
+
88
+ it "must be able to update the intended group attributes" do
89
+ result = @iam.update_group(:group_name => 'Group1', :new_group_name => 'NewGroup1')
90
+ result.should have_key('ResponseMetadata')
91
+
92
+ # The Amazon IAM UpdateGroup API is work,
93
+ # But the response does not have a UpdateGroupResult tag.
94
+ # Is this a Amazon's documentation or implementation Bug?
95
+ #
96
+ #result.should have_key('UpdateGroupResult')
97
+ end
98
+
99
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
100
+ lambda { @iam.update_group }.should raise_error(ArgumentError)
101
+ end
102
+ end
103
+
104
+ context "#add_user_to_group" do
105
+ before(:each) do
106
+ response = stub(RestClient::Response, :code => '200', :to_str => add_user_to_group_response, :empty? => false)
107
+ RestClient.stub!(:get).and_return(response)
108
+ end
109
+
110
+ it "must be able to add the new user to the group" do
111
+ result = @iam.add_user_to_group(:group_name => 'Group1', :user_name => 'User1')
112
+ result.should have_key('ResponseMetadata')
113
+ end
114
+
115
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
116
+ lambda { @iam.add_user_to_group(:group_name => 'Group1') }.should raise_error(ArgumentError)
117
+ end
118
+
119
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
120
+ lambda { @iam.add_user_to_group(:user_name => 'User1') }.should raise_error(ArgumentError)
121
+ end
122
+ end
123
+
124
+ context "#remove_user_from_group" do
125
+ before(:each) do
126
+ response = stub(RestClient::Response, :code => '200', :to_str => remove_user_from_group_response, :empty? => false)
127
+ RestClient.stub!(:get).and_return(response)
128
+ end
129
+
130
+ it "must be able to remove the new user to the group" do
131
+ result = @iam.remove_user_from_group(:group_name => 'Group1', :user_name => 'User1')
132
+ result.should have_key('ResponseMetadata')
133
+ end
134
+
135
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
136
+ lambda { @iam.remove_user_from_group(:group_name => 'Group1') }.should raise_error(ArgumentError)
137
+ end
138
+
139
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
140
+ lambda { @iam.remove_user_from_group(:user_name => 'User1') }.should raise_error(ArgumentError)
141
+ end
142
+ end
143
+
144
+ context "#get_user" do
145
+ before(:each) do
146
+ response = stub(RestClient::Response, :code => '200', :to_str => get_user_response, :empty? => false)
147
+ RestClient.stub!(:get).and_return(response)
148
+ end
149
+
150
+ it "must be able to get a user attributes" do
151
+ result = @iam.get_user
152
+ result.should have_key('GetUserResult')
153
+ result['GetUserResult'].should have_key('User')
154
+ user = result['GetUserResult']['User']
155
+ user['UserId'].should_not be_nil
156
+ user['Arn'].should_not be_nil
157
+
158
+ # if the user that just getting attributes is not created by the CreateUser API,
159
+ # GetUser API result does not have following keys.
160
+ user['UserName'].should be_nil
161
+ user['Path'].should be_nil
162
+ end
163
+
164
+ context "if :user_name option passed" do
165
+ before(:each) do
166
+ response = stub(RestClient::Response, :code => '200', :to_str => get_user_response(:with_user_name => true), :empty? => false)
167
+ RestClient.stub!(:get).and_return(response)
168
+ end
169
+
170
+ it "must be able to get a user attributes" do
171
+ result = @iam.get_user(:user_name => 'User1')
172
+ result.should have_key('GetUserResult')
173
+ result['GetUserResult'].should have_key('User')
174
+ user = result['GetUserResult']['User']
175
+ user['UserId'].should_not be_nil
176
+ user['Arn'].should_not be_nil
177
+ user['UserName'].should_not be_nil
178
+ user['Path'].should_not be_nil
179
+ end
180
+ end
181
+
182
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
183
+ @iam.should_receive(:call_api).with('GetUser', {}).once.and_return(get_user_response)
184
+ @iam.get_user
185
+ end
186
+ end
187
+
188
+ context "#create_user" do
189
+ before(:each) do
190
+ response = stub(RestClient::Response, :code => '200', :to_str => create_user_response, :empty? => false)
191
+ RestClient.stub!(:get).and_return(response)
192
+ end
193
+
194
+ it "must be able to create a new user" do
195
+ result = @iam.create_user(:user_name => 'NewUser')
196
+ user = result['CreateUserResult']['User']
197
+ user.should_not be_nil
198
+ user['UserId'].should == 'AIDAI6PGTVSCYFGUNXK4G'
199
+ user['Path'].should == '/'
200
+ user['UserName'].should == 'NewUser'
201
+ user['Arn'].should == 'arn:aws:iam::832248165982:user/NewUser'
202
+ end
203
+
204
+ it "must raise ArgumentError if the user_name parameter haven't been passed." do
205
+ lambda { @iam.create_user }.should raise_error(ArgumentError)
206
+ end
207
+ end
208
+
209
+ context "#delete_user" do
210
+ before(:each) do
211
+ response = stub(RestClient::Response, :code => '200', :to_str => delete_user_response, :empty? => false)
212
+ RestClient.stub!(:get).and_return(response)
213
+ end
214
+
215
+ it "must be able to delete a existing user" do
216
+ result = @iam.delete_user(:user_name => 'NewUser')
217
+ result.should have_key('ResponseMetadata')
218
+ result['ResponseMetadata'].should have_key('RequestId')
219
+ end
220
+
221
+ it "must raise ArgumentError if the user_name parameter haven't been passed." do
222
+ lambda { @iam.delete_user }.should raise_error(ArgumentError)
223
+ end
224
+ end
225
+
226
+ context "#list_users" do
227
+ before(:each) do
228
+ response = stub(RestClient::Response, :code => '200', :to_str => list_users_response, :empty? => false)
229
+ RestClient.stub!(:get).and_return(response)
230
+ end
231
+
232
+ it "must be able to list existing users" do
233
+ result = @iam.list_users
234
+ result.should have_key('ListUsersResult')
235
+ result['ListUsersResult'].should have_key('Users')
236
+ result['ListUsersResult']['Users'].should have_key('member')
237
+ users = result['ListUsersResult']['Users']['member']
238
+ users.should be_kind_of(Array)
239
+ users.each do |user|
240
+ user['UserId'].should_not be_empty
241
+ user['Path'].should == '/'
242
+ user['UserName'].should_not be_empty
243
+ user['Arn'].should_not be_empty
244
+ end
245
+ end
246
+ end
247
+
248
+ context "#list_groups_for_user" do
249
+ before(:each) do
250
+ response = stub(RestClient::Response, :code => '200', :to_str => list_groups_for_user_response, :empty? => false)
251
+ RestClient.stub!(:get).and_return(response)
252
+ end
253
+
254
+ it "must be able to get groups for the intended user" do
255
+ result = @iam.list_groups_for_user(:user_name => 'User1')
256
+ result.should have_key('ListGroupsForUserResult')
257
+ result['ListGroupsForUserResult'].should have_key('Groups')
258
+ result['ListGroupsForUserResult']['Groups'].should be_nil
259
+ end
260
+
261
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
262
+ lambda { @iam.list_groups_for_user }.should raise_error(ArgumentError)
263
+ end
264
+ end
265
+
266
+ context "#update_user" do
267
+ before(:each) do
268
+ response = stub(RestClient::Response, :code => '200', :to_str => update_user_response, :empty? => false)
269
+ RestClient.stub!(:get).and_return(response)
270
+ end
271
+
272
+ it "must be able to update the intended user attributes" do
273
+ result = @iam.update_user(:user_name => 'User1', :new_user_name => 'NewUser1')
274
+ result.should have_key('ResponseMetadata')
275
+
276
+ # The Amazon IAM UpdateUser API is work,
277
+ # But the response does not have a UpdateUserResult tag.
278
+ # Is this a Amazon's documentation or implementation Bug?
279
+ #
280
+ #result.should have_key('UpdateUserResult')
281
+ end
282
+
283
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
284
+ lambda { @iam.update_user }.should raise_error(ArgumentError)
285
+ end
286
+ end
287
+
288
+ context "#create_access_key" do
289
+ before(:each) do
290
+ response = stub(RestClient::Response, :code => '200', :to_str => create_access_key_response, :empty? => false)
291
+ RestClient.stub!(:get).and_return(response)
292
+ end
293
+
294
+ it "must be able to create a new access key" do
295
+ result = @iam.create_access_key(:user_name => 'User1')
296
+ result.should have_key('CreateAccessKeyResult')
297
+ result['CreateAccessKeyResult'].should have_key('AccessKey')
298
+ result['CreateAccessKeyResult']['AccessKey'].should_not be_nil
299
+ end
300
+
301
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
302
+ @iam.should_receive(:call_api).with('CreateAccessKey', {}).once.and_return(create_access_key_response)
303
+ @iam.create_access_key
304
+ end
305
+ end
306
+
307
+ context "#delete_access_key" do
308
+ before(:each) do
309
+ response = stub(RestClient::Response, :code => '200', :to_str => delete_access_key_response, :empty? => false)
310
+ RestClient.stub!(:get).and_return(response)
311
+ end
312
+
313
+ it "must be able to delete a intended access key" do
314
+ result = @iam.delete_access_key(:access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :user_id => 'User1')
315
+ result.should have_key('ResponseMetadata')
316
+ end
317
+
318
+ it "must raise ArgumentError if the :access_key_id option haven't been passed." do
319
+ lambda { @iam.delete_access_key }.should raise_error(ArgumentError)
320
+ end
321
+
322
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
323
+ @iam.should_receive(:call_api).with(
324
+ 'DeleteAccessKey', {'AccessKeyId' => 'AKIAXXXXXXXXXXXXXXXX'}
325
+ ).once.and_return(delete_access_key_response)
326
+ @iam.delete_access_key(:access_key_id => 'AKIAXXXXXXXXXXXXXXXX')
327
+ end
328
+ end
329
+
330
+ context "#update_access_key" do
331
+ before(:each) do
332
+ response = stub(RestClient::Response, :code => '200', :to_str => update_access_key_response, :empty? => false)
333
+ RestClient.stub!(:get).and_return(response)
334
+ end
335
+
336
+ it "must be able to update a intended access key" do
337
+ result = @iam.update_access_key(:access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :status => 'Active', :user_id => 'User1')
338
+ result.should have_key('ResponseMetadata')
339
+ end
340
+
341
+ it "must raise ArgumentError if the :access_key_id option haven't been passed." do
342
+ lambda {
343
+ @iam.update_access_key(:user_name => 'User1', :status => 'Active')
344
+ }.should raise_error(ArgumentError)
345
+ end
346
+
347
+ it "must raise ArgumentError if the :status option haven't been passed." do
348
+ lambda {
349
+ @iam.update_access_key(:user_name => 'User1', :access_key_id => 'AKIAXXXXXXXXXXXXXXXX')
350
+ }.should raise_error(ArgumentError)
351
+ end
352
+
353
+ it "must raise ArgumentError if invalid :status option have been passed." do
354
+ lambda {
355
+ @iam.update_access_key(:user_name => 'User1', :access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :status => 'active')
356
+ @iam.update_access_key(:user_name => 'User1', :access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :status => :active)
357
+ @iam.update_access_key(:user_name => 'User1', :access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :status => 'Active')
358
+ }.should_not raise_error(ArgumentError)
359
+ lambda {
360
+ @iam.update_access_key(:user_name => 'User1', :access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :status => 'XXXX')
361
+ }.should raise_error(ArgumentError)
362
+ end
363
+
364
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
365
+ @iam.should_receive(:call_api).with(
366
+ 'UpdateAccessKey', {'AccessKeyId' => 'AKIAXXXXXXXXXXXXXXXX', 'Status' => 'Inactive'}
367
+ ).once.and_return(update_access_key_response)
368
+ @iam.update_access_key(:access_key_id => 'AKIAXXXXXXXXXXXXXXXX', :status => :inactive)
369
+ end
370
+ end
371
+
372
+ context "#list_access_keys" do
373
+ before(:each) do
374
+ response = stub(RestClient::Response, :code => '200', :to_str => list_access_keys_response, :empty? => false)
375
+ RestClient.stub!(:get).and_return(response)
376
+ end
377
+
378
+ it "must be able to get a list of access keys" do
379
+ result = @iam.list_access_keys(:user_name => 'User1')
380
+ result.should have_key('ListAccessKeysResult')
381
+ result['ListAccessKeysResult'].should have_key('AccessKeyMetadata')
382
+ result['ListAccessKeysResult']['AccessKeyMetadata'].should have_key('member')
383
+ result['ListAccessKeysResult']['AccessKeyMetadata']['member'].should be_kind_of(Array)
384
+ result['ListAccessKeysResult']['AccessKeyMetadata']['member'].each do |key|
385
+ key['UserName'].should_not be_nil
386
+ key['AccessKeyId'].should_not be_nil
387
+ key['Status'].should_not be_nil
388
+ end
389
+ end
390
+
391
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
392
+ @iam.should_receive(:call_api).with('ListAccessKeys', {}).once.and_return(list_access_keys_response)
393
+ @iam.list_access_keys
394
+ end
395
+ end
396
+
397
+ context "#get_group_policy" do
398
+ before(:each) do
399
+ response = stub(RestClient::Response, :code => '200', :to_str => get_group_policy_response, :empty? => false)
400
+ RestClient.stub!(:get).and_return(response)
401
+ end
402
+
403
+ it "must be able to get a intended group policy" do
404
+ result = @iam.get_group_policy(:group_name => 'Group1', :policy_name => 'Policy1')
405
+ result.should have_key('GetGroupPolicyResult')
406
+ result['GetGroupPolicyResult'].should have_key('GroupName')
407
+ result['GetGroupPolicyResult'].should have_key('PolicyName')
408
+ result['GetGroupPolicyResult'].should have_key('PolicyDocument')
409
+ result['GetGroupPolicyResult']['GroupName'].should_not be_empty
410
+ result['GetGroupPolicyResult']['PolicyName'].should_not be_empty
411
+ result['GetGroupPolicyResult']['PolicyDocument'].should_not be_empty
412
+ end
413
+
414
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
415
+ lambda {
416
+ @iam.get_group_policy(:policy_name => 'Policy1')
417
+ }.should raise_error(ArgumentError)
418
+ end
419
+
420
+ it "must raise ArgumentError if the :policy_name option haven't been passed." do
421
+ lambda {
422
+ @iam.get_group_policy(:group_name => 'Group1')
423
+ }.should raise_error(ArgumentError)
424
+ end
425
+ end
426
+
427
+ context "#put_group_policy" do
428
+ before(:each) do
429
+ @policy = '{"Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}'
430
+ response = stub(RestClient::Response, :code => '200', :to_str => put_group_policy_response, :empty? => false)
431
+ RestClient.stub!(:get).and_return(response)
432
+ end
433
+
434
+ it "must be able to put a new group policy" do
435
+ result = @iam.put_group_policy(:group_name => 'Group1', :policy_name => 'Policy1', :policy_document => @policy)
436
+ result.should have_key('ResponseMetadata')
437
+ end
438
+
439
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
440
+ lambda {
441
+ @iam.put_group_policy(:policy_name => 'Policy1', :policy_document => @policy)
442
+ }.should raise_error(ArgumentError)
443
+ end
444
+
445
+ it "must raise ArgumentError if the :policy_name option haven't been passed." do
446
+ lambda {
447
+ @iam.put_group_policy(:group_name => 'Group1', :policy_document => @policy)
448
+ }.should raise_error(ArgumentError)
449
+ end
450
+
451
+ it "must raise ArgumentError if the :policy_document option haven't been passed." do
452
+ lambda {
453
+ @iam.put_group_policy(:group_name => 'Group1', :policy_name => 'Policy1')
454
+ }.should raise_error(ArgumentError)
455
+ end
456
+ end
457
+
458
+ context "#delete_group_policy" do
459
+ before(:each) do
460
+ response = stub(RestClient::Response, :code => '200', :to_str => delete_group_policy_response, :empty? => false)
461
+ RestClient.stub!(:get).and_return(response)
462
+ end
463
+
464
+ it "must be able to delete intended group policy" do
465
+ result = @iam.delete_group_policy(:group_name => 'Group1', :policy_name => 'Policy1')
466
+ result.should have_key('ResponseMetadata')
467
+ end
468
+
469
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
470
+ lambda {
471
+ @iam.delete_group_policy(:policy_name => 'Policy1')
472
+ }.should raise_error(ArgumentError)
473
+ end
474
+
475
+ it "must raise ArgumentError if the :policy_name option haven't been passed." do
476
+ lambda {
477
+ @iam.delete_group_policy(:group_name => 'Group1')
478
+ }.should raise_error(ArgumentError)
479
+ end
480
+ end
481
+
482
+ context "#list_group_policies" do
483
+ before(:each) do
484
+ response = stub(RestClient::Response, :code => '200', :to_str => list_group_policies_response, :empty? => false)
485
+ RestClient.stub!(:get).and_return(response)
486
+ end
487
+
488
+ it "must be able to get a list of group policies" do
489
+ result = @iam.list_group_policies(:group_name => 'Group1')
490
+ result.should have_key('ListGroupPoliciesResult')
491
+ result['ListGroupPoliciesResult'].should have_key('PolicyNames')
492
+ result['ListGroupPoliciesResult']['PolicyNames'].should have_key('member')
493
+ result['ListGroupPoliciesResult']['PolicyNames']['member'].should be_kind_of(Array)
494
+ result['ListGroupPoliciesResult']['PolicyNames']['member'].each do |policy_name|
495
+ policy_name.should_not be_nil
496
+ end
497
+ end
498
+
499
+ it "must raise ArgumentError if the :group_name option haven't been passed." do
500
+ lambda {
501
+ @iam.list_group_policies
502
+ }.should raise_error(ArgumentError)
503
+ end
504
+ end
505
+
506
+ context "#get_user_policy" do
507
+ before(:all) { require 'json' }
508
+ before(:each) do
509
+ response = stub(RestClient::Response, :code => '200', :to_str => get_user_policy_response, :empty? => false)
510
+ RestClient.stub!(:get).and_return(response)
511
+ end
512
+
513
+ it "must be able to get a intended user policy" do
514
+ result = @iam.get_user_policy(:user_name => 'User1', :policy_name => 'Policy1')
515
+ result.should have_key('GetUserPolicyResult')
516
+ result['GetUserPolicyResult'].should have_key('UserName')
517
+ result['GetUserPolicyResult'].should have_key('PolicyName')
518
+ result['GetUserPolicyResult'].should have_key('PolicyDocument')
519
+ result['GetUserPolicyResult']['UserName'].should_not be_empty
520
+ result['GetUserPolicyResult']['PolicyName'].should_not be_empty
521
+ result['GetUserPolicyResult']['PolicyDocument'].should_not be_empty
522
+ end
523
+
524
+ it "must return a policy document formated by JSON" do
525
+ result = @iam.get_user_policy(:user_name => 'User1', :policy_name => 'Policy1')
526
+ lambda {
527
+ policy = JSON.parse(result['GetUserPolicyResult']['PolicyDocument'])
528
+ policy.should have_key('Statement')
529
+ }.should_not raise_error(JSON::ParserError)
530
+ end
531
+
532
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
533
+ lambda {
534
+ @iam.get_user_policy(:policy_name => 'Policy1')
535
+ }.should raise_error(ArgumentError)
536
+ end
537
+
538
+ it "must raise ArgumentError if the :policy_name option haven't been passed." do
539
+ lambda {
540
+ @iam.get_user_policy(:user_name => 'User1')
541
+ }.should raise_error(ArgumentError)
542
+ end
543
+ end
544
+
545
+ context "#put_user_policy" do
546
+ before(:each) do
547
+ @policy = '{"Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}'
548
+ response = stub(RestClient::Response, :code => '200', :to_str => put_user_policy_response, :empty? => false)
549
+ RestClient.stub!(:get).and_return(response)
550
+ end
551
+
552
+ it "must be able to put a new user policy" do
553
+ result = @iam.put_user_policy(:user_name => 'User1', :policy_name => 'Policy1', :policy_document => @policy)
554
+ result.should have_key('ResponseMetadata')
555
+ end
556
+
557
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
558
+ lambda {
559
+ @iam.put_user_policy(:policy_name => 'Policy1', :policy_document => @policy)
560
+ }.should raise_error(ArgumentError)
561
+ end
562
+
563
+ it "must raise ArgumentError if the :policy_name option haven't been passed." do
564
+ lambda {
565
+ @iam.put_user_policy(:user_name => 'User1', :policy_document => @policy)
566
+ }.should raise_error(ArgumentError)
567
+ end
568
+
569
+ it "must raise ArgumentError if the :policy_document option haven't been passed." do
570
+ lambda {
571
+ @iam.put_user_policy(:user_name => 'User1', :policy_name => 'Policy1')
572
+ }.should raise_error(ArgumentError)
573
+ end
574
+ end
575
+
576
+ context "#delete_user_policy" do
577
+ before(:each) do
578
+ response = stub(RestClient::Response, :code => '200', :to_str => delete_user_policy_response, :empty? => false)
579
+ RestClient.stub!(:get).and_return(response)
580
+ end
581
+
582
+ it "must be able to delete intended user policy" do
583
+ result = @iam.delete_user_policy(:user_name => 'User1', :policy_name => 'Policy1')
584
+ result.should have_key('ResponseMetadata')
585
+ end
586
+
587
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
588
+ lambda {
589
+ @iam.delete_user_policy(:policy_name => 'Policy1')
590
+ }.should raise_error(ArgumentError)
591
+ end
592
+
593
+ it "must raise ArgumentError if the :policy_name option haven't been passed." do
594
+ lambda {
595
+ @iam.delete_user_policy(:user_name => 'User1')
596
+ }.should raise_error(ArgumentError)
597
+ end
598
+ end
599
+
600
+ context "#list_user_policies" do
601
+ before(:each) do
602
+ response = stub(RestClient::Response, :code => '200', :to_str => list_user_policies_response, :empty? => false)
603
+ RestClient.stub!(:get).and_return(response)
604
+ end
605
+
606
+ it "must be able to get a list of user policies" do
607
+ result = @iam.list_user_policies(:user_name => 'User1')
608
+ result.should have_key('ListUserPoliciesResult')
609
+ result['ListUserPoliciesResult'].should have_key('PolicyNames')
610
+ result['ListUserPoliciesResult']['PolicyNames'].should have_key('member')
611
+ result['ListUserPoliciesResult']['PolicyNames']['member'].should be_kind_of(Array)
612
+ result['ListUserPoliciesResult']['PolicyNames']['member'].each do |policy_name|
613
+ policy_name.should_not be_nil
614
+ end
615
+ end
616
+
617
+ it "must raise ArgumentError if the :user_name option haven't been passed." do
618
+ lambda {
619
+ @iam.list_user_policies
620
+ }.should raise_error(ArgumentError)
621
+ end
622
+ end
623
+
624
+ context "#upload_signing_certificate" do
625
+ before(:each) do
626
+ @response = stub(RestClient::Response, :code => '200', :to_str => upload_signing_certificate_response, :empty? => false)
627
+ RestClient.stub!(:post).and_return(@response)
628
+ end
629
+
630
+ it "must be able to upload a new certification" do
631
+ RestClient.should_not_receive(:get)
632
+ RestClient.should_receive(:post).and_return(@response)
633
+ result = @iam.upload_signing_certificate(:user_name => 'User1', :certificate_body => dummy_certificate)
634
+ result.should have_key('UploadSigningCertificateResult')
635
+ result['UploadSigningCertificateResult'].should have_key('Certificate')
636
+ result['UploadSigningCertificateResult']['Certificate'].should have_key('CertificateBody')
637
+ result['UploadSigningCertificateResult']['Certificate']['CertificateBody'].gsub(/^ +/, "").should == dummy_certificate
638
+ end
639
+
640
+ it "must raise ArgumentError if the :certificate_body option haven't been passed." do
641
+ lambda {
642
+ @iam.upload_signing_certificate(:user_name => 'User1')
643
+ }.should raise_error(ArgumentError)
644
+ end
645
+
646
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
647
+ @iam.should_receive(:call_api).with(
648
+ 'UploadSigningCertificate', {'CertificateBody' => dummy_certificate}
649
+ ).once.and_return(upload_signing_certificate_response)
650
+ @iam.upload_signing_certificate(:certificate_body => dummy_certificate)
651
+ end
652
+ end
653
+
654
+ context "#update_signing_certificate" do
655
+ before(:each) do
656
+ response = stub(RestClient::Response, :code => '200', :to_str => update_signing_certificate_response, :empty? => false)
657
+ RestClient.stub!(:get).and_return(response)
658
+ end
659
+
660
+ it "must be able to update a intended certificate" do
661
+ result = @iam.update_signing_certificate(:certificate_id => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA', :status => 'Active', :user_id => 'User1')
662
+ result.should have_key('ResponseMetadata')
663
+ end
664
+
665
+ it "must raise ArgumentError if the :certificate_id option haven't been passed." do
666
+ lambda {
667
+ @iam.update_signing_certificate(:user_name => 'User1', :status => 'Active')
668
+ }.should raise_error(ArgumentError)
669
+ end
670
+
671
+ it "must raise ArgumentError if the :status option haven't been passed." do
672
+ lambda {
673
+ @iam.update_signing_certificate(:user_name => 'User1', :certificate_id => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA')
674
+ }.should raise_error(ArgumentError)
675
+ end
676
+
677
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
678
+ @iam.should_receive(:call_api).with(
679
+ 'UpdateSigningCertificate', {'CertificateId' => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA', 'Status' => 'Active'}
680
+ ).once.and_return(update_signing_certificate_response)
681
+ @iam.update_signing_certificate(:certificate_id => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA', :status => :active)
682
+ end
683
+ end
684
+
685
+ context "#delete_signing_certificate" do
686
+ before(:each) do
687
+ response = stub(RestClient::Response, :code => '200', :to_str => delete_signing_certificate_response, :empty? => false)
688
+ RestClient.stub!(:get).and_return(response)
689
+ end
690
+
691
+ it "must be able to delete a intended certificate" do
692
+ result = @iam.delete_signing_certificate(:certificate_id => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA', :user_id => 'User1')
693
+ result.should have_key('ResponseMetadata')
694
+ end
695
+
696
+ it "must raise ArgumentError if the :certificate_id option haven't been passed." do
697
+ lambda {
698
+ @iam.delete_signing_certificate(:user_name => 'User1')
699
+ }.should raise_error(ArgumentError)
700
+ end
701
+
702
+ it "must call the 'call_api' internally without 'UserName' parameter if :user_name option not given" do
703
+ @iam.should_receive(:call_api).with(
704
+ 'DeleteSigningCertificate', {'CertificateId' => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA'}
705
+ ).once.and_return(delete_signing_certificate_response)
706
+ @iam.delete_signing_certificate(:certificate_id => 'PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA')
707
+ end
708
+ end
709
+
710
+ context "#list_signing_certificates" do
711
+ before(:each) do
712
+ response = stub(RestClient::Response, :code => '200', :to_str => list_signing_certificates_response, :empty? => false)
713
+ RestClient.stub!(:get).and_return(response)
714
+ end
715
+
716
+ it "must be able to get a list of certificates" do
717
+ result = @iam.list_signing_certificates(:user_name => 'User1')
718
+ result.should have_key('ListSigningCertificatesResult')
719
+ result['ListSigningCertificatesResult'].should have_key('Certificates')
720
+ result['ListSigningCertificatesResult']['Certificates'].should have_key('member')
721
+ result['ListSigningCertificatesResult']['Certificates']['member'].should be_kind_of(Array)
722
+ result['ListSigningCertificatesResult']['Certificates']['member'].each do |certificate|
723
+ certificate.should have_key('CertificateId')
724
+ end
725
+ end
726
+
727
+ it "must call the 'call_api' method internally without 'UserName' parameter if :user_name option not given" do
728
+ @iam.should_receive(:call_api).with('ListSigningCertificates', {}).once.and_return(list_signing_certificates_response)
729
+ @iam.list_signing_certificates()
730
+ end
731
+
732
+ it "must call the 'call_api' method internally with 'Marker' parameter if :marker option given" do
733
+ @iam.should_receive(:call_api).with(
734
+ 'ListSigningCertificates', {'Marker' => 'marker'}
735
+ ).once.and_return(list_signing_certificates_response)
736
+ result = @iam.list_signing_certificates(:marker => 'marker')
737
+ end
738
+
739
+ it "must call the 'call_api' method internally with 'MaxItems' parameter if :max_items option given" do
740
+ @iam.should_receive(:call_api).with(
741
+ 'ListSigningCertificates', {'MaxItems' => 10}
742
+ ).once.and_return(list_signing_certificates_response)
743
+ @iam.list_signing_certificates(:max_items => 10)
744
+ end
745
+
746
+ it "must call the 'call_api' method internally with 'Marker' and 'MaxItems' parameter if :marker and :max_items option given" do
747
+ @iam.should_receive(:call_api).with(
748
+ 'ListSigningCertificates', {'Marker' => 'marker', 'MaxItems' => 10}
749
+ ).once.and_return(list_signing_certificates_response)
750
+ @iam.list_signing_certificates(:marker => 'marker', :max_items => 10)
751
+ end
752
+ end
753
+
754
+ def get_group_response
755
+ return <<-RES
756
+ <GetGroupResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
757
+ <GetGroupResult>
758
+ <Users/>
759
+ <IsTruncated>false</IsTruncated>
760
+ <Group>
761
+ <GroupId>AGPAIDO7XVSF6MYKVGFIA</GroupId>
762
+ <GroupName>NewGroup1</GroupName>
763
+ <Path>/</Path>
764
+ <Arn>arn:aws:iam::832248165982:group/NewGroup1</Arn>
765
+ </Group>
766
+ </GetGroupResult>
767
+ <ResponseMetadata>
768
+ <RequestId>ea3adc94-ba45-11df-a356-3d1e141e353d</RequestId>
769
+ </ResponseMetadata>
770
+ </GetGroupResponse>
771
+ RES
772
+ end
773
+
774
+ def create_group_response
775
+ return <<-RES
776
+ <CreateGroupResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
777
+ <CreateGroupResult>
778
+ <Group>
779
+ <GroupId>AGPAJHLP6LD46WOZLH64A</GroupId>
780
+ <GroupName>NewGroup1</GroupName>
781
+ <Path>/</Path>
782
+ <Arn>arn:aws:iam::832248165982:group/NewGroup1</Arn>
783
+ </Group>
784
+ </CreateGroupResult>
785
+ <ResponseMetadata>
786
+ <RequestId>496c3bad-ba3f-11df-a8c6-9f6df870c6f2</RequestId>
787
+ </ResponseMetadata>
788
+ </CreateGroupResponse>
789
+ RES
790
+ end
791
+
792
+ def delete_group_response
793
+ return <<-RES
794
+ <DeleteGroupResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
795
+ <ResponseMetadata>
796
+ <RequestId>06b3f9ae-ba42-11df-89f0-69aaa229db19</RequestId>
797
+ </ResponseMetadata>
798
+ </DeleteGroupResponse>
799
+ RES
800
+ end
801
+
802
+ def list_groups_response
803
+ [
804
+ '<ListGroupsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">',
805
+ '<ListGroupsResult>',
806
+ '<IsTruncated>false</IsTruncated>',
807
+ '<Groups>',
808
+ '<member>',
809
+ '<GroupId>AGPAIBHPCA4Z3Y2HAR3SE</GroupId>',
810
+ '<GroupName>Development</GroupName>',
811
+ '<Path>/</Path>',
812
+ '<Arn>arn:aws:iam::326454305199:group/Development</Arn>',
813
+ '</member>',
814
+ '</Groups>',
815
+ '</ListGroupsResult>',
816
+ '<ResponseMetadata>',
817
+ '<RequestId>944a9b23-b97a-11df-996e-e7c1660b9998</RequestId>',
818
+ '</ResponseMetadata>',
819
+ '</ListGroupsResponse>',
820
+ ].join("\n")
821
+ end
822
+
823
+ def update_group_response
824
+ return <<-RES
825
+ <UpdateGroupResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
826
+ <ResponseMetadata>
827
+ <RequestId>46f03346-ba49-11df-a1ef-f7061c8dca90</RequestId>
828
+ </ResponseMetadata>
829
+ </UpdateGroupResponse>
830
+ RES
831
+ end
832
+
833
+ def add_user_to_group_response
834
+ return <<-RES
835
+ <AddUserToGroupResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
836
+ <ResponseMetadata>
837
+ <RequestId>f4606eb1-ba4e-11df-92f8-89ed818707d9</RequestId>
838
+ </ResponseMetadata>
839
+ </AddUserToGroupResponse>
840
+ RES
841
+ end
842
+
843
+ def remove_user_from_group_response
844
+ return <<-RES
845
+ <RemoveUserFromGroupResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
846
+ <ResponseMetadata>
847
+ <RequestId>8294a061-ba51-11df-a518-4f7d9054fd5f</RequestId>
848
+ </ResponseMetadata>
849
+ </RemoveUserFromGroupResponse>
850
+ RES
851
+ end
852
+
853
+ def create_user_response
854
+ return <<-RES
855
+ <CreateUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">$
856
+ <CreateUserResult>$
857
+ <User>$
858
+ <UserId>AIDAI6PGTVSCYFGUNXK4G</UserId>$
859
+ <Path>/</Path>$
860
+ <UserName>NewUser</UserName>$
861
+ <Arn>arn:aws:iam::832248165982:user/NewUser</Arn>$
862
+ </User>$
863
+ </CreateUserResult>$
864
+ <ResponseMetadata>$
865
+ <RequestId>dfeceb17-b98c-11df-aaf3-4191ccb1dcaa</RequestId>$
866
+ </ResponseMetadata>$
867
+ </CreateUserResponse>$
868
+ RES
869
+ end
870
+
871
+ def delete_user_response
872
+ return <<-RES
873
+ <DeleteUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
874
+ <ResponseMetadata>
875
+ <RequestId>2a91c5c6-b99b-11df-92f8-89ed818707d9</RequestId>
876
+ </ResponseMetadata>
877
+ </DeleteUserResponse>
878
+ RES
879
+ end
880
+
881
+ def list_users_response
882
+ return <<-RES
883
+ <ListUsersResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
884
+ <ListUsersResult>
885
+ <Users>
886
+ <member>
887
+ <UserId>AIDAJPTEYQSGQ525SOKXW</UserId>
888
+ <Path>/</Path>
889
+ <UserName>NewUser</UserName>
890
+ <Arn>arn:aws:iam::832248165982:user/NewUser</Arn>
891
+ </member>
892
+ </Users>
893
+ <IsTruncated>false</IsTruncated>
894
+ </ListUsersResult>
895
+ <ResponseMetadata>
896
+ <RequestId>6332d0e4-b99e-11df-a1ef-f7061c8dca90</RequestId>
897
+ </ResponseMetadata>
898
+ </ListUsersResponse>
899
+ RES
900
+ end
901
+
902
+ def get_user_response(options = {:with_user_name => false})
903
+ if options[:with_user_name]
904
+ return <<-RES
905
+ "<GetUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
906
+ <GetUserResult>
907
+ <User>
908
+ <UserId>AIDAJEDM3GIZBSIR6SSHK</UserId>
909
+ <Path>/</Path>
910
+ <UserName>User1</UserName>
911
+ <Arn>arn:aws:iam::832248165982:user/User1</Arn>
912
+ </User>
913
+ </GetUserResult>
914
+ <ResponseMetadata>
915
+ <RequestId>6a98020f-ba24-11df-aaf3-4191ccb1dcaa</RequestId>
916
+ </ResponseMetadata>
917
+ </GetUserResponse>
918
+ RES
919
+ end
920
+
921
+ return <<-RES
922
+ <GetUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
923
+ <GetUserResult>
924
+ <User>
925
+ <UserId>832248165982</UserId>
926
+ <Arn>arn:aws:iam::832248165982:root</Arn>
927
+ </User>
928
+ </GetUserResult>
929
+ <ResponseMetadata>
930
+ <RequestId>e8f05387-ba23-11df-89f0-69aaa229db19</RequestId>
931
+ </ResponseMetadata>
932
+ </GetUserResponse>
933
+ RES
934
+ end
935
+
936
+ def list_groups_for_user_response
937
+ return <<-RES
938
+ <ListGroupsForUserResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
939
+ <ListGroupsForUserResult>
940
+ <IsTruncated>false</IsTruncated>
941
+ <Groups/>
942
+ </ListGroupsForUserResult>
943
+ <ResponseMetadata>
944
+ <RequestId>bf42415e-ba29-11df-a1ef-f7061c8dca90</RequestId>
945
+ </ResponseMetadata>
946
+ </ListGroupsForUserResponse>
947
+ RES
948
+ end
949
+
950
+ def update_user_response
951
+ return <<-RES
952
+ <UpdateUserResponse xmlns=\"https://iam.amazonaws.com/doc/2010-05-08/\">
953
+ <ResponseMetadata>
954
+ <RequestId>5e00d1d4-ba31-11df-b738-6709d34e9585</RequestId>
955
+ </ResponseMetadata>
956
+ </UpdateUserResponse>
957
+ RES
958
+ end
959
+
960
+ def create_access_key_response
961
+ return <<-RES
962
+ <CreateAccessKeyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
963
+ <CreateAccessKeyResult>
964
+ <AccessKey>
965
+ <SecretAccessKey>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</SecretAccessKey>
966
+ <Status>Active</Status>
967
+ <AccessKeyId>AKIAXXXXXXXXXXXXXXXX</AccessKeyId>
968
+ <UserName>User1</UserName>
969
+ <CreateDate>2010-09-07T07:53:29.546Z</CreateDate>
970
+ </AccessKey>
971
+ </CreateAccessKeyResult>
972
+ <ResponseMetadata>
973
+ <RequestId>00ee559f-ba55-11df-92f8-89ed818707d9</RequestId>
974
+ </ResponseMetadata>
975
+ </CreateAccessKeyResponse>
976
+ RES
977
+ end
978
+
979
+ def delete_access_key_response
980
+ return <<-RES
981
+ <DeleteAccessKeyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
982
+ <ResponseMetadata>
983
+ <RequestId>cf5417f0-ba57-11df-996e-e7c1660b9998</RequestId>
984
+ </ResponseMetadata>
985
+ </DeleteAccessKeyResponse>
986
+ RES
987
+ end
988
+
989
+ def update_access_key_response
990
+ return <<-RES
991
+ <UpdateAccessKeyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
992
+ <ResponseMetadata>
993
+ <RequestId>dfbe66c0-ba63-11df-a356-3d1e141e353d</RequestId>
994
+ </ResponseMetadata>
995
+ </UpdateAccessKeyResponse>
996
+ RES
997
+ end
998
+
999
+ def list_access_keys_response
1000
+ return <<-RES
1001
+ <ListAccessKeysResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1002
+ <ListAccessKeysResult>
1003
+ <IsTruncated>false</IsTruncated>
1004
+ <AccessKeyMetadata>
1005
+ <member>
1006
+ <Status>Active</Status>
1007
+ <AccessKeyId>AKIAXXXXXXXXXXXXXXXX</AccessKeyId>
1008
+ <UserName>User1</UserName>
1009
+ <CreateDate>2010-09-07T08:43:17Z</CreateDate>
1010
+ </member>
1011
+ </AccessKeyMetadata>
1012
+ </ListAccessKeysResult>
1013
+ <ResponseMetadata>
1014
+ <RequestId>f9460529-ba5b-11df-996e-e7c1660b9998</RequestId>
1015
+ </ResponseMetadata>
1016
+ </ListAccessKeysResponse>
1017
+ RES
1018
+ end
1019
+
1020
+ def get_group_policy_response
1021
+ return <<-RES
1022
+ <GetGroupPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1023
+ <GetGroupPolicyResult>
1024
+ <PolicyName>Policy1</PolicyName>
1025
+ <GroupName>Group1</GroupName>
1026
+ <PolicyDocument>%7B%22Statement%22%3A%5B%7B%22Resource%22%3A%22%2A%22%2C%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%22%2A%22%7D%5D%7D</PolicyDocument>
1027
+ </GetGroupPolicyResult>
1028
+ <ResponseMetadata>
1029
+ <RequestId>84c5d59b-baec-11df-b3cb-6d0722822344</RequestId>
1030
+ </ResponseMetadata>
1031
+ </GetGroupPolicyResponse>
1032
+ RES
1033
+ end
1034
+
1035
+ def put_group_policy_response
1036
+ return <<-RES
1037
+ <PutGroupPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1038
+ <ResponseMetadata>
1039
+ <RequestId>676431f9-bae9-11df-996e-e7c1660b9998</RequestId>
1040
+ </ResponseMetadata>
1041
+ </PutGroupPolicyResponse>
1042
+ RES
1043
+ end
1044
+
1045
+ def delete_group_policy_response
1046
+ return <<-RES
1047
+ <DeleteGroupPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1048
+ <ResponseMetadata>
1049
+ <RequestId>27686694-bb08-11df-a8c6-9f6df870c6f2</RequestId>
1050
+ </ResponseMetadata>
1051
+ </DeleteGroupPolicyResponse>
1052
+ RES
1053
+ end
1054
+
1055
+ def list_group_policies_response
1056
+ return <<-RES
1057
+ <ListGroupPoliciesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1058
+ <ListGroupPoliciesResult>
1059
+ <PolicyNames>
1060
+ <member>Policy1</member>
1061
+ </PolicyNames>
1062
+ <IsTruncated>false</IsTruncated>
1063
+ </ListGroupPoliciesResult>
1064
+ <ResponseMetadata>
1065
+ <RequestId>a8528a43-bb0b-11df-b3cb-6d0722822344</RequestId>
1066
+ </ResponseMetadata>
1067
+ </ListGroupPoliciesResponse>
1068
+ RES
1069
+ end
1070
+
1071
+ def get_user_policy_response
1072
+ return <<-RES
1073
+ <GetUserPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1074
+ <GetUserPolicyResult>
1075
+ <PolicyName>Policy1</PolicyName>
1076
+ <UserName>User1</UserName>
1077
+ <PolicyDocument>%7B%22Statement%22%3A%5B%7B%22Resource%22%3A%22%2A%22%2C%22Effect%22%3A%22Allow%22%2C%22Action%22%3A%22%2A%22%7D%5D%7D</PolicyDocument>
1078
+ </GetUserPolicyResult>
1079
+ <ResponseMetadata>
1080
+ <RequestId>c8a77c43-bb0e-11df-a518-4f7d9054fd5f</RequestId>
1081
+ </ResponseMetadata>
1082
+ </GetUserPolicyResponse>
1083
+ RES
1084
+ end
1085
+
1086
+ def put_user_policy_response
1087
+ return <<-RES
1088
+ <PutUserPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1089
+ <ResponseMetadata>
1090
+ <RequestId>ec1ca2cb-bb0e-11df-996e-e7c1660b9998</RequestId>
1091
+ </ResponseMetadata>
1092
+ </PutUserPolicyResponse>
1093
+ RES
1094
+ end
1095
+
1096
+ def delete_user_policy_response
1097
+ return <<-RES
1098
+ <DeleteUserPolicyResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1099
+ <ResponseMetadata>
1100
+ <RequestId>83c49d29-bb12-11df-996e-e7c1660b9998</RequestId>
1101
+ </ResponseMetadata>
1102
+ </DeleteUserPolicyResponse>
1103
+ RES
1104
+ end
1105
+
1106
+ def list_user_policies_response
1107
+ return <<-RES
1108
+ <ListUserPoliciesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1109
+ <ListUserPoliciesResult>
1110
+ <PolicyNames>
1111
+ <member>Policy1</member>
1112
+ </PolicyNames>
1113
+ <IsTruncated>false</IsTruncated>
1114
+ </ListUserPoliciesResult>
1115
+ <ResponseMetadata>
1116
+ <RequestId>b84ad9d2-bb13-11df-aaf3-4191ccb1dcaa</RequestId>
1117
+ </ResponseMetadata>
1118
+ </ListUserPoliciesResponse>
1119
+ RES
1120
+ end
1121
+
1122
+ def upload_signing_certificate_response
1123
+ return <<-RES
1124
+ <UploadSigningCertificateResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1125
+ <UploadSigningCertificateResult>
1126
+ <Certificate>
1127
+ <Status>Active</Status>
1128
+ <CertificateId>PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA</CertificateId>
1129
+ <UserName>User1</UserName>
1130
+ <CertificateBody>-----BEGIN CERTIFICATE-----
1131
+ MIIBrjCCAVigAwIBAgIJAJAOioXmW9VvMA0GCSqGSIb3DQEBBQUAMBwxGjAYBgNV
1132
+ BAMTEU5vcmloaXRvIFlvc2hpb2thMB4XDTEwMDkwODA5MDgyM1oXDTEwMTAwODA5
1133
+ MDgyM1owHDEaMBgGA1UEAxMRTm9yaWhpdG8gWW9zaGlva2EwXDANBgkqhkiG9w0B
1134
+ AQEFAANLADBIAkEA0IDAJgXhdMhjLEiG1TMOZgeInMGidxVn0jukTZujWZ2iawpr
1135
+ B+Qgw4AOvfOOif1ZAzJ2N4Y3DOyuuEYTZhQ+nQIDAQABo30wezAdBgNVHQ4EFgQU
1136
+ 7+EbzgqFJ5H4f+F8tVVclyuhAnswTAYDVR0jBEUwQ4AU7+EbzgqFJ5H4f+F8tVVc
1137
+ lyuhAnuhIKQeMBwxGjAYBgNVBAMTEU5vcmloaXRvIFlvc2hpb2thggkAkA6KheZb
1138
+ 1W8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAHumka+fYPGm15+8m4kq
1139
+ go6GPf+b8JYNClRmsus93/YdLSJJeXdTvaCcnBQWJCXaQ5UCr1qZ5Kiu9+0/Vk34
1140
+ nXg=
1141
+ -----END CERTIFICATE-----
1142
+ </CertificateBody>
1143
+ <UploadDate>2010-09-08T09:24:47Z</UploadDate>
1144
+ </Certificate>
1145
+ </UploadSigningCertificateResult>
1146
+ <ResponseMetadata>
1147
+ <RequestId>c6d0939c-bb2b-11df-a1ef-f7061c8dca90</RequestId>
1148
+ </ResponseMetadata>
1149
+ </UploadSigningCertificateResponse>
1150
+ RES
1151
+ end
1152
+
1153
+ def dummy_certificate
1154
+ return <<-EOF
1155
+ -----BEGIN CERTIFICATE-----
1156
+ MIIBrjCCAVigAwIBAgIJAJAOioXmW9VvMA0GCSqGSIb3DQEBBQUAMBwxGjAYBgNV
1157
+ BAMTEU5vcmloaXRvIFlvc2hpb2thMB4XDTEwMDkwODA5MDgyM1oXDTEwMTAwODA5
1158
+ MDgyM1owHDEaMBgGA1UEAxMRTm9yaWhpdG8gWW9zaGlva2EwXDANBgkqhkiG9w0B
1159
+ AQEFAANLADBIAkEA0IDAJgXhdMhjLEiG1TMOZgeInMGidxVn0jukTZujWZ2iawpr
1160
+ B+Qgw4AOvfOOif1ZAzJ2N4Y3DOyuuEYTZhQ+nQIDAQABo30wezAdBgNVHQ4EFgQU
1161
+ 7+EbzgqFJ5H4f+F8tVVclyuhAnswTAYDVR0jBEUwQ4AU7+EbzgqFJ5H4f+F8tVVc
1162
+ lyuhAnuhIKQeMBwxGjAYBgNVBAMTEU5vcmloaXRvIFlvc2hpb2thggkAkA6KheZb
1163
+ 1W8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAHumka+fYPGm15+8m4kq
1164
+ go6GPf+b8JYNClRmsus93/YdLSJJeXdTvaCcnBQWJCXaQ5UCr1qZ5Kiu9+0/Vk34
1165
+ nXg=
1166
+ -----END CERTIFICATE-----
1167
+ EOF
1168
+ end
1169
+
1170
+ def update_signing_certificate_response
1171
+ return <<-RES
1172
+ <UpdateSigningCertificateResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1173
+ <ResponseMetadata>
1174
+ <RequestId>02945b3a-bb32-11df-a8c6-9f6df870c6f2</RequestId>
1175
+ </ResponseMetadata>
1176
+ </UpdateSigningCertificateResponse>
1177
+ RES
1178
+ end
1179
+
1180
+ def delete_signing_certificate_response
1181
+ return <<-RES
1182
+ <DeleteSigningCertificateResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1183
+ <ResponseMetadata>
1184
+ <RequestId>2113a2d0-bbaf-11df-b3cb-6d0722822344</RequestId>
1185
+ </ResponseMetadata>
1186
+ </DeleteSigningCertificateResponse>
1187
+ RES
1188
+ end
1189
+
1190
+ def list_signing_certificates_response
1191
+ return <<-RES
1192
+ <ListSigningCertificatesResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
1193
+ <ListSigningCertificatesResult>
1194
+ <IsTruncated>false</IsTruncated>
1195
+ <Certificates>
1196
+ <member>
1197
+ <Status>Active</Status>
1198
+ <CertificateId>PBEX2T7R5DA3SVZHQDK2HQ2G3ZOP7SYA</CertificateId>
1199
+ <UserName>User1</UserName>
1200
+ <CertificateBody>-----BEGIN CERTIFICATE-----
1201
+ MIIBrjCCAVigAwIBAgIJAJAOioXmW9VvMA0GCSqGSIb3DQEBBQUAMBwxGjAYBgNV
1202
+ BAMTEU5vcmloaXRvIFlvc2hpb2thMB4XDTEwMDkwODA5MDgyM1oXDTEwMTAwODA5
1203
+ MDgyM1owHDEaMBgGA1UEAxMRTm9yaWhpdG8gWW9zaGlva2EwXDANBgkqhkiG9w0B
1204
+ AQEFAANLADBIAkEA0IDAJgXhdMhjLEiG1TMOZgeInMGidxVn0jukTZujWZ2iawpr
1205
+ B+Qgw4AOvfOOif1ZAzJ2N4Y3DOyuuEYTZhQ+nQIDAQABo30wezAdBgNVHQ4EFgQU
1206
+ 7+EbzgqFJ5H4f+F8tVVclyuhAnswTAYDVR0jBEUwQ4AU7+EbzgqFJ5H4f+F8tVVc
1207
+ lyuhAnuhIKQeMBwxGjAYBgNVBAMTEU5vcmloaXRvIFlvc2hpb2thggkAkA6KheZb
1208
+ 1W8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAHumka+fYPGm15+8m4kq
1209
+ go6GPf+b8JYNClRmsus93/YdLSJJeXdTvaCcnBQWJCXaQ5UCr1qZ5Kiu9+0/Vk34
1210
+ nXg=
1211
+ -----END CERTIFICATE-----
1212
+ </CertificateBody>
1213
+ <UploadDate>2010-09-08T09:24:47Z</UploadDate>
1214
+ </member>
1215
+ </Certificates>
1216
+ </ListSigningCertificatesResult>
1217
+ <ResponseMetadata>
1218
+ <RequestId>20a2a122-bb2f-11df-a8c6-9f6df870c6f2</RequestId>
1219
+ </ResponseMetadata>
1220
+ </ListSigningCertificatesResponse>
1221
+ RES
1222
+ end
1223
+ end
1224
+