rhc 1.22.5 → 1.23.7
Sign up to get free protection for your applications and to get access to all the features.
- data/autocomplete/rhc_bash +38 -14
- data/features/core_feature.rb +2 -0
- data/lib/rhc/commands/domain.rb +2 -1
- data/lib/rhc/commands/member.rb +255 -33
- data/lib/rhc/commands/scp.rb +1 -1
- data/lib/rhc/exceptions.rb +18 -0
- data/lib/rhc/helpers.rb +1 -1
- data/lib/rhc/rest.rb +1 -0
- data/lib/rhc/rest/client.rb +38 -0
- data/lib/rhc/rest/membership.rb +46 -5
- data/lib/rhc/rest/mock.rb +24 -5
- data/lib/rhc/rest/team.rb +20 -0
- data/spec/rhc/commands/domain_spec.rb +1 -1
- data/spec/rhc/commands/member_spec.rb +384 -21
- metadata +5 -4
data/lib/rhc/commands/scp.rb
CHANGED
@@ -13,7 +13,7 @@ module RHC::Commands
|
|
13
13
|
cartridge) by default.
|
14
14
|
|
15
15
|
Examples:
|
16
|
-
Uploading a file from your
|
16
|
+
Uploading a file from your working directory to your app-root/data directory
|
17
17
|
rhc scp myapp upload somefile.txt app-root/data
|
18
18
|
|
19
19
|
Downloading a file from your app-root/data directory to your working directory
|
data/lib/rhc/exceptions.rb
CHANGED
@@ -67,6 +67,24 @@ module RHC
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
class TeamsNotSupportedException < Exception
|
71
|
+
def initialize(message="Server does not support teams")
|
72
|
+
super message, 161
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
class TeamNotFoundException < Exception
|
77
|
+
def initialize(message="Team not found")
|
78
|
+
super message, 162
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class MemberNotFoundException < Exception
|
83
|
+
def initialize(message="Member not found")
|
84
|
+
super message, 163
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
70
88
|
class GitPermissionDenied < GitException; end
|
71
89
|
class GitDirectoryExists < GitException; end
|
72
90
|
|
data/lib/rhc/helpers.rb
CHANGED
data/lib/rhc/rest.rb
CHANGED
data/lib/rhc/rest/client.rb
CHANGED
@@ -64,6 +64,38 @@ module RHC
|
|
64
64
|
@user ||= api.rest_method "GET_USER"
|
65
65
|
end
|
66
66
|
|
67
|
+
def teams
|
68
|
+
debug "Getting all teams"
|
69
|
+
if link = api.link_href(:LIST_TEAMS)
|
70
|
+
@teams ||= api.rest_method "LIST_TEAMS"
|
71
|
+
else
|
72
|
+
raise RHC::TeamsNotSupportedException
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def owned_teams
|
77
|
+
debug "Getting owned teams"
|
78
|
+
if link = api.link_href(:LIST_TEAMS_BY_OWNER)
|
79
|
+
@owned_teams ||= api.rest_method "LIST_TEAMS_BY_OWNER", :owner => '@self'
|
80
|
+
else
|
81
|
+
raise RHC::TeamsNotSupportedException
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def search_teams(search, global=false)
|
86
|
+
debug "Searching teams"
|
87
|
+
if link = api.link_href(:SEARCH_TEAMS)
|
88
|
+
api.rest_method "SEARCH_TEAMS", :search => search, :global => global
|
89
|
+
else
|
90
|
+
raise RHC::TeamsNotSupportedException
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def search_owned_teams(search)
|
95
|
+
debug "Searching owned teams"
|
96
|
+
owned_teams.select{|team| team.name.downcase =~ /#{Regexp.escape(search)}/i}
|
97
|
+
end
|
98
|
+
|
67
99
|
#Find Domain by namespace
|
68
100
|
def find_domain(id)
|
69
101
|
debug "Finding domain #{id}"
|
@@ -550,6 +582,12 @@ module RHC
|
|
550
582
|
data.map{ |json| EnvironmentVariable.new(json, self) }
|
551
583
|
when 'deployments'
|
552
584
|
data.map{ |json| Deployment.new(json, self) }
|
585
|
+
when 'teams'
|
586
|
+
data.map{ |json| Team.new(json, self) }
|
587
|
+
when 'member'
|
588
|
+
RHC::Rest::Membership::Member.new(data, self)
|
589
|
+
when 'members'
|
590
|
+
data.map{ |json| RHC::Rest::Membership::Member.new(json, self) }
|
553
591
|
else
|
554
592
|
data
|
555
593
|
end
|
data/lib/rhc/rest/membership.rb
CHANGED
@@ -1,22 +1,54 @@
|
|
1
1
|
module RHC::Rest
|
2
2
|
module Membership
|
3
3
|
class Member < Base
|
4
|
+
|
4
5
|
define_attr :name, :login, :id, :type, :from, :role, :owner, :explicit_role
|
6
|
+
|
5
7
|
def owner?
|
6
8
|
!!owner
|
7
9
|
end
|
10
|
+
|
8
11
|
def admin?
|
9
12
|
role == 'admin'
|
10
13
|
end
|
14
|
+
|
11
15
|
def editor?
|
12
16
|
role == 'edit'
|
13
17
|
end
|
18
|
+
|
14
19
|
def viewer?
|
15
20
|
role == 'view'
|
16
21
|
end
|
22
|
+
|
23
|
+
def team?
|
24
|
+
type == 'team'
|
25
|
+
end
|
26
|
+
|
17
27
|
def name
|
18
28
|
attributes['name'] || login
|
19
29
|
end
|
30
|
+
|
31
|
+
def type
|
32
|
+
attributes['type'] || 'user'
|
33
|
+
end
|
34
|
+
|
35
|
+
def explicit_role?
|
36
|
+
explicit_role.present?
|
37
|
+
end
|
38
|
+
|
39
|
+
def from
|
40
|
+
Array(attributes['from'])
|
41
|
+
end
|
42
|
+
|
43
|
+
def grant_from?(type, id)
|
44
|
+
from.detect {|f| f['type'] == type && f['id'] == id}
|
45
|
+
end
|
46
|
+
|
47
|
+
def teams(members)
|
48
|
+
team_ids = from.inject([]) {|ids, f| ids << f['id'] if f['type'] == 'team'; ids }
|
49
|
+
members.select {|m| m.team? && team_ids.include?(m.id) }
|
50
|
+
end
|
51
|
+
|
20
52
|
def to_s
|
21
53
|
if name == login
|
22
54
|
"#{login} (#{role})"
|
@@ -26,12 +58,21 @@ module RHC::Rest
|
|
26
58
|
"#{name} (#{role})"
|
27
59
|
end
|
28
60
|
end
|
61
|
+
|
62
|
+
def <=>(other)
|
63
|
+
[role_weight, type, name, id] <=> [other.role_weight, other.type, other.name, other.id]
|
64
|
+
end
|
65
|
+
|
29
66
|
def role_weight
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
67
|
+
if owner?
|
68
|
+
0
|
69
|
+
else
|
70
|
+
case role
|
71
|
+
when 'admin' then 1
|
72
|
+
when 'edit' then 2
|
73
|
+
when 'view' then 3
|
74
|
+
else 4
|
75
|
+
end
|
35
76
|
end
|
36
77
|
end
|
37
78
|
end
|
data/lib/rhc/rest/mock.rb
CHANGED
@@ -428,11 +428,18 @@ module RHC::Rest::Mock
|
|
428
428
|
end
|
429
429
|
|
430
430
|
def mock_real_client_links
|
431
|
-
[
|
432
|
-
['
|
433
|
-
['
|
434
|
-
['
|
435
|
-
|
431
|
+
mock_teams_links.concat([
|
432
|
+
['GET_USER', "broker/rest/user", 'GET'],
|
433
|
+
['LIST_DOMAINS', "broker/rest/domains", 'GET'],
|
434
|
+
['ADD_DOMAIN', "broker/rest/domains", 'POST', ({'optional_params' => [{'name' => 'allowed_gear_sizes'}]} if example_allows_gear_sizes?)].compact,
|
435
|
+
['LIST_CARTRIDGES', "broker/rest/cartridges", 'GET'],
|
436
|
+
])
|
437
|
+
end
|
438
|
+
|
439
|
+
def mock_teams_links
|
440
|
+
[['SEARCH_TEAMS', "broker/rest/teams", 'GET'],
|
441
|
+
['LIST_TEAMS', "broker/rest/teams", 'GET'],
|
442
|
+
['LIST_TEAMS_BY_OWNER', "broker/rest/teams", 'GET']]
|
436
443
|
end
|
437
444
|
|
438
445
|
def mock_api_with_authorizations
|
@@ -696,6 +703,12 @@ module RHC::Rest::Mock
|
|
696
703
|
@applications
|
697
704
|
end
|
698
705
|
|
706
|
+
def init_members
|
707
|
+
@members ||= []
|
708
|
+
attributes['members'] ||= []
|
709
|
+
self
|
710
|
+
end
|
711
|
+
|
699
712
|
def add_member(member)
|
700
713
|
(@members ||= []) << member
|
701
714
|
(attributes['members'] ||= []) << member.attributes
|
@@ -902,6 +915,12 @@ module RHC::Rest::Mock
|
|
902
915
|
end
|
903
916
|
end
|
904
917
|
|
918
|
+
def init_members
|
919
|
+
@members ||= []
|
920
|
+
attributes['members'] ||= []
|
921
|
+
self
|
922
|
+
end
|
923
|
+
|
905
924
|
def add_member(member)
|
906
925
|
(@members ||= []) << member
|
907
926
|
(attributes['members'] ||= []) << member.attributes
|
@@ -334,7 +334,7 @@ describe RHC::Commands::Domain do
|
|
334
334
|
let(:arguments) { ['domain', 'leave', '-n', 'deleteme'] }
|
335
335
|
|
336
336
|
it "should leave the domain" do
|
337
|
-
rest_client.domains.first.should_receive(:leave)
|
337
|
+
rest_client.domains.first.should_receive(:leave).and_return(RHC::Rest::Membership::Member.new)
|
338
338
|
expect { run }.to exit_with_code(0)
|
339
339
|
end
|
340
340
|
end
|
@@ -13,7 +13,7 @@ describe RHC::Commands::Member do
|
|
13
13
|
expect { run }.to exit_with_code(0)
|
14
14
|
end
|
15
15
|
it('should output usage') { run_output.should match "Usage: rhc member" }
|
16
|
-
it('should output info about roles') { run_output.should match "
|
16
|
+
it('should output info about roles') { run_output.should match "Developers can collaborate" }
|
17
17
|
end
|
18
18
|
|
19
19
|
let(:username){ 'test_user' }
|
@@ -35,13 +35,23 @@ describe RHC::Commands::Member do
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
let(:owner){ RHC::Rest::Membership::Member.new(:id => '1', :role => 'admin', :owner => true, :login => 'alice') }
|
39
|
-
let(:other_admin){ RHC::Rest::Membership::Member.new(:id => '2', :role => 'admin', :login => 'Bob') }
|
40
|
-
let(:other_editor){ RHC::Rest::Membership::Member.new(:id => '3', :role => 'edit', :name => 'Carol', :login => 'carol') }
|
41
|
-
let(:other_viewer){ RHC::Rest::Membership::Member.new(:id => '4', :role => 'view', :name => 'Doug', :login => 'doug@doug.com') }
|
42
|
-
let(:other_viewer2){ RHC::Rest::Membership::Member.new(:id => '5', :role => 'view', :name => 'ViewerC', :login => 'viewerc@viewer.com') }
|
43
|
-
let(:other_viewer3){ RHC::Rest::Membership::Member.new(:id => '6', :role => 'view', :name => 'ViewerB', :login => 'viewerb@viewer.com') }
|
44
|
-
let(:other_viewer4){ RHC::Rest::Membership::Member.new(:id => '7', :role => 'view', :name => 'ViewerA', :login => 'viewera@viewer.com') }
|
38
|
+
let(:owner){ RHC::Rest::Membership::Member.new(:id => '1', :role => 'admin', :explicit_role => 'admin', :owner => true, :login => 'alice', :type => 'user') }
|
39
|
+
let(:other_admin){ RHC::Rest::Membership::Member.new(:id => '2', :role => 'admin', :explicit_role => 'admin', :login => 'Bob', :type => 'user') }
|
40
|
+
let(:other_editor){ RHC::Rest::Membership::Member.new(:id => '3', :role => 'edit', :explicit_role => 'edit', :name => 'Carol', :login => 'carol', :type => 'user') }
|
41
|
+
let(:other_viewer){ RHC::Rest::Membership::Member.new(:id => '4', :role => 'view', :explicit_role => 'view', :name => 'Doug', :login => 'doug@doug.com', :type => 'user') }
|
42
|
+
let(:other_viewer2){ RHC::Rest::Membership::Member.new(:id => '5', :role => 'view', :explicit_role => 'view', :name => 'ViewerC', :login => 'viewerc@viewer.com', :type => 'user') }
|
43
|
+
let(:other_viewer3){ RHC::Rest::Membership::Member.new(:id => '6', :role => 'view', :explicit_role => 'view', :name => 'ViewerB', :login => 'viewerb@viewer.com', :type => 'user') }
|
44
|
+
let(:other_viewer4){ RHC::Rest::Membership::Member.new(:id => '7', :role => 'view', :explicit_role => 'view', :name => 'ViewerA', :login => 'viewera@viewer.com', :type => 'user') }
|
45
|
+
let(:team_admin){ RHC::Rest::Membership::Member.new(:id => '11', :role => 'admin', :explicit_role => 'admin', :name => 'team1', :type => 'team') }
|
46
|
+
let(:team_editor){ RHC::Rest::Membership::Member.new(:id => '12', :role => 'edit', :explicit_role => 'edit', :name => 'team2', :type => 'team') }
|
47
|
+
let(:team_viewer){ RHC::Rest::Membership::Member.new(:id => '13', :role => 'view', :explicit_role => 'view', :name => 'team3', :type => 'team') }
|
48
|
+
let(:team_admin_member){ RHC::Rest::Membership::Member.new(:id => '21', :role => 'admin', :login => 'memberadmin', :type => 'user', :from => [{'id' => '11', 'type' => 'team'}]) }
|
49
|
+
let(:team_editor_member){ RHC::Rest::Membership::Member.new(:id => '22', :role => 'edit', :login => 'membereditor', :type => 'user', :from => [{'id' => '12', 'type' => 'team'}]) }
|
50
|
+
let(:team_viewer_member){ RHC::Rest::Membership::Member.new(:id => '23', :role => 'view', :login => 'memberviewer', :type => 'user', :from => [{'id' => '13', 'type' => 'team'}]) }
|
51
|
+
let(:team_viewer_member2){ RHC::Rest::Membership::Member.new(:id => '24', :role => 'view', :login => 'memberviewer2', :type => 'user', :from => [{'id' => '13', 'type' => 'team'}]) }
|
52
|
+
let(:team_viewer_member3){ RHC::Rest::Membership::Member.new(:id => '25', :role => 'view', :login => 'memberviewer3', :type => 'user', :from => [{'id' => '13', 'type' => 'team'}]) }
|
53
|
+
let(:team_viewer_and_explicit_member){ RHC::Rest::Membership::Member.new(:id => '26', :role => 'view', :explicit_role => 'view', :login => 'memberviewerexplicitedit', :type => 'user', :from => [{'id' => '13', 'type' => 'team'}]) }
|
54
|
+
let(:app_member_via_domain) { RHC::Rest::Membership::Member.new(:id => '27', :role => 'view', :login => 'app_member_via_domain', :type => 'user', :from => [{'type' => 'domain'}]) }
|
45
55
|
|
46
56
|
describe 'show-domain' do
|
47
57
|
context 'with members' do
|
@@ -57,16 +67,52 @@ describe RHC::Commands::Member do
|
|
57
67
|
it("should order the members by role then by name") { run_output.should =~ /Bob.*admin.*Admins.*Carol.*Editors.*ViewerA.*ViewerB.*ViewerC.*Viewers/m }
|
58
68
|
it("should include the login value") { run_output.should =~ /alice.*Bob.*carol.*doug@doug\.com/m }
|
59
69
|
end
|
70
|
+
|
60
71
|
end
|
61
72
|
|
62
73
|
describe 'list-member' do
|
74
|
+
context 'on a domain with no members' do
|
75
|
+
let(:arguments) { ['members', '-n', 'mock-domain-0'] }
|
76
|
+
let(:supports_members){ true }
|
77
|
+
before{ with_mock_domain.init_members }
|
78
|
+
it { expect { run }.to exit_with_code(0) }
|
79
|
+
it { run_output.should =~ /does not have any members/ }
|
80
|
+
end
|
81
|
+
|
63
82
|
context 'on a domain' do
|
64
83
|
let(:arguments) { ['members', '-n', 'mock-domain-0'] }
|
65
84
|
let(:supports_members){ true }
|
66
85
|
before{ with_mock_domain.add_member(owner) }
|
67
86
|
it { expect { run }.to exit_with_code(0) }
|
68
87
|
it { run_output.should =~ /alice\s+admin \(owner\)/ }
|
69
|
-
it("should not show the name column") { run_output.should =~ /^Login\s+Role$/ }
|
88
|
+
it("should not show the name column") { run_output.should =~ /^Login\s+Role\s+Type$/ }
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'on a domain with teams not showing all members' do
|
92
|
+
let(:arguments) { ['members', '-n', 'mock-domain-0'] }
|
93
|
+
let(:supports_members){ true }
|
94
|
+
before{ with_mock_domain.add_member(owner).add_member(team_admin).add_member(team_editor).add_member(team_admin_member).add_member(team_editor_member).add_member(team_viewer).add_member(team_viewer_and_explicit_member) }
|
95
|
+
it { expect { run }.to exit_with_code(0) }
|
96
|
+
it { run_output.should =~ /alice\s+alice\s+admin \(owner\)\s+user/ }
|
97
|
+
it { run_output.should =~ /team1\s+admin\s+team/ }
|
98
|
+
it { run_output.should_not =~ /memberadmin\s+memberadmin\s+admin \(via team1\)\s+user/ }
|
99
|
+
it { run_output.should =~ /team2\s+edit\s+team/ }
|
100
|
+
it { run_output.should_not =~ /membereditor\s+membereditor\s+edit \(via team2\)\s+user/ }
|
101
|
+
it("should show the name column") { run_output.should =~ /^Name\s+Login\s+Role\s+Type$/ }
|
102
|
+
it("should prompt to use the --all parameter") { run_output.should =~ /--all to display all members/ }
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'on a domain with teams showing all members' do
|
106
|
+
let(:arguments) { ['members', '-n', 'mock-domain-0', '--all'] }
|
107
|
+
let(:supports_members){ true }
|
108
|
+
before{ with_mock_domain.add_member(owner).add_member(team_admin).add_member(team_editor).add_member(team_admin_member).add_member(team_editor_member).add_member(team_viewer).add_member(team_viewer_and_explicit_member) }
|
109
|
+
it { expect { run }.to exit_with_code(0) }
|
110
|
+
it { run_output.should =~ /alice\s+alice\s+admin \(owner\)\s+user/ }
|
111
|
+
it { run_output.should =~ /team1\s+admin\s+team/ }
|
112
|
+
it { run_output.should =~ /memberadmin\s+memberadmin\s+admin \(via team1\)\s+user/ }
|
113
|
+
it { run_output.should =~ /team2\s+edit\s+team/ }
|
114
|
+
it { run_output.should =~ /membereditor\s+membereditor\s+edit \(via team2\)\s+user/ }
|
115
|
+
it("should show the name column") { run_output.should =~ /^Name\s+Login\s+Role\s+Type$/ }
|
70
116
|
end
|
71
117
|
|
72
118
|
context 'on an application' do
|
@@ -77,18 +123,27 @@ describe RHC::Commands::Member do
|
|
77
123
|
it { expect { run }.to exit_with_code(1) }
|
78
124
|
it { run_output.should =~ /The server does not support adding or removing members/ }
|
79
125
|
|
126
|
+
context "with only implicit members via domain" do
|
127
|
+
let(:supports_members){ true }
|
128
|
+
before{ with_mock_app.add_member(app_member_via_domain) }
|
129
|
+
it { expect { run }.to exit_with_code(0) }
|
130
|
+
it { run_output.should =~ /app_member_via_domain\s+view \(via domain\)/ }
|
131
|
+
it("should not show the name column") { run_output.should =~ /^Login\s+Role\s+Type$/ }
|
132
|
+
it("should not show the --all message") { run_output.should_not =~ /--all/ }
|
133
|
+
end
|
134
|
+
|
80
135
|
context "with only owner" do
|
81
136
|
let(:supports_members){ true }
|
82
137
|
before{ with_mock_app.add_member(owner) }
|
83
138
|
it { expect { run }.to exit_with_code(0) }
|
84
139
|
it { run_output.should =~ /alice\s+admin \(owner\)/ }
|
85
|
-
it("should not show the name column") { run_output.should =~ /^Login\s+Role$/ }
|
140
|
+
it("should not show the name column") { run_output.should =~ /^Login\s+Role\s+Type$/ }
|
86
141
|
|
87
142
|
context "with ids" do
|
88
143
|
let(:arguments) { ['members', 'mock-domain-0/mock-app-0', '--ids'] }
|
89
144
|
it { expect { run }.to exit_with_code(0) }
|
90
145
|
it { run_output.should =~ /alice\s+admin \(owner\) 1/ }
|
91
|
-
it("should not show the name column") { run_output.should =~ /^Login\s+Role\s+ID$/ }
|
146
|
+
it("should not show the name column") { run_output.should =~ /^Login\s+Role\s+ID\s+Type$/ }
|
92
147
|
end
|
93
148
|
end
|
94
149
|
|
@@ -102,7 +157,7 @@ describe RHC::Commands::Member do
|
|
102
157
|
it { run_output.should =~ /doug\.com\s+view/ }
|
103
158
|
it("should order the members by role") { run_output.should =~ /admin.*owner.*admin.*edit.*view/m }
|
104
159
|
it("should include the login value") { run_output.should =~ /alice.*Bob.*carol.*doug@doug\.com/m }
|
105
|
-
it("should show the name column") { run_output.should =~ /^Name\s+Login\s+Role$/ }
|
160
|
+
it("should show the name column") { run_output.should =~ /^Name\s+Login\s+Role\s+Type$/ }
|
106
161
|
end
|
107
162
|
end
|
108
163
|
end
|
@@ -119,6 +174,13 @@ describe RHC::Commands::Member do
|
|
119
174
|
it { run_output.should =~ /Adding 1 editor to domain .*The server does not support adding or removing members/ }
|
120
175
|
end
|
121
176
|
|
177
|
+
context "when the client doesn't support teams" do
|
178
|
+
let(:mock_teams_links){ [] }
|
179
|
+
let(:arguments) { ['add-member', 'testteam', '-n', 'test', '--type', 'team'] }
|
180
|
+
it { expect { run }.to exit_with_code(161) }
|
181
|
+
it { run_output.should =~ /Adding 1 editor to domain .*Server does not support teams/ }
|
182
|
+
end
|
183
|
+
|
122
184
|
context "with supported membership" do
|
123
185
|
let(:supports_members?){ true }
|
124
186
|
|
@@ -126,13 +188,154 @@ describe RHC::Commands::Member do
|
|
126
188
|
let(:arguments) { ['add-member', 'testuser', '-n', 'test'] }
|
127
189
|
before do
|
128
190
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
129
|
-
with(:body => {:members => [{'login' => 'testuser', 'role' => 'edit'}]}).
|
191
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'edit', 'type' => 'user'}]}).
|
130
192
|
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Added 1 member'},]}.to_json, :status => 200})
|
131
193
|
end
|
132
194
|
it { expect { run }.to exit_with_code(0) }
|
133
195
|
it { run_output.should =~ /Adding 1 editor to domain .*done/ }
|
134
196
|
end
|
135
197
|
|
198
|
+
context 'with a valid team' do
|
199
|
+
let(:arguments) { ['add-member', 'testteam', '-n', 'test', '--type', 'team'] }
|
200
|
+
before do
|
201
|
+
challenge do
|
202
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
203
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'testteam'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
204
|
+
end
|
205
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
206
|
+
with(:body => {:members => [{:role => 'edit', :type => 'team', :id => 111, }]}).
|
207
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'id', :index => 0, :severity => 'info', :text => 'Added 1 member'},]}.to_json, :status => 200})
|
208
|
+
end
|
209
|
+
it { expect { run }.to exit_with_code(0) }
|
210
|
+
it { run_output.should =~ /Adding 1 editor to domain .*done/ }
|
211
|
+
end
|
212
|
+
|
213
|
+
context 'with an invalid type' do
|
214
|
+
let(:arguments) { ['add-member', 'invalidteam', '-n', 'test', '--type', 'foo'] }
|
215
|
+
it { expect { run }.to exit_with_code(1) }
|
216
|
+
it { run_output.should =~ /Type must be/ }
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'with an invalid team' do
|
220
|
+
let(:arguments) { ['add-member', 'invalidteam', '-n', 'test', '--type', 'team'] }
|
221
|
+
before do
|
222
|
+
challenge do
|
223
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
224
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'testteam'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
225
|
+
end
|
226
|
+
end
|
227
|
+
it { expect { run }.to exit_with_code(162) }
|
228
|
+
it { run_output.should =~ /Adding 1 editor to domain .*You do not have a team named 'invalidteam'/ }
|
229
|
+
end
|
230
|
+
|
231
|
+
context 'with multiple partial team matches but one exact match' do
|
232
|
+
let(:arguments) { ['add-member', 'testteam', '-n', 'test', '--type', 'team'] }
|
233
|
+
before do
|
234
|
+
challenge do
|
235
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
236
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'testteam'}, {:id => 222, :global => false, :name => 'testteam1'}, {:id => 333, :global => false, :name => 'testteam11'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
237
|
+
end
|
238
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
239
|
+
with(:body => {:members => [{:role => 'edit', :type => 'team', :id => 111, }]}).
|
240
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'id', :index => 0, :severity => 'info', :text => 'Added 1 member'},]}.to_json, :status => 200})
|
241
|
+
end
|
242
|
+
it { expect { run }.to exit_with_code(0) }
|
243
|
+
it { run_output.should =~ /Adding 1 editor to domain .*done/ }
|
244
|
+
end
|
245
|
+
|
246
|
+
context 'without an exact team match' do
|
247
|
+
let(:arguments) { ['add-member', 'team', '-n', 'test', '--type', 'team'] }
|
248
|
+
before do
|
249
|
+
challenge do
|
250
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
251
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'team1'}, {:id => 111, :global => false, :name => 'team2'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
252
|
+
end
|
253
|
+
end
|
254
|
+
it { expect { run }.to exit_with_code(162) }
|
255
|
+
it { run_output.should =~ /Adding 1 editor to domain .*You do not have a team named 'team'. Did you mean one of the following\?\nteam1, team2/ }
|
256
|
+
end
|
257
|
+
|
258
|
+
context 'with a single exact case insensitive match' do
|
259
|
+
let(:arguments) { ['add-member', 'testteam', '-n', 'test', '--type', 'team'] }
|
260
|
+
before do
|
261
|
+
challenge do
|
262
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
263
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'TESTTEAM'}, {:id => 222, :global => false, :name => 'TESTTEAM1'}, {:id => 333, :global => false, :name => 'TESTTEAM2'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
264
|
+
end
|
265
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
266
|
+
with(:body => {:members => [{:role => 'edit', :type => 'team', :id => 111, }]}).
|
267
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'id', :index => 0, :severity => 'info', :text => 'Added 1 member'},]}.to_json, :status => 200})
|
268
|
+
end
|
269
|
+
it { expect { run }.to exit_with_code(0) }
|
270
|
+
it { run_output.should =~ /Adding 1 editor to domain .*done/ }
|
271
|
+
end
|
272
|
+
|
273
|
+
context 'with an exact case sensitive match and some exact case insensitive matches' do
|
274
|
+
let(:arguments) { ['add-member', 'testteam', '-n', 'test', '--type', 'team'] }
|
275
|
+
before do
|
276
|
+
challenge do
|
277
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
278
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'testteam'}, {:id => 222, :global => false, :name => 'TESTTEAM'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
279
|
+
end
|
280
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
281
|
+
with(:body => {:members => [{:role => 'edit', :type => 'team', :id => 111, }]}).
|
282
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'id', :index => 0, :severity => 'info', :text => 'Added 1 member'},]}.to_json, :status => 200})
|
283
|
+
end
|
284
|
+
it { expect { run }.to exit_with_code(0) }
|
285
|
+
it { run_output.should =~ /Adding 1 editor to domain .*done/ }
|
286
|
+
end
|
287
|
+
|
288
|
+
context 'with a team name containing special characters' do
|
289
|
+
let(:arguments) { ['add-member', '*1()', '-n', 'test', '--type', 'team'] }
|
290
|
+
before do
|
291
|
+
challenge do
|
292
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
293
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => '*1()'}, {:id => 222, :global => false, :name => 'another team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
294
|
+
end
|
295
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
296
|
+
with(:body => {:members => [{:role => 'edit', :type => 'team', :id => 111, }]}).
|
297
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'id', :index => 0, :severity => 'info', :text => 'Added 1 member'},]}.to_json, :status => 200})
|
298
|
+
end
|
299
|
+
it { expect { run }.to exit_with_code(0) }
|
300
|
+
it { run_output.should =~ /Adding 1 editor to domain .*done/ }
|
301
|
+
end
|
302
|
+
|
303
|
+
context 'with multiple exact team matches' do
|
304
|
+
let(:arguments) { ['add-member', 'someteam', '-n', 'test', '--type', 'team'] }
|
305
|
+
before do
|
306
|
+
challenge do
|
307
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
308
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'someteam'}, {:id => 222, :global => false, :name => 'someteam'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
309
|
+
end
|
310
|
+
end
|
311
|
+
it { expect { run }.to exit_with_code(162) }
|
312
|
+
it { run_output.should =~ /Adding 1 editor to domain .*There is more than one team named 'someteam'\. Please use the --ids flag and specify the exact id of the team you want to manage\./ }
|
313
|
+
end
|
314
|
+
|
315
|
+
context 'with multiple case-insensitive team matches' do
|
316
|
+
let(:arguments) { ['add-member', 'someteam', '-n', 'test', '--type', 'team'] }
|
317
|
+
before do
|
318
|
+
challenge do
|
319
|
+
stub_api_request(:get, "broker/rest/teams?owner=@self").
|
320
|
+
to_return({:body => {:type => 'teams', :data => [{:id => 111, :global => false, :name => 'SOMETEAM'}, {:id => 222, :global => false, :name => 'SomeTeam'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
321
|
+
end
|
322
|
+
end
|
323
|
+
it { expect { run }.to exit_with_code(162) }
|
324
|
+
it { run_output.should =~ /Adding 1 editor to domain .*You do not have a team named 'someteam'. Did you mean one of the following\?\nSOMETEAM, SomeTeam/ }
|
325
|
+
end
|
326
|
+
|
327
|
+
context 'without a global team' do
|
328
|
+
let(:arguments) { ['add-member', 'testteam', '-n', 'test', '--type', 'team', '--global'] }
|
329
|
+
before do
|
330
|
+
challenge do
|
331
|
+
stub_api_request(:get, "broker/rest/teams?global&search=testteam").
|
332
|
+
to_return({:body => {:type => 'teams', :data => [], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
333
|
+
end
|
334
|
+
end
|
335
|
+
it { expect { run }.to exit_with_code(162) }
|
336
|
+
it { run_output.should =~ /Adding 1 editor to domain .*No global team found with the name 'testteam'\./ }
|
337
|
+
end
|
338
|
+
|
136
339
|
context 'with an invalid role' do
|
137
340
|
let(:arguments) { ['add-member', 'testuser', '-n', 'test', '--role', 'missing'] }
|
138
341
|
it { expect { run }.to exit_with_code(1) }
|
@@ -140,10 +343,10 @@ describe RHC::Commands::Member do
|
|
140
343
|
end
|
141
344
|
|
142
345
|
context 'with a missing user' do
|
143
|
-
let(:arguments) { ['add-member', 'testuser', '-n', 'test'] }
|
346
|
+
let(:arguments) { ['add-member', 'testuser', '-n', 'test', '--type', 'user'] }
|
144
347
|
before do
|
145
348
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
146
|
-
with(:body => {:members => [{'login' => 'testuser', 'role' => 'edit'}]}).
|
349
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'edit', 'type' => 'user'}]}).
|
147
350
|
to_return({:body => {:messages => [{:exit_code => 132, :field => 'login', :index => 0, :severity => 'error', :text => 'There is no user with a login testuser'},]}.to_json, :status => 422})
|
148
351
|
end
|
149
352
|
it { expect { run }.to exit_with_code(1) }
|
@@ -154,7 +357,7 @@ describe RHC::Commands::Member do
|
|
154
357
|
let(:arguments) { ['add-member', '123', '-n', 'test', '--ids', '--role', 'admin'] }
|
155
358
|
before do
|
156
359
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
157
|
-
with(:body => {:members => [{'id' => '123', 'role' => 'admin'}]}).
|
360
|
+
with(:body => {:members => [{'id' => '123', 'role' => 'admin', 'type' => 'user'}]}).
|
158
361
|
to_return({:body => {:messages => [{:exit_code => 132, :field => 'id', :index => 0, :severity => 'error', :text => 'There is no user with the id 123'},]}.to_json, :status => 422})
|
159
362
|
end
|
160
363
|
it { expect { run }.to exit_with_code(1) }
|
@@ -163,6 +366,166 @@ describe RHC::Commands::Member do
|
|
163
366
|
end
|
164
367
|
end
|
165
368
|
|
369
|
+
describe 'update-member' do
|
370
|
+
context "when the resource doesn't support membership changes" do
|
371
|
+
before{ stub_api }
|
372
|
+
|
373
|
+
context "when updating a domain" do
|
374
|
+
let(:arguments) { ['update-member', 'testuser', '-n', 'test'] }
|
375
|
+
before{ challenge{ stub_one_domain('test', nil, mock_user_auth) } }
|
376
|
+
it { expect { run }.to exit_with_code(1) }
|
377
|
+
it { run_output.should =~ /Updating 1 editor to domain .*The server does not support adding or removing members/ }
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
context "with supported membership" do
|
382
|
+
let(:supports_members?){ true }
|
383
|
+
before do
|
384
|
+
stub_api
|
385
|
+
challenge{ stub_one_domain('test', nil, mock_user_auth) }
|
386
|
+
end
|
387
|
+
|
388
|
+
context 'with a valid user' do
|
389
|
+
let(:arguments) { ['update-member', 'testuser', '-n', 'test', '-r', 'view'] }
|
390
|
+
before do
|
391
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
392
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'view', 'type' => 'user'}]}).
|
393
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Updated 1 member'},]}.to_json, :status => 200})
|
394
|
+
end
|
395
|
+
it { expect { run }.to exit_with_code(0) }
|
396
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*done/ }
|
397
|
+
end
|
398
|
+
|
399
|
+
context 'with a valid team' do
|
400
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
401
|
+
before do
|
402
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
403
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => 'testteam', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
404
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
405
|
+
with(:body => {:members => [{'id' => 1, 'role' => 'view', 'type' => 'team'}]}).
|
406
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Updated 1 member'},]}.to_json, :status => 200})
|
407
|
+
end
|
408
|
+
it { expect { run }.to exit_with_code(0) }
|
409
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*done/ }
|
410
|
+
end
|
411
|
+
|
412
|
+
context 'with multiple team exact matches' do
|
413
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
414
|
+
before do
|
415
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
416
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => 'testteam', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}, {:id => 12, :name => 'testteam', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
417
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
418
|
+
with(:body => {:members => [{'id' => 1, 'role' => 'view', 'type' => 'team'}]}).
|
419
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Updated 1 member'},]}.to_json, :status => 200})
|
420
|
+
end
|
421
|
+
it { expect { run }.to exit_with_code(163) }
|
422
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*There is more than one member team named 'testteam'/ }
|
423
|
+
end
|
424
|
+
|
425
|
+
context 'with multiple team case-insensitive matches' do
|
426
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
427
|
+
before do
|
428
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
429
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => 'TESTTEAM', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}, {:id => 12, :name => 'TestTeam', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
430
|
+
end
|
431
|
+
it { expect { run }.to exit_with_code(163) }
|
432
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*No member team found with the name 'testteam'. Did you mean one of the following\?\nTESTTEAM, TestTeam/ }
|
433
|
+
end
|
434
|
+
|
435
|
+
context 'with a single exact case insensitive match' do
|
436
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
437
|
+
before do
|
438
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
439
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => 'TESTTEAM', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}, {:id => 2, :name => 'TESTTEAM2', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}, {:id => 3, :name => 'TESTTEAM3', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
440
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
441
|
+
with(:body => {:members => [{'id' => 1, 'role' => 'view', 'type' => 'team'}]}).
|
442
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Updated 1 member'},]}.to_json, :status => 200})
|
443
|
+
end
|
444
|
+
it { expect { run }.to exit_with_code(0) }
|
445
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*done/ }
|
446
|
+
end
|
447
|
+
|
448
|
+
context 'with an exact case sensitive match and some exact case insensitive matches' do
|
449
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
450
|
+
before do
|
451
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
452
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => 'testteam', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}, {:id => 2, :name => 'TESTTEAM', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}, {:id => 3, :name => 'TeStTeAm', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
453
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
454
|
+
with(:body => {:members => [{'id' => 1, 'role' => 'view', 'type' => 'team'}]}).
|
455
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Updated 1 member'},]}.to_json, :status => 200})
|
456
|
+
end
|
457
|
+
it { expect { run }.to exit_with_code(0) }
|
458
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*done/ }
|
459
|
+
end
|
460
|
+
|
461
|
+
context 'with a team name containing special characters' do
|
462
|
+
let(:arguments) { ['update-member', '*1()', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
463
|
+
before do
|
464
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
465
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => '*1()', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'team'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
466
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
467
|
+
with(:body => {:members => [{'id' => 1, 'role' => 'view', 'type' => 'team'}]}).
|
468
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Updated 1 member'},]}.to_json, :status => 200})
|
469
|
+
end
|
470
|
+
it { expect { run }.to exit_with_code(0) }
|
471
|
+
it { run_output.should =~ /Updating 1 viewer to domain .*done/ }
|
472
|
+
end
|
473
|
+
|
474
|
+
context 'with a missing user' do
|
475
|
+
let(:arguments) { ['update-member', 'testuser', '-n', 'test', '-r', 'view'] }
|
476
|
+
before do
|
477
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
478
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'view', 'type' => 'user'}]}).
|
479
|
+
to_return({:body => {:messages => [{:exit_code => 132, :field => 'login', :index => 0, :severity => 'error', :text => 'There is no user with a login testuser'},]}.to_json, :status => 422})
|
480
|
+
end
|
481
|
+
it { expect { run }.to exit_with_code(1) }
|
482
|
+
it { run_output.should =~ /Updating 1 viewer to domain.*There is no user with a login testuser/ }
|
483
|
+
end
|
484
|
+
|
485
|
+
context 'with a missing team' do
|
486
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
487
|
+
before do
|
488
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
489
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing teams'},]}.to_json, :status => 200})
|
490
|
+
end
|
491
|
+
it { expect { run }.to exit_with_code(163) }
|
492
|
+
it { run_output.should =~ /Updating 1 viewer to domain.*No member team found with the name 'testteam'/ }
|
493
|
+
end
|
494
|
+
|
495
|
+
context 'with a missing team with an identical user name' do
|
496
|
+
let(:arguments) { ['update-member', 'testteam', '-n', 'test', '-r', 'view', '--type', 'team'] }
|
497
|
+
before do
|
498
|
+
stub_api_request(:get, "broker/rest/domains/test/members").
|
499
|
+
to_return({:body => {:type => 'members', :data => [{:id => 1, :name => 'testteam', :login => 'testteam', :owner => false, :role => 'edit', :explicit_role => 'edit', :type => 'user'}], :messages => [{:exit_code => 0, :field => nil, :index => nil, :severity => 'info', :text => 'Listing members'},]}.to_json, :status => 200})
|
500
|
+
end
|
501
|
+
it { expect { run }.to exit_with_code(163) }
|
502
|
+
it { run_output.should =~ /Updating 1 viewer to domain.*No member team found with the name 'testteam'/ }
|
503
|
+
end
|
504
|
+
|
505
|
+
context 'with a missing user id and role' do
|
506
|
+
let(:arguments) { ['update-member', '123', '-n', 'test', '--ids', '-r', 'view'] }
|
507
|
+
before do
|
508
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
509
|
+
with(:body => {:members => [{'id' => '123', 'role' => 'view', 'type' => 'user'}]}).
|
510
|
+
to_return({:body => {:messages => [{:exit_code => 132, :field => 'id', :index => 0, :severity => 'error', :text => 'There is no user with the id 123'},]}.to_json, :status => 422})
|
511
|
+
end
|
512
|
+
it { expect { run }.to exit_with_code(1) }
|
513
|
+
it { run_output.should =~ /Updating 1 viewer to domain.*There is no user with the id 123/ }
|
514
|
+
end
|
515
|
+
|
516
|
+
context 'when the user is not a member' do
|
517
|
+
let(:arguments) { ['update-member', 'testuser', '-n', 'test', '-r', 'view'] }
|
518
|
+
before do
|
519
|
+
stub_api_request(:patch, "broker/rest/domains/test/members").
|
520
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'view', 'type' => 'user'}]}).
|
521
|
+
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'warning', :text => 'testuser is not a member of this domain.'},]}.to_json, :status => 200})
|
522
|
+
end
|
523
|
+
it { expect { run }.to exit_with_code(0) }
|
524
|
+
it { run_output.should =~ /Updating 1 viewer to domain.*testuser is not a member of this domain.*done/m }
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
166
529
|
describe 'remove-member' do
|
167
530
|
context "when the resource doesn't support membership changes" do
|
168
531
|
before{ stub_api }
|
@@ -193,7 +556,7 @@ describe RHC::Commands::Member do
|
|
193
556
|
let(:arguments) { ['remove-member', 'testuser', '-n', 'test'] }
|
194
557
|
before do
|
195
558
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
196
|
-
with(:body => {:members => [{'login' => 'testuser', 'role' => 'none'}]}).
|
559
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'none', 'type' => 'user'}]}).
|
197
560
|
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'info', :text => 'Removed 1 member'},]}.to_json, :status => 200})
|
198
561
|
end
|
199
562
|
it { expect { run }.to exit_with_code(0) }
|
@@ -214,7 +577,7 @@ describe RHC::Commands::Member do
|
|
214
577
|
let(:arguments) { ['remove-member', 'testuser', '-n', 'test'] }
|
215
578
|
before do
|
216
579
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
217
|
-
with(:body => {:members => [{'login' => 'testuser', 'role' => 'none'}]}).
|
580
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'none', 'type' => 'user'}]}).
|
218
581
|
to_return({:body => {:messages => [{:exit_code => 132, :field => 'login', :index => 0, :severity => 'error', :text => 'There is no user with a login testuser'},]}.to_json, :status => 422})
|
219
582
|
end
|
220
583
|
it { expect { run }.to exit_with_code(1) }
|
@@ -225,18 +588,18 @@ describe RHC::Commands::Member do
|
|
225
588
|
let(:arguments) { ['remove-member', '123', '-n', 'test', '--ids'] }
|
226
589
|
before do
|
227
590
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
228
|
-
with(:body => {:members => [{'id' => '123', 'role' => 'none'}]}).
|
591
|
+
with(:body => {:members => [{'id' => '123', 'role' => 'none', 'type' => 'user'}]}).
|
229
592
|
to_return({:body => {:messages => [{:exit_code => 132, :field => 'id', :index => 0, :severity => 'error', :text => 'There is no user with the id 123'},]}.to_json, :status => 422})
|
230
593
|
end
|
231
594
|
it { expect { run }.to exit_with_code(1) }
|
232
595
|
it { run_output.should =~ /Removing 1 member from domain.*There is no user with the id 123/ }
|
233
596
|
end
|
234
597
|
|
235
|
-
context 'when the user
|
598
|
+
context 'when the user is not a member' do
|
236
599
|
let(:arguments) { ['remove-member', 'testuser', '-n', 'test'] }
|
237
600
|
before do
|
238
601
|
stub_api_request(:patch, "broker/rest/domains/test/members").
|
239
|
-
with(:body => {:members => [{'login' => 'testuser', 'role' => 'none'}]}).
|
602
|
+
with(:body => {:members => [{'login' => 'testuser', 'role' => 'none', 'type' => 'user'}]}).
|
240
603
|
to_return({:body => {:type => 'members', :data => [], :messages => [{:exit_code => 0, :field => 'login', :index => 0, :severity => 'warning', :text => 'testuser is not a member of this domain.'},]}.to_json, :status => 200})
|
241
604
|
end
|
242
605
|
it { expect { run }.to exit_with_code(0) }
|