jira-ruby 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +7 -1
  3. data/Guardfile +1 -1
  4. data/Rakefile +4 -5
  5. data/http-basic-example.rb +13 -12
  6. data/jira-ruby.gemspec +9 -10
  7. data/lib/jira-ruby.rb +5 -2
  8. data/lib/jira/base.rb +49 -48
  9. data/lib/jira/base_factory.rb +1 -4
  10. data/lib/jira/client.rb +29 -20
  11. data/lib/jira/has_many_proxy.rb +0 -1
  12. data/lib/jira/http_client.rb +9 -10
  13. data/lib/jira/http_error.rb +3 -5
  14. data/lib/jira/oauth_client.rb +19 -20
  15. data/lib/jira/request_client.rb +3 -4
  16. data/lib/jira/resource/agile.rb +10 -8
  17. data/lib/jira/resource/applinks.rb +5 -8
  18. data/lib/jira/resource/attachment.rb +1 -2
  19. data/lib/jira/resource/board.rb +84 -0
  20. data/lib/jira/resource/comment.rb +0 -2
  21. data/lib/jira/resource/component.rb +1 -3
  22. data/lib/jira/resource/createmeta.rb +12 -14
  23. data/lib/jira/resource/field.rb +22 -22
  24. data/lib/jira/resource/filter.rb +2 -2
  25. data/lib/jira/resource/issue.rb +41 -39
  26. data/lib/jira/resource/issuelink.rb +3 -5
  27. data/lib/jira/resource/issuelinktype.rb +0 -1
  28. data/lib/jira/resource/issuetype.rb +1 -3
  29. data/lib/jira/resource/priority.rb +1 -3
  30. data/lib/jira/resource/project.rb +5 -7
  31. data/lib/jira/resource/rapidview.rb +28 -7
  32. data/lib/jira/resource/remotelink.rb +1 -4
  33. data/lib/jira/resource/resolution.rb +2 -4
  34. data/lib/jira/resource/serverinfo.rb +1 -2
  35. data/lib/jira/resource/sprint.rb +82 -18
  36. data/lib/jira/resource/sprint_report.rb +8 -0
  37. data/lib/jira/resource/status.rb +1 -3
  38. data/lib/jira/resource/transition.rb +2 -6
  39. data/lib/jira/resource/user.rb +12 -2
  40. data/lib/jira/resource/version.rb +1 -3
  41. data/lib/jira/resource/watcher.rb +1 -5
  42. data/lib/jira/resource/webhook.rb +3 -6
  43. data/lib/jira/resource/worklog.rb +3 -5
  44. data/lib/jira/version.rb +1 -1
  45. data/lib/tasks/generate.rake +4 -4
  46. data/spec/integration/attachment_spec.rb +15 -16
  47. data/spec/integration/comment_spec.rb +31 -34
  48. data/spec/integration/component_spec.rb +21 -24
  49. data/spec/integration/field_spec.rb +15 -18
  50. data/spec/integration/issue_spec.rb +44 -48
  51. data/spec/integration/issuelinktype_spec.rb +8 -11
  52. data/spec/integration/issuetype_spec.rb +5 -7
  53. data/spec/integration/priority_spec.rb +5 -8
  54. data/spec/integration/project_spec.rb +13 -20
  55. data/spec/integration/rapidview_spec.rb +17 -10
  56. data/spec/integration/resolution_spec.rb +7 -10
  57. data/spec/integration/status_spec.rb +5 -8
  58. data/spec/integration/transition_spec.rb +17 -20
  59. data/spec/integration/user_spec.rb +24 -8
  60. data/spec/integration/version_spec.rb +21 -25
  61. data/spec/integration/watcher_spec.rb +28 -34
  62. data/spec/integration/webhook.rb +8 -17
  63. data/spec/integration/worklog_spec.rb +30 -34
  64. data/spec/jira/base_factory_spec.rb +11 -12
  65. data/spec/jira/base_spec.rb +204 -228
  66. data/spec/jira/client_spec.rb +26 -28
  67. data/spec/jira/has_many_proxy_spec.rb +11 -12
  68. data/spec/jira/http_client_spec.rb +51 -52
  69. data/spec/jira/http_error_spec.rb +7 -9
  70. data/spec/jira/oauth_client_spec.rb +44 -46
  71. data/spec/jira/request_client_spec.rb +5 -5
  72. data/spec/jira/resource/agile_spec.rb +5 -7
  73. data/spec/jira/resource/attachment_spec.rb +25 -26
  74. data/spec/jira/resource/board_spec.rb +175 -0
  75. data/spec/jira/resource/createmeta_spec.rb +29 -32
  76. data/spec/jira/resource/field_spec.rb +42 -48
  77. data/spec/jira/resource/filter_spec.rb +40 -40
  78. data/spec/jira/resource/issue_spec.rb +87 -89
  79. data/spec/jira/resource/issuelink_spec.rb +1 -1
  80. data/spec/jira/resource/project_factory_spec.rb +2 -4
  81. data/spec/jira/resource/project_spec.rb +33 -33
  82. data/spec/jira/resource/sprint_spec.rb +78 -0
  83. data/spec/jira/resource/user_factory_spec.rb +6 -8
  84. data/spec/jira/resource/worklog_spec.rb +9 -11
  85. data/spec/spec_helper.rb +8 -9
  86. data/spec/support/clients_helper.rb +4 -4
  87. data/spec/support/shared_examples/integration.rb +60 -77
  88. metadata +59 -53
@@ -1,43 +1,42 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe JIRA::OauthClient do
4
-
5
4
  let(:oauth_client) do
6
- options = { :consumer_key => 'foo', :consumer_secret => 'bar' }
5
+ options = { consumer_key: 'foo', consumer_secret: 'bar' }
7
6
  options = JIRA::Client::DEFAULT_OPTIONS.merge(options)
8
7
  JIRA::OauthClient.new(options)
9
8
  end
10
9
 
11
10
  let(:response) do
12
- response = double("response")
13
- allow(response).to receive(:kind_of?).with(Net::HTTPSuccess).and_return(true)
11
+ response = double('response')
12
+ allow(response).to receive(:is_a?).with(Net::HTTPSuccess).and_return(true)
14
13
  response
15
14
  end
16
15
 
17
- describe "authenticating with oauth" do
18
- it "prepends the context path to all authorization and rest paths" do
19
- options = [:request_token_path, :authorize_path, :access_token_path]
16
+ describe 'authenticating with oauth' do
17
+ it 'prepends the context path to all authorization and rest paths' do
18
+ options = %i[request_token_path authorize_path access_token_path]
20
19
  defaults = JIRA::Client::DEFAULT_OPTIONS.merge(JIRA::OauthClient::DEFAULT_OPTIONS)
21
20
  options.each do |key|
22
21
  expect(oauth_client.options[key]).to eq(defaults[:context_path] + defaults[key])
23
22
  end
24
23
  end
25
24
 
26
- it "creates a Oauth::Consumer on initialize" do
25
+ it 'creates a Oauth::Consumer on initialize' do
27
26
  expect(oauth_client.consumer.class).to eq(OAuth::Consumer)
28
27
  expect(oauth_client.consumer.key).to eq(oauth_client.key)
29
28
  expect(oauth_client.consumer.secret).to eq(oauth_client.secret)
30
29
  end
31
30
 
32
- it "returns an OAuth request_token" do
31
+ it 'returns an OAuth request_token' do
33
32
  # Cannot just check for method delegation as http connection will be attempted
34
33
  request_token = OAuth::RequestToken.new(oauth_client.consumer)
35
34
  allow(oauth_client).to receive(:get_request_token).and_return(request_token)
36
35
  expect(oauth_client.get_request_token).to eq(request_token)
37
36
  end
38
37
 
39
- it "allows setting the request token" do
40
- token = double()
38
+ it 'allows setting the request token' do
39
+ token = double
41
40
  expect(OAuth::RequestToken).to receive(:new).with(oauth_client.consumer, 'foo', 'bar').and_return(token)
42
41
 
43
42
  request_token = oauth_client.set_request_token('foo', 'bar')
@@ -46,34 +45,33 @@ describe JIRA::OauthClient do
46
45
  expect(oauth_client.request_token).to eq(token)
47
46
  end
48
47
 
49
- it "allows setting the consumer key" do
48
+ it 'allows setting the consumer key' do
50
49
  expect(oauth_client.key).to eq('foo')
51
50
  end
52
51
 
53
- it "allows setting the consumer secret" do
52
+ it 'allows setting the consumer secret' do
54
53
  expect(oauth_client.secret).to eq('bar')
