new_cfoundry 4.8.2 → 4.8.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f67b3d8cac78644f9dfb2149b9a485f03c415dc5
4
- data.tar.gz: b71be34bd3870e3944ff50ac312916e72b70dae9
3
+ metadata.gz: 1db0e9895e11eccd067274b7989b8c7d630da182
4
+ data.tar.gz: 0777ad44dc209588fa57c28e48ac3aafbc82eb36
5
5
  SHA512:
6
- metadata.gz: 9596e13643a84820b2091c3ffe2e9f3b7d8cb70cb791df8a337543e5d78b4852d770827a38b90e169e6af15c93b30093533daa0a7047c468b59f18adadd9ddc4
7
- data.tar.gz: 5a46119b0a0064b146dd1e6666e3820d9592446eea9629b57fa015529bf3c21c427130d7e49376627b5411cb6c3b47df8f8e1999ee45a7a358a0d46451891845
6
+ metadata.gz: 8038fb2fd9388649c229c1c614b00a4f0bc52b019721e2128b17ee752be739f5f844351990c934a1d2e4c5636805db71f66da0611dc3941cc4fc80287cb48faf
7
+ data.tar.gz: d6eadc54a8ce1530182213597db2800b0f978942bee0c9d33521f29b38ca4f5bd79ba85215b952a25a12749b1c462872b3089928a46f91454a84c27922ea20ad
data/.gitmodules CHANGED
@@ -1,3 +1,3 @@
1
1
  [submodule "vendor/errors"]
2
2
  path = vendor/errors
3
- url = git://github.com/cloudfoundry/errors.git
3
+ url = https://github.com/cloudfoundry/errors.git
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.8.2
1
+ 4.8.3
data/cfoundry.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
20
20
 
21
21
  s.add_dependency "activemodel", "<5.0.0", ">= 3.2.13"
22
22
  s.add_dependency "cf-uaa-lib", "~> 2.0.0"
23
+ s.add_dependency "jwt", "~> 1.5"
23
24
  s.add_dependency "multi_json", "~> 1.7"
24
25
  s.add_dependency "multipart-post", "~> 1.1"
25
26
  s.add_dependency "rubyzip", "~> 0.9"
@@ -38,12 +38,11 @@ module CFoundry
38
38
  return @token_data if @token_data
39
39
  return {} unless @auth_header
40
40
 
41
- json_hashes = Base64.decode64(@auth_header.split(" ", 2).last)
42
- data_json = json_hashes.sub(JSON_HASH, "")[JSON_HASH]
41
+ data_json = @auth_header.split(" ", 2).last
43
42
  return {} unless data_json
44
43
 
45
- @token_data = MultiJson.load data_json, :symbolize_keys => true
46
- rescue MultiJson::DecodeError
44
+ @token_data = JWT.decode(data_json, nil, false)[0].symbolize_keys
45
+ rescue
47
46
  {}
48
47
  end
49
48
 
@@ -53,7 +52,7 @@ module CFoundry
53
52
  end
54
53
 
55
54
  def expiration
56
- Time.at(token_data[:exp])
55
+ token_data[:exp].nil? ? Time.at(0) : Time.at(token_data[:exp])
57
56
  end
58
57
 
59
58
  def expires_soon?
@@ -12,13 +12,18 @@ module CFoundry
12
12
  extend Forwardable
13
13
 
14
14
  attr_reader :rest_client
15
+ attr_accessor :client_id, :client_secret
15
16
 
16
17
  def_delegators :rest_client, :target, :target=, :token,
17
18
  :trace, :backtrace, :backtrace=, :log, :log=,
18
19
  :http_proxy, :http_proxy=, :https_proxy, :https_proxy=
19
20
 
20
- def initialize(target, token = nil)
21
+ def initialize(target, token = nil, options = {})
21
22
  @rest_client = CFoundry::RestClient.new(target, token)
23
+ @rest_client.http_proxy = options[:http_proxy]
24
+ @rest_client.https_proxy = options[:https_proxy]
25
+ self.client_id = options[:client_id]
26
+ self.client_secret = options[:client_secret]
22
27
  self.trace = false
23
28
  self.backtrace = false
24
29
  self.log = false
@@ -29,7 +34,10 @@ module CFoundry
29
34
  endpoint = info[:authorization_endpoint]
