jira-ruby 1.1.3 → 2.3.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.
- checksums.yaml +5 -5
- data/.gitignore +3 -0
- data/.travis.yml +5 -3
- data/Gemfile +7 -1
- data/Guardfile +1 -1
- data/README.md +452 -0
- data/Rakefile +6 -7
- data/example.rb +38 -6
- data/http-basic-example.rb +14 -13
- data/jira-ruby.gemspec +13 -13
- data/lib/jira/base.rb +58 -53
- data/lib/jira/base_factory.rb +3 -6
- data/lib/jira/client.rb +127 -30
- data/lib/jira/has_many_proxy.rb +0 -1
- data/lib/jira/http_client.rb +54 -16
- data/lib/jira/http_error.rb +3 -5
- data/lib/jira/jwt_client.rb +67 -0
- data/lib/jira/oauth_client.rb +47 -17
- data/lib/jira/request_client.rb +16 -5
- data/lib/jira/resource/agile.rb +34 -9
- data/lib/jira/resource/applinks.rb +5 -8
- data/lib/jira/resource/attachment.rb +41 -3
- data/lib/jira/resource/board.rb +91 -0
- data/lib/jira/resource/board_configuration.rb +9 -0
- data/lib/jira/resource/comment.rb +0 -2
- data/lib/jira/resource/component.rb +1 -3
- data/lib/jira/resource/createmeta.rb +14 -22
- data/lib/jira/resource/field.rb +22 -22
- data/lib/jira/resource/filter.rb +2 -2
- data/lib/jira/resource/issue.rb +69 -38
- data/lib/jira/resource/issue_picker_suggestions.rb +24 -0
- data/lib/jira/resource/issue_picker_suggestions_issue.rb +10 -0
- data/lib/jira/resource/issuelink.rb +3 -5
- data/lib/jira/resource/issuelinktype.rb +0 -1
- data/lib/jira/resource/issuetype.rb +1 -3
- data/lib/jira/resource/priority.rb +1 -3
- data/lib/jira/resource/project.rb +8 -8
- data/lib/jira/resource/rapidview.rb +28 -7
- data/lib/jira/resource/remotelink.rb +1 -4
- data/lib/jira/resource/resolution.rb +2 -4
- data/lib/jira/resource/serverinfo.rb +1 -2
- data/lib/jira/resource/sprint.rb +86 -17
- data/lib/jira/resource/sprint_report.rb +8 -0
- data/lib/jira/resource/status.rb +1 -3
- data/lib/jira/resource/suggested_issue.rb +9 -0
- data/lib/jira/resource/transition.rb +2 -6
- data/lib/jira/resource/user.rb +12 -2
- data/lib/jira/resource/version.rb +1 -3
- data/lib/jira/resource/watcher.rb +35 -0
- data/lib/jira/resource/webhook.rb +3 -6
- data/lib/jira/resource/worklog.rb +3 -5
- data/lib/jira/version.rb +1 -1
- data/lib/jira-ruby.rb +12 -2
- data/lib/tasks/generate.rake +4 -4
- data/spec/integration/attachment_spec.rb +17 -8
- data/spec/integration/comment_spec.rb +31 -34
- data/spec/integration/component_spec.rb +21 -24
- data/spec/integration/field_spec.rb +15 -18
- data/spec/integration/issue_spec.rb +45 -46
- data/spec/integration/issuelinktype_spec.rb +8 -11
- data/spec/integration/issuetype_spec.rb +5 -7
- data/spec/integration/priority_spec.rb +5 -8
- data/spec/integration/project_spec.rb +13 -20
- data/spec/integration/rapidview_spec.rb +17 -10
- data/spec/integration/resolution_spec.rb +7 -10
- data/spec/integration/status_spec.rb +5 -8
- data/spec/integration/transition_spec.rb +17 -20
- data/spec/integration/user_spec.rb +24 -8
- data/spec/integration/version_spec.rb +21 -25
- data/spec/integration/watcher_spec.rb +62 -0
- data/spec/integration/webhook.rb +8 -17
- data/spec/integration/worklog_spec.rb +30 -34
- data/spec/jira/base_factory_spec.rb +11 -12
- data/spec/jira/base_spec.rb +216 -229
- data/spec/jira/client_spec.rb +227 -159
- data/spec/jira/has_many_proxy_spec.rb +11 -12
- data/spec/jira/http_client_spec.rb +254 -31
- data/spec/jira/http_error_spec.rb +7 -9
- data/spec/jira/jwt_uri_builder_spec.rb +59 -0
- data/spec/jira/oauth_client_spec.rb +110 -39
- data/spec/jira/request_client_spec.rb +36 -9
- data/spec/jira/resource/agile_spec.rb +135 -0
- data/spec/jira/resource/attachment_spec.rb +127 -9
- data/spec/jira/resource/board_spec.rb +224 -0
- data/spec/jira/resource/createmeta_spec.rb +39 -34
- data/spec/jira/resource/field_spec.rb +42 -48
- data/spec/jira/resource/filter_spec.rb +40 -40
- data/spec/jira/resource/issue_picker_suggestions_spec.rb +79 -0
- data/spec/jira/resource/issue_spec.rb +88 -85
- data/spec/jira/resource/issuelink_spec.rb +1 -1
- data/spec/jira/resource/jira_picker_suggestions_issue_spec.rb +18 -0
- data/spec/jira/resource/project_factory_spec.rb +2 -4
- data/spec/jira/resource/project_spec.rb +86 -33
- data/spec/jira/resource/sprint_spec.rb +90 -0
- data/spec/jira/resource/user_factory_spec.rb +6 -8
- data/spec/jira/resource/worklog_spec.rb +9 -11
- data/spec/mock_responses/board/1.json +33 -0
- data/spec/mock_responses/board/1_issues.json +62 -0
- data/spec/mock_responses/empty_issues.json +8 -0
- data/spec/mock_responses/issue/10002/watchers.json +13 -0
- data/spec/mock_responses/issue.json +1 -1
- data/spec/mock_responses/sprint/1_issues.json +125 -0
- data/spec/spec_helper.rb +8 -9
- data/spec/support/clients_helper.rb +4 -4
- data/spec/support/shared_examples/integration.rb +60 -77
- metadata +115 -54
- data/README.rdoc +0 -329
- /data/spec/mock_responses/{attachment → issue/10002/attachments}/10000.json +0 -0
@@ -1,21 +1,21 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe JIRA::Resource::Createmeta do
|
4
|
-
let(:client)
|
4
|
+
let(:client) do
|
5
5
|
double(
|
6
6
|
'client',
|
7
|
-
:
|
8
|
-
:
|
7
|
+
options: {
|
8
|
+
rest_base_path: '/jira/rest/api/2'
|
9
9
|
}
|
10
10
|
)
|
11
|
-
|
11
|
+
end
|
12
12
|
|
13
|
-
let(:response)
|
13
|
+
let(:response) do
|
14
14
|
double(
|
15
15
|
'response',
|
16
|
-
:
|
16
|
+
body: '{"expand":"projects","projects":[{"self":"http://localhost:2029/rest/api/2/project/TST","id":"10200","key":"test_key","name":"Test Name"}]}'
|
17
17
|
)
|
18
|
-
|
18
|
+
end
|
19
19
|
|
20
20
|
describe 'general' do
|
21
21
|
it 'should query correct url without parameters' do
|
@@ -25,23 +25,31 @@ describe JIRA::Resource::Createmeta do
|
|
25
25
|
|
26
26
|
it 'should query correct url with `expand` parameter' do
|
27
27
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?expand=projects.issuetypes.fields').and_return(response)
|
28
|
-
JIRA::Resource::Createmeta.all(client, :
|
28
|
+
JIRA::Resource::Createmeta.all(client, expand: 'projects.issuetypes.fields')
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'should query correct url with `foo` parameter' do
|
32
32
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?foo=bar').and_return(response)
|
33
|
-
JIRA::Resource::Createmeta.all(client, :
|
33
|
+
JIRA::Resource::Createmeta.all(client, foo: 'bar')
|
34
34
|
end
|
35
35
|
|
36
|
+
it 'should return an array of createmeta objects' do
|
37
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta').and_return(response)
|
38
|
+
createmetas = JIRA::Resource::Createmeta.all(client)
|
39
|
+
expect(createmetas).to be_an Array
|
40
|
+
createmeta = createmetas.first
|
41
|
+
expect(createmeta.id).to eq '10200'
|
42
|
+
expect(createmeta.key).to eq 'test_key'
|
43
|
+
expect(createmeta.name).to eq 'Test Name'
|
44
|
+
end
|
36
45
|
end
|
37
46
|
|
38
|
-
|
39
47
|
describe 'projectKeys' do
|
40
48
|
it 'should query correct url when only one `projectKeys` given as string' do
|
41
49
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PROJECT_1').and_return(response)
|
42
50
|
JIRA::Resource::Createmeta.all(
|
43
51
|
client,
|
44
|
-
:
|
52
|
+
projectKeys: 'PROJECT_1'
|
45
53
|
)
|
46
54
|
end
|
47
55
|
|
@@ -49,7 +57,7 @@ describe JIRA::Resource::Createmeta do
|
|
49
57
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PROJECT_1%2CPROJECT_2').and_return(response)
|
50
58
|
JIRA::Resource::Createmeta.all(
|
51
59
|
client,
|
52
|
-
:
|
60
|
+
projectKeys: %w[PROJECT_1 PROJECT_2]
|
53
61
|
)
|
54
62
|
end
|
55
63
|
|
@@ -60,7 +68,7 @@ describe JIRA::Resource::Createmeta do
|
|
60
68
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PRJ').and_return(response)
|
61
69
|
JIRA::Resource::Createmeta.all(
|
62
70
|
client,
|
63
|
-
:
|
71
|
+
projectKeys: prj
|
64
72
|
)
|
65
73
|
end
|
66
74
|
|
@@ -73,7 +81,7 @@ describe JIRA::Resource::Createmeta do
|
|
73
81
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PRJ_2%2CPRJ_1').and_return(response)
|
74
82
|
JIRA::Resource::Createmeta.all(
|
75
83
|
client,
|
76
|
-
:
|
84
|
+
projectKeys: [prj_2, prj_1]
|
77
85
|
)
|
78
86
|
end
|
79
87
|
|
@@ -84,18 +92,17 @@ describe JIRA::Resource::Createmeta do
|
|
84
92
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectKeys=PROJECT_1%2CPRJ_5').and_return(response)
|
85
93
|
JIRA::Resource::Createmeta.all(
|
86
94
|
client,
|
87
|
-
:
|
95
|
+
projectKeys: ['PROJECT_1', prj_5]
|
88
96
|
)
|
89
97
|
end
|
90
98
|
end
|
91
99
|
|
92
|
-
|
93
100
|
describe 'projectIds' do
|
94
101
|
it 'should query correct url when only one `projectIds` given as string' do
|
95
102
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=10101').and_return(response)
|
96
103
|
JIRA::Resource::Createmeta.all(
|
97
104
|
client,
|
98
|
-
:
|
105
|
+
projectIds: '10101'
|
99
106
|
)
|
100
107
|
end
|
101
108
|
|
@@ -103,7 +110,7 @@ describe JIRA::Resource::Createmeta do
|
|
103
110
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=10101%2C20202').and_return(response)
|
104
111
|
JIRA::Resource::Createmeta.all(
|
105
112
|
client,
|
106
|
-
:
|
113
|
+
projectIds: %w[10101 20202]
|
107
114
|
)
|
108
115
|
end
|
109
116
|
|
@@ -114,7 +121,7 @@ describe JIRA::Resource::Createmeta do
|
|
114
121
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=30303').and_return(response)
|
115
122
|
JIRA::Resource::Createmeta.all(
|
116
123
|
client,
|
117
|
-
:
|
124
|
+
projectIds: prj
|
118
125
|
)
|
119
126
|
end
|
120
127
|
|
@@ -127,7 +134,7 @@ describe JIRA::Resource::Createmeta do
|
|
127
134
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=50505%2C30303').and_return(response)
|
128
135
|
JIRA::Resource::Createmeta.all(
|
129
136
|
client,
|
130
|
-
:
|
137
|
+
projectIds: [prj_2, prj_1]
|
131
138
|
)
|
132
139
|
end
|
133
140
|
|
@@ -138,18 +145,17 @@ describe JIRA::Resource::Createmeta do
|
|
138
145
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?projectIds=10101%2C60606').and_return(response)
|
139
146
|
JIRA::Resource::Createmeta.all(
|
140
147
|
client,
|
141
|
-
:
|
148
|
+
projectIds: ['10101', prj_5]
|
142
149
|
)
|
143
150
|
end
|
144
151
|
end
|
145
152
|
|
146
|
-
|
147
153
|
describe 'issuetypeNames' do
|
148
154
|
it 'should query correct url when only one `issuetypeNames` given as string' do
|
149
155
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Feature').and_return(response)
|
150
156
|
JIRA::Resource::Createmeta.all(
|
151
157
|
client,
|
152
|
-
:
|
158
|
+
issuetypeNames: 'Feature'
|
153
159
|
)
|
154
160
|
end
|
155
161
|
|
@@ -157,7 +163,7 @@ describe JIRA::Resource::Createmeta do
|
|
157
163
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Feature%2CBug').and_return(response)
|
158
164
|
JIRA::Resource::Createmeta.all(
|
159
165
|
client,
|
160
|
-
:
|
166
|
+
issuetypeNames: %w[Feature Bug]
|
161
167
|
)
|
162
168
|
end
|
163
169
|
|
@@ -168,7 +174,7 @@ describe JIRA::Resource::Createmeta do
|
|
168
174
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Epic').and_return(response)
|
169
175
|
JIRA::Resource::Createmeta.all(
|
170
176
|
client,
|
171
|
-
:
|
177
|
+
issuetypeNames: issue_type
|
172
178
|
)
|
173
179
|
end
|
174
180
|
|
@@ -181,7 +187,7 @@ describe JIRA::Resource::Createmeta do
|
|
181
187
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Sub-Task%2CEpic').and_return(response)
|
182
188
|
JIRA::Resource::Createmeta.all(
|
183
189
|
client,
|
184
|
-
:
|
190
|
+
issuetypeNames: [issue_type_2, issue_type_1]
|
185
191
|
)
|
186
192
|
end
|
187
193
|
|
@@ -192,18 +198,17 @@ describe JIRA::Resource::Createmeta do
|
|
192
198
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeNames=Feature%2CEpic').and_return(response)
|
193
199
|
JIRA::Resource::Createmeta.all(
|
194
200
|
client,
|
195
|
-
:
|
201
|
+
issuetypeNames: ['Feature', issue_type]
|
196
202
|
)
|
197
203
|
end
|
198
204
|
end
|
199
205
|
|
200
|
-
|
201
206
|
describe 'issuetypeIds' do
|
202
207
|
it 'should query correct url when only one `issuetypeIds` given as string' do
|
203
208
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=10101').and_return(response)
|
204
209
|
JIRA::Resource::Createmeta.all(
|
205
210
|
client,
|
206
|
-
:
|
211
|
+
issuetypeIds: '10101'
|
207
212
|
)
|
208
213
|
end
|
209
214
|
|
@@ -211,7 +216,7 @@ describe JIRA::Resource::Createmeta do
|
|
211
216
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=10101%2C20202').and_return(response)
|
212
217
|
JIRA::Resource::Createmeta.all(
|
213
218
|
client,
|
214
|
-
:
|
219
|
+
issuetypeIds: %w[10101 20202]
|
215
220
|
)
|
216
221
|
end
|
217
222
|
|
@@ -222,7 +227,7 @@ describe JIRA::Resource::Createmeta do
|
|
222
227
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=30303').and_return(response)
|
223
228
|
JIRA::Resource::Createmeta.all(
|
224
229
|
client,
|
225
|
-
:
|
230
|
+
issuetypeIds: issue_type
|
226
231
|
)
|
227
232
|
end
|
228
233
|
|
@@ -235,7 +240,7 @@ describe JIRA::Resource::Createmeta do
|
|
235
240
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=50505%2C30303').and_return(response)
|
236
241
|
JIRA::Resource::Createmeta.all(
|
237
242
|
client,
|
238
|
-
:
|
243
|
+
issuetypeIds: [issue_type_2, issue_type_1]
|
239
244
|
)
|
240
245
|
end
|
241
246
|
|
@@ -246,8 +251,8 @@ describe JIRA::Resource::Createmeta do
|
|
246
251
|
expect(client).to receive(:get).with('/jira/rest/api/2/issue/createmeta?issuetypeIds=10101%2C30303').and_return(response)
|
247
252
|
JIRA::Resource::Createmeta.all(
|
248
253
|
client,
|
249
|
-
:
|
254
|
+
issuetypeIds: ['10101', issue_type]
|
250
255
|
)
|
251
256
|
end
|
252
257
|
end
|
253
|
-
end
|
258
|
+
end
|
@@ -1,91 +1,85 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe JIRA::Resource::Field do
|
4
|
-
|
5
4
|
let(:cache) { OpenStruct.new }
|
6
5
|
|
7
6
|
let(:client) do
|
8
|
-
client = double(options: {rest_base_path: '/jira/rest/api/2'}
|
7
|
+
client = double(options: { rest_base_path: '/jira/rest/api/2' })
|
9
8
|
field = JIRA::Resource::FieldFactory.new(client)
|
10
9
|
allow(client).to receive(:Field).and_return(field)
|
11
10
|
allow(client).to receive(:cache).and_return(cache)
|
12
11
|
# info about all fields on the client
|
13
12
|
allow(client.Field).to receive(:all).and_return([
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
13
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'customfield_10666', 'name' => 'Priority', 'custom' => true, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10666]', 'Priority'], 'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_666 } }),
|
14
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'issuekey', 'name' => 'Key', 'custom' => false, 'orderable' => false, 'navigable' => true, 'searchable' => false, 'clauseNames' => %w[id issue issuekey key] }),
|
15
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'priority', 'name' => 'Priority', 'custom' => false, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['priority'], 'schema' => { 'type' => 'priority', 'system' => 'priority' } }),
|
16
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'summary', 'name' => 'Summary', 'custom' => false, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['summary'], 'schema' => { 'type' => 'string', 'system' => 'summary' } }),
|
17
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'issuetype', 'name' => 'Issue Type', 'custom' => false, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => %w[issuetype type], 'schema' => { 'type' => 'issuetype', 'system' => 'issuetype' } }),
|
18
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'customfield_10111', 'name' => 'SingleWord', 'custom' => true, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10111]', 'SingleWord'], 'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_111 } }),
|
19
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'customfield_10222', 'name' => 'Multi Word', 'custom' => true, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10222]', 'Multi Word'], 'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_222 } }),
|
20
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'customfield_10333', 'name' => 'Why/N@t', 'custom' => true, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10333]', 'Why/N@t'], 'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_333 } }),
|
21
|
+
JIRA::Resource::Field.new(client, attrs: { 'id' => 'customfield_10444', 'name' => 'SingleWord', 'custom' => true, 'orderable' => true, 'navigable' => true, 'searchable' => true, 'clauseNames' => ['cf[10444]', 'SingleWord'], 'schema' => { 'type' => 'string', 'custom' => 'com.atlassian.jira.plugin.system.customfieldtypes:select', 'customId' => 10_444 } })
|
22
|
+
])
|
24
23
|
client
|
25
24
|
end
|
26
25
|
|
27
|
-
describe
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
})
|
40
|
-
}
|
26
|
+
describe 'field_mappings' do
|
27
|
+
shared_context 'mapped or not' do
|
28
|
+
subject do
|
29
|
+
JIRA::Resource::Field.new(client, attrs: {
|
30
|
+
'priority' => 1,
|
31
|
+
'customfield_10111' => 'data_in_custom_field',
|
32
|
+
'customfield_10222' => 'multi word custom name',
|
33
|
+
'customfield_10333' => 'complex custom name',
|
34
|
+
'customfield_10444' => 'duplicated custom name',
|
35
|
+
'customfield_10666' => 'duplicate of a system name'
|
36
|
+
})
|
37
|
+
end
|
41
38
|
|
42
|
-
it
|
39
|
+
it 'can find a standard field by id' do
|
43
40
|
expect(subject.priority).to eq(1)
|
44
41
|
end
|
45
42
|
|
46
|
-
it
|
43
|
+
it 'can find a custom field by customfield_##### name' do
|
47
44
|
expect(subject.customfield_10111).to eq('data_in_custom_field')
|
48
45
|
end
|
49
46
|
|
50
|
-
it
|
51
|
-
expect{subject.name}.to raise_error(NoMethodError)
|
52
|
-
expect{subject.custom}.to raise_error(NoMethodError)
|
47
|
+
it 'is not confused by common attribute keys' do
|
48
|
+
expect { subject.name }.to raise_error(NoMethodError)
|
49
|
+
expect { subject.custom }.to raise_error(NoMethodError)
|
53
50
|
expect(subject.id).to eq(nil) # picks up ID from the parent -
|
54
51
|
end
|
55
52
|
end
|
56
53
|
|
57
|
-
context
|
54
|
+
context 'before fields are mapped' do
|
55
|
+
include_context 'mapped or not'
|
58
56
|
|
59
|
-
|
60
|
-
|
61
|
-
it "can find a standard field by id" do
|
57
|
+
it 'can find a standard field by id' do
|
62
58
|
expect(subject.priority).to eq(1)
|
63
59
|
end
|
64
60
|
|
65
|
-
it
|
66
|
-
expect{subject.Priority}.to raise_error(NoMethodError)
|
61
|
+
it 'cannot find a standard field by name before mapping' do
|
62
|
+
expect { subject.Priority }.to raise_error(NoMethodError)
|
67
63
|
end
|
68
64
|
|
69
|
-
it
|
65
|
+
it 'can find a custom field by customfield_##### name' do
|
70
66
|
expect(subject.customfield_10111).to eq('data_in_custom_field')
|
71
67
|
end
|
72
68
|
|
73
|
-
it
|
74
|
-
expect{subject.name}.to raise_error(NoMethodError)
|
75
|
-
expect{subject.custom}.to raise_error(NoMethodError)
|
69
|
+
it 'is not confused by common attribute keys and raises error' do
|
70
|
+
expect { subject.name }.to raise_error(NoMethodError)
|
71
|
+
expect { subject.custom }.to raise_error(NoMethodError)
|
76
72
|
expect(subject.id).to eq(nil) # picks up ID from the parent -
|
77
73
|
end
|
78
74
|
end
|
79
75
|
|
80
|
-
context
|
81
|
-
|
82
|
-
include_context "mapped or not"
|
76
|
+
context 'after fields are mapped' do
|
77
|
+
include_context 'mapped or not'
|
83
78
|
|
84
|
-
it
|
85
|
-
expect{client.Field.map_fields}.to output(/renaming as Priority_10666/).to_stderr
|
86
|
-
expect{client.Field.map_fields}.to output(/renaming as SingleWord_10444/).to_stderr
|
79
|
+
it 'warns of duplicate fields' do
|
80
|
+
expect { client.Field.map_fields }.to output(/renaming as Priority_10666/).to_stderr
|
81
|
+
expect { client.Field.map_fields }.to output(/renaming as SingleWord_10444/).to_stderr
|
87
82
|
end
|
88
|
-
|
89
83
|
end
|
90
84
|
end
|
91
85
|
end
|
@@ -2,48 +2,48 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe JIRA::Resource::Filter do
|
4
4
|
let(:client) do
|
5
|
-
client = double
|
5
|
+
client = double
|
6
6
|
allow(client).to receive(:Issue).and_return(JIRA::Resource::IssueFactory.new(self))
|
7
7
|
client
|
8
8
|
end
|
9
9
|
let(:collection_path) { '/rest/api/2/filter' }
|
10
10
|
let(:jira_user) do
|
11
11
|
{
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
12
|
+
self: 'https://localhost/rest/api/2/user?username=ljharb',
|
13
|
+
name: 'ljharb',
|
14
|
+
avatarUrls: {
|
15
15
|
'16x16' => 'https://localhost/secure/useravatar?size=small&ownerId=ljharb&avatarId=1',
|
16
16
|
'48x48' => 'https://localhost/secure/useravatar?ownerId=ljharb&avatarId=1'
|
17
17
|
},
|
18
|
-
:
|
19
|
-
:
|
18
|
+
displayName: 'Jordan Harband',
|
19
|
+
active: true
|
20
20
|
}
|
21
21
|
end
|
22
22
|
let(:filter_attrs) do
|
23
23
|
{
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
32
|
-
:
|
33
|
-
:
|
24
|
+
self: "https://localhost#{collection_path}/42",
|
25
|
+
id: 42,
|
26
|
+
name: 'Resolved Tickets',
|
27
|
+
description: '',
|
28
|
+
owner: jira_user,
|
29
|
+
jql: '"Git Repository" ~ jira-ruby AND status = Resolved',
|
30
|
+
viewUrl: 'https://localhost/secure/IssueNavigator.jspa?mode=hide&requestId=42',
|
31
|
+
searchUrl: 'https://localhost/rest/api/2/search?jql=%22Git+Repository%22+~+jira-ruby+AND+status+%3D+Resolved',
|
32
|
+
favourite: false,
|
33
|
+
sharePermissions: [
|
34
34
|
{
|
35
|
-
:
|
36
|
-
:
|
35
|
+
id: 123,
|
36
|
+
type: 'global'
|
37
37
|
}
|
38
38
|
],
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
39
|
+
subscriptions: {
|
40
|
+
size: 0,
|
41
|
+
items: []
|
42
42
|
}
|
43
43
|
}
|
44
44
|
end
|
45
45
|
let(:filter_response) do
|
46
|
-
response = double
|
46
|
+
response = double
|
47
47
|
allow(response).to receive(:body).and_return(filter_attrs.to_json)
|
48
48
|
response
|
49
49
|
end
|
@@ -54,40 +54,40 @@ describe JIRA::Resource::Filter do
|
|
54
54
|
end
|
55
55
|
let(:jql_issue) do
|
56
56
|
{
|
57
|
-
:
|
58
|
-
:
|
59
|
-
:
|
60
|
-
:
|
61
|
-
:
|
62
|
-
:
|
63
|
-
:
|
57
|
+
id: '663147',
|
58
|
+
self: 'https://localhost/rest/api/2/issue/663147',
|
59
|
+
key: 'JIRARUBY-2386',
|
60
|
+
fields: {
|
61
|
+
reporter: jira_user,
|
62
|
+
created: '2013-12-11T23:28:02.000+0000',
|
63
|
+
assignee: jira_user
|
64
64
|
}
|
65
65
|
}
|
66
66
|
end
|
67
67
|
let(:jql_attrs) do
|
68
68
|
{
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
69
|
+
startAt: 0,
|
70
|
+
maxResults: 50,
|
71
|
+
total: 2,
|
72
|
+
issues: [jql_issue]
|
73
73
|
}
|
74
74
|
end
|
75
75
|
let(:issue_jql_response) do
|
76
|
-
response = double
|
76
|
+
response = double
|
77
77
|
allow(response).to receive(:body).and_return(jql_attrs.to_json)
|
78
78
|
response
|
79
79
|
end
|
80
80
|
|
81
|
-
it
|
81
|
+
it 'can be found by ID' do
|
82
82
|
expect(JSON.parse(filter.attrs.to_json)).to eql(JSON.parse(filter_attrs.to_json))
|
83
83
|
end
|
84
84
|
|
85
|
-
it
|
85
|
+
it 'returns issues' do
|
86
86
|
expect(filter).to be_present
|
87
|
-
allow(client).to receive(:options).and_return(
|
88
|
-
expect(client).to receive(:get)
|
89
|
-
with("localhost/search?jql=#{CGI.escape(filter.jql)}")
|
90
|
-
and_return(issue_jql_response)
|
87
|
+
allow(client).to receive(:options).and_return(rest_base_path: 'localhost')
|
88
|
+
expect(client).to receive(:get)
|
89
|
+
.with("localhost/search?jql=#{CGI.escape(filter.jql)}")
|
90
|
+
.and_return(issue_jql_response)
|
91
91
|
issues = filter.issues
|
92
92
|
expect(issues).to be_an(Array)
|
93
93
|
expect(issues.size).to eql(1)
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe JIRA::Resource::IssuePickerSuggestions do
|
4
|
+
let(:client) do
|
5
|
+
double('client', options: {
|
6
|
+
rest_base_path: '/jira/rest/api/2'
|
7
|
+
})
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'relationships' do
|
11
|
+
subject do
|
12
|
+
JIRA::Resource::IssuePickerSuggestions.new(client, attrs: {
|
13
|
+
'sections' => [{ 'id' => 'hs'}, { 'id' => 'cs' }]
|
14
|
+
})
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'has the correct relationships' do
|
18
|
+
expect(subject).to have_many(:sections, JIRA::Resource::IssuePickerSuggestionsIssue)
|
19
|
+
expect(subject.sections.length).to eq(2)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#all' do
|
24
|
+
let(:response) { double }
|
25
|
+
let(:issue_picker_suggestions) { double }
|
26
|
+
|
27
|
+
before do
|
28
|
+
allow(response).to receive(:body).and_return('{"sections":[{"id": "cs"}]}')
|
29
|
+
allow(client).to receive(:IssuePickerSuggestions).and_return(issue_picker_suggestions)
|
30
|
+
allow(issue_picker_suggestions).to receive(:build)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should autocomplete issues' do
|
34
|
+
allow(response).to receive(:body).and_return('{"sections":[{"id": "cs"}]}')
|
35
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/picker?query=query')
|
36
|
+
.and_return(response)
|
37
|
+
|
38
|
+
expect(client).to receive(:IssuePickerSuggestions).and_return(issue_picker_suggestions)
|
39
|
+
expect(issue_picker_suggestions).to receive(:build).with({ 'sections' => [{ 'id' => 'cs' }] })
|
40
|
+
|
41
|
+
JIRA::Resource::IssuePickerSuggestions.all(client, 'query')
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should autocomplete issues with current jql' do
|
45
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/picker?query=query¤tJQL=project+%3D+PR')
|
46
|
+
.and_return(response)
|
47
|
+
|
48
|
+
JIRA::Resource::IssuePickerSuggestions.all(client, 'query', current_jql: 'project = PR')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should autocomplete issues with current issue jey' do
|
52
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/picker?query=query¤tIssueKey=PR-42')
|
53
|
+
.and_return(response)
|
54
|
+
|
55
|
+
JIRA::Resource::IssuePickerSuggestions.all(client, 'query', current_issue_key: 'PR-42')
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should autocomplete issues with current project id' do
|
59
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/picker?query=query¤tProjectId=PR')
|
60
|
+
.and_return(response)
|
61
|
+
|
62
|
+
JIRA::Resource::IssuePickerSuggestions.all(client, 'query', current_project_id: 'PR')
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should autocomplete issues with show sub tasks' do
|
66
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/picker?query=query&showSubTasks=true')
|
67
|
+
.and_return(response)
|
68
|
+
|
69
|
+
JIRA::Resource::IssuePickerSuggestions.all(client, 'query', show_sub_tasks: true)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should autocomplete issues with show sub tasks parent' do
|
73
|
+
expect(client).to receive(:get).with('/jira/rest/api/2/issue/picker?query=query&showSubTaskParent=true')
|
74
|
+
.and_return(response)
|
75
|
+
|
76
|
+
JIRA::Resource::IssuePickerSuggestions.all(client, 'query', show_sub_task_parent: true)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|