lita-github 0.0.13 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/lita-github.rb +1 -0
- data/lib/lita-github/general.rb +23 -17
- data/lib/lita-github/r.rb +2 -6
- data/lib/lita-github/version.rb +2 -2
- data/lib/lita/handlers/github.rb +6 -3
- data/lib/lita/handlers/github_issues.rb +110 -0
- data/lib/lita/handlers/github_org.rb +132 -1
- data/lib/lita/handlers/github_pr.rb +1 -1
- data/locales/en.yml +26 -2
- data/spec/unit/lita-github/general_spec.rb +27 -12
- data/spec/unit/lita-github/r_spec.rb +0 -44
- data/spec/unit/lita-github/version_spec.rb +7 -7
- data/spec/unit/lita/handlers/github_issues_spec.rb +162 -0
- data/spec/unit/lita/handlers/github_org_spec.rb +259 -2
- data/spec/unit/lita/handlers/github_pr_spec.rb +63 -49
- data/spec/unit/lita/handlers/github_repo_spec.rb +1 -1
- data/spec/unit/lita/handlers/github_spec.rb +20 -8
- metadata +5 -2
@@ -21,25 +21,40 @@ describe LitaGithub::General do
|
|
21
21
|
|
22
22
|
describe '.opts_parse' do
|
23
23
|
it 'should find the valid options' do
|
24
|
-
o =
|
24
|
+
o = %q( private:true team:heckman Bacon:always bacon:sometimes string1:"something here" string2:'something else')
|
25
25
|
co = opts_parse(o)
|
26
26
|
expect(co).to be_an_instance_of Hash
|
27
|
-
expect(co
|
28
|
-
expect(co
|
27
|
+
expect(co.key?(:Bacon)).to be_falsey
|
28
|
+
expect(co.key?(:bacon)).to be_truthy
|
29
29
|
expect(co[:bacon]).to eql 'always' # of course it's always
|
30
|
-
|
31
|
-
end
|
32
|
-
|
33
|
-
describe '.e_opts_parse' do
|
34
|
-
it 'should find the valid options' do
|
35
|
-
o = %q( private:true team:heckman bacon:always bacon:sometimes string1:"something here" string2:'something else')
|
36
|
-
co = e_opts_parse(o)
|
37
|
-
expect(co).to be_an_instance_of Hash
|
30
|
+
expect(co[:bacon]).to_not eql 'sometimes'
|
38
31
|
expect(co[:private]).to eql 'true'
|
39
32
|
expect(co[:team]).to eql 'heckman'
|
40
|
-
expect(co[:bacon]).to eql 'always' # of course it's always
|
41
33
|
expect(co[:string1]).to eql 'something here'
|
42
34
|
expect(co[:string2]).to eql 'something else'
|
43
35
|
end
|
44
36
|
end
|
37
|
+
|
38
|
+
describe '.to_i_if_numeric' do
|
39
|
+
context 'when value is a number' do
|
40
|
+
subject { to_i_if_numeric('42') }
|
41
|
+
it { should eql 42 }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when value is not a number' do
|
45
|
+
let(:val) { 'hello' }
|
46
|
+
subject { to_i_if_numeric(val) }
|
47
|
+
it { should eql val }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '.symbolize_opt_key' do
|
52
|
+
it 'should return an Array with the downcased/symblized key' do
|
53
|
+
kv = %w(Hello! ohai)
|
54
|
+
a = symbolize_opt_key(*kv)
|
55
|
+
expect(a).to be_an_instance_of Array
|
56
|
+
expect(a[0]).to eql kv[0].downcase.to_sym
|
57
|
+
expect(a[1]).to eql kv[1]
|
58
|
+
end
|
59
|
+
end
|
45
60
|
end
|
@@ -44,50 +44,6 @@ describe LitaGithub::R do
|
|
44
44
|
describe '::OPT_REGEX' do
|
45
45
|
subject { LitaGithub::R::OPT_REGEX }
|
46
46
|
|
47
|
-
context 'it should match' do
|
48
|
-
it 'test:pass' do
|
49
|
-
s = ' test:pass'
|
50
|
-
m = s.scan(subject).flatten.map(&:strip)
|
51
|
-
expect(m).to eql ['test:pass']
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'test7_pass:pAss_test' do
|
55
|
-
s = ' test7_pass:pAss_test'
|
56
|
-
m = s.scan(subject).flatten.map(&:strip)
|
57
|
-
expect(m).to eql ['test7_pass:pAss_test']
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'test:pass bacon:always test:coverage' do
|
61
|
-
s = ' test:pass bacon:always test:coverage'
|
62
|
-
m = s.scan(subject).flatten.map(&:strip)
|
63
|
-
expect(m).to eql ['test:pass', 'bacon:always', 'test:coverage']
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context 'it should not match' do
|
68
|
-
it 'test-stuff:fail' do
|
69
|
-
s = ' test-stuff:fail'
|
70
|
-
m = s.scan(subject).flatten
|
71
|
-
expect(m).to be_empty
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'test: fail' do
|
75
|
-
s = ' test: fail'
|
76
|
-
m = s.scan(subject).flatten
|
77
|
-
expect(m).to be_empty
|
78
|
-
end
|
79
|
-
|
80
|
-
it 'test:fail (no leading space)' do
|
81
|
-
s = 'test:fail'
|
82
|
-
m = s.scan(subject).flatten
|
83
|
-
expect(m).to be_empty
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
describe '::E_OPT_REGEX' do
|
89
|
-
subject { LitaGithub::R::E_OPT_REGEX }
|
90
|
-
|
91
47
|
context 'it should match' do
|
92
48
|
it 'test:pass' do
|
93
49
|
s = ' test:pass'
|
@@ -18,23 +18,23 @@ describe LitaGithub do
|
|
18
18
|
describe '::VERSION' do
|
19
19
|
subject { LitaGithub::VERSION }
|
20
20
|
it { should be_an_instance_of String }
|
21
|
-
it { should match(/\d+\.\d+\.\d+(?:\-[a-zA-Z0-9_\.\-])?/) }
|
21
|
+
it { should match(/\d+\.\d+\.\d+(?:\-[a-zA-Z0-9_\.\-]+)?/) }
|
22
22
|
end
|
23
23
|
|
24
|
-
describe '::
|
25
|
-
subject { LitaGithub::
|
24
|
+
describe '::MAJOR_VERSION' do
|
25
|
+
subject { LitaGithub::MAJOR_VERSION }
|
26
26
|
it { should be_an_instance_of Fixnum }
|
27
27
|
it { should be >= 0 }
|
28
28
|
end
|
29
29
|
|
30
|
-
describe '::
|
31
|
-
subject { LitaGithub::
|
30
|
+
describe '::MINOR_VERSION' do
|
31
|
+
subject { LitaGithub::MINOR_VERSION }
|
32
32
|
it { should be_an_instance_of Fixnum }
|
33
33
|
it { should be >= 0 }
|
34
34
|
end
|
35
35
|
|
36
|
-
describe '::
|
37
|
-
subject { LitaGithub::
|
36
|
+
describe '::REVISION' do
|
37
|
+
subject { LitaGithub::REVISION }
|
38
38
|
it { should be_an_instance_of Fixnum }
|
39
39
|
it { should be >= 0 }
|
40
40
|
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
# -*- coding: UTF-8 -*-
|
2
|
+
#
|
3
|
+
# Copyright 2014 PagerDuty, Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'spec_helper'
|
18
|
+
|
19
|
+
describe Lita::Handlers::GithubIssues, lita_handler: true do
|
20
|
+
# issues_list command routing
|
21
|
+
it { routes_command('gh issues GrapeDuty/lita-test').to(:issues_list) }
|
22
|
+
it { routes_command('gh issues lita-test').to(:issues_list) }
|
23
|
+
it { routes_command('gh issues lita-test key:value keys:"values"').to(:issues_list) }
|
24
|
+
it { routes_command('gh repo issues GrapeDuty/lita-test').to(:issues_list) }
|
25
|
+
it { routes_command('gh repo issues lita-test').to(:issues_list) }
|
26
|
+
it { routes_command('gh repo issues lita-test key:value keys:"values"').to(:issues_list) }
|
27
|
+
|
28
|
+
let(:gh_org) { 'GapeDuty' }
|
29
|
+
let(:gh_repo) { 'lita-test' }
|
30
|
+
let(:github_issues) { Lita::Handlers::GithubIssues.new('robot') }
|
31
|
+
|
32
|
+
describe '.validate_list_opts' do
|
33
|
+
let(:good_opts) { { state: 'open', sort: 'updated', direction: 'asc' } }
|
34
|
+
let(:bad_opts) { Hash.new('sometestval').merge(state: 'shipped', sort: 'most code', direction: 'backwards, yo') }
|
35
|
+
let(:bad_state) { good_opts.merge(state: 'something') }
|
36
|
+
let(:bad_sort) { good_opts.merge(sort: 'something') }
|
37
|
+
let(:bad_direction) { good_opts.merge(direction: 'backwards, yo') }
|
38
|
+
let(:io_header) { "Invalid option(s):\n" }
|
39
|
+
|
40
|
+
context 'when all options are good' do
|
41
|
+
it 'should reply with a string' do
|
42
|
+
expect(github_issues.send(:validate_list_opts, good_opts)).to be_an_instance_of String
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should reply with empty string' do
|
46
|
+
expect(github_issues.send(:validate_list_opts, good_opts)).to be_empty
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when :state is invalid' do
|
51
|
+
it 'should return a string containing a valid error message' do
|
52
|
+
r = github_issues.send(:validate_list_opts, bad_state)
|
53
|
+
expect(r).to eql "#{io_header}Issues can be one of the following states: 'open', 'closed', or 'all'\n"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when :sort is invalid' do
|
58
|
+
it 'should return a string containing a valid error message' do
|
59
|
+
r = github_issues.send(:validate_list_opts, bad_sort)
|
60
|
+
expect(r).to eql "#{io_header}Issues can be sorted by one of the following: 'created', 'updated', 'comments'\n"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when :direction is invalid' do
|
65
|
+
it 'should return a string containing a valid error message' do
|
66
|
+
r = github_issues.send(:validate_list_opts, bad_direction)
|
67
|
+
expect(r).to eql "#{io_header}Issues can be ordered either 'asc' (ascending) or 'desc' (descending)\n"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when the user did EVERYTHING wrong' do
|
72
|
+
it 'should return a string containing all the error messages' do
|
73
|
+
r = github_issues.send(:validate_list_opts, bad_opts)
|
74
|
+
expect(r).to eql(
|
75
|
+
"#{io_header}Issues can be one of the following states: 'open', 'closed', or 'all'\n" \
|
76
|
+
"Issues can be sorted by one of the following: 'created', 'updated', 'comments'\n" \
|
77
|
+
"Issues can be ordered either 'asc' (ascending) or 'desc' (descending)\n"
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '.issues_list' do
|
84
|
+
before do
|
85
|
+
issues = [
|
86
|
+
{
|
87
|
+
number: 42, title: 'XYXYXYXY', html_url: 'https://github.com/GrapeDuty/lita-test/issues/42',
|
88
|
+
user: { login: 'theckman' }
|
89
|
+
},
|
90
|
+
{
|
91
|
+
number: 84, title: 'YZYZYZYZ', html_url: 'https://github.com/GrapeDuty/lita-test/issues/84',
|
92
|
+
user: { login: 'theckman' }
|
93
|
+
},
|
94
|
+
{
|
95
|
+
number: 99, title: 'NO', html_url: 'https://github.com/GrapeDuty/lita-test/issues/99',
|
96
|
+
user: { login: 'theckman' }, pull_request: {}
|
97
|
+
}
|
98
|
+
]
|
99
|
+
@octo_obj = double('Octokit::Client', list_issues: issues)
|
100
|
+
allow(github_issues).to receive(:octo).and_return(@octo_obj)
|
101
|
+
allow(github_issues).to receive(:repo?).and_return(true)
|
102
|
+
allow(github_issues).to receive(:validate_list_opts).and_return('')
|
103
|
+
end
|
104
|
+
|
105
|
+
context 'when all goes well' do
|
106
|
+
it 'should reply with the list of issues' do
|
107
|
+
send_command('gh issues GrapeDuty/lita-test')
|
108
|
+
r = replies.last
|
109
|
+
expect(r).to eql "Showing 2 issue(s) for GrapeDuty/lita-test
|
110
|
+
GrapeDuty/lita-test #42: 'XYXYXYXY' opened by theckman :: https://github.com/GrapeDuty/lita-test/issues/42
|
111
|
+
GrapeDuty/lita-test #84: 'YZYZYZYZ' opened by theckman :: https://github.com/GrapeDuty/lita-test/issues/84
|
112
|
+
"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'when there are no issues' do
|
117
|
+
before { allow(@octo_obj).to receive(:list_issues).and_return([]) }
|
118
|
+
|
119
|
+
it 'should return message indicating no issues' do
|
120
|
+
send_command('gh issues GrapeDuty/lita-test')
|
121
|
+
expect(replies.last).to eql 'There are no open issues for GrapeDuty/lita-test'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'when there is an option that fails validation' do
|
126
|
+
before { allow(github_issues).to receive(:validate_list_opts).and_return('sadpanda') }
|
127
|
+
|
128
|
+
it 'should reply with the response from .validate_list_opts' do
|
129
|
+
send_command('gh issues GrapeDuty/lita-test')
|
130
|
+
expect(replies.last).to eql 'sadpanda'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when the repo is not found' do
|
135
|
+
before { allow(github_issues).to receive(:repo?).and_return(false) }
|
136
|
+
|
137
|
+
it 'should reply with response indicating repo not found' do
|
138
|
+
send_command('gh issues GrapeDuty/lita-test')
|
139
|
+
expect(replies.last).to eql 'That repo (GrapeDuty/lita-test) was not found'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'when an option passes validation, but fails from GitHub' do
|
144
|
+
before { allow(@octo_obj).to receive(:list_issues).and_raise(Octokit::UnprocessableEntity.new) }
|
145
|
+
|
146
|
+
it 'should reply indicating an issue was hit and include the exception message' do
|
147
|
+
send_command('gh issues GrapeDuty/lita-test')
|
148
|
+
expect(replies.last).to eql "An invalid option was provided, here's the error from Octokit:
|
149
|
+
Octokit::UnprocessableEntity"
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'when there is a general error when calling GitHub' do
|
154
|
+
before { allow(@octo_obj).to receive(:list_issues).and_raise(StandardError.new) }
|
155
|
+
|
156
|
+
it 'should reply indicating an issue was hit and include the exception message' do
|
157
|
+
send_command('gh issues GrapeDuty/lita-test')
|
158
|
+
expect(replies.last).to eql 'I had a problem :( ... StandardError'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
@@ -29,7 +29,30 @@ describe Lita::Handlers::GithubOrg, lita_handler: true do
|
|
29
29
|
it { routes_command('gh org team add GrapeDuty name:"All Staff" perms:pull').to(:org_team_add) }
|
30
30
|
it { routes_command('gh org team add name:"All Staff" perms:pull').to(:org_team_add) }
|
31
31
|
|
32
|
+
# org_team_rm routing
|
33
|
+
it { routes_command('gh org team rm GrapeDuty ops').to(:org_team_rm) }
|
34
|
+
it { routes_command('gh org team rm GrapeDuty 42').to(:org_team_rm) }
|
35
|
+
it { routes_command('gh org team rm ops').to(:org_team_rm) }
|
36
|
+
it { routes_command('gh org team rm 42').to(:org_team_rm) }
|
37
|
+
|
38
|
+
# org_user_add routing
|
39
|
+
it { routes_command('gh org user add GrapeDuty heckmantest theckman').to(:org_user_add) }
|
40
|
+
it { routes_command('gh org user add heckmantest theckman').to(:org_user_add) }
|
41
|
+
it { routes_command('gh org user add GrapeDuty 42 theckman').to(:org_user_add) }
|
42
|
+
it { routes_command('gh org user add 42 theckman').to(:org_user_add) }
|
43
|
+
|
44
|
+
# org_user_rm routing
|
45
|
+
it { routes_command('gh org user rm GrapeDuty heckmantest theckman').to(:org_user_rm) }
|
46
|
+
it { routes_command('gh org user rm heckmantest theckman').to(:org_user_rm) }
|
47
|
+
it { routes_command('gh org user rm GrapeDuty 42 theckman').to(:org_user_rm) }
|
48
|
+
it { routes_command('gh org user rm 42 theckman').to(:org_user_rm) }
|
49
|
+
|
50
|
+
# org_eject_user routing
|
51
|
+
it { routes_command('gh org eject GrapeDuty theckman').to(:org_eject_user) }
|
52
|
+
it { routes_command('gh org eject theckman').to(:org_eject_user) }
|
53
|
+
|
32
54
|
let(:github_org) { Lita::Handlers::GithubOrg.new('robot') }
|
55
|
+
let(:disabled_err) { 'Sorry, this function has either been disabled or not enabled in the config' }
|
33
56
|
|
34
57
|
####
|
35
58
|
# Helper Methods
|
@@ -165,7 +188,7 @@ Name: HeckmanTest, Slug: heckmantest, ID: 42, Perms: push
|
|
165
188
|
|
166
189
|
it 'should return the method disabled error' do
|
167
190
|
send_command('gh org team add GrapeDuty name:"HeckmanTest" perms:pull')
|
168
|
-
expect(replies.last).to eql
|
191
|
+
expect(replies.last).to eql disabled_err
|
169
192
|
end
|
170
193
|
end
|
171
194
|
|
@@ -226,7 +249,7 @@ Missing the perms option
|
|
226
249
|
|
227
250
|
it 'should return the method disabled error' do
|
228
251
|
send_command('gh org team rm GrapeDuty 42')
|
229
|
-
expect(replies.last).to eql
|
252
|
+
expect(replies.last).to eql disabled_err
|
230
253
|
end
|
231
254
|
end
|
232
255
|
|
@@ -249,4 +272,238 @@ Missing the perms option
|
|
249
272
|
end
|
250
273
|
end
|
251
274
|
end
|
275
|
+
|
276
|
+
describe '.org_eject_user' do
|
277
|
+
before do
|
278
|
+
@self_user = {
|
279
|
+
name: 'OfficerURL',
|
280
|
+
login: 'OfficerURL',
|
281
|
+
id: 8_525_060
|
282
|
+
}
|
283
|
+
@t_user = {
|
284
|
+
name: 'Tim Heckman',
|
285
|
+
login: 'theckman',
|
286
|
+
id: 787_332
|
287
|
+
}
|
288
|
+
@octo_obj = double('Octokit::Client', remove_organization_member: true)
|
289
|
+
@conf_obj = double('Lita::Config', default_org: 'GrapeDuty')
|
290
|
+
allow(@octo_obj).to receive(:user).with(no_args).and_return(@self_user)
|
291
|
+
allow(@octo_obj).to receive(:user).with('theckman').and_return(@t_user)
|
292
|
+
allow(github_org).to receive(:func_disabled?).and_return(false)
|
293
|
+
allow(github_org).to receive(:octo).and_return(@octo_obj)
|
294
|
+
allow(github_org).to receive(:cofig).and_return(@conf_obj)
|
295
|
+
end
|
296
|
+
|
297
|
+
context 'when all goes well' do
|
298
|
+
it 'should reply that the user was ejected' do
|
299
|
+
send_command('gh org eject GrapeDuty theckman')
|
300
|
+
expect(replies.last).to eql 'Ejected theckman out of GrapeDuty'
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
context 'when the method is disabled' do
|
305
|
+
before { allow(github_org).to receive(:func_disabled?).and_return(true) }
|
306
|
+
|
307
|
+
it 'should return the method disabled error' do
|
308
|
+
send_command('gh org eject GrapeDuty theckman')
|
309
|
+
expect(replies.last).to eql disabled_err
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
context 'when the user is the same user' do
|
314
|
+
before { allow(@octo_obj).to receive(:user).with('OfficerURL').and_return(@self_user) }
|
315
|
+
|
316
|
+
it 'should return the gtfo error message' do
|
317
|
+
send_command('gh org eject GrapeDuty OfficerURL')
|
318
|
+
expect(replies.last).to eql "No...\n\nಠ_ಠ"
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
context 'when the user is not found' do
|
323
|
+
before { allow(@octo_obj).to receive(:user).with('theckman').and_raise(Octokit::NotFound.new) }
|
324
|
+
|
325
|
+
it 'should reply with the user not found message' do
|
326
|
+
send_command('gh org eject GrapeDuty theckman')
|
327
|
+
expect(replies.last).to eql 'Unable to find the GitHub user theckman'
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
context 'when the Octokit client call bombs' do
|
332
|
+
before { allow(@octo_obj).to receive(:remove_organization_member).and_raise(Octokit::NotFound.new) }
|
333
|
+
|
334
|
+
it 'should return the *boom* error' do
|
335
|
+
send_command('gh org eject GrapeDuty theckman')
|
336
|
+
expect(replies.last).to eql 'I had a problem :( ... Octokit::NotFound'
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
context 'when the action fails' do
|
341
|
+
before { allow(@octo_obj).to receive(:remove_organization_member).and_return(false) }
|
342
|
+
|
343
|
+
it 'should respond with the failure message' do
|
344
|
+
send_command('gh org eject GrapeDuty theckman')
|
345
|
+
expect(replies.last).to eql 'Failed to eject the user from the organization for an unknown reason'
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
describe '.org_user_add' do
|
351
|
+
before do
|
352
|
+
@self_user = {
|
353
|
+
name: 'OfficerURL',
|
354
|
+
login: 'OfficerURL',
|
355
|
+
id: 8_525_060
|
356
|
+
}
|
357
|
+
@t_user = {
|
358
|
+
name: 'Tim Heckman',
|
359
|
+
login: 'theckman',
|
360
|
+
id: 787_332
|
361
|
+
}
|
362
|
+
@team = {
|
363
|
+
name: 'HeckmanTest',
|
364
|
+
id: 42,
|
365
|
+
slug: 'heckmantest'
|
366
|
+
}
|
367
|
+
@octo_obj = double('Octokit::Client', team: @team, add_team_membership: true)
|
368
|
+
@conf_obj = double('Lita::Config', default_org: 'GrapeDuty')
|
369
|
+
allow(@octo_obj).to receive(:user).with(no_args).and_return(@self_user)
|
370
|
+
allow(@octo_obj).to receive(:user).with('theckman').and_return(@t_user)
|
371
|
+
allow(github_org).to receive(:func_disabled?).and_return(false)
|
372
|
+
allow(github_org).to receive(:octo).and_return(@octo_obj)
|
373
|
+
allow(github_org).to receive(:cofig).and_return(@conf_obj)
|
374
|
+
allow(github_org).to receive(:team_id).and_return(42)
|
375
|
+
end
|
376
|
+
|
377
|
+
context 'when all goes well' do
|
378
|
+
it 'should respond with a successful add' do
|
379
|
+
send_command('gh org user add GrapeDuty heckmantest theckman')
|
380
|
+
expect(replies.last).to eql "theckman has been added to the 'GrapeDuty/HeckmanTest' (heckmantest) team"
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
context 'when the method is disabled' do
|
385
|
+
before { allow(github_org).to receive(:func_disabled?).and_return(true) }
|
386
|
+
|
387
|
+
it 'should return the method disabled error' do
|
388
|
+
send_command('gh org user add GrapeDuty heckmantest theckman')
|
389
|
+
expect(replies.last).to eql disabled_err
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
context 'when the user is the same user' do
|
394
|
+
before { allow(@octo_obj).to receive(:user).with('OfficerURL').and_return(@self_user) }
|
395
|
+
|
396
|
+
it 'should return the gtfo error message' do
|
397
|
+
send_command('gh org user add GrapeDuty heckmantest OfficerURL')
|
398
|
+
expect(replies.last).to eql "No...\n\nಠ_ಠ"
|
399
|
+
end
|
400
|
+
end
|
401
|
+
|
402
|
+
context 'when the user is not found' do
|
403
|
+
before { allow(@octo_obj).to receive(:user).with('theckman').and_raise(Octokit::NotFound.new) }
|
404
|
+
|
405
|
+
it 'should reply with the user not found message' do
|
406
|
+
send_command('gh org user add GrapeDuty heckmantest theckman')
|
407
|
+
expect(replies.last).to eql 'Unable to find the GitHub user theckman'
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
context 'when the team is not found' do
|
412
|
+
before { allow(@octo_obj).to receive(:team).with(42).and_raise(Octokit::NotFound.new) }
|
413
|
+
|
414
|
+
it 'should reply with the team not found message' do
|
415
|
+
send_command('gh org user add GrapeDuty heckmantest theckman')
|
416
|
+
expect(replies.last).to eql 'Unable to match any teams based on: heckmantest'
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
context 'when an error is hit adding the team membership' do
|
421
|
+
before { allow(@octo_obj).to receive(:add_team_membership).with(42, 'theckman').and_raise(StandardError.new) }
|
422
|
+
|
423
|
+
it 'should reply with the *boom* message' do
|
424
|
+
send_command('gh org user add GrapeDuty heckmantest theckman')
|
425
|
+
expect(replies.last).to eql 'I had a problem :( ... StandardError'
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
|
430
|
+
describe '.org_user_rm' do
|
431
|
+
before do
|
432
|
+
@self_user = {
|
433
|
+
name: 'OfficerURL',
|
434
|
+
login: 'OfficerURL',
|
435
|
+
id: 8_525_060
|
436
|
+
}
|
437
|
+
@t_user = {
|
438
|
+
name: 'Tim Heckman',
|
439
|
+
login: 'theckman',
|
440
|
+
id: 787_332
|
441
|
+
}
|
442
|
+
@team = {
|
443
|
+
name: 'HeckmanTest',
|
444
|
+
id: 42,
|
445
|
+
slug: 'heckmantest'
|
446
|
+
}
|
447
|
+
@octo_obj = double('Octokit::Client', team: @team, remove_team_member: true)
|
448
|
+
@conf_obj = double('Lita::Config', default_org: 'GrapeDuty')
|
449
|
+
allow(@octo_obj).to receive(:user).with(no_args).and_return(@self_user)
|
450
|
+
allow(@octo_obj).to receive(:user).with('theckman').and_return(@t_user)
|
451
|
+
allow(github_org).to receive(:func_disabled?).and_return(false)
|
452
|
+
allow(github_org).to receive(:octo).and_return(@octo_obj)
|
453
|
+
allow(github_org).to receive(:cofig).and_return(@conf_obj)
|
454
|
+
allow(github_org).to receive(:team_id).and_return(42)
|
455
|
+
end
|
456
|
+
|
457
|
+
context 'when all goes well' do
|
458
|
+
it 'should respond with a successful removal' do
|
459
|
+
send_command('gh org user rm GrapeDuty heckmantest theckman')
|
460
|
+
expect(replies.last).to eql "theckman has been removed from the 'GrapeDuty/HeckmanTest' (heckmantest) team"
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
context 'when the method is disabled' do
|
465
|
+
before { allow(github_org).to receive(:func_disabled?).and_return(true) }
|
466
|
+
|
467
|
+
it 'should return the method disabled error' do
|
468
|
+
send_command('gh org user rm GrapeDuty heckmantest theckman')
|
469
|
+
expect(replies.last).to eql disabled_err
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
context 'when the user is the same user' do
|
474
|
+
before { allow(@octo_obj).to receive(:user).with('OfficerURL').and_return(@self_user) }
|
475
|
+
|
476
|
+
it 'should return the gtfo error message' do
|
477
|
+
send_command('gh org user rm GrapeDuty heckmantest OfficerURL')
|
478
|
+
expect(replies.last).to eql "No...\n\nಠ_ಠ"
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
context 'when the user is not found' do
|
483
|
+
before { allow(@octo_obj).to receive(:user).with('theckman').and_raise(Octokit::NotFound.new) }
|
484
|
+
|
485
|
+
it 'should reply with the user not found message' do
|
486
|
+
send_command('gh org user rm GrapeDuty heckmantest theckman')
|
487
|
+
expect(replies.last).to eql 'Unable to find the GitHub user theckman'
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
context 'when the team is not found' do
|
492
|
+
before { allow(@octo_obj).to receive(:team).with(42).and_raise(Octokit::NotFound.new) }
|
493
|
+
|
494
|
+
it 'should reply with the team not found message' do
|
495
|
+
send_command('gh org user rm GrapeDuty heckmantest theckman')
|
496
|
+
expect(replies.last).to eql 'Unable to match any teams based on: heckmantest'
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
context 'when an error is hit adding the team membership' do
|
501
|
+
before { allow(@octo_obj).to receive(:remove_team_member).with(42, 'theckman').and_raise(StandardError.new) }
|
502
|
+
|
503
|
+
it 'should reply with the *boom* message' do
|
504
|
+
send_command('gh org user rm GrapeDuty heckmantest theckman')
|
505
|
+
expect(replies.last).to eql 'I had a problem :( ... StandardError'
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|
252
509
|
end
|