30
35
 
31
36
  if endpoint
32
- uaa = CFoundry::UAAClient.new(endpoint, "cf", http_proxy: http_proxy, https_proxy: https_proxy)
37
+ uaa = CFoundry::UAAClient.new(endpoint,
38
+ client_id || "cf",
39
+ client_secret: client_secret,
40
+ http_proxy: http_proxy, https_proxy: https_proxy)
33
41
  uaa.trace = trace
34
42
  uaa.token = token
35
43
  uaa
@@ -3,11 +3,12 @@ require "uaa"
3
3
 
4
4
  module CFoundry
5
5
  class UAAClient
6
- attr_accessor :target, :client_id, :token, :trace, :http_proxy, :https_proxy
6
+ attr_accessor :target, :client_id, :client_secret, :token, :trace, :http_proxy, :https_proxy
7
7
 
8
8
  def initialize(target, client_id = "cf", options = {})
9
9
  @target = target
10
10
  @client_id = client_id
11
+ @client_secret = options[:client_secret]
11
12
  @http_proxy = options[:http_proxy]
12
13
  @https_proxy = options[:https_proxy]
13
14
  @uaa_info_client = uaa_info_client_for(target)
@@ -102,7 +103,7 @@ module CFoundry
102
103
  end
103
104
 
104
105
  def token_issuer
