jira-ruby 2.2.0 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/CI.yml +28 -0
- data/.github/workflows/codeql.yml +100 -0
- data/.github/workflows/rubocop.yml +18 -0
- data/.rubocop.yml +188 -0
- data/Gemfile +11 -3
- data/Guardfile +2 -0
- data/README.md +121 -20
- data/Rakefile +4 -5
- data/jira-ruby.gemspec +11 -17
- data/lib/jira/base.rb +37 -28
- data/lib/jira/base_factory.rb +4 -1
- data/lib/jira/client.rb +65 -46
- data/lib/jira/has_many_proxy.rb +4 -2
- data/lib/jira/http_client.rb +18 -13
- data/lib/jira/http_error.rb +4 -0
- data/lib/jira/jwt_client.rb +18 -42
- data/lib/jira/oauth_client.rb +6 -3
- data/lib/jira/railtie.rb +2 -0
- data/lib/jira/request_client.rb +5 -1
- data/lib/jira/resource/agile.rb +7 -9
- data/lib/jira/resource/applinks.rb +5 -3
- data/lib/jira/resource/attachment.rb +43 -3
- data/lib/jira/resource/board.rb +5 -3
- data/lib/jira/resource/board_configuration.rb +2 -0
- data/lib/jira/resource/comment.rb +2 -0
- data/lib/jira/resource/component.rb +2 -0
- data/lib/jira/resource/createmeta.rb +3 -1
- data/lib/jira/resource/field.rb +9 -4
- data/lib/jira/resource/filter.rb +2 -0
- data/lib/jira/resource/issue.rb +35 -44
- data/lib/jira/resource/issue_picker_suggestions.rb +4 -1
- data/lib/jira/resource/issue_picker_suggestions_issue.rb +2 -0
- data/lib/jira/resource/issuelink.rb +2 -0
- data/lib/jira/resource/issuelinktype.rb +2 -0
- data/lib/jira/resource/issuetype.rb +2 -0
- data/lib/jira/resource/priority.rb +2 -0
- data/lib/jira/resource/project.rb +4 -2
- data/lib/jira/resource/rapidview.rb +5 -3
- data/lib/jira/resource/remotelink.rb +2 -0
- data/lib/jira/resource/resolution.rb +2 -0
- data/lib/jira/resource/serverinfo.rb +2 -0
- data/lib/jira/resource/sprint.rb +14 -23
- data/lib/jira/resource/status.rb +7 -1
- data/lib/jira/resource/status_category.rb +10 -0
- data/lib/jira/resource/suggested_issue.rb +2 -0
- data/lib/jira/resource/transition.rb +2 -0
- data/lib/jira/resource/user.rb +3 -1
- data/lib/jira/resource/version.rb +2 -0
- data/lib/jira/resource/watcher.rb +2 -1
- data/lib/jira/resource/webhook.rb +4 -2
- data/lib/jira/resource/worklog.rb +3 -2
- data/lib/jira/version.rb +3 -1
- data/lib/jira-ruby.rb +5 -3
- data/lib/tasks/generate.rake +4 -2
- data/spec/data/files/short.txt +1 -0
- data/spec/integration/attachment_spec.rb +3 -3
- data/spec/integration/comment_spec.rb +8 -8
- data/spec/integration/component_spec.rb +7 -7
- data/spec/integration/field_spec.rb +3 -3
- data/spec/integration/issue_spec.rb +20 -16
- data/spec/integration/issuelinktype_spec.rb +3 -3
- data/spec/integration/issuetype_spec.rb +3 -3
- data/spec/integration/priority_spec.rb +3 -3
- data/spec/integration/project_spec.rb +7 -7
- data/spec/integration/rapidview_spec.rb +9 -9
- data/spec/integration/resolution_spec.rb +3 -3
- data/spec/integration/status_category_spec.rb +20 -0
- data/spec/integration/status_spec.rb +4 -8
- data/spec/integration/transition_spec.rb +2 -2
- data/spec/integration/user_spec.rb +22 -8
- data/spec/integration/version_spec.rb +7 -7
- data/spec/integration/watcher_spec.rb +17 -18
- data/spec/integration/webhook.rb +5 -4
- data/spec/integration/worklog_spec.rb +8 -8
- data/spec/jira/base_factory_spec.rb +2 -1
- data/spec/jira/base_spec.rb +55 -41
- data/spec/jira/client_spec.rb +48 -34
- data/spec/jira/has_many_proxy_spec.rb +3 -3
- data/spec/jira/http_client_spec.rb +98 -26
- data/spec/jira/http_error_spec.rb +2 -2
- data/spec/jira/oauth_client_spec.rb +30 -8
- data/spec/jira/request_client_spec.rb +4 -4
- data/spec/jira/resource/agile_spec.rb +28 -28
- data/spec/jira/resource/attachment_spec.rb +142 -52
- data/spec/jira/resource/board_spec.rb +21 -20
- data/spec/jira/resource/createmeta_spec.rb +48 -48
- data/spec/jira/resource/field_spec.rb +30 -12
- data/spec/jira/resource/filter_spec.rb +4 -4
- data/spec/jira/resource/issue_picker_suggestions_spec.rb +18 -18
- data/spec/jira/resource/issue_spec.rb +44 -38
- data/spec/jira/resource/jira_picker_suggestions_issue_spec.rb +3 -3
- data/spec/jira/resource/project_factory_spec.rb +3 -2
- data/spec/jira/resource/project_spec.rb +16 -16
- data/spec/jira/resource/sprint_spec.rb +70 -3
- data/spec/jira/resource/status_spec.rb +21 -0
- data/spec/jira/resource/user_factory_spec.rb +4 -4
- data/spec/jira/resource/worklog_spec.rb +3 -3
- data/spec/mock_responses/sprint/1.json +13 -0
- data/spec/mock_responses/status/1.json +8 -1
- data/spec/mock_responses/status.json +40 -5
- data/spec/mock_responses/statuscategory/1.json +7 -0
- data/spec/mock_responses/statuscategory.json +30 -0
- data/spec/mock_responses/{user_username=admin.json → user_accountId=1234567890abcdef01234567.json} +2 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/clients_helper.rb +3 -5
- data/spec/support/shared_examples/integration.rb +25 -28
- metadata +25 -257
- data/.travis.yml +0 -9
- data/example.rb +0 -232
- data/http-basic-example.rb +0 -113
- data/lib/jira/resource/sprint_report.rb +0 -8
- data/lib/jira/tasks.rb +0 -0
- data/spec/jira/jwt_uri_builder_spec.rb +0 -59
@@ -5,7 +5,7 @@ describe JIRA::HttpClient do
|
|
5
5
|
options = JIRA::Client::DEFAULT_OPTIONS
|
6
6
|
.merge(JIRA::HttpClient::DEFAULT_OPTIONS)
|
7
7
|
.merge(basic_auth_credentials)
|
8
|
-
|
8
|
+
described_class.new(options)
|
9
9
|
end
|
10
10
|
|
11
11
|
let(:basic_cookie_client) do
|
@@ -13,12 +13,12 @@ describe JIRA::HttpClient do
|
|
13
13
|
.merge(JIRA::HttpClient::DEFAULT_OPTIONS)
|
14
14
|
.merge(use_cookies: true)
|
15
15
|
.merge(basic_auth_credentials)
|
16
|
-
|
16
|
+
described_class.new(options)
|
17
17
|
end
|
18
18
|
|
19
19
|
let(:custom_ssl_version_client) do
|
20
20
|
options = JIRA::Client::DEFAULT_OPTIONS.merge(JIRA::HttpClient::DEFAULT_OPTIONS).merge(ssl_version: :TLSv1_2)
|
21
|
-
|
21
|
+
described_class.new(options)
|
22
22
|
end
|
23
23
|
|
24
24
|
let(:basic_cookie_client_with_context_path) do
|
@@ -26,7 +26,7 @@ describe JIRA::HttpClient do
|
|
26
26
|
use_cookies: true,
|
27
27
|
context_path: '/context'
|
28
28
|
)
|
29
|
-
|
29
|
+
described_class.new(options)
|
30
30
|
end
|
31
31
|
|
32
32
|
let(:basic_cookie_client_with_additional_cookies) do
|
@@ -37,7 +37,7 @@ describe JIRA::HttpClient do
|
|
37
37
|
additional_cookies: ['sessionToken=abc123', 'internal=true']
|
38
38
|
)
|
39
39
|
.merge(basic_auth_credentials)
|
40
|
-
|
40
|
+
described_class.new(options)
|
41
41
|
end
|
42
42
|
|
43
43
|
let(:basic_client_cert_client) do
|
@@ -46,13 +46,13 @@ describe JIRA::HttpClient do
|
|
46
46
|
cert: 'public certificate contents',
|
47
47
|
key: 'private key contents'
|
48
48
|
)
|
49
|
-
|
49
|
+
described_class.new(options)
|
50
50
|
end
|
51
51
|
|
52
52
|
let(:basic_client_with_no_auth_credentials) do
|
53
53
|
options = JIRA::Client::DEFAULT_OPTIONS
|
54
54
|
.merge(JIRA::HttpClient::DEFAULT_OPTIONS)
|
55
|
-
|
55
|
+
described_class.new(options)
|
56
56
|
end
|
57
57
|
|
58
58
|
let(:basic_auth_credentials) do
|
@@ -66,7 +66,14 @@ describe JIRA::HttpClient do
|
|
66
66
|
proxy_username: 'proxyUsername',
|
67
67
|
proxy_password: 'proxyPassword'
|
68
68
|
)
|
69
|
-
|
69
|
+
described_class.new(options)
|
70
|
+
end
|
71
|
+
|
72
|
+
let(:basic_client_with_max_retries) do
|
73
|
+
options = JIRA::Client::DEFAULT_OPTIONS.merge(JIRA::HttpClient::DEFAULT_OPTIONS).merge(
|
74
|
+
max_retries: 2
|
75
|
+
)
|
76
|
+
described_class.new(options)
|
70
77
|
end
|
71
78
|
|
72
79
|
let(:response) do
|
@@ -81,6 +88,35 @@ describe JIRA::HttpClient do
|
|
81
88
|
response
|
82
89
|
end
|
83
90
|
|
91
|
+
context 'simple client' do
|
92
|
+
let(:client) do
|
93
|
+
options_local = JIRA::Client::DEFAULT_OPTIONS.merge(JIRA::HttpClient::DEFAULT_OPTIONS).merge(
|
94
|
+
proxy_address: 'proxyAddress',
|
95
|
+
proxy_port: 42,
|
96
|
+
proxy_username: 'proxyUsername',
|
97
|
+
proxy_password: 'proxyPassword'
|
98
|
+
)
|
99
|
+
described_class.new(options_local)
|
100
|
+
end
|
101
|
+
|
102
|
+
describe 'HttpClient#basic_auth_http_conn' do
|
103
|
+
subject(:http_conn) { basic_client.basic_auth_http_conn }
|
104
|
+
|
105
|
+
it 'creates an instance of Net:HTTP for a basic auth client' do
|
106
|
+
expect(http_conn.class).to eq(Net::HTTP)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'the connection created has no proxy' do
|
110
|
+
http_conn
|
111
|
+
|
112
|
+
expect(http_conn.proxy_address).to be_nil
|
113
|
+
expect(http_conn.proxy_port).to be_nil
|
114
|
+
expect(http_conn.proxy_user).to be_nil
|
115
|
+
expect(http_conn.proxy_pass).to be_nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
84
120
|
it 'creates an instance of Net:HTTP for a basic auth client' do
|
85
121
|
expect(basic_client.basic_auth_http_conn.class).to eq(Net::HTTP)
|
86
122
|
end
|
@@ -111,7 +147,8 @@ describe JIRA::HttpClient do
|
|
111
147
|
basic_auth_http_conn = double
|
112
148
|
request = double
|
113
149
|
allow(basic_client).to receive(:basic_auth_http_conn).and_return(basic_auth_http_conn)
|
114
|
-
expect(request).to receive(:basic_auth).with(basic_client.options[:username],
|
150
|
+
expect(request).to receive(:basic_auth).with(basic_client.options[:username],
|
151
|
+
basic_client.options[:password]).exactly(5).times.and_return(request)
|
115
152
|
expect(basic_auth_http_conn).to receive(:request).exactly(5).times.with(request).and_return(response)
|
116
153
|
%i[delete get head].each do |method|
|
117
154
|
expect(Net::HTTP.const_get(method.to_s.capitalize)).to receive(:new).with('/path', headers).and_return(request)
|
@@ -130,7 +167,8 @@ describe JIRA::HttpClient do
|
|
130
167
|
basic_auth_http_conn = double
|
131
168
|
request = double
|
132
169
|
allow(basic_cookie_client).to receive(:basic_auth_http_conn).and_return(basic_auth_http_conn)
|
133
|
-
expect(request).to receive(:basic_auth).with(basic_cookie_client.options[:username],
|
170
|
+
expect(request).to receive(:basic_auth).with(basic_cookie_client.options[:username],
|
171
|
+
basic_cookie_client.options[:password]).exactly(5).times.and_return(request)
|
134
172
|
expect(cookie_response).to receive(:get_fields).with('set-cookie').exactly(5).times
|
135
173
|
expect(basic_auth_http_conn).to receive(:request).exactly(5).times.with(request).and_return(cookie_response)
|
136
174
|
%i[delete get head].each do |method|
|
@@ -151,7 +189,8 @@ describe JIRA::HttpClient do
|
|
151
189
|
basic_auth_http_conn = double
|
152
190
|
request = double
|
153
191
|
allow(client).to receive(:basic_auth_http_conn).and_return(basic_auth_http_conn)
|
154
|
-
expect(request).to receive(:basic_auth).with(client.options[:username],
|
192
|
+
expect(request).to receive(:basic_auth).with(client.options[:username],
|
193
|
+
client.options[:password]).exactly(5).times.and_return(request)
|
155
194
|
expect(request).to receive(:add_field).with('Cookie', 'sessionToken=abc123; internal=true').exactly(5).times
|
156
195
|
expect(cookie_response).to receive(:get_fields).with('set-cookie').exactly(5).times
|
157
196
|
expect(basic_auth_http_conn).to receive(:request).exactly(5).times.with(request).and_return(cookie_response)
|
@@ -174,7 +213,8 @@ describe JIRA::HttpClient do
|
|
174
213
|
expect(Net::HTTP::Get).to receive(:new).with('/foo', headers).and_return(http_request)
|
175
214
|
|
176
215
|
expect(basic_auth_http_conn).to receive(:request).with(http_request).and_return(response)
|
177
|
-
expect(http_request).to receive(:basic_auth).with(basic_client.options[:username],
|
216
|
+
expect(http_request).to receive(:basic_auth).with(basic_client.options[:username],
|
217
|
+
basic_client.options[:password]).and_return(http_request)
|
178
218
|
allow(basic_client).to receive(:basic_auth_http_conn).and_return(basic_auth_http_conn)
|
179
219
|
basic_client.make_request(:get, '/foo', body, headers)
|
180
220
|
end
|
@@ -187,7 +227,8 @@ describe JIRA::HttpClient do
|
|
187
227
|
expect(Net::HTTP::Get).to receive(:new).with('/foo', headers).and_return(http_request)
|
188
228
|
|
189
229
|
expect(basic_auth_http_conn).to receive(:request).with(http_request).and_return(response)
|
190
|
-
expect(http_request).to receive(:basic_auth).with(basic_client.options[:username],
|
230
|
+
expect(http_request).to receive(:basic_auth).with(basic_client.options[:username],
|
231
|
+
basic_client.options[:password]).and_return(http_request)
|
191
232
|
allow(basic_client).to receive(:basic_auth_http_conn).and_return(basic_auth_http_conn)
|
192
233
|
basic_client.make_request(:get, 'http://mydomain.com/foo', body, headers)
|
193
234
|
end
|
@@ -254,19 +295,29 @@ describe JIRA::HttpClient do
|
|
254
295
|
expect(proxy_configuration.proxy_pass).to be_nil
|
255
296
|
end
|
256
297
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
298
|
+
context 'client has proxy settings' do
|
299
|
+
subject(:proxy_conn) { proxy_client.basic_auth_http_conn }
|
300
|
+
|
301
|
+
let(:proxy_client) do
|
302
|
+
options_local = JIRA::Client::DEFAULT_OPTIONS.merge(JIRA::HttpClient::DEFAULT_OPTIONS).merge(
|
303
|
+
proxy_address: 'proxyAddress',
|
304
|
+
proxy_port: 42,
|
305
|
+
proxy_username: 'proxyUsername',
|
306
|
+
proxy_password: 'proxyPassword'
|
307
|
+
)
|
308
|
+
described_class.new(options_local)
|
309
|
+
end
|
261
310
|
|
262
|
-
|
263
|
-
|
311
|
+
describe 'HttpClient#basic_auth_http_conn' do
|
312
|
+
it 'creates a Net:HTTP instance for a basic auth client setting up a proxied http connection' do
|
313
|
+
expect(proxy_conn.class).to eq(Net::HTTP)
|
264
314
|
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
315
|
+
expect(proxy_conn.proxy_address).to eq(proxy_client.options[:proxy_address])
|
316
|
+
expect(proxy_conn.proxy_port).to eq(proxy_client.options[:proxy_port])
|
317
|
+
expect(proxy_conn.proxy_user).to eq(proxy_client.options[:proxy_username])
|
318
|
+
expect(proxy_conn.proxy_pass).to eq(proxy_client.options[:proxy_password])
|
319
|
+
end
|
320
|
+
end
|
270
321
|
end
|
271
322
|
|
272
323
|
it 'can use client certificates' do
|
@@ -285,6 +336,26 @@ describe JIRA::HttpClient do
|
|
285
336
|
expect(basic_client_cert_client.http_conn(uri)).to eq(http_conn)
|
286
337
|
end
|
287
338
|
|
339
|
+
it 'can use a certificate authority file' do
|
340
|
+
client = described_class.new(JIRA::Client::DEFAULT_OPTIONS.merge(ca_file: '/opt/custom.ca.pem'))
|
341
|
+
expect(client.http_conn(client.uri).ca_file).to eql('/opt/custom.ca.pem')
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'allows overriding max_retries' do
|
345
|
+
http_conn = double
|
346
|
+
uri = double
|
347
|
+
host = double
|
348
|
+
port = double
|
349
|
+
expect(uri).to receive(:host).and_return(host)
|
350
|
+
expect(uri).to receive(:port).and_return(port)
|
351
|
+
expect(Net::HTTP).to receive(:new).with(host, port).and_return(http_conn)
|
352
|
+
expect(http_conn).to receive(:use_ssl=).with(basic_client.options[:use_ssl]).and_return(http_conn)
|
353
|
+
expect(http_conn).to receive(:verify_mode=).with(basic_client.options[:ssl_verify_mode]).and_return(http_conn)
|
354
|
+
expect(http_conn).to receive(:read_timeout=).with(basic_client.options[:read_timeout]).and_return(http_conn)
|
355
|
+
expect(http_conn).to receive(:max_retries=).with(basic_client_with_max_retries.options[:max_retries]).and_return(http_conn)
|
356
|
+
expect(basic_client_with_max_retries.http_conn(uri)).to eq(http_conn)
|
357
|
+
end
|
358
|
+
|
288
359
|
it 'returns a http connection' do
|
289
360
|
http_conn = double
|
290
361
|
uri = double
|
@@ -302,7 +373,7 @@ describe JIRA::HttpClient do
|
|
302
373
|
let(:data) { {} }
|
303
374
|
let(:headers) { { 'X-Atlassian-Token' => 'no-check' } }
|
304
375
|
let(:basic_auth_http_conn) { double }
|
305
|
-
let(:request) { double('Http Request', path:
|
376
|
+
let(:request) { double('Http Request', path:) }
|
306
377
|
let(:response) { double('response') }
|
307
378
|
|
308
379
|
before do
|
@@ -313,7 +384,8 @@ describe JIRA::HttpClient do
|
|
313
384
|
end
|
314
385
|
|
315
386
|
it 'performs a basic http client request' do
|
316
|
-
expect(request).to receive(:basic_auth).with(basic_client.options[:username],
|
387
|
+
expect(request).to receive(:basic_auth).with(basic_client.options[:username],
|
388
|
+
basic_client.options[:password]).and_return(request)
|
317
389
|
|
318
390
|
subject
|
319
391
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe JIRA::HTTPError do
|
4
|
+
subject { described_class.new(response) }
|
5
|
+
|
4
6
|
let(:response) do
|
5
7
|
response = double('response')
|
6
8
|
allow(response).to receive(:code).and_return(401)
|
@@ -8,8 +10,6 @@ describe JIRA::HTTPError do
|
|
8
10
|
response
|
9
11
|
end
|
10
12
|
|
11
|
-
subject { described_class.new(response) }
|
12
|
-
|
13
13
|
it 'takes the response object as an argument' do
|
14
14
|
expect(subject.response).to eq(response)
|
15
15
|
end
|
@@ -4,7 +4,7 @@ describe JIRA::OauthClient do
|
|
4
4
|
let(:oauth_client) do
|
5
5
|
options = { consumer_key: 'foo', consumer_secret: 'bar' }
|
6
6
|
options = JIRA::Client::DEFAULT_OPTIONS.merge(options)
|
7
|
-
|
7
|
+
described_class.new(options)
|
8
8
|
end
|
9
9
|
|
10
10
|
let(:response) do
|
@@ -35,6 +35,26 @@ describe JIRA::OauthClient do
|
|
35
35
|
expect(oauth_client.get_request_token).to eq(request_token)
|
36
36
|
end
|
37
37
|
|
38
|
+
it 'could pre-process the response body in a block' do
|
39
|
+
response = Net::HTTPSuccess.new(1.0, '200', 'OK')
|
40
|
+
allow_any_instance_of(OAuth::Consumer).to receive(:request).and_return(response)
|
41
|
+
allow(response).to receive(:body).and_return('&oauth_token=token&oauth_token_secret=secret&password=top_secret')
|
42
|
+
|
43
|
+
result = oauth_client.request_token do |response_body|
|
44
|
+
CGI.parse(response_body).each_with_object({}) do |(k, v), h|
|
45
|
+
next if k == 'password'
|
46
|
+
|
47
|
+
h[k.strip.to_sym] = v.first
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
expect(result).to be_an_instance_of(OAuth::RequestToken)
|
52
|
+
expect(result.consumer).to eql(oauth_client.consumer)
|
53
|
+
expect(result.params[:oauth_token]).to eql('token')
|
54
|
+
expect(result.params[:oauth_token_secret]).to eql('secret')
|
55
|
+
expect(result.params[:password]).to be_falsey
|
56
|
+
end
|
57
|
+
|
38
58
|
it 'allows setting the request token' do
|
39
59
|
token = double
|
40
60
|
expect(OAuth::RequestToken).to receive(:new).with(oauth_client.consumer, 'foo', 'bar').and_return(token)
|
@@ -58,7 +78,7 @@ describe JIRA::OauthClient do
|
|
58
78
|
request_token = OAuth::RequestToken.new(oauth_client.consumer)
|
59
79
|
allow(oauth_client).to receive(:get_request_token).and_return(request_token)
|
60
80
|
mock_access_token = double
|
61
|
-
expect(request_token).to receive(:get_access_token).with(oauth_verifier: 'abc123').and_return(mock_access_token)
|
81
|
+
expect(request_token).to receive(:get_access_token).with({ oauth_verifier: 'abc123' }).and_return(mock_access_token)
|
62
82
|
oauth_client.init_access_token(oauth_verifier: 'abc123')
|
63
83
|
expect(oauth_client.access_token).to eq(mock_access_token)
|
64
84
|
end
|
@@ -104,7 +124,6 @@ describe JIRA::OauthClient do
|
|
104
124
|
it 'performs a request' do
|
105
125
|
expect(access_token).to receive(:send).with(:get, '/foo', headers).and_return(response)
|
106
126
|
|
107
|
-
|
108
127
|
oauth_client.request(:get, '/foo', body, headers)
|
109
128
|
end
|
110
129
|
|
@@ -116,7 +135,8 @@ describe JIRA::OauthClient do
|
|
116
135
|
|
117
136
|
it 'signs the access_token and performs the request' do
|
118
137
|
expect(access_token).to receive(:sign!).with(an_instance_of(Net::HTTP::Post::Multipart))
|
119
|
-
expect(oauth_client.consumer).to receive_message_chain(:http,
|
138
|
+
expect(oauth_client.consumer).to receive_message_chain(:http,
|
139
|
+
:request).with(an_instance_of(Net::HTTP::Post::Multipart))
|
120
140
|
|
121
141
|
subject
|
122
142
|
end
|
@@ -127,7 +147,7 @@ describe JIRA::OauthClient do
|
|
127
147
|
let(:oauth__2legged_client) do
|
128
148
|
options = { consumer_key: 'foo', consumer_secret: 'bar', auth_type: :oauth_2legged }
|
129
149
|
options = JIRA::Client::DEFAULT_OPTIONS.merge(options)
|
130
|
-
|
150
|
+
described_class.new(options)
|
131
151
|
end
|
132
152
|
|
133
153
|
it 'responds to the http methods adding oauth_token parameter' do
|
@@ -149,14 +169,16 @@ describe JIRA::OauthClient do
|
|
149
169
|
mock_access_token = double
|
150
170
|
allow(oauth__2legged_client).to receive(:access_token).and_return(mock_access_token)
|
151
171
|
%i[delete get head].each do |method|
|
152
|
-
expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=',
|
172
|
+
expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=',
|
173
|
+
headers).and_return(response)
|
153
174
|
oauth__2legged_client.make_request(method, '/path?any_param=toto', '', headers)
|
154
175
|
end
|
155
176
|
%i[post put].each do |method|
|
156
|
-
expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=', '',
|
177
|
+
expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=', '',
|
178
|
+
headers).and_return(response)
|
157
179
|
oauth__2legged_client.make_request(method, '/path?any_param=toto', '', headers)
|
158
180
|
end
|
159
181
|
end
|
160
182
|
end
|
161
183
|
end
|
162
|
-
end
|
184
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe JIRA::RequestClient do
|
4
|
-
let(:request_client) {
|
4
|
+
let(:request_client) { described_class.new }
|
5
5
|
|
6
6
|
describe '#request' do
|
7
7
|
subject(:request) { request_client.request(:get, '/foo', '', {}) }
|
@@ -15,7 +15,7 @@ describe JIRA::RequestClient do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'raises an exception' do
|
18
|
-
expect{ subject }.to raise_exception(JIRA::HTTPError)
|
18
|
+
expect { subject }.to raise_exception(JIRA::HTTPError)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -34,8 +34,8 @@ describe JIRA::RequestClient do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'raises an exception' do
|
37
|
-
expect{ subject }.to raise_exception(JIRA::HTTPError)
|
37
|
+
expect { subject }.to raise_exception(JIRA::HTTPError)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
-
end
|
41
|
+
end
|
@@ -9,34 +9,34 @@ describe JIRA::Resource::Agile do
|
|
9
9
|
let(:response) { double }
|
10
10
|
|
11
11
|
describe '#all' do
|
12
|
-
it '
|
12
|
+
it 'queries url without parameters' do
|
13
13
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board').and_return(response)
|
14
14
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
15
15
|
|
16
|
-
|
16
|
+
described_class.all(client)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
describe '#get_backlog_issues' do
|
21
|
-
it '
|
21
|
+
it 'queries the url without parameters' do
|
22
22
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/backlog?maxResults=100').and_return(response)
|
23
23
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
24
24
|
|
25
|
-
|
25
|
+
described_class.get_backlog_issues(client, 1)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
29
|
describe '#get_board_issues' do
|
30
|
-
it '
|
30
|
+
it 'queries correct url without parameters' do
|
31
31
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/issue?').and_return(response)
|
32
32
|
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
33
33
|
|
34
34
|
expect(client).to receive(:get).with('/jira/rest/api/2/search?jql=id+IN%2810546%2C+10547%2C+10556%2C+10557%2C+10558%2C+10559%2C+10600%2C+10601%2C+10604%29').and_return(response)
|
35
35
|
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
36
36
|
|
37
|
-
issues =
|
37
|
+
issues = described_class.get_board_issues(client, 1)
|
38
38
|
expect(issues).to be_an(Array)
|
39
|
-
expect(issues.size).to
|
39
|
+
expect(issues.size).to be(9)
|
40
40
|
|
41
41
|
issues.each do |issue|
|
42
42
|
expect(issue.class).to eq(JIRA::Resource::Issue)
|
@@ -44,16 +44,16 @@ describe JIRA::Resource::Agile do
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
it '
|
47
|
+
it 'queries correct url with parameters' do
|
48
48
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/issue?startAt=50').and_return(response)
|
49
49
|
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
50
50
|
|
51
51
|
expect(client).to receive(:get).with('/jira/rest/api/2/search?jql=id+IN%2810546%2C+10547%2C+10556%2C+10557%2C+10558%2C+10559%2C+10600%2C+10601%2C+10604%29').and_return(response)
|
52
52
|
expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
|
53
53
|
|
54
|
-
issues =
|
54
|
+
issues = described_class.get_board_issues(client, 1, startAt: 50)
|
55
55
|
expect(issues).to be_an(Array)
|
56
|
-
expect(issues.size).to
|
56
|
+
expect(issues.size).to be(9)
|
57
57
|
|
58
58
|
issues.each do |issue|
|
59
59
|
expect(issue.class).to eq(JIRA::Resource::Issue)
|
@@ -63,73 +63,73 @@ describe JIRA::Resource::Agile do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
describe '#get_sprints' do
|
66
|
-
it '
|
66
|
+
it 'queries correct url without parameters' do
|
67
67
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=100').and_return(response)
|
68
68
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
69
69
|
|
70
|
-
|
70
|
+
described_class.get_sprints(client, 1)
|
71
71
|
end
|
72
72
|
|
73
|
-
it '
|
73
|
+
it 'queries correct url with parameters' do
|
74
74
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?startAt=50&maxResults=100').and_return(response)
|
75
75
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
76
76
|
|
77
|
-
|
77
|
+
described_class.get_sprints(client, 1, startAt: 50)
|
78
78
|
end
|
79
79
|
|
80
|
-
it '
|
80
|
+
it 'works with pagination starting at 0' do
|
81
81
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=0').and_return(response)
|
82
82
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
83
83
|
|
84
|
-
|
84
|
+
described_class.get_sprints(client, 1, maxResults: 1, startAt: 0)
|
85
85
|
end
|
86
86
|
|
87
|
-
it '
|
87
|
+
it 'works with pagination not starting at 0' do
|
88
88
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=1').and_return(response)
|
89
89
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
90
90
|
|
91
|
-
|
91
|
+
described_class.get_sprints(client, 1, maxResults: 1, startAt: 1)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
95
95
|
describe '#get_sprint_issues' do
|
96
|
-
it '
|
96
|
+
it 'queries correct url without parameters' do
|
97
97
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/sprint/1/issue?maxResults=100').and_return(response)
|
98
98
|
expect(response).to receive(:body).and_return(get_mock_response('sprint/1_issues.json'))
|
99
99
|
|
100
|
-
|
100
|
+
described_class.get_sprint_issues(client, 1)
|
101
101
|
end
|
102
102
|
|
103
|
-
it '
|
103
|
+
it 'queries correct url with parameters' do
|
104
104
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/sprint/1/issue?startAt=50&maxResults=100').and_return(response)
|
105
105
|
expect(response).to receive(:body).and_return(get_mock_response('sprint/1_issues.json'))
|
106
106
|
|
107
|
-
|
107
|
+
described_class.get_sprint_issues(client, 1, startAt: 50)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
111
111
|
describe '#get_projects_full' do
|
112
|
-
it '
|
112
|
+
it 'queries correct url without parameters' do
|
113
113
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/project/full').and_return(response)
|
114
114
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
115
115
|
|
116
|
-
|
116
|
+
described_class.get_projects_full(client, 1)
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
120
|
describe '#get_projects' do
|
121
|
-
it '
|
121
|
+
it 'queries correct url without parameters' do
|
122
122
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/project?maxResults=100').and_return(response)
|
123
123
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
124
124
|
|
125
|
-
|
125
|
+
described_class.get_projects(client, 1)
|
126
126
|
end
|
127
127
|
|
128
|
-
it '
|
128
|
+
it 'queries correct url with parameters' do
|
129
129
|
expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/project?startAt=50&maxResults=100').and_return(response)
|
130
130
|
expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
|
131
131
|
|
132
|
-
|
132
|
+
described_class.get_projects(client, 1, startAt: 50)
|
133
133
|
end
|
134
134
|
end
|
135
135
|
end
|