55
54
  end
56
55
 
57
- describe "the access token" do
58
-
59
- it "initializes" do
56
+ describe 'the access token' do
57
+ it 'initializes' do
60
58
  request_token = OAuth::RequestToken.new(oauth_client.consumer)
61
59
  allow(oauth_client).to receive(:get_request_token).and_return(request_token)
62
- mock_access_token = double()
63
- expect(request_token).to receive(:get_access_token).with(:oauth_verifier => 'abc123').and_return(mock_access_token)
64
- oauth_client.init_access_token(:oauth_verifier => 'abc123')
60
+ mock_access_token = double
61
+ expect(request_token).to receive(:get_access_token).with(oauth_verifier: 'abc123').and_return(mock_access_token)
62
+ oauth_client.init_access_token(oauth_verifier: 'abc123')
65
63
  expect(oauth_client.access_token).to eq(mock_access_token)
66
64
  end
67
65
 
68
- it "raises an exception when accessing without initialisation" do
69
- expect {
66
+ it 'raises an exception when accessing without initialisation' do
67
+ expect do
70
68
  oauth_client.access_token
71
- }.to raise_exception(JIRA::OauthClient::UninitializedAccessTokenError,
72
- "init_access_token must be called before using the client")
69
+ end.to raise_exception(JIRA::OauthClient::UninitializedAccessTokenError,
70
+ 'init_access_token must be called before using the client')
73
71
  end
74
72
 
75
- it "allows setting the access token" do
76
- token = double()
73
+ it 'allows setting the access token' do
74
+ token = double
77
75
  expect(OAuth::AccessToken).to receive(:new).with(oauth_client.consumer, 'foo', 'bar').and_return(token)
78
76
 
79
77
  access_token = oauth_client.set_access_token('foo', 'bar')
@@ -83,61 +81,61 @@ describe JIRA::OauthClient do
83
81
  end
84
82
  end
85
83
 
86
- describe "http" do
87
- it "responds to the http methods" do
88
- headers = double()
89
- mock_access_token = double()
84
+ describe 'http' do
85
+ it 'responds to the http methods' do
86
+ headers = double
87
+ mock_access_token = double
90
88
  allow(oauth_client).to receive(:access_token).and_return(mock_access_token)
91
- [:delete, :get, :head].each do |method|
89
+ %i[delete get head].each do |method|
92
90
  expect(mock_access_token).to receive(method).with('/path', headers).and_return(response)
93
91
  oauth_client.make_request(method, '/path', '', headers)
94
92
  end
95
- [:post, :put].each do |method|
93
+ %i[post put].each do |method|
96
94
  expect(mock_access_token).to receive(method).with('/path', '', headers).and_return(response)
97
95
  oauth_client.make_request(method, '/path', '', headers)
98
96
  end
99
97
  end
100
98
 
101
- it "performs a request" do
99
+ it 'performs a request' do
102
100
  body = nil
103
- headers = double()
104
- access_token = double()
101
+ headers = double
102
+ access_token = double
105
103
  expect(access_token).to receive(:send).with(:get, '/foo', headers).and_return(response)
106
104
  allow(oauth_client).to receive(:access_token).and_return(access_token)
107
105
  oauth_client.request(:get, '/foo', body, headers)
108
106
  end
109
107
  end
110
108
 
111
- describe "auth type is oauth_2legged" do
109
+ describe 'auth type is oauth_2legged' do
112
110
  let(:oauth__2legged_client) do
113
- options = { :consumer_key => 'foo', :consumer_secret => 'bar', :auth_type => :oauth_2legged }
111
+ options = { consumer_key: 'foo', consumer_secret: 'bar', auth_type: :oauth_2legged }
114
112
  options = JIRA::Client::DEFAULT_OPTIONS.merge(options)
115
113
  JIRA::OauthClient.new(options)
116
114
  end
117
115
 
118
- it "responds to the http methods adding oauth_token parameter" do
119
- headers = double()
120
- mock_access_token = double()
116
+ it 'responds to the http methods adding oauth_token parameter' do
117
+ headers = double
118
+ mock_access_token = double
121
119
  allow(oauth__2legged_client).to receive(:access_token).and_return(mock_access_token)
122
- [:delete, :get, :head].each do |method|
120
+ %i[delete get head].each do |method|
123
121
  expect(mock_access_token).to receive(method).with('/path?oauth_token=', headers).and_return(response)