105
- @token_issuer ||= CF::UAA::TokenIssuer.new(target, client_id, nil,
106
+ @token_issuer ||= CF::UAA::TokenIssuer.new(target, client_id, client_secret,
106
107
  :symbolize_keys => true,
107
108
  :http_proxy => @http_proxy,
108
109
  :https_proxy => @https_proxy
@@ -113,7 +114,7 @@ module CFoundry
113
114
 
114
115
  def scim
115
116
  auth_header = token && token.auth_header
116
- scim = CF::UAA::Scim.new(uaa_url, auth_header, :symbolize_keys => true)
117
+ scim = CF::UAA::Scim.new(uaa_url, auth_header, :symbolize_keys => true, :http_proxy => @http_proxy, :https_proxy => @https_proxy)
117
118
  scim.logger.level = @trace ? Logger::Severity::TRACE : 1
118
119
  scim
119
120
  end
@@ -71,6 +71,16 @@ module CFoundry::V2
71
71
  stats
72
72
  end
73
73
 
74
+ def system_env
75
+ system_env = {}
76
+
77
+ @client.base.env(@guid).each do |idx, info|
78
+ system_env[idx.to_s] = info
79
+ end
80
+
81
+ system_env
82
+ end
83
+
74
84
  def services
75
85
  service_bindings.collect(&:service_instance)
76
86
  end
@@ -81,6 +81,10 @@ module CFoundry::V2
81
81
  get("v2", "apps", guid, "stats", :accept => :json)
82
82
  end
83
83
 
84
+ def env(guid)
85
+ get("v2", "apps", guid, "env", :accept => :json)
86
+ end
87
+
84
88
  def update_app(guid, diff)
85
89
  put("v2", "apps", guid,
86
90
  :content => :json,
@@ -24,8 +24,8 @@ module CFoundry::V2
24
24
  # Create a new Client for interfacing with the given target.
25
25
  #
26
26
  # A token may also be provided to skip the login step.
27
- def initialize(target, token = nil)
28
- @base = Base.new(target, token)
27
+ def initialize(target, token = nil, options = {})
28
+ @base = Base.new(target, token, options)
29
29
  end
30
30
 
31
31
  def version
@@ -3,6 +3,7 @@ require "cfoundry/v2/service_instance"
3
3
  module CFoundry::V2
4
4
  class ManagedServiceInstance < ServiceInstance
5
5
  attribute :credentials, :hash
6
+ attribute :parameters, :hash
6
7
  to_one :service_plan
7
8
 
8
9
  def self.object_name
@@ -73,6 +73,13 @@ module CFoundry::V2::ModelMagic
73
73
  @client.base.put("v2", plural_object_name, @guid, plural, x.guid, :accept => :json)
74
74
  end
75
75
 
76
+ #
77
+ # def add_MODEL_by_username
78
+ #
79
+ define_method(:"add_#{singular}_by_username") do |username|
80
+ @client.base.put("v2", plural_object_name, @guid, plural, :accept => :json, :content => :json, :payload => {:username => username.to_s})
81
+ end
82
+
76
83
  #
77
84
  # def create_MODEL
78
85
  #
@@ -75,6 +75,10 @@ module CFoundry
75
75
  true
76
76
  end
77
77
 
78
+ def username
79
+ manifest.try(:[], :entity).try(:[], :username)
80
+ end
81
+
78
82
  private
79
83
 
80
84
  def get_meta_from_uaa
@@ -3,6 +3,7 @@ require "cfoundry/v2/service_instance"
3
3
  module CFoundry::V2
4
4
  class UserProvidedServiceInstance < ServiceInstance
5
5
  attribute :credentials, :hash
6
+ attribute :parameters, :hash
6
7
 
7
8
  def self.object_name
8
9
  'service_instance'
data/lib/cfoundry.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "cfoundry/version"
2
2
  require "active_model"
3
+ require "jwt"
3
4
  require "cfoundry/client"
4
5
 
5
6
  I18n.load_path += Dir["config/locales/*.yml"]
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
 
4
4
  describe CFoundry::AuthToken do
5
5
  describe ".from_uaa_token_info" do
6
- let(:access_token) { Base64.encode64('{"algo": "h1234"}{"user_id": "a6", "email": "a@b.com"}random-bytes') }
6
+ let(:access_token) { JWT.encode({user_id: "a6", email: "a@b.com"}, nil, 'none') }
7
7
  let(:info_hash) do
8
8
  {
9
9
  :token_type => "bearer",
@@ -70,16 +70,15 @@ describe CFoundry::AuthToken do
70
70
  end
71
71
 
72
72
  describe '#token_data' do
73
- subject { super().token_data }
74
- it { should eq({}) }
73
+ it { subject.token_data.should eq({}) }
75
74
  end
76
75
  end
77
76
  end
78
77
  end
79
78
 
80
79
  describe ".from_hash(hash)" do
81
- let(:token_data) { '{"baz":"buzz"}' }
82
- let(:token) { Base64.encode64("{\"foo\":1}#{token_data}") }
80
+ let(:token_data) { {baz:"buzz"} }
81
+ let(:token) { JWT.encode(token_data, nil, 'none') }
83
82
 
84
83
  let(:hash) do
85
84
  {
@@ -113,8 +112,8 @@ describe CFoundry::AuthToken do
113
112
  end
114
113
 
115
114
  describe "#auth_header=" do
116
- let(:access_token) { Base64.encode64('{"algo": "h1234"}{"user_id": "a6", "email": "a@b.com"}random-bytes') }
117
- let(:other_access_token) { Base64.encode64('{"algo": "h1234"}{"user_id": "b6", "email": "a@b.com"}random-bytes') }
115
+ let(:access_token) { JWT.encode({ user_id: "a6", email: "a@b.com" }, nil, 'none') }
116
+ let(:other_access_token) { JWT.encode({ user_id: "b6", email: "a@b.com"}, nil, 'none') }
118
117
 
119
118
  subject { CFoundry::AuthToken.new("bearer #{access_token}") }
120
119
 
@@ -127,7 +126,7 @@ describe CFoundry::AuthToken do
127
126
  end
128
127
 
129
128
  describe "#expires_soon?" do
130
- let(:access_token) { Base64.encode64(%Q|{"algo": "h1234"}{"exp":#{expiration.to_i}}random-bytes|) }
129
+ let(:access_token) { JWT.encode({ exp: expiration.to_i }, nil, 'none') }
131
130
 
132
131
  subject { CFoundry::AuthToken.new("bearer #{access_token}") }
133
132
 
@@ -40,7 +40,7 @@ module CFoundry
40
40
 
41
41
  context "when there is access_token_data" do
42
42
  let(:token_data) { {:user_id => "123", :email => "guy@example.com"} }
43
- let(:auth_header) { Base64.encode64("{}#{MultiJson.encode(token_data)}") }
43
+ let(:auth_header) { JWT.encode(token_data, nil, false) }
44
44
  let(:token) do
45
45
  CFoundry::AuthToken.new("bearer #{auth_header}", "some-refresh-token")
46
46
  end
@@ -130,6 +130,153 @@ json
130
130
  expect(WebMock).to have_requested(:delete, "http://api.example.com/v2/spaces/#{space2.guid}/developers/#{user.guid}")
131
131
  end
132
132
  end
133
+
134
+ describe "#add_manager_by_username" do
135
+ let(:user) { build(:user) }
136
+ let(:organization) do
137
+ build(:organization, client: client, users: [],
138
+ managers: [], billing_managers: [], auditors: [])
139
+ end
140
+
141
+ let(:status) { 201 }
142
+
143
+ let(:add_manager_org_response) do
144
+ <<-json
145
+ {
146
+ "metadata": {
147
+ "guid": "8d2238e2-2fb3-4ede-b188-1fd3a533c4b4",
148
+ "url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4",
149
+ "created_at": "2015-11-30T23:38:59Z",
150
+ "updated_at": null
151
+ },
152
+ "entity": {
153
+ "name": "name-2523",
154
+ "billing_enabled": false,
155
+ "quota_definition_guid": "0e36ae22-a752-4e37-9dbf-0bac5c1b93c1",
156
+ "status": "active",
157
+ "quota_definition_url": "/v2/quota_definitions/0e36ae22-a752-4e37-9dbf-0bac5c1b93c1",
158
+ "spaces_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/spaces",
159
+ "domains_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/domains",
160
+ "private_domains_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/private_domains",
161
+ "users_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/users",
162
+ "managers_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/managers",
163
+ "billing_managers_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/billing_managers",
164
+ "auditors_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/auditors",
165
+ "app_events_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/app_events",
166
+ "space_quota_definitions_url": "/v2/organizations/8d2238e2-2fb3-4ede-b188-1fd3a533c4b4/space_quota_definitions"
167
+ }
168
+ }
169
+ json
170
+ end
171
+
172
+ before do
173
+ allow(user).to receive(:username).and_return("user_1")
174
+ stub_request(:put, "http://api.example.com/v2/organizations/#{organization.guid}/managers").to_return(status: status, body: add_manager_org_response)
175
+ end
176
+
177
+ it "adds the given user to OrgManager in the org" do
178
+ organization.add_manager_by_username("user_1")
179
+ expect(WebMock).to have_requested(:put, "http://api.example.com/v2/organizations/#{organization.guid}/managers")
180
+ end
181
+ end
182
+
183
+ describe "#add_billing_manager_by_username" do
184
+ let(:user) { build(:user) }
185
+ let(:organization) do
186
+ build(:organization, client: client, users: [],
187
+ managers: [], billing_managers: [], auditors: [])
188
+ end
189
+
190
+ let(:status) { 201 }
191
+
192
+ let(:add_billing_manager_org_response) do
193
+ <<-json
194
+ {
195
+ "metadata": {
196
+ "guid": "c8d4f13c-8880-4859-8e03-fc690efd8f48",
197
+ "url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48",
198
+ "created_at": "2015-11-30T23:38:58Z",
199
+ "updated_at": null
200
+ },
201
+ "entity": {
202
+ "name": "name-2470",
203
+ "billing_enabled": false,
204
+ "quota_definition_guid": "4ad7378e-e90a-4714-b906-a451dd0d5507",
205
+ "status": "active",
206
+ "quota_definition_url": "/v2/quota_definitions/4ad7378e-e90a-4714-b906-a451dd0d5507",
207
+ "spaces_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/spaces",
208
+ "domains_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/domains",
209
+ "private_domains_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/private_domains",
210
+ "users_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/users",
211
+ "managers_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/managers",
212
+ "billing_managers_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/billing_managers",
213
+ "auditors_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/auditors",
214
+ "app_events_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/app_events",
215
+ "space_quota_definitions_url": "/v2/organizations/c8d4f13c-8880-4859-8e03-fc690efd8f48/space_quota_definitions"
216
+ }
217
+ }
218
+ json
219
+ end
220
+
221
+ before do
222
+ allow(user).to receive(:username).and_return("user_1")
223
+ stub_request(:put, "http://api.example.com/v2/organizations/#{organization.guid}/billing_managers").to_return(status: status, body: add_billing_manager_org_response)
224
+ end
225
+
226
+ it "adds the given user to OrgBillingMnager in the org" do
227
+ organization.add_billing_manager_by_username("user_1")
228
+ expect(WebMock).to have_requested(:put, "http://api.example.com/v2/organizations/#{organization.guid}/billing_managers")
229
+ end
230
+ end
231
+
232
+ describe "#add_auditor_by_username" do
233
+ let(:user) { build(:user) }
234
+ let(:organization) do
235
+ build(:organization, client: client, users: [],
236
+ managers: [], billing_managers: [], auditors: [])
237
+ end
238
+
239
+ let(:status) { 201 }
240
+
241
+ let(:add_auditor_org_response) do
242
+ <<-json
243
+ {
244
+ "metadata": {
245
+ "guid": "50dfb04d-cd49-477d-a54c-32e00e180022",
246
+ "url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022",
247
+ "created_at": "2015-11-30T23:38:58Z",
248
+ "updated_at": null
249
+ },
250
+ "entity": {
251
+ "name": "name-2476",
252
+ "billing_enabled": false,
253
+ "quota_definition_guid": "8de0754e-bb1e-4739-be6e-91104bbab281",
254
+ "status": "active",
255
+ "quota_definition_url": "/v2/quota_definitions/8de0754e-bb1e-4739-be6e-91104bbab281",
256
+ "spaces_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/spaces",
257
+ "domains_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/domains",
258
+ "private_domains_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/private_domains",
259
+ "users_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/users",
260
+ "managers_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/managers",
261
+ "billing_managers_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/billing_managers",
262
+ "auditors_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/auditors",
263
+ "app_events_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/app_events",
264
+ "space_quota_definitions_url": "/v2/organizations/50dfb04d-cd49-477d-a54c-32e00e180022/space_quota_definitions"
265
+ }
266
+ }
267
+ json
268
+ end
269
+
270
+ before do
271
+ allow(user).to receive(:username).and_return("user_1")
272
+ stub_request(:put, "http://api.example.com/v2/organizations/#{organization.guid}/auditors").to_return(status: status, body: add_auditor_org_response)
273
+ end
274
+
275
+ it "adds the given user to OrgAuditor in the org" do
276
+ organization.add_auditor_by_username("user_1")
277
+ expect(WebMock).to have_requested(:put, "http://api.example.com/v2/organizations/#{organization.guid}/auditors")
278
+ end
279
+ end
133
280
  end
134
281
  end
135
282
  end
@@ -3,10 +3,147 @@ require "spec_helper"
3
3
  module CFoundry
4
4
  module V2
5
5
  describe Space do
6
+ let(:client) { build(:client) }
7
+ let(:space) { build(:space, :client => client) }
8
+
6
9
  it_behaves_like "a summarizeable model" do
10
+ subject { space }
7
11
  let(:summary_attributes) { {:name => "fizzbuzz"} }
8
- let(:client) { build(:client) }
9
- subject { build(:space, :client => client) }
12
+ end
13
+
14
+ describe "#add_manager_by_username" do
15
+ let(:user) { build(:user) }
16
+ let(:status) { 201 }
17
+
18
+ let(:add_manager_space_response) do
19
+ <<-json
20
+ {
21
+ "metadata": {
22
+ "guid": "4351f97b-3485-4738-821b-5bf77bed44eb",
23
+ "url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb",
24
+ "created_at": "2015-11-30T23:38:28Z",
25
+ "updated_at": null
26
+ },
27
+ "entity": {
28
+ "name": "name-98",
29
+ "organization_guid": "a488910d-2d69-46a2-bf6e-319248e03705",
30
+ "space_quota_definition_guid": null,
31
+ "allow_ssh": true,
32
+ "organization_url": "/v2/organizations/a488910d-2d69-46a2-bf6e-319248e03705",
33
+ "developers_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/developers",
34
+ "managers_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/managers",
35
+ "auditors_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/auditors",
36
+ "apps_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/apps",
37
+ "routes_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/routes",
38
+ "domains_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/domains",
39
+ "service_instances_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/service_instances",
40
+ "app_events_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/app_events",
41
+ "events_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/events",
42
+ "security_groups_url": "/v2/spaces/4351f97b-3485-4738-821b-5bf77bed44eb/security_groups"
43
+ }
44
+ }
45
+ json
46
+ end
47
+
48
+ before do
49
+ allow(user).to receive(:username).and_return("user_1")
50
+ stub_request(:put, "http://api.example.com/v2/spaces/#{space.guid}/managers").to_return(status: status, body: add_manager_space_response)
51
+ end
52
+
53
+ it "adds the given user to SpaceManager in the space" do
54
+ space.add_manager_by_username("user_1")
55
+ expect(WebMock).to have_requested(:put, "http://api.example.com/v2/spaces/#{space.guid}/managers")
56
+ end
57
+ end
58
+
59
+ describe "#add_auditor_by_username" do
60
+ let(:user) { build(:user) }
61
+ let(:status) { 201 }
62
+
63
+ let(:add_auditor_space_response) do
64
+ <<-json
65
+ {
66
+ "metadata": {
67
+ "guid": "873193ee-878c-436f-80bd-10d68927937d",
68
+ "url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d",
69
+ "created_at": "2015-11-30T23:38:28Z",
70
+ "updated_at": null
71
+ },
72
+ "entity": {
73
+ "name": "name-101",
74
+ "organization_guid": "5fddaf61-092d-4b33-9490-8350963db89e",
75
+ "space_quota_definition_guid": null,
76
+ "allow_ssh": true,
77
+ "organization_url": "/v2/organizations/5fddaf61-092d-4b33-9490-8350963db89e",
78
+ "developers_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/developers",
79
+ "managers_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/managers",
80
+ "auditors_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/auditors",
81
+ "apps_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/apps",
82
+ "routes_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/routes",
83
+ "domains_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/domains",
84
+ "service_instances_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/service_instances",
85
+ "app_events_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/app_events",
86
+ "events_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/events",
87
+ "security_groups_url": "/v2/spaces/873193ee-878c-436f-80bd-10d68927937d/security_groups"
88
+ }
89
+ }
90
+ json
91
+ end
92
+
93
+ before do
94
+ allow(user).to receive(:username).and_return("user_1")
95
+ stub_request(:put, "http://api.example.com/v2/spaces/#{space.guid}/auditors").to_return(status: status, body: add_auditor_space_response)
96
+ end
97
+
98
+ it "adds the given user to SpaceAuditor in the space" do
99
+ space.add_auditor_by_username("user_1")
100
+ expect(WebMock).to have_requested(:put, "http://api.example.com/v2/spaces/#{space.guid}/auditors")
101
+ end
102
+ end
103
+
104
+ describe "#add_developer_by_username" do
105
+ let(:user) { build(:user) }
106
+ let(:status) { 201 }
107
+
108
+ let(:add_developer_space_response) do
109
+ <<-json
110
+ {
111
+ "metadata": {
112
+ "guid": "b6d11f17-1cea-4c00-a951-fef3223b8c84",
113
+ "url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84",
114
+ "created_at": "2015-11-30T23:38:27Z",
115
+ "updated_at": null
116
+ },
117
+ "entity": {
118
+ "name": "name-58",
119
+ "organization_guid": "b13bbebe-427e-424d-8820-2937f7e218d5",
120
+ "space_quota_definition_guid": null,
121
+ "allow_ssh": true,
122
+ "organization_url": "/v2/organizations/b13bbebe-427e-424d-8820-2937f7e218d5",
123
+ "developers_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/developers",
124
+ "managers_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/managers",
125
+ "auditors_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/auditors",
126
+ "apps_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/apps",
127
+ "routes_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/routes",
128
+ "domains_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/domains",
129
+ "service_instances_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/service_instances",
130
+ "app_events_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/app_events",
131
+ "events_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/events",
132
+ "security_groups_url": "/v2/spaces/b6d11f17-1cea-4c00-a951-fef3223b8c84/security_groups"
133
+ }
134
+ }
135
+ json
136
+ end
137
+
138
+ before do
139
+ allow(user).to receive(:username).and_return("user_1")
140
+ stub_request(:put, "http://api.example.com/v2/spaces/#{space.guid}/developers").to_return(status: status, body: add_developer_space_response)
141
+ end
142
+
143
+ it "adds the given user to SpaceDeveloper in the space" do
144
+ space.add_developer_by_username("user_1")
145
+ expect(WebMock).to have_requested(:put, "http://api.example.com/v2/spaces/#{space.guid}/developers")
146
+ end
10
147
  end
11
148
  end
12
149
  end