jira-ruby 2.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.
Files changed (154) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +9 -0
  4. data/Gemfile +14 -0
  5. data/Guardfile +14 -0
  6. data/LICENSE +19 -0
  7. data/README.md +427 -0
  8. data/Rakefile +31 -0
  9. data/example.rb +224 -0
  10. data/http-basic-example.rb +113 -0
  11. data/jira-ruby.gemspec +35 -0
  12. data/lib/jira-ruby.rb +49 -0
  13. data/lib/jira/base.rb +525 -0
  14. data/lib/jira/base_factory.rb +46 -0
  15. data/lib/jira/client.rb +308 -0
  16. data/lib/jira/has_many_proxy.rb +42 -0
  17. data/lib/jira/http_client.rb +112 -0
  18. data/lib/jira/http_error.rb +14 -0
  19. data/lib/jira/jwt_client.rb +67 -0
  20. data/lib/jira/oauth_client.rb +114 -0
  21. data/lib/jira/railtie.rb +10 -0
  22. data/lib/jira/request_client.rb +31 -0
  23. data/lib/jira/resource/agile.rb +79 -0
  24. data/lib/jira/resource/applinks.rb +39 -0
  25. data/lib/jira/resource/attachment.rb +50 -0
  26. data/lib/jira/resource/board.rb +91 -0
  27. data/lib/jira/resource/board_configuration.rb +9 -0
  28. data/lib/jira/resource/comment.rb +12 -0
  29. data/lib/jira/resource/component.rb +8 -0
  30. data/lib/jira/resource/createmeta.rb +44 -0
  31. data/lib/jira/resource/field.rb +83 -0
  32. data/lib/jira/resource/filter.rb +15 -0
  33. data/lib/jira/resource/issue.rb +141 -0
  34. data/lib/jira/resource/issuelink.rb +20 -0
  35. data/lib/jira/resource/issuelinktype.rb +14 -0
  36. data/lib/jira/resource/issuetype.rb +8 -0
  37. data/lib/jira/resource/priority.rb +8 -0
  38. data/lib/jira/resource/project.rb +41 -0
  39. data/lib/jira/resource/rapidview.rb +67 -0
  40. data/lib/jira/resource/remotelink.rb +26 -0
  41. data/lib/jira/resource/resolution.rb +8 -0
  42. data/lib/jira/resource/serverinfo.rb +18 -0
  43. data/lib/jira/resource/sprint.rb +105 -0
  44. data/lib/jira/resource/sprint_report.rb +8 -0
  45. data/lib/jira/resource/status.rb +8 -0
  46. data/lib/jira/resource/transition.rb +29 -0
  47. data/lib/jira/resource/user.rb +30 -0
  48. data/lib/jira/resource/version.rb +8 -0
  49. data/lib/jira/resource/watcher.rb +35 -0
  50. data/lib/jira/resource/webhook.rb +37 -0
  51. data/lib/jira/resource/worklog.rb +14 -0
  52. data/lib/jira/tasks.rb +0 -0
  53. data/lib/jira/version.rb +3 -0
  54. data/lib/tasks/generate.rake +18 -0
  55. data/spec/integration/attachment_spec.rb +32 -0
  56. data/spec/integration/comment_spec.rb +52 -0
  57. data/spec/integration/component_spec.rb +39 -0
  58. data/spec/integration/field_spec.rb +32 -0
  59. data/spec/integration/issue_spec.rb +93 -0
  60. data/spec/integration/issuelinktype_spec.rb +26 -0
  61. data/spec/integration/issuetype_spec.rb +24 -0
  62. data/spec/integration/priority_spec.rb +24 -0
  63. data/spec/integration/project_spec.rb +49 -0
  64. data/spec/integration/rapidview_spec.rb +74 -0
  65. data/spec/integration/resolution_spec.rb +26 -0
  66. data/spec/integration/status_spec.rb +24 -0
  67. data/spec/integration/transition_spec.rb +49 -0
  68. data/spec/integration/user_spec.rb +41 -0
  69. data/spec/integration/version_spec.rb +39 -0
  70. data/spec/integration/watcher_spec.rb +62 -0
  71. data/spec/integration/webhook.rb +25 -0
  72. data/spec/integration/worklog_spec.rb +51 -0
  73. data/spec/jira/base_factory_spec.rb +45 -0
  74. data/spec/jira/base_spec.rb +598 -0
  75. data/spec/jira/client_spec.rb +291 -0
  76. data/spec/jira/has_many_proxy_spec.rb +46 -0
  77. data/spec/jira/http_client_spec.rb +328 -0
  78. data/spec/jira/http_error_spec.rb +24 -0
  79. data/spec/jira/jwt_uri_builder_spec.rb +59 -0
  80. data/spec/jira/oauth_client_spec.rb +162 -0
  81. data/spec/jira/request_client_spec.rb +41 -0
  82. data/spec/jira/resource/agile_spec.rb +135 -0
  83. data/spec/jira/resource/attachment_spec.rb +138 -0
  84. data/spec/jira/resource/board_spec.rb +224 -0
  85. data/spec/jira/resource/createmeta_spec.rb +258 -0
  86. data/spec/jira/resource/field_spec.rb +85 -0
  87. data/spec/jira/resource/filter_spec.rb +97 -0
  88. data/spec/jira/resource/issue_spec.rb +227 -0
  89. data/spec/jira/resource/issuelink_spec.rb +14 -0
  90. data/spec/jira/resource/project_factory_spec.rb +11 -0
  91. data/spec/jira/resource/project_spec.rb +123 -0
  92. data/spec/jira/resource/sprint_spec.rb +90 -0
  93. data/spec/jira/resource/user_factory_spec.rb +31 -0
  94. data/spec/jira/resource/worklog_spec.rb +22 -0
  95. data/spec/mock_responses/board/1.json +33 -0
  96. data/spec/mock_responses/board/1_issues.json +62 -0
  97. data/spec/mock_responses/component.post.json +28 -0
  98. data/spec/mock_responses/component/10000.invalid.put.json +5 -0
  99. data/spec/mock_responses/component/10000.json +39 -0
  100. data/spec/mock_responses/component/10000.put.json +39 -0
  101. data/spec/mock_responses/empty_issues.json +8 -0
  102. data/spec/mock_responses/field.json +32 -0
  103. data/spec/mock_responses/field/1.json +15 -0
  104. data/spec/mock_responses/issue.json +1108 -0
  105. data/spec/mock_responses/issue.post.json +5 -0
  106. data/spec/mock_responses/issue/10002.invalid.put.json +6 -0
  107. data/spec/mock_responses/issue/10002.json +126 -0
  108. data/spec/mock_responses/issue/10002.put.missing_field_update.json +6 -0
  109. data/spec/mock_responses/issue/10002/attachments/10000.json +20 -0
  110. data/spec/mock_responses/issue/10002/comment.json +65 -0
  111. data/spec/mock_responses/issue/10002/comment.post.json +29 -0
  112. data/spec/mock_responses/issue/10002/comment/10000.json +29 -0
  113. data/spec/mock_responses/issue/10002/comment/10000.put.json +29 -0
  114. data/spec/mock_responses/issue/10002/transitions.json +49 -0
  115. data/spec/mock_responses/issue/10002/transitions.post.json +1 -0
  116. data/spec/mock_responses/issue/10002/watchers.json +13 -0
  117. data/spec/mock_responses/issue/10002/worklog.json +98 -0
  118. data/spec/mock_responses/issue/10002/worklog.post.json +30 -0
  119. data/spec/mock_responses/issue/10002/worklog/10000.json +31 -0
  120. data/spec/mock_responses/issue/10002/worklog/10000.put.json +30 -0
  121. data/spec/mock_responses/issueLinkType.json +25 -0
  122. data/spec/mock_responses/issueLinkType/10000.json +7 -0
  123. data/spec/mock_responses/issuetype.json +42 -0
  124. data/spec/mock_responses/issuetype/5.json +8 -0
  125. data/spec/mock_responses/jira/rest/webhooks/1.0/webhook.json +11 -0
  126. data/spec/mock_responses/jira/rest/webhooks/1.0/webhook/2.json +11 -0
  127. data/spec/mock_responses/priority.json +42 -0
  128. data/spec/mock_responses/priority/1.json +8 -0
  129. data/spec/mock_responses/project.json +12 -0
  130. data/spec/mock_responses/project/SAMPLEPROJECT.issues.json +1108 -0
  131. data/spec/mock_responses/project/SAMPLEPROJECT.json +84 -0
  132. data/spec/mock_responses/rapidview.json +10 -0
  133. data/spec/mock_responses/rapidview/SAMPLEPROJECT.issues.full.json +276 -0
  134. data/spec/mock_responses/rapidview/SAMPLEPROJECT.issues.json +111 -0
  135. data/spec/mock_responses/rapidview/SAMPLEPROJECT.json +6 -0
  136. data/spec/mock_responses/resolution.json +15 -0
  137. data/spec/mock_responses/resolution/1.json +7 -0
  138. data/spec/mock_responses/sprint/1_issues.json +125 -0
  139. data/spec/mock_responses/status.json +37 -0
  140. data/spec/mock_responses/status/1.json +7 -0
  141. data/spec/mock_responses/user_username=admin.json +17 -0
  142. data/spec/mock_responses/version.post.json +7 -0
  143. data/spec/mock_responses/version/10000.invalid.put.json +5 -0
  144. data/spec/mock_responses/version/10000.json +11 -0
  145. data/spec/mock_responses/version/10000.put.json +7 -0
  146. data/spec/mock_responses/webhook.json +11 -0
  147. data/spec/mock_responses/webhook/webhook.json +11 -0
  148. data/spec/spec_helper.rb +21 -0
  149. data/spec/support/clients_helper.rb +16 -0
  150. data/spec/support/matchers/have_attributes.rb +11 -0
  151. data/spec/support/matchers/have_many.rb +9 -0
  152. data/spec/support/matchers/have_one.rb +5 -0
  153. data/spec/support/shared_examples/integration.rb +177 -0
  154. metadata +491 -0
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::HTTPError do
4
+ let(:response) do
5
+ response = double('response')
6
+ allow(response).to receive(:code).and_return(401)
7
+ allow(response).to receive(:message).and_return('A MESSAGE WOO')
8
+ response
9
+ end
10
+
11
+ subject { described_class.new(response) }
12
+
13
+ it 'takes the response object as an argument' do
14
+ expect(subject.response).to eq(response)
15
+ end
16
+
17
+ it 'has a code method' do
18
+ expect(subject.code).to eq(response.code)
19
+ end
20
+
21
+ it 'returns code and class from message' do
22
+ expect(subject.message).to eq(response.message)
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::JwtClient::JwtUriBuilder do
4
+ subject(:url_builder) do
5
+ JIRA::JwtClient::JwtUriBuilder.new(url, http_method, shared_secret, site, issuer)
6
+ end
7
+
8
+ let(:url) { '/foo' }
9
+ let(:http_method) { :get }
10
+ let(:shared_secret) { 'shared_secret' }
11
+ let(:site) { 'http://localhost:2990' }
12
+ let(:issuer) { nil }
13
+
14
+ describe '#build' do
15
+ subject { url_builder.build }
16
+
17
+ it 'includes the jwt param' do
18
+ expect(subject).to include('?jwt=')
19
+ end
20
+
21
+ context 'when the url already contains params' do
22
+ let(:url) { '/foo?expand=projects.issuetypes.fields' }
23
+
24
+ it 'includes the jwt param' do
25
+ expect(subject).to include('&jwt=')
26
+ end
27
+ end
28
+
29
+ context 'with a complete url' do
30
+ let(:url) { 'http://localhost:2990/rest/api/2/issue/createmeta' }
31
+
32
+ it 'includes the jwt param' do
33
+ expect(subject).to include('?jwt=')
34
+ end
35
+
36
+ it { is_expected.to start_with('/') }
37
+
38
+ it 'contains only one ?' do
39
+ expect(subject.count('?')).to eq(1)
40
+ end
41
+ end
42
+
43
+ context 'with a complete url containing a param' do
44
+ let(:url) do
45
+ 'http://localhost:2990/rest/api/2/issue/createmeta?expand=projects.issuetypes.fields'
46
+ end
47
+
48
+ it 'includes the jwt param' do
49
+ expect(subject).to include('&jwt=')
50
+ end
51
+
52
+ it { is_expected.to start_with('/') }
53
+
54
+ it 'contains only one ?' do
55
+ expect(subject.count('?')).to eq(1)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::OauthClient do
4
+ let(:oauth_client) do
5
+ options = { consumer_key: 'foo', consumer_secret: 'bar' }
6
+ options = JIRA::Client::DEFAULT_OPTIONS.merge(options)
7
+ JIRA::OauthClient.new(options)
8
+ end
9
+
10
+ let(:response) do
11
+ response = double('response')
12
+ allow(response).to receive(:is_a?).with(Net::HTTPSuccess).and_return(true)
13
+ response
14
+ end
15
+
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]
19
+ defaults = JIRA::Client::DEFAULT_OPTIONS.merge(JIRA::OauthClient::DEFAULT_OPTIONS)
20
+ options.each do |key|
21
+ expect(oauth_client.options[key]).to eq(defaults[:context_path] + defaults[key])
22
+ end
23
+ end
24
+
25
+ it 'creates a Oauth::Consumer on initialize' do
26
+ expect(oauth_client.consumer.class).to eq(OAuth::Consumer)
27
+ expect(oauth_client.consumer.key).to eq(oauth_client.key)
28
+ expect(oauth_client.consumer.secret).to eq(oauth_client.secret)
29
+ end
30
+
31
+ it 'returns an OAuth request_token' do
32
+ # Cannot just check for method delegation as http connection will be attempted
33
+ request_token = OAuth::RequestToken.new(oauth_client.consumer)
34
+ allow(oauth_client).to receive(:get_request_token).and_return(request_token)
35
+ expect(oauth_client.get_request_token).to eq(request_token)
36
+ end
37
+
38
+ it 'allows setting the request token' do
39
+ token = double
40
+ expect(OAuth::RequestToken).to receive(:new).with(oauth_client.consumer, 'foo', 'bar').and_return(token)
41
+
42
+ request_token = oauth_client.set_request_token('foo', 'bar')
43
+
44
+ expect(request_token).to eq(token)
45
+ expect(oauth_client.request_token).to eq(token)
46
+ end
47
+
48
+ it 'allows setting the consumer key' do
49
+ expect(oauth_client.key).to eq('foo')
50
+ end
51
+
52
+ it 'allows setting the consumer secret' do
53
+ expect(oauth_client.secret).to eq('bar')
54
+ end
55
+
56
+ describe 'the access token' do
57
+ it 'initializes' do
58
+ request_token = OAuth::RequestToken.new(oauth_client.consumer)
59
+ allow(oauth_client).to receive(:get_request_token).and_return(request_token)
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')
63
+ expect(oauth_client.access_token).to eq(mock_access_token)
64
+ end
65
+
66
+ it 'raises an exception when accessing without initialisation' do
67
+ expect do
68
+ oauth_client.access_token
69
+ end.to raise_exception(JIRA::OauthClient::UninitializedAccessTokenError,
70
+ 'init_access_token must be called before using the client')
71
+ end
72
+
73
+ it 'allows setting the access token' do
74
+ token = double
75
+ expect(OAuth::AccessToken).to receive(:new).with(oauth_client.consumer, 'foo', 'bar').and_return(token)
76
+
77
+ access_token = oauth_client.set_access_token('foo', 'bar')
78
+
79
+ expect(access_token).to eq(token)
80
+ expect(oauth_client.access_token).to eq(token)
81
+ end
82
+ end
83
+
84
+ describe 'http' do
85
+ let(:headers) { double }
86
+ let(:access_token) { double }
87
+ let(:body) { nil }
88
+
89
+ before do
90
+ allow(oauth_client).to receive(:access_token).and_return(access_token)
91
+ end
92
+
93
+ it 'responds to the http methods' do
94
+ %i[delete get head].each do |method|
95
+ expect(access_token).to receive(method).with('/path', headers).and_return(response)
96
+ oauth_client.make_request(method, '/path', '', headers)
97
+ end
98
+ %i[post put].each do |method|
99
+ expect(access_token).to receive(method).with('/path', '', headers).and_return(response)
100
+ oauth_client.make_request(method, '/path', '', headers)
101
+ end
102
+ end
103
+
104
+ it 'performs a request' do
105
+ expect(access_token).to receive(:send).with(:get, '/foo', headers).and_return(response)
106
+
107
+
108
+ oauth_client.request(:get, '/foo', body, headers)
109
+ end
110
+
111
+ context 'for a multipart request' do
112
+ subject { oauth_client.make_multipart_request('/path', data, headers) }
113
+
114
+ let(:data) { {} }
115
+ let(:headers) { {} }
116
+
117
+ it 'signs the access_token and performs the request' do
118
+ expect(access_token).to receive(:sign!).with(an_instance_of(Net::HTTP::Post::Multipart))
119
+ expect(oauth_client.consumer).to receive_message_chain(:http, :request).with(an_instance_of(Net::HTTP::Post::Multipart))
120
+
121
+ subject
122
+ end
123
+ end
124
+ end
125
+
126
+ describe 'auth type is oauth_2legged' do
127
+ let(:oauth__2legged_client) do
128
+ options = { consumer_key: 'foo', consumer_secret: 'bar', auth_type: :oauth_2legged }
129
+ options = JIRA::Client::DEFAULT_OPTIONS.merge(options)
130
+ JIRA::OauthClient.new(options)
131
+ end
132
+
133
+ it 'responds to the http methods adding oauth_token parameter' do
134
+ headers = double
135
+ mock_access_token = double
136
+ allow(oauth__2legged_client).to receive(:access_token).and_return(mock_access_token)
137
+ %i[delete get head].each do |method|
138
+ expect(mock_access_token).to receive(method).with('/path?oauth_token=', headers).and_return(response)
139
+ oauth__2legged_client.make_request(method, '/path', '', headers)
140
+ end
141
+ %i[post put].each do |method|
142
+ expect(mock_access_token).to receive(method).with('/path?oauth_token=', '', headers).and_return(response)
143
+ oauth__2legged_client.make_request(method, '/path', '', headers)
144
+ end
145
+ end
146
+
147
+ it 'responds to the http methods adding oauth_token parameter to any existing parameters' do
148
+ headers = double
149
+ mock_access_token = double
150
+ allow(oauth__2legged_client).to receive(:access_token).and_return(mock_access_token)
151
+ %i[delete get head].each do |method|
152
+ expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=', headers).and_return(response)
153
+ oauth__2legged_client.make_request(method, '/path?any_param=toto', '', headers)
154
+ end
155
+ %i[post put].each do |method|
156
+ expect(mock_access_token).to receive(method).with('/path?any_param=toto&oauth_token=', '', headers).and_return(response)
157
+ oauth__2legged_client.make_request(method, '/path?any_param=toto', '', headers)
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::RequestClient do
4
+ let(:request_client) { JIRA::RequestClient.new }
5
+
6
+ describe '#request' do
7
+ subject(:request) { request_client.request(:get, '/foo', '', {}) }
8
+
9
+ context 'when doing a request fails' do
10
+ let(:response) { double }
11
+
12
+ before do
13
+ allow(response).to receive(:kind_of?).with(Net::HTTPSuccess).and_return(false)
14
+ allow(request_client).to receive(:make_request).with(:get, '/foo', '', {}).and_return(response)
15
+ end
16
+
17
+ it 'raises an exception' do
18
+ expect{ subject }.to raise_exception(JIRA::HTTPError)
19
+ end
20
+ end
21
+ end
22
+
23
+ describe '#request_multipart' do
24
+ subject(:request) { request_client.request_multipart('/foo', data, {}) }
25
+
26
+ let(:data) { double }
27
+
28
+ context 'when doing a request fails' do
29
+ let(:response) { double }
30
+
31
+ before do
32
+ allow(response).to receive(:kind_of?).with(Net::HTTPSuccess).and_return(false)
33
+ allow(request_client).to receive(:make_multipart_request).with('/foo', data, {}).and_return(response)
34
+ end
35
+
36
+ it 'raises an exception' do
37
+ expect{ subject }.to raise_exception(JIRA::HTTPError)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,135 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::Resource::Agile do
4
+ let(:client) do
5
+ client = double(options: { rest_base_path: '/jira/rest/api/2', context_path: '/jira' })
6
+ allow(client).to receive(:Issue).and_return(JIRA::Resource::IssueFactory.new(client))
7
+ client
8
+ end
9
+ let(:response) { double }
10
+
11
+ describe '#all' do
12
+ it 'should query url without parameters' do
13
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board').and_return(response)
14
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
15
+
16
+ JIRA::Resource::Agile.all(client)
17
+ end
18
+ end
19
+
20
+ describe '#get_backlog_issues' do
21
+ it 'should query the url without parameters' do
22
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/backlog?maxResults=100').and_return(response)
23
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
24
+
25
+ JIRA::Resource::Agile.get_backlog_issues(client, 1)
26
+ end
27
+ end
28
+
29
+ describe '#get_board_issues' do
30
+ it 'should query correct url without parameters' do
31
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/issue?').and_return(response)
32
+ expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
33
+
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
+ expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
36
+
37
+ issues = JIRA::Resource::Agile.get_board_issues(client, 1)
38
+ expect(issues).to be_an(Array)
39
+ expect(issues.size).to eql(9)
40
+
41
+ issues.each do |issue|
42
+ expect(issue.class).to eq(JIRA::Resource::Issue)
43
+ expect(issue.expanded?).to be_falsey
44
+ end
45
+ end
46
+
47
+ it 'should query correct url with parameters' do
48
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/issue?startAt=50').and_return(response)
49
+ expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
50
+
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
+ expect(response).to receive(:body).and_return(get_mock_response('board/1_issues.json'))
53
+
54
+ issues = JIRA::Resource::Agile.get_board_issues(client, 1, startAt: 50)
55
+ expect(issues).to be_an(Array)
56
+ expect(issues.size).to eql(9)
57
+
58
+ issues.each do |issue|
59
+ expect(issue.class).to eq(JIRA::Resource::Issue)
60
+ expect(issue.expanded?).to be_falsey
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#get_sprints' do
66
+ it 'should query correct url without parameters' do
67
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=100').and_return(response)
68
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
69
+
70
+ JIRA::Resource::Agile.get_sprints(client, 1)
71
+ end
72
+
73
+ it 'should query correct url with parameters' do
74
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?startAt=50&maxResults=100').and_return(response)
75
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
76
+
77
+ JIRA::Resource::Agile.get_sprints(client, 1, startAt: 50)
78
+ end
79
+
80
+ it 'should work with pagination starting at 0' do
81
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=0').and_return(response)
82
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
83
+
84
+ JIRA::Resource::Agile.get_sprints(client, 1, maxResults: 1, startAt: 0)
85
+ end
86
+
87
+ it 'should work with pagination not starting at 0' do
88
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/sprint?maxResults=1&startAt=1').and_return(response)
89
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
90
+
91
+ JIRA::Resource::Agile.get_sprints(client, 1, maxResults: 1, startAt: 1)
92
+ end
93
+ end
94
+
95
+ describe '#get_sprint_issues' do
96
+ it 'should query correct url without parameters' do
97
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/sprint/1/issue?maxResults=100').and_return(response)
98
+ expect(response).to receive(:body).and_return(get_mock_response('sprint/1_issues.json'))
99
+
100
+ JIRA::Resource::Agile.get_sprint_issues(client, 1)
101
+ end
102
+
103
+ it 'should query correct url with parameters' do
104
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/sprint/1/issue?startAt=50&maxResults=100').and_return(response)
105
+ expect(response).to receive(:body).and_return(get_mock_response('sprint/1_issues.json'))
106
+
107
+ JIRA::Resource::Agile.get_sprint_issues(client, 1, startAt: 50)
108
+ end
109
+ end
110
+
111
+ describe '#get_projects_full' do
112
+ it 'should query correct url without parameters' do
113
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/project/full').and_return(response)
114
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
115
+
116
+ JIRA::Resource::Agile.get_projects_full(client, 1)
117
+ end
118
+ end
119
+
120
+ describe '#get_projects' do
121
+ it 'should query correct url without parameters' do
122
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/project?maxResults=100').and_return(response)
123
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
124
+
125
+ JIRA::Resource::Agile.get_projects(client, 1)
126
+ end
127
+
128
+ it 'should query correct url with parameters' do
129
+ expect(client).to receive(:get).with('/jira/rest/agile/1.0/board/1/project?startAt=50&maxResults=100').and_return(response)
130
+ expect(response).to receive(:body).and_return(get_mock_response('board/1.json'))
131
+
132
+ JIRA::Resource::Agile.get_projects(client, 1, startAt: 50)
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,138 @@
1
+ require 'spec_helper'
2
+
3
+ describe JIRA::Resource::Attachment do
4
+ subject(:attachment) do
5
+ JIRA::Resource::Attachment.new(
6
+ client,
7
+ issue: JIRA::Resource::Issue.new(client),
8
+ attrs: { 'author' => { 'foo' => 'bar' } }
9
+ )
10
+ end
11
+
12
+ let(:client) do
13
+ double(
14
+ 'client',
15
+ options: {
16
+ rest_base_path: '/jira/rest/api/2'
17
+ },
18
+ request_client: double(
19
+ options: {
20
+ username: 'username',
21
+ password: 'password'
22
+ }
23
+ )
24
+ )
25
+ end
26
+
27
+ describe 'relationships' do
28
+ it 'has an author' do
29
+ expect(subject).to have_one(:author, JIRA::Resource::User)
30
+ end
31
+
32
+ it 'has the correct author name' do
33
+ expect(subject.author.foo).to eq('bar')
34
+ end
35
+ end
36
+
37
+ describe '.meta' do
38
+ subject { JIRA::Resource::Attachment.meta(client) }
39
+
40
+ let(:response) do
41
+ double(
42
+ 'response',
43
+ body: '{"enabled":true,"uploadLimit":10485760}'
44
+ )
45
+ end
46
+
47
+ it 'returns meta information about attachment upload' do
48
+ expect(client).to receive(:get).with('/jira/rest/api/2/attachment/meta').and_return(response)
49
+
50
+ subject
51
+ end
52
+
53
+ context 'the factory delegates correctly' do
54
+ subject { JIRA::Resource::AttachmentFactory.new(client) }
55
+
56
+ it 'delegates #meta to to target class' do
57
+ expect(subject).to respond_to(:meta)
58
+ end
59
+ end
60
+ end
61
+
62
+ describe '#save' do
63
+ subject { attachment.save('file' => path_to_file) }
64
+ let(:path_to_file) { './spec/mock_responses/issue.json' }
65
+ let(:response) do
66
+ double(
67
+ body: [
68
+ {
69
+ "id": 10_001,
70
+ "self": 'http://www.example.com/jira/rest/api/2.0/attachments/10000',
71
+ "filename": 'picture.jpg',
72
+ "created": '2017-07-19T12:23:06.572+0000',
73
+ "size": 23_123,
74
+ "mimeType": 'image/jpeg'
75
+ }
76
+ ].to_json
77
+ )
78
+ end
79
+ let(:issue) { JIRA::Resource::Issue.new(client) }
80
+
81
+ before do
82
+ allow(client).to receive(:post_multipart).and_return(response)
83
+ end
84
+
85
+ it 'successfully update the attachment' do
86
+ subject
87
+
88
+ expect(attachment.filename).to eq 'picture.jpg'
89
+ expect(attachment.mimeType).to eq 'image/jpeg'
90
+ expect(attachment.size).to eq 23_123
91
+ end
92
+ end
93
+
94
+ describe '#save!' do
95
+ subject { attachment.save!('file' => path_to_file) }
96
+
97
+ let(:path_to_file) { './spec/mock_responses/issue.json' }
98
+ let(:response) do
99
+ double(
100
+ body: [
101
+ {
102
+ "id": 10_001,
103
+ "self": 'http://www.example.com/jira/rest/api/2.0/attachments/10000',
104
+ "filename": 'picture.jpg',
105
+ "created": '2017-07-19T12:23:06.572+0000',
106
+ "size": 23_123,
107
+ "mimeType": 'image/jpeg'
108
+ }
109
+ ].to_json
110
+ )
111
+ end
112
+ let(:issue) { JIRA::Resource::Issue.new(client) }
113
+
114
+ before do
115
+ allow(client).to receive(:post_multipart).and_return(response)
116
+ end
117
+
118
+ it 'successfully update the attachment' do
119
+ subject
120
+
121
+ expect(attachment.filename).to eq 'picture.jpg'
122
+ expect(attachment.mimeType).to eq 'image/jpeg'
123
+ expect(attachment.size).to eq 23_123
124
+ end
125
+
126
+ context 'when passing in a symbol as file key' do
127
+ subject { attachment.save!(file: path_to_file) }
128
+
129
+ it 'successfully update the attachment' do
130
+ subject
131
+
132
+ expect(attachment.filename).to eq 'picture.jpg'
133
+ expect(attachment.mimeType).to eq 'image/jpeg'
134
+ expect(attachment.size).to eq 23_123
135
+ end
136
+ end
137
+ end
138
+ end