124
122
  oauth__2legged_client.make_request(method, '/path', '', headers)
125
123
  end
126
- [:post, :put].each do |method|
124
+ %i[post put].each do |method|
127
125
  expect(mock_access_token).to receive(method).with('/path?oauth_token=', '', headers).and_return(response)
128
126
  oauth__2legged_client.make_request(method, '/path', '', headers)
129
127
  end
130
128
  end
131
129
 
132
- it "responds to the http methods adding oauth_token parameter to any existing parameters" do
133
- headers = double()
134
- mock_access_token = double()
130
+ it 'responds to the http methods adding oauth_token parameter to any existing parameters' do
131
+ headers = double
132
+ mock_access_token = double
135
133
  allow(oauth__2legged_client).to receive(:access_token).and_return(mock_access_token)
136
- [:delete, :get, :head].each do |method|
134
+ %i[delete get head].each do |method|
137
135
  expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=', headers).and_return(response)
138
136
  oauth__2legged_client.make_request(method, '/path?any_param=toto', '', headers)
139
137
  end
140
- [:post, :put].each do |method|
138
+ %i[post put].each do |method|
141
139
  expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=', '', headers).and_return(response)
142
140
  oauth__2legged_client.make_request(method, '/path?any_param=toto', '', headers)
143
141
  end
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe JIRA::RequestClient do
4
-
5
- it "raises an exception for non success responses" do
6
- response = double()
4
+ it 'raises an exception for non success responses' do
5
+ response = double
7
6
  allow(response).to receive(:kind_of?).with(Net::HTTPSuccess).and_return(false)
8
7
  rc = JIRA::RequestClient.new
9
8
  expect(rc).to receive(:make_request).with(:get, '/foo', '', {}).and_return(response)
10
- expect {
9
+
10
+ expect do
11
11
  rc.request(:get, '/foo', '', {})
12
- }.to raise_exception(JIRA::HTTPError)
12
+ end.to raise_exception(JIRA::HTTPError)
13
13
  end
14
14
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe JIRA::Resource::Agile do
4
4
  let(:client) do
5
- client = double(options: {rest_base_path: '/jira/rest/api/2', context_path: '/jira'})
5
+ client = double(options: { rest_base_path: '/jira/rest/api/2', context_path: '/jira' })
6
6
  allow(client).to receive(:Issue).and_return(JIRA::Resource::IssueFactory.new(client))
7
7
  client
8
8
  end
@@ -42,7 +42,6 @@ describe JIRA::Resource::Agile do
42
42
  expect(issue.class).to eq(JIRA::Resource::Issue)
43
43
  expect(issue.expanded?).to be_falsey
44
44
  end
45
-
46
45
  end
47
46
 
48
47
  it 'should query correct url with parameters' do
@@ -60,7 +59,6 @@ describe JIRA::Resource::Agile do
60
59
  expect(issue.class).to eq(JIRA::Resource::Issue)
61
60
  expect(issue.expanded?).to be_falsey
62
61
  end
63
-
64
62
  end
65
63
  end
66
64
 
@@ -78,18 +76,18 @@ describe JIRA::Resource::Agile do
78
76
 
79
77
  JIRA::Resource::Agile.get_sprints(client, 1, startAt: 50)
80
78
  end
81
-
79
+
82
80
  it 'should work with pagination starting at 0' do
83
81
  expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=0').and_return(response)
84
82
  expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
85
-
83
+
86
84
  JIRA::Resource::Agile.get_sprints(client, 1, maxResults: 1, startAt: 0)
87
85
  end
88
-
86
+
89
87
  it 'should work with pagination not starting at 0' do
90
88
  expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=1').and_return(response)
91
89
  expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
92
-
90
+
93
91
  JIRA::Resource::Agile.get_sprints(client, 1, maxResults: 1, startAt: 1)
94
92
  end
95
93
  end
