ibm_cloud_sdk_core 1.0.0 → 1.1.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 +4 -4
- data/README.md +2 -2
- data/lib/ibm_cloud_sdk_core/api_exception.rb +2 -2
- data/lib/ibm_cloud_sdk_core/authenticators/no_auth_authenticator.rb +1 -1
- data/lib/ibm_cloud_sdk_core/base_service.rb +11 -9
- data/lib/ibm_cloud_sdk_core/utils.rb +22 -5
- data/lib/ibm_cloud_sdk_core/version.rb +1 -1
- data/test/unit/test_base_service.rb +157 -9
- data/test/unit/test_cp4d_authenticator.rb +2 -2
- data/test/unit/test_iam_authenticator.rb +4 -4
- data/test/unit/test_jwt_token_manager.rb +1 -1
- data/test/unit/test_utils.rb +116 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c9b7ef0229991386edba6b798b8dfbe46863a789cf3e224e4a4dd1a3a0c77b9
|
4
|
+
data.tar.gz: 78f9a4edfe95f69a19ecf88a7c914f34beb7d8f6776ee6fec87464fcd03c889b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3496ff88377fcf4bf3efea81161642ba457d09c8c755da289afdae16597cfbb8d1f6e488fa259b3152c2cceb48329e1dc058dddf9ebd4d5f00d6e6f4cfd0072
|
7
|
+
data.tar.gz: fd308b61b2aa884f3110d125733024306ef06b15c416b4d12730a700a6ab17ffac79c459b076655e407ca11f4b7ef7cc7c59f9a45c53fa7cf35cf124130223b4
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
[](https://travis-ci.com/IBM/ruby-sdk-core)
|
2
|
+
[](https://codecov.io/gh/IBM/ruby-sdk-core)
|
3
3
|
[](https://rubygems.org/gems/ibm_cloud_sdk_core)
|
4
4
|
|
5
5
|
# ruby-sdk-core
|
@@ -26,8 +26,8 @@ module IBMCloudSdkCore
|
|
26
26
|
@info = info
|
27
27
|
# :nocov:
|
28
28
|
end
|
29
|
-
@transaction_id = transaction_id
|
30
|
-
@global_transaction_id = global_transaction_id
|
29
|
+
@transaction_id = transaction_id || response.headers["X-Dp-Watson-Tran-Id"]
|
30
|
+
@global_transaction_id = global_transaction_id || response.headers["X-Global-Transaction-Id"]
|
31
31
|
end
|
32
32
|
|
33
33
|
def to_s
|
@@ -39,16 +39,11 @@ module IBMCloudSdkCore
|
|
39
39
|
|
40
40
|
raise ArgumentError.new("authenticator must be provided") if @authenticator.nil?
|
41
41
|
|
42
|
-
if @service_name && !@service_url
|
43
|
-
config = get_service_properties(@service_name)
|
44
|
-
@service_url = config[:url] unless config.nil?
|
45
|
-
end
|
46
|
-
|
47
|
-
configure_http_client(disable_ssl_verification: @disable_ssl_verification)
|
48
|
-
@temp_headers = {}
|
49
42
|
@conn = HTTP::Client.new(
|
50
43
|
headers: {}
|
51
44
|
).use normalize_uri: { normalizer: NORMALIZER }
|
45
|
+
configure_service(@service_name)
|
46
|
+
@temp_headers = {}
|
52
47
|
end
|
53
48
|
|
54
49
|
def disable_ssl_verification=(disable_ssl_verification)
|
@@ -61,6 +56,15 @@ module IBMCloudSdkCore
|
|
61
56
|
headers.each_pair { |k, v| @conn.default_options.headers.add(k, v) }
|
62
57
|
end
|
63
58
|
|
59
|
+
def configure_service(service_name)
|
60
|
+
config = get_service_properties(service_name) if service_name
|
61
|
+
|
62
|
+
@service_url = config[:url] unless config.nil? || config[:url].nil?
|
63
|
+
disable_ssl_verification = explicitly_true(config[:disable_ssl]) unless config.nil? || config[:disable_ssl].nil?
|
64
|
+
# configure the http client if ssl is disabled
|
65
|
+
configure_http_client(disable_ssl_verification: disable_ssl_verification) if disable_ssl_verification
|
66
|
+
end
|
67
|
+
|
64
68
|
# @return [DetailedResponse]
|
65
69
|
def request(args)
|
66
70
|
defaults = { method: nil, url: nil, accept_json: false, headers: nil, params: nil, json: {}, data: nil }
|
@@ -143,8 +147,6 @@ module IBMCloudSdkCore
|
|
143
147
|
ssl_context = OpenSSL::SSL::SSLContext.new
|
144
148
|
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
145
149
|
@conn.default_options = { ssl_context: ssl_context }
|
146
|
-
|
147
|
-
@token_manager&.ssl_verification(true)
|
148
150
|
end
|
149
151
|
add_proxy(proxy) unless proxy.empty? || !proxy.dig(:address).is_a?(String) || !proxy.dig(:port).is_a?(Integer)
|
150
152
|
add_timeout(timeout) unless timeout.empty? || (!timeout.key?(:per_operation) && !timeout.key?(:global))
|
@@ -16,6 +16,13 @@ def check_bad_first_or_last_char(str)
|
|
16
16
|
return str.start_with?("{", "\"") || str.end_with?("}", "\"") unless str.nil?
|
17
17
|
end
|
18
18
|
|
19
|
+
# checks if the provided value is truthy
|
20
|
+
def explicitly_true(value)
|
21
|
+
return value.to_s.casecmp("true").zero? unless value.nil?
|
22
|
+
|
23
|
+
false
|
24
|
+
end
|
25
|
+
|
19
26
|
# Initiates the credentials based on the credential file
|
20
27
|
def load_from_credential_file(service_name, separator = "=")
|
21
28
|
credential_file_path = ENV["IBM_CREDENTIALS_FILE"]
|
@@ -37,8 +44,8 @@ def load_from_credential_file(service_name, separator = "=")
|
|
37
44
|
file_contents = File.open(credential_file_path, "r")
|
38
45
|
config = {}
|
39
46
|
file_contents.each_line do |line|
|
40
|
-
key_val = line.strip.split(separator)
|
41
|
-
|
47
|
+
key_val = line.strip.split(separator, 2)
|
48
|
+
if key_val.length == 2 && !line.start_with?("#")
|
42
49
|
key = parse_key(key_val[0].downcase, service_name) unless key_val[0].nil?
|
43
50
|
config.store(key.to_sym, key_val[1]) unless key.nil?
|
44
51
|
end
|
@@ -63,10 +70,20 @@ def load_from_vcap_services(service_name)
|
|
63
70
|
vcap_services = ENV["VCAP_SERVICES"]
|
64
71
|
unless vcap_services.nil?
|
65
72
|
services = JSON.parse(vcap_services)
|
73
|
+
credentials = ""
|
74
|
+
# search for matching inner name value
|
75
|
+
services.each do |_key, val|
|
76
|
+
service = val.detect { |item| item["name"] == service_name }
|
77
|
+
credentials = service["credentials"] unless service.nil?
|
78
|
+
break unless credentials.nil? || credentials.empty?
|
79
|
+
end
|
66
80
|
config = {}
|
67
|
-
|
68
|
-
|
69
|
-
|
81
|
+
# if no matching inner key is found, then search outer keys
|
82
|
+
if credentials.nil? || credentials.empty?
|
83
|
+
credentials = services[service_name][0]["credentials"] if services.key?(service_name) && !services[service_name].empty?
|
84
|
+
return config if credentials.nil? || credentials.empty?
|
85
|
+
end
|
86
|
+
# store credentials
|
70
87
|
credentials.each do |key, val|
|
71
88
|
config.store(key.to_sym, val)
|
72
89
|
end
|
@@ -26,6 +26,7 @@ class BaseServiceTest < Minitest::Test
|
|
26
26
|
assert_raises do
|
27
27
|
IBMCloudSdkCore::ConfigBasedAuthenticatorFactory.new.get_authenticator(service_name: "wrong")
|
28
28
|
end
|
29
|
+
ENV.delete("IBM_CREDENTIALS_FILE")
|
29
30
|
end
|
30
31
|
|
31
32
|
def test_wrong_url
|
@@ -82,6 +83,47 @@ class BaseServiceTest < Minitest::Test
|
|
82
83
|
ENV.delete("IBM_CREDENTIALS_FILE")
|
83
84
|
end
|
84
85
|
|
86
|
+
def test_set_credentials_from_path_invalid_auth_type_value
|
87
|
+
token_layout = {
|
88
|
+
"username": "dummy",
|
89
|
+
"role": "Admin",
|
90
|
+
"permissions": %w[administrator manage_catalog],
|
91
|
+
"sub": "admin",
|
92
|
+
"iss": "sss",
|
93
|
+
"aud": "sss",
|
94
|
+
"uid": "sss",
|
95
|
+
"iat": Time.now.to_i + 3600,
|
96
|
+
"exp": Time.now.to_i
|
97
|
+
}
|
98
|
+
token = JWT.encode token_layout, "secret", "HS256"
|
99
|
+
response = {
|
100
|
+
"access_token" => token,
|
101
|
+
"token_type" => "Bearer",
|
102
|
+
"expires_in" => 3600,
|
103
|
+
"expiration" => 1_524_167_011,
|
104
|
+
"refresh_token" => "jy4gl91BQ"
|
105
|
+
}
|
106
|
+
stub_request(:post, "https://iam.cloud.ibm.com/identity/token")
|
107
|
+
.with(
|
108
|
+
body: {
|
109
|
+
"apikey" => "sadio",
|
110
|
+
"grant_type" => "urn:ibm:params:oauth:grant-type:apikey",
|
111
|
+
"response_type" => "cloud_iam"
|
112
|
+
},
|
113
|
+
headers: {
|
114
|
+
"Connection" => "close",
|
115
|
+
"Host" => "iam.cloud.ibm.com",
|
116
|
+
"User-Agent" => "http.rb/4.4.1"
|
117
|
+
}
|
118
|
+
)
|
119
|
+
.to_return(status: 200, body: response.to_json, headers: {})
|
120
|
+
file_path = File.join(File.dirname(__FILE__), "../../resources/ibm-credentials.env")
|
121
|
+
ENV["IBM_CREDENTIALS_FILE"] = file_path
|
122
|
+
authenticator = IBMCloudSdkCore::ConfigBasedAuthenticatorFactory.new.get_authenticator(service_name: "mane")
|
123
|
+
assert_equal(authenticator.authentication_type, "iam")
|
124
|
+
ENV.delete("IBM_CREDENTIALS_FILE")
|
125
|
+
end
|
126
|
+
|
85
127
|
def test_set_credentials_from_path_in_env_bearer_token
|
86
128
|
file_path = File.join(File.dirname(__FILE__), "../../resources/ibm-credentials.env")
|
87
129
|
ENV["IBM_CREDENTIALS_FILE"] = file_path
|
@@ -89,6 +131,7 @@ class BaseServiceTest < Minitest::Test
|
|
89
131
|
service = IBMCloudSdkCore::BaseService.new(service_name: "leo_messi", url: "some.url", authenticator: authenticator)
|
90
132
|
assert_equal(authenticator.authentication_type, "bearerToken")
|
91
133
|
refute_nil(service)
|
134
|
+
ENV.delete("IBM_CREDENTIALS_FILE")
|
92
135
|
end
|
93
136
|
|
94
137
|
def test_vcap_services
|
@@ -97,6 +140,7 @@ class BaseServiceTest < Minitest::Test
|
|
97
140
|
service = IBMCloudSdkCore::BaseService.new(service_name: "salah", authenticator: authenticator)
|
98
141
|
assert_equal(authenticator.username, "mo")
|
99
142
|
assert_equal(service.service_name, "salah")
|
143
|
+
ENV.delete("VCAP_SERVICES")
|
100
144
|
end
|
101
145
|
|
102
146
|
def test_dummy_request
|
@@ -108,24 +152,26 @@ class BaseServiceTest < Minitest::Test
|
|
108
152
|
}
|
109
153
|
).to_return(status: 200, body: "", headers: {})
|
110
154
|
authenticator = IBMCloudSdkCore::ConfigBasedAuthenticatorFactory.new.get_authenticator(service_name: "salah")
|
111
|
-
service = IBMCloudSdkCore::BaseService.new(service_name: "salah", authenticator: authenticator
|
155
|
+
service = IBMCloudSdkCore::BaseService.new(service_name: "salah", authenticator: authenticator)
|
156
|
+
service.service_url = "https://we.the.best"
|
112
157
|
service_response = service.request(method: "GET", url: "/music", headers: {})
|
113
158
|
assert_equal("", service_response.result)
|
159
|
+
ENV.delete("VCAP_SERVICES")
|
114
160
|
end
|
115
161
|
|
116
162
|
def test_dummy_request_form_data
|
117
163
|
authenticator = IBMCloudSdkCore::BearerTokenAuthenticator.new(bearer_token: "token")
|
118
164
|
service = IBMCloudSdkCore::BaseService.new(
|
119
165
|
service_name: "assistant",
|
120
|
-
authenticator: authenticator
|
121
|
-
service_url: "https://gateway.watsonplatform.net/"
|
166
|
+
authenticator: authenticator
|
122
167
|
)
|
168
|
+
service.service_url = "https://gateway.watsonplatform.net/assistant/api/"
|
123
169
|
form_data = {}
|
124
170
|
file = File.open(Dir.getwd + "/resources/cnc_test.pdf")
|
125
171
|
filename = file.path if filename.nil? && file.respond_to?(:path)
|
126
172
|
form_data[:file] = HTTP::FormData::File.new(file, content_type: "application/octet-stream", filename: filename)
|
127
173
|
|
128
|
-
stub_request(:post, "https://gateway.watsonplatform.net/").with do |req|
|
174
|
+
stub_request(:post, "https://gateway.watsonplatform.net/assistant/api/dummy/endpoint").with do |req|
|
129
175
|
# Test the headers.
|
130
176
|
assert_equal(req.headers["Accept"], "application/json")
|
131
177
|
assert_match(%r{\Amultipart/form-data}, req.headers["Content-Type"])
|
@@ -134,7 +180,7 @@ class BaseServiceTest < Minitest::Test
|
|
134
180
|
method: "POST",
|
135
181
|
form: form_data,
|
136
182
|
headers: { "Accept" => "application/json" },
|
137
|
-
url: ""
|
183
|
+
url: "dummy/endpoint"
|
138
184
|
)
|
139
185
|
end
|
140
186
|
|
@@ -151,10 +197,12 @@ class BaseServiceTest < Minitest::Test
|
|
151
197
|
}
|
152
198
|
).to_return(status: 500, body: response.to_json, headers: {})
|
153
199
|
authenticator = IBMCloudSdkCore::ConfigBasedAuthenticatorFactory.new.get_authenticator(service_name: "salah")
|
154
|
-
service = IBMCloudSdkCore::BaseService.new(service_name: "salah", authenticator: authenticator
|
200
|
+
service = IBMCloudSdkCore::BaseService.new(service_name: "salah", authenticator: authenticator)
|
201
|
+
service.service_url = "https://we.the.best"
|
155
202
|
assert_raises IBMCloudSdkCore::ApiException do
|
156
203
|
service.request(method: "GET", url: "/music", headers: {})
|
157
204
|
end
|
205
|
+
ENV.delete("VCAP_SERVICES")
|
158
206
|
end
|
159
207
|
|
160
208
|
def test_dummy_request_icp
|
@@ -169,7 +217,8 @@ class BaseServiceTest < Minitest::Test
|
|
169
217
|
stub_request(:get, "https://we.the.best/music")
|
170
218
|
.with(
|
171
219
|
headers: {
|
172
|
-
"Host" => "we.the.best"
|
220
|
+
"Host" => "we.the.best",
|
221
|
+
"Authorization" => "Basic YXBpa2V5OmljcC14eXo="
|
173
222
|
}
|
174
223
|
).to_return(status: 200, body: response.to_json, headers: headers)
|
175
224
|
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
@@ -178,10 +227,109 @@ class BaseServiceTest < Minitest::Test
|
|
178
227
|
)
|
179
228
|
service = IBMCloudSdkCore::BaseService.new(
|
180
229
|
service_name: "assistant",
|
181
|
-
authenticator: authenticator
|
182
|
-
service_url: "https://we.the.best"
|
230
|
+
authenticator: authenticator
|
183
231
|
)
|
232
|
+
service.service_url = "https://we.the.best"
|
184
233
|
service_response = service.request(method: "GET", url: "/music", headers: {})
|
185
234
|
assert_equal(response, service_response.result)
|
186
235
|
end
|
236
|
+
|
237
|
+
def test_configure_service_using_credentials_in_env
|
238
|
+
file_path = File.join(File.dirname(__FILE__), "../../resources/ibm-credentials.env")
|
239
|
+
ENV["IBM_CREDENTIALS_FILE"] = file_path
|
240
|
+
|
241
|
+
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
242
|
+
username: "apikey",
|
243
|
+
password: "icp-xyz"
|
244
|
+
)
|
245
|
+
service = IBMCloudSdkCore::BaseService.new(
|
246
|
+
authenticator: authenticator,
|
247
|
+
service_name: "visual_recognition"
|
248
|
+
)
|
249
|
+
service.configure_service("visual_recognition")
|
250
|
+
|
251
|
+
assert_equal("https://gateway.ronaldo.com", service.service_url)
|
252
|
+
assert(service.disable_ssl_verification)
|
253
|
+
ENV.delete("IBM_CREDENTIALS_FILE")
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_configure_service_using_credentials_in_vcap_match_outer_key
|
257
|
+
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
258
|
+
username: "apikey",
|
259
|
+
password: "icp-xyz"
|
260
|
+
)
|
261
|
+
service = IBMCloudSdkCore::BaseService.new(
|
262
|
+
authenticator: authenticator,
|
263
|
+
service_name: "key_to_service_entry_1"
|
264
|
+
)
|
265
|
+
ENV["VCAP_SERVICES"] = JSON.parse(File.read(Dir.getwd + "/resources/vcap-testing.json")).to_json
|
266
|
+
service.configure_service("key_to_service_entry_1")
|
267
|
+
|
268
|
+
assert_equal("https://on.the.toolchainplatform.net/devops-insights/api", service.service_url)
|
269
|
+
ENV.delete("VCAP_SERVICES")
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_configure_service_using_credentials_in_vcap_match_inner_key
|
273
|
+
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
274
|
+
username: "apikey",
|
275
|
+
password: "icp-xyz"
|
276
|
+
)
|
277
|
+
service = IBMCloudSdkCore::BaseService.new(
|
278
|
+
authenticator: authenticator,
|
279
|
+
service_name: "devops_insights"
|
280
|
+
)
|
281
|
+
ENV["VCAP_SERVICES"] = JSON.parse(File.read(Dir.getwd + "/resources/vcap-testing.json")).to_json
|
282
|
+
service.configure_service("devops_insights")
|
283
|
+
|
284
|
+
assert_equal("https://ibmtesturl.net/devops_insights/api", service.service_url)
|
285
|
+
ENV.delete("VCAP_SERVICES")
|
286
|
+
end
|
287
|
+
|
288
|
+
def test_configure_service_using_credentials_in_vcap_no_matching_key
|
289
|
+
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
290
|
+
username: "apikey",
|
291
|
+
password: "icp-xyz"
|
292
|
+
)
|
293
|
+
service = IBMCloudSdkCore::BaseService.new(
|
294
|
+
authenticator: authenticator,
|
295
|
+
service_name: "different_name_two"
|
296
|
+
)
|
297
|
+
ENV["VCAP_SERVICES"] = JSON.parse(File.read(Dir.getwd + "/resources/vcap-testing.json")).to_json
|
298
|
+
service.configure_service("different_name_two")
|
299
|
+
|
300
|
+
assert_equal("https://gateway.watsonplatform.net/different-name-two/api", service.service_url)
|
301
|
+
ENV.delete("VCAP_SERVICES")
|
302
|
+
end
|
303
|
+
|
304
|
+
def test_configure_service_using_credentials_in_vcap_empty_entry
|
305
|
+
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
306
|
+
username: "apikey",
|
307
|
+
password: "icp-xyz"
|
308
|
+
)
|
309
|
+
service = IBMCloudSdkCore::BaseService.new(
|
310
|
+
authenticator: authenticator,
|
311
|
+
service_name: "empty_service"
|
312
|
+
)
|
313
|
+
ENV["VCAP_SERVICES"] = JSON.parse(File.read(Dir.getwd + "/resources/vcap-testing.json")).to_json
|
314
|
+
service.configure_service("empty_service")
|
315
|
+
|
316
|
+
assert_nil(service.service_url)
|
317
|
+
ENV.delete("VCAP_SERVICES")
|
318
|
+
end
|
319
|
+
|
320
|
+
def test_configure_service_using_credentials_in_vcap_no_creds
|
321
|
+
authenticator = IBMCloudSdkCore::BasicAuthenticator.new(
|
322
|
+
username: "apikey",
|
323
|
+
password: "icp-xyz"
|
324
|
+
)
|
325
|
+
service = IBMCloudSdkCore::BaseService.new(
|
326
|
+
authenticator: authenticator,
|
327
|
+
service_name: "no-creds-service-two"
|
328
|
+
)
|
329
|
+
ENV["VCAP_SERVICES"] = JSON.parse(File.read(Dir.getwd + "/resources/vcap-testing.json")).to_json
|
330
|
+
service.configure_service("no-creds-service-two")
|
331
|
+
|
332
|
+
assert_nil(service.service_url)
|
333
|
+
ENV.delete("VCAP_SERVICES")
|
334
|
+
end
|
187
335
|
end
|
@@ -37,7 +37,7 @@ class Cp4dAuthenticatorTest < Minitest::Test
|
|
37
37
|
"Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
|
38
38
|
"Connection" => "close",
|
39
39
|
"Host" => "icp.com",
|
40
|
-
"User-Agent" => "http.rb/4.
|
40
|
+
"User-Agent" => "http.rb/4.4.1"
|
41
41
|
}
|
42
42
|
)
|
43
43
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -77,7 +77,7 @@ class Cp4dAuthenticatorTest < Minitest::Test
|
|
77
77
|
"Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
|
78
78
|
"Connection" => "close",
|
79
79
|
"Host" => "icp.com",
|
80
|
-
"User-Agent" => "http.rb/4.
|
80
|
+
"User-Agent" => "http.rb/4.4.1"
|
81
81
|
}
|
82
82
|
)
|
83
83
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -41,7 +41,7 @@ class IamAuthenticatorTest < Minitest::Test
|
|
41
41
|
headers: {
|
42
42
|
"Connection" => "close",
|
43
43
|
"Host" => "iam.cloud.ibm.com",
|
44
|
-
"User-Agent" => "http.rb/4.
|
44
|
+
"User-Agent" => "http.rb/4.4.1"
|
45
45
|
}
|
46
46
|
)
|
47
47
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -83,7 +83,7 @@ class IamAuthenticatorTest < Minitest::Test
|
|
83
83
|
"Connection" => "close",
|
84
84
|
"Authorization" => "Basic Yng6Yng=",
|
85
85
|
"Host" => "iam.cloud.ibm.com",
|
86
|
-
"User-Agent" => "http.rb/4.
|
86
|
+
"User-Agent" => "http.rb/4.4.1"
|
87
87
|
}
|
88
88
|
)
|
89
89
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -126,7 +126,7 @@ class IamAuthenticatorTest < Minitest::Test
|
|
126
126
|
headers: {
|
127
127
|
"Connection" => "close",
|
128
128
|
"Host" => "iam.cloud.ibm.com",
|
129
|
-
"User-Agent" => "http.rb/4.
|
129
|
+
"User-Agent" => "http.rb/4.4.1"
|
130
130
|
}
|
131
131
|
)
|
132
132
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -173,7 +173,7 @@ class IamAuthenticatorTest < Minitest::Test
|
|
173
173
|
headers: {
|
174
174
|
"Connection" => "close",
|
175
175
|
"Host" => "my.link",
|
176
|
-
"User-Agent" => "http.rb/4.
|
176
|
+
"User-Agent" => "http.rb/4.4.1"
|
177
177
|
}
|
178
178
|
)
|
179
179
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -114,7 +114,7 @@ class JWTTokenManagerTest < Minitest::Test
|
|
114
114
|
"Authorization" => "Basic dXNlcm5hbWU6cGFzc3dvcmQ=",
|
115
115
|
"Connection" => "close",
|
116
116
|
"Host" => "icp.com",
|
117
|
-
"User-Agent" => "http.rb/4.
|
117
|
+
"User-Agent" => "http.rb/4.4.1"
|
118
118
|
}
|
119
119
|
)
|
120
120
|
.to_return(status: 200, body: response.to_json, headers: {})
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require("json")
|
4
|
+
require("jwt")
|
5
|
+
require_relative("./../test_helper.rb")
|
6
|
+
require_relative("./../../lib/ibm_cloud_sdk_core/authenticators/basic_authenticator")
|
7
|
+
require_relative("./../../lib/ibm_cloud_sdk_core/authenticators/config_based_authenticator_factory")
|
8
|
+
require("webmock/minitest")
|
9
|
+
|
10
|
+
WebMock.disable_net_connect!(allow_localhost: true)
|
11
|
+
|
12
|
+
# Unit tests for the utility methods
|
13
|
+
class UtilsTest < Minitest::Test
|
14
|
+
def test_explicitly_true
|
15
|
+
assert(explicitly_true("true"))
|
16
|
+
assert(explicitly_true("True"))
|
17
|
+
assert(explicitly_true(true))
|
18
|
+
|
19
|
+
assert_equal(explicitly_true("false"), false)
|
20
|
+
assert_equal(explicitly_true("False"), false)
|
21
|
+
assert_equal(explicitly_true("someothervalue"), false)
|
22
|
+
assert_equal(explicitly_true(""), false)
|
23
|
+
assert_equal(explicitly_true(false), false)
|
24
|
+
assert_equal(explicitly_true(nil), false)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_get_configuration_credential_file
|
28
|
+
file_path = File.join(File.dirname(__FILE__), "../../resources/ibm-credentials.env")
|
29
|
+
ENV["IBM_CREDENTIALS_FILE"] = file_path
|
30
|
+
# get properties
|
31
|
+
config = get_service_properties("service_1")
|
32
|
+
auth_type = config[:auth_type] unless config.nil?
|
33
|
+
apikey = config[:apikey] unless config.nil?
|
34
|
+
auth_url = config[:auth_url] unless config.nil?
|
35
|
+
client_id = config[:client_id] unless config.nil?
|
36
|
+
client_secret = config[:client_secret] unless config.nil?
|
37
|
+
service_url = config[:url] unless config.nil?
|
38
|
+
|
39
|
+
assert !auth_type.nil?
|
40
|
+
assert !apikey.nil?
|
41
|
+
assert !auth_url.nil?
|
42
|
+
assert !client_id.nil?
|
43
|
+
assert !client_secret.nil?
|
44
|
+
assert !service_url.nil?
|
45
|
+
|
46
|
+
assert_equal("iam", auth_type)
|
47
|
+
assert_equal("V4HXmoUtMjohnsnow=KotN", apikey)
|
48
|
+
assert_equal("https://iamhost/iam/api=", auth_url)
|
49
|
+
assert_equal("somefake========id", client_id)
|
50
|
+
assert_equal("==my-client-secret==", client_secret)
|
51
|
+
assert_equal("service1.com/api", service_url)
|
52
|
+
ENV.delete("IBM_CREDENTIALS_FILE")
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_get_configuration_from_env
|
56
|
+
# Service1 auth properties configured with IAM and a token containing '='
|
57
|
+
ENV["SERVICE_1_AUTH_TYPE"] = "iam"
|
58
|
+
ENV["SERVICE_1_APIKEY"] = "V4HXmoUtMjohnsnow=KotN"
|
59
|
+
ENV["SERVICE_1_CLIENT_ID"] = "somefake========id"
|
60
|
+
ENV["SERVICE_1_CLIENT_SECRET"] = "==my-client-secret=="
|
61
|
+
ENV["SERVICE_1_AUTH_URL"] = "https://iamhost/iam/api="
|
62
|
+
# Service1 service properties
|
63
|
+
ENV["SERVICE_1_URL"] = "service1.com/api"
|
64
|
+
# get properties
|
65
|
+
config = get_service_properties("service_1")
|
66
|
+
auth_type = config[:auth_type] unless config.nil?
|
67
|
+
apikey = config[:apikey] unless config.nil?
|
68
|
+
auth_url = config[:auth_url] unless config.nil?
|
69
|
+
client_id = config[:client_id] unless config.nil?
|
70
|
+
client_secret = config[:client_secret] unless config.nil?
|
71
|
+
service_url = config[:url] unless config.nil?
|
72
|
+
|
73
|
+
assert !auth_type.nil?
|
74
|
+
assert !apikey.nil?
|
75
|
+
assert !auth_url.nil?
|
76
|
+
assert !client_id.nil?
|
77
|
+
assert !client_secret.nil?
|
78
|
+
assert !service_url.nil?
|
79
|
+
|
80
|
+
assert_equal("iam", auth_type)
|
81
|
+
assert_equal("V4HXmoUtMjohnsnow=KotN", apikey)
|
82
|
+
assert_equal("https://iamhost/iam/api=", auth_url)
|
83
|
+
assert_equal("somefake========id", client_id)
|
84
|
+
assert_equal("==my-client-secret==", client_secret)
|
85
|
+
assert_equal("service1.com/api", service_url)
|
86
|
+
|
87
|
+
ENV.delete("SERVICE_1_AUTH_TYPE")
|
88
|
+
ENV.delete("SERVICE_1_APIKEY")
|
89
|
+
ENV.delete("SERVICE_1_CLIENT_ID")
|
90
|
+
ENV.delete("SERVICE_1_CLIENT_SECRET")
|
91
|
+
ENV.delete("SERVICE_1_AUTH_URL")
|
92
|
+
ENV.delete("SERVICE_1_URL")
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_get_configuration_from_vcap
|
96
|
+
ENV["VCAP_SERVICES"] = JSON.parse(File.read(Dir.getwd + "/resources/vcap-testing.json")).to_json
|
97
|
+
# get properties
|
98
|
+
config = get_service_properties("equals-sign-test")
|
99
|
+
auth_type = config[:auth_type] unless config.nil?
|
100
|
+
apikey = config[:apikey] unless config.nil?
|
101
|
+
iam_url = config[:iam_url] unless config.nil?
|
102
|
+
service_url = config[:url] unless config.nil?
|
103
|
+
|
104
|
+
assert !auth_type.nil?
|
105
|
+
assert !apikey.nil?
|
106
|
+
assert !iam_url.nil?
|
107
|
+
assert !service_url.nil?
|
108
|
+
|
109
|
+
assert_equal("iam", auth_type)
|
110
|
+
assert_equal("V4HXmoUtMjohnsnow=KotN", apikey)
|
111
|
+
assert_equal("https://iamhost/iam/api=", iam_url)
|
112
|
+
assert_equal("https://gateway.watsonplatform.net/testService", service_url)
|
113
|
+
|
114
|
+
ENV.delete("VCAP_SERVICES")
|
115
|
+
end
|
116
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibm_cloud_sdk_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mamoon Raja
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 4.
|
33
|
+
version: 4.4.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 4.
|
40
|
+
version: 4.4.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: jwt
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -253,6 +253,7 @@ files:
|
|
253
253
|
- test/unit/test_iam_authenticator.rb
|
254
254
|
- test/unit/test_iam_token_manager.rb
|
255
255
|
- test/unit/test_jwt_token_manager.rb
|
256
|
+
- test/unit/test_utils.rb
|
256
257
|
homepage: https://www.github.com/IBM
|
257
258
|
licenses:
|
258
259
|
- Apache-2.0
|
@@ -275,8 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
275
276
|
- !ruby/object:Gem::Version
|
276
277
|
version: '0'
|
277
278
|
requirements: []
|
278
|
-
|
279
|
-
rubygems_version: 2.7.7
|
279
|
+
rubygems_version: 3.0.8
|
280
280
|
signing_key:
|
281
281
|
specification_version: 4
|
282
282
|
summary: Official IBM Cloud SDK core library
|