@@ -1,42 +1,41 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe JIRA::Resource::Attachment do
4
-
5
- let(:client) {
4
+ let(:client) do
6
5
  double(
7
6
  'client',
8
- :options => {
9
- :rest_base_path => '/jira/rest/api/2'
7
+ options: {
8
+ rest_base_path: '/jira/rest/api/2'
10
9
  },
11
- :request_client => double(
12
- :options => {
13
- :username => 'username',
14
- :password => 'password'
10
+ request_client: double(
11
+ options: {
12
+ username: 'username',
13
+ password: 'password'
15
14
  }
16
15
  )
17
16
  )
18
- }
17
+ end
19
18
 
20
- describe "relationships" do
21
- subject {
19
+ describe 'relationships' do
20
+ subject do
22
21
  JIRA::Resource::Attachment.new(client,
23
- :issue => JIRA::Resource::Issue.new(client),
24
- :attrs => { 'author' => {'foo' => 'bar'} })
25
- }
22
+ issue: JIRA::Resource::Issue.new(client),
23
+ attrs: { 'author' => { 'foo' => 'bar' } })
24
+ end
26
25
 
27
- it "has the correct relationships" do
26
+ it 'has the correct relationships' do
28
27
  expect(subject).to have_one(:author, JIRA::Resource::User)
29
28
  expect(subject.author.foo).to eq('bar')
30
29
  end
31
30
  end
32
31
 
33
32
  describe '#meta' do
34
- let(:response) {
33
+ let(:response) do
35
34
  double(
36
35
  'response',
37
- :body => '{"enabled":true,"uploadLimit":10485760}'
36
+ body: '{"enabled":true,"uploadLimit":10485760}'
38
37
  )
39
- }
38
+ end
40
39
 
41
40
  it 'returns meta information about attachment upload' do
42
41
  expect(client).to receive(:get).with('/jira/rest/api/2/attachment/meta').and_return(response)
@@ -52,16 +51,16 @@ describe JIRA::Resource::Attachment do
52
51
 
53
52
  describe '#save!' do
54
53
  it 'successfully update the attachment' do
55
- basic_auth_http_conn = double()
54
+ basic_auth_http_conn = double
56
55
  response = double(
57
56
  body: [
58
57
  {
59
- "id": 10001,
60
- "self": "http://www.example.com/jira/rest/api/2.0/attachments/10000",
61
- "filename": "picture.jpg",
62
- "created": "2017-07-19T12:23:06.572+0000",
63
- "size": 23123,
64
- "mimeType": "image/jpeg",
58
+ "id": 10_001,
59
+ "self": 'http://www.example.com/jira/rest/api/2.0/attachments/10000',
60
+ "filename": 'picture.jpg',
61
+ "created": '2017-07-19T12:23:06.572+0000',
62
+ "size": 23_123,
63
+ "mimeType": 'image/jpeg'
65
64
  }
66
65
  ].to_json
67
66
  )
@@ -76,7 +75,7 @@ describe JIRA::Resource::Attachment do
76
75
 
77
76
  expect(attachment.filename).to eq 'picture.jpg'
78
77
  expect(attachment.mimeType).to eq 'image/jpeg'
79
- expect(attachment.size).to eq 23123
78
+ expect(attachment.size).to eq 23_123
80
79
  end
81
80
  end
82
81
  end
@@ -0,0 +1,175 @@
1
+ require 'spec_helper'
2
+ require 'active_support/core_ext/hash'
3
+
4
+ describe JIRA::Resource::Board do
5
+ class JIRAResourceDelegation < SimpleDelegator # :nodoc:
6
+ end
7
+
8
+ let(:client) do
9
+ double(options: {
10
+ rest_base_path: '/jira/rest/api/2',
11
+ context_path: ''
12
+ })
13
+ end
14
+
15
+ let(:board) do
16
+ response = double
17
+ api_json_board = "{
18
+ \"id\": 84,
19
+ \"self\": \"http://www.example.com/jira/rest/agile/1.0/board/84\",
20
+ \"name\": \"scrum board\",
21
+ \"type\": \"scrum\"
22
+ }"
23
+ allow(response).to receive(:body).and_return(api_json_board)
24
+ expect(client).to receive(:get).with('/rest/agile/1.0/board/84')
25
+ .and_return(response)
26
+
27
+ expect(client).to receive(:Board).and_return(JIRA::Resource::BoardFactory.new(client))
28
+ JIRA::Resource::Board.find(client, '84')
29
+ end
30
+
31
+ it 'should find all boards' do
32
+ response = double
33
+ api_json = <<eos
34
+ {
35
+ "maxResults": 50,
36
+ "startAt": 0,
37
+ "isLast": true,
38
+ "values": [
39
+ {
40
+ "id": 84,
41
+ "name": "scrum board",
42
+ "type": "scrum"
43
+ },
44
+ {
45
+ "id": 92,
46
+ "name": "kanban board",
47
+ "type": "kanban"
48
+ }
49
+ ]
50
+ }
51
+ eos
52
+ allow(response).to receive(:body).and_return(api_json)
53
+ expect(client).to receive(:get).with('/rest/agile/1.0/board')
54
+ .and_return(response)
55
+ expect(client).to receive(:Board).twice.and_return(JIRA::Resource::BoardFactory.new(client))
56
+ boards = JIRA::Resource::Board.all(client)
57
+ expect(boards.count).to eq(2)
58
+ end
59
+
60
+ it 'should find one board by id' do
61
+ expect(board).to be_a(JIRA::Resource::Board)
62
+ end
63
+
64
+ describe '#issues' do
65
+ it 'should find all issues' do
66
+ issues_response = double
67
+
68
+ api_json_issues = <<eos
69
+ {
70
+ "expand": "names,schema",
71
+ "startAt": 0,
72
+ "maxResults": 50,
73
+ "total": 1,
74
+ "issues": [
75
+ {
76
+ "id": "10001",
77
+ "fields": {
78
+ "sprint": {
79
+ "id": 37,
80
+ "state": "future",
81
+ "name": "sprint 2"
82
+ },
83
+ "description": "example bug report"
84
+ }
85
+ }
86
+ ]
87
+ }
88
+ eos
89
+
90
+ allow(issues_response).to receive(:body).and_return(api_json_issues)
91
+ allow(board).to receive(:id).and_return(84)
92
+ expect(client).to receive(:get).with('/rest/agile/1.0/board/84/issue?')
93
+ .and_return(issues_response)
94
+ expect(client).to receive(:Issue).and_return(JIRA::Resource::IssueFactory.new(client))
95
+
96
+ expect(board.issues.size).to be(1)
97
+ end
98
+
99
+ describe 'pagination' do
100
+ subject { described_class.new(client) }
101
+ let(:client) { JIRA::Client.new }
102
+
103
+ before do
104
+ allow(subject).to receive(:id).and_return('123')
105
+ end
106
+
107
+ context 'when there are multiple pages of results' do
108
+ let(:result_1) do
109
+ OpenStruct.new(body: {
110
+ 'startAt' => 0,
111
+ 'maxResults' => 1,
112
+ 'total' => 2,
113
+ 'issues' => []
114
+ }.to_json)
115
+ end
116
+ let(:result_2) do
117
+ OpenStruct.new(body: {
118
+ 'startAt' => 1,
119
+ 'maxResults' => 1,
120
+ 'total' => 2,
121
+ 'issues' => []
122
+ }.to_json)
123
+ end
124
+
125
+ it 'makes multiple requests and increments the startAt param' do
126
+ expect(client).to receive(:get).and_return(result_1)
127
+ expect(client).to receive(:get).and_return(result_2)
128
+ subject.issues
129
+ end
130
+ end
131
+
132
+ context 'when there is only one page of results' do
133
+ let(:result_1) do
134
+ OpenStruct.new(body: {
135
+ 'startAt' => 0,
136
+ 'maxResults' => 2,
137
+ 'total' => 2,
138
+ 'issues' => []
139
+ }.to_json)
140
+ end
141
+
142
+ it 'only requires one request' do
143
+ expect(client).to receive(:get).once.and_return(result_1)
144
+ subject.issues
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ it 'should get all sprints for a board' do
151
+ response = double
152
+
153
+ api_json = <<-eos
154
+ {
155
+ "values": [
156
+ {
157
+ "id": 37,
158
+ "state": "closed",
159
+ "name": "sprint 1"
160
+ },
161
+ {
162
+ "id": 72,
163
+ "state": "future",
164
+ "name": "sprint 2"
165
+ }
166
+ ]
167
+ }
168
+ eos
169
+ allow(response).to receive(:body).and_return(api_json)
170
+ allow(board).to receive(:id).and_return(84)
171
+ expect(client).to receive(:get).with('/rest/agile/1.0/board/84/sprint?').and_return(response)
172
+ expect(client).to receive(:Sprint).twice.and_return(JIRA::Resource::SprintFactory.new(client))
173
+ expect(board.sprints.size).to be(2)
174
+ end
175
+ end