lita-hcadmin 0.3.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.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/.rspec +2 -0
- data/.rubocop.yml +28 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +41 -0
- data/Gemfile +10 -0
- data/LICENSE.md +21 -0
- data/README.md +163 -0
- data/Rakefile +26 -0
- data/lib/lita/handlers/hcadmin.rb +441 -0
- data/lib/lita-hcadmin.rb +13 -0
- data/lita-hcadmin.gemspec +25 -0
- data/locales/en.yml +4 -0
- data/spec/fixtures/bad_gateway.txt +1 -0
- data/spec/fixtures/room_data.json +40 -0
- data/spec/fixtures/room_v2_data.json +45 -0
- data/spec/fixtures/stats.json +6 -0
- data/spec/fixtures/status.json +3 -0
- data/spec/fixtures/user_data.json +17 -0
- data/spec/fixtures/user_v2_data.json +39 -0
- data/spec/fixtures/user_v2_notreal_email.json +7 -0
- data/spec/fixtures/users_data.json +49 -0
- data/spec/fixtures/v2_room_not_found.json +7 -0
- data/spec/fixtures/v2_user_data.json +41 -0
- data/spec/fixtures/v2_user_not_found.json +7 -0
- data/spec/lita/handlers/hcadmin_spec.rb +561 -0
- data/spec/spec_helper.rb +17 -0
- data/templates/.gitkeep +0 -0
- metadata +186 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
{
|
2
|
+
"users": [
|
3
|
+
{
|
4
|
+
"user_id": 11,
|
5
|
+
"email": "user11@company.com",
|
6
|
+
"is_deleted": 0,
|
7
|
+
"is_group_admin": 0,
|
8
|
+
"name": "User 11",
|
9
|
+
"mention_name": "User11",
|
10
|
+
"photo_url": "https://secure.gravatar.com/avatar/0fcefe0e34ef508390c2cd8ecd3db787?s=125&d=https%3A%2F%2Fwww.hipchat.com%2Fimg%2Fsilhouette_125.png&r=g",
|
11
|
+
"last_active": 88,
|
12
|
+
"created": 55,
|
13
|
+
"status": "offline",
|
14
|
+
"status_message": "",
|
15
|
+
"timezone": "America/Chicago",
|
16
|
+
"title": "Analyst 11"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"user_id": 12,
|
20
|
+
"email": "user11@company.com",
|
21
|
+
"is_deleted": 0,
|
22
|
+
"is_group_admin": 0,
|
23
|
+
"name": "User 11",
|
24
|
+
"mention_name": "User11",
|
25
|
+
"photo_url": "https://secure.gravatar.com/avatar/0fcefe0e34ef508390c2cd8ecd3db787?s=125&d=https%3A%2F%2Fwww.hipchat.com%2Fimg%2Fsilhouette_125.png&r=g",
|
26
|
+
"last_active": 88,
|
27
|
+
"created": 55,
|
28
|
+
"status": "offline",
|
29
|
+
"status_message": "",
|
30
|
+
"timezone": "America/Chicago",
|
31
|
+
"title": "Analyst 11"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"user_id": 13,
|
35
|
+
"email": "user11@company.com",
|
36
|
+
"is_deleted": 0,
|
37
|
+
"is_group_admin": 0,
|
38
|
+
"name": "User 11",
|
39
|
+
"mention_name": "User11",
|
40
|
+
"photo_url": "https://secure.gravatar.com/avatar/0fcefe0e34ef508390c2cd8ecd3db787?s=125&d=https%3A%2F%2Fwww.hipchat.com%2Fimg%2Fsilhouette_125.png&r=g",
|
41
|
+
"last_active": 88,
|
42
|
+
"created": 55,
|
43
|
+
"status": "offline",
|
44
|
+
"status_message": "",
|
45
|
+
"timezone": "America/Chicago",
|
46
|
+
"title": "Analyst 11"
|
47
|
+
}
|
48
|
+
]
|
49
|
+
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
{
|
3
|
+
"created": "2014-09-19T23:26:09+00:00",
|
4
|
+
"email": "dummy.account@target.com",
|
5
|
+
"group":
|
6
|
+
{
|
7
|
+
"id": 9876,
|
8
|
+
"links":
|
9
|
+
{
|
10
|
+
"self": "https://api.hipchat.com/v2/group/1234"
|
11
|
+
},
|
12
|
+
"name": "Tgtbullseye"
|
13
|
+
},
|
14
|
+
"id": 11,
|
15
|
+
"is_deleted": false,
|
16
|
+
"is_group_admin": true,
|
17
|
+
"is_guest": false,
|
18
|
+
"last_active": "2016-02-19T16:04:04+0000",
|
19
|
+
"links":
|
20
|
+
{
|
21
|
+
"self": "https://api.hipchat.com/v2/user/11"
|
22
|
+
},
|
23
|
+
"mention_name": "DummyAccount",
|
24
|
+
"name": "Dummy Account",
|
25
|
+
"photo_url": "https://s3.amazonaws.com/uploads.hipchat.com/photos/11/nope.jpg",
|
26
|
+
"presence":
|
27
|
+
{
|
28
|
+
"client":
|
29
|
+
{
|
30
|
+
"type": "http://hipchat.com/client/mac/macweb",
|
31
|
+
"version": "519"
|
32
|
+
},
|
33
|
+
"is_online": true,
|
34
|
+
"show": "chat"
|
35
|
+
},
|
36
|
+
"roles": ["owner", "admin", "user"],
|
37
|
+
"timezone": "America/Chicago",
|
38
|
+
"title": "Chairman of Dummy",
|
39
|
+
"version": "NMJP5APO",
|
40
|
+
"xmpp_jid": "1234_11@chat.hipchat.com"
|
41
|
+
}
|
@@ -0,0 +1,561 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'json'
|
3
|
+
require 'net/smtp'
|
4
|
+
|
5
|
+
describe Lita::Handlers::Hcadmin, lita_handler: true do
|
6
|
+
subject { described_class.new(robot) }
|
7
|
+
let(:room_json) { File.read(File.join('spec', 'fixtures', 'room_data.json')) }
|
8
|
+
let(:room_v2_json) { File.read(File.join('spec', 'fixtures', 'room_v2_data.json')) }
|
9
|
+
let(:user_json) { File.read(File.join('spec', 'fixtures', 'user_data.json')) }
|
10
|
+
let(:all_user_json) { File.read(File.join('spec', 'fixtures', 'users_data.json')) }
|
11
|
+
let(:user_v2_json) { File.read(File.join('spec', 'fixtures', 'v2_user_data.json')) }
|
12
|
+
let(:user_v2_noaccount) { File.read(File.join('spec', 'fixtures', 'user_v2_notreal_email.json')) }
|
13
|
+
let(:user_v2_not_found) { File.read(File.join('spec', 'fixtures', 'v2_user_not_found.json')) }
|
14
|
+
let(:room_v2_not_found) { File.read(File.join('spec', 'fixtures', 'v2_room_not_found.json')) }
|
15
|
+
let(:group_stats) { File.read(File.join('spec', 'fixtures', 'stats.json')) }
|
16
|
+
let(:status_json) { File.read(File.join('spec', 'fixtures', 'status.json')) }
|
17
|
+
let(:bad_gateway) { File.read(File.join('spec', 'fixtures', 'bad_gateway.txt')) }
|
18
|
+
let(:http_proxy) { 'http://proxy-proxy.company.com:3128' }
|
19
|
+
let(:url) { 'https://api.hipchat.com/v1/rooms/list?auth_token=testtoken&format=json' }
|
20
|
+
let(:mock_smtp) { mock('smtp') }
|
21
|
+
|
22
|
+
let(:room_change_admin_member) { Lita::User.create(55, name: 'TestAdmin') }
|
23
|
+
let(:regular_member) { Lita::User.create(66, name: 'RegularMember') }
|
24
|
+
|
25
|
+
let(:fetch_api_data) { Hcadmin.fetch_data('v1', 'foo', 'bar') }
|
26
|
+
|
27
|
+
before do
|
28
|
+
Lita.configure do |config|
|
29
|
+
config.handlers.hcadmin.v1_admin_token = '123'
|
30
|
+
config.handlers.hcadmin.v1_notify_token = '321'
|
31
|
+
config.handlers.hcadmin.v2_admin_token = 'abc'
|
32
|
+
config.handlers.hcadmin.http_proxy = 'http://proxy-proxy.company.com:3128'
|
33
|
+
config.handlers.hcadmin.email_dist_list = 'blahblah@company.com'
|
34
|
+
config.handlers.hcadmin.smtp_server = 'smtp.mailserverstuffandthings.com'
|
35
|
+
config.handlers.hcadmin.room_change_admins = ['TestAdmin', 'AnotherAdmin'] # rubocop:disable Style/WordArray
|
36
|
+
config.handlers.hcadmin.account_name = 'TestHipChatAccount'
|
37
|
+
config.handlers.hcadmin.email_domain_name = ['@company.com', '@network.net']
|
38
|
+
config.handlers.hcadmin.http_logging = false
|
39
|
+
end
|
40
|
+
|
41
|
+
stub_request(:get, 'https://api.hipchat.com/v1/rooms/list?auth_token=123&format=json')
|
42
|
+
.with(
|
43
|
+
headers: {
|
44
|
+
'Accept' => 'application/json',
|
45
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
46
|
+
'Content-Type' => 'application/json',
|
47
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
48
|
+
.to_return(
|
49
|
+
status: 200,
|
50
|
+
body: room_json,
|
51
|
+
headers: {}
|
52
|
+
)
|
53
|
+
|
54
|
+
stub_request(:get, 'https://api.hipchat.com/v1/users/show?auth_token=123&format=json&user_id=2341755')
|
55
|
+
.with(
|
56
|
+
headers: {
|
57
|
+
'Accept' => 'application/json',
|
58
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
59
|
+
'Content-Type' => 'application/json',
|
60
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
61
|
+
.to_return(
|
62
|
+
status: 200,
|
63
|
+
body: user_json,
|
64
|
+
headers: {}
|
65
|
+
)
|
66
|
+
|
67
|
+
stub_request(:get, 'https://api.hipchat.com/v2/health-check')
|
68
|
+
.with(
|
69
|
+
headers: {
|
70
|
+
'Accept' => 'application/json',
|
71
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
72
|
+
'Content-Type' => 'application/json',
|
73
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
74
|
+
.to_return(
|
75
|
+
status: 200,
|
76
|
+
body: status_json,
|
77
|
+
headers: {}
|
78
|
+
)
|
79
|
+
stub_request(:get, 'https://api.hipchat.com/v2/user/1234?auth_token=abc&format=json')
|
80
|
+
.with(
|
81
|
+
headers: {
|
82
|
+
'Accept' => 'application/json',
|
83
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
84
|
+
'Content-Type' => 'application/json',
|
85
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
86
|
+
.to_return(
|
87
|
+
status: 200,
|
88
|
+
body: user_v2_json,
|
89
|
+
headers: {}
|
90
|
+
)
|
91
|
+
stub_request(:get, 'https://api.hipchat.com/v2/user/@testmember?auth_token=abc&format=json')
|
92
|
+
.with(
|
93
|
+
headers: {
|
94
|
+
'Accept' => 'application/json',
|
95
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
96
|
+
'Content-Type' => 'application/json',
|
97
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
98
|
+
.to_return(
|
99
|
+
status: 200,
|
100
|
+
body: user_v2_not_found,
|
101
|
+
headers: {}
|
102
|
+
)
|
103
|
+
stub_request(:get, 'https://api.hipchat.com/v2/user/@realmember?auth_token=abc&format=json')
|
104
|
+
.with(
|
105
|
+
headers: {
|
106
|
+
'Accept' => 'application/json',
|
107
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
108
|
+
'Content-Type' => 'application/json',
|
109
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
110
|
+
.to_return(
|
111
|
+
status: 200,
|
112
|
+
body: user_v2_json,
|
113
|
+
headers: {}
|
114
|
+
)
|
115
|
+
|
116
|
+
stub_request(:get, 'https://api.hipchat.com/v2/room/foobar?auth_token=abc&format=json')
|
117
|
+
.with(
|
118
|
+
headers: {
|
119
|
+
'Accept' => 'application/json',
|
120
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
121
|
+
'Content-Type' => 'application/json',
|
122
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
123
|
+
.to_return(
|
124
|
+
status: 200,
|
125
|
+
body: room_v2_not_found,
|
126
|
+
headers: {}
|
127
|
+
)
|
128
|
+
|
129
|
+
stub_request(:get, 'https://api.hipchat.com/v2/room/realroom?auth_token=abc&format=json')
|
130
|
+
.with(
|
131
|
+
headers: {
|
132
|
+
'Accept' => 'application/json',
|
133
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
134
|
+
'Content-Type' => 'application/json',
|
135
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
136
|
+
.to_return(
|
137
|
+
status: 200,
|
138
|
+
body: room_v2_json,
|
139
|
+
headers: {}
|
140
|
+
)
|
141
|
+
stub_request(:put, 'https://api.hipchat.com/v2/room/1460619?auth_token=abc&format=json')
|
142
|
+
.with(
|
143
|
+
body: "{\"name\":\"Test Room @ Company.com\",\"privacy\":\"public\",\"is_archived\":false,\"is_guest_accessible\":false,\"topic\":\"Room for testing things\",\"owner\":{\"id\":\"11\"}}", # rubocop:disable Style/StringLiterals
|
144
|
+
headers: {
|
145
|
+
'Accept' => 'application/json',
|
146
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
147
|
+
'Content-Type' => 'application/json',
|
148
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
149
|
+
.to_return(
|
150
|
+
status: 204,
|
151
|
+
body: '',
|
152
|
+
headers: {}
|
153
|
+
)
|
154
|
+
|
155
|
+
stub_request(:put, 'https://api.hipchat.com/v2/room/1460619?auth_token=abc&format=json')
|
156
|
+
.with(
|
157
|
+
body: "{\"name\":\"Test Room @ Company.com\",\"privacy\":\"public\",\"is_archived\":false,\"is_guest_accessible\":false,\"topic\":\"Room for testing things\",\"owner\":{\"id\":\"66\"}}", # rubocop:disable Style/StringLiterals
|
158
|
+
headers: {
|
159
|
+
'Accept' => 'application/json',
|
160
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
161
|
+
'Content-Type' => 'application/json',
|
162
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
163
|
+
.to_return(
|
164
|
+
status: 204,
|
165
|
+
body: '',
|
166
|
+
headers: {}
|
167
|
+
)
|
168
|
+
stub_request(:get, 'https://api.hipchat.com/v2/room/real%20room?auth_token=abc&format=json')
|
169
|
+
.with(
|
170
|
+
headers: {
|
171
|
+
'Accept' => 'application/json',
|
172
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
173
|
+
'Content-Type' => 'application/json',
|
174
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
175
|
+
.to_return(
|
176
|
+
status: 200,
|
177
|
+
body: room_v2_json,
|
178
|
+
headers: {}
|
179
|
+
)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'routes the identify room owner command room name has spaces' do
|
183
|
+
is_expected.to route_command('identify room owner thisis a test').to(:identify_room_owner)
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'routes the identify room owner command room name in quotes' do
|
187
|
+
is_expected.to route_command('identify room owner "thisis a test"').to(:identify_room_owner)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'routes the identify room owner command room name has a @' do
|
191
|
+
is_expected.to route_command('identify room owner "thisis @ test"').to(:identify_room_owner)
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'routes the identify admins command' do
|
195
|
+
is_expected.to route_command('identify hipchat admins').to(:identify_hipchat_admins)
|
196
|
+
end
|
197
|
+
|
198
|
+
it 'routes the identify room count' do
|
199
|
+
is_expected.to route_command('identify room count').to(:identify_room_count)
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'routes the identify user count' do
|
203
|
+
is_expected.to route_command('identify user count').to(:identify_user_count)
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'routes the identify status check' do
|
207
|
+
is_expected.to route_command('identify status').to(:identify_status)
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'routes a sponsor a person request correctly' do
|
211
|
+
is_expected.to route_command('hipchat sponsor first.last@company.com').to(:hipchat_sponsor)
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'routes room change admin requests' do
|
215
|
+
is_expected.to route_command('identify room change admins').to(:identify_room_change_admins)
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'routes room owner change requests' do
|
219
|
+
is_expected.to route_command('room owner change mention_name room_name').to(:room_owner_change)
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'routes room unarchive requests' do
|
223
|
+
is_expected.to route_command('room unarchive room_name').to(:room_unarchive)
|
224
|
+
end
|
225
|
+
|
226
|
+
describe '#hipchat_sponsor' do
|
227
|
+
context 'validates the new account request is for a Target.com email address' do
|
228
|
+
it 'rejects non-Target.com email addresses' do
|
229
|
+
send_command('hipchat sponsor dummy@gmail.com')
|
230
|
+
expect(replies.last).to eq('The email address has to be one of: ["@company.com", "@network.net"]')
|
231
|
+
end
|
232
|
+
end
|
233
|
+
context 'hipchat account exists' do
|
234
|
+
before(:each) do
|
235
|
+
stub_request(:get, 'https://api.hipchat.com/v2/user/dummy.account@company.com?auth_token=abc&format=json')
|
236
|
+
.with(headers: { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Faraday v0.9.2' })
|
237
|
+
.to_return(status: 200, body: user_v2_json, headers: {})
|
238
|
+
end
|
239
|
+
|
240
|
+
it 'responds that the user exists if an ID is found' do
|
241
|
+
send_command('hipchat sponsor dummy.account@company.com')
|
242
|
+
expect(replies.last).to eq('The email address of dummy.account@company.com already has an account on TestHipChatAccount of 11')
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
context 'hipchat account does not exist' do
|
247
|
+
before(:each) do
|
248
|
+
stub_request(:get, 'https://api.hipchat.com/v2/user/dummy.account@company.com?auth_token=abc&format=json')
|
249
|
+
.with(headers: { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Faraday v0.9.2' })
|
250
|
+
.to_return(status: 200, body: user_v2_noaccount, headers: {})
|
251
|
+
allow(described_class).to receive(:send_mail).with('dummy.account@company.com', 'blahblah@company.com', 'dummyHipChatUser', 'smtp.mailserverstuffandthings.com').and_return('221')
|
252
|
+
allow(Net::SMTP).to receive(:start).with('smtp.mailserverstuffandthings.com').and_return('221')
|
253
|
+
end
|
254
|
+
it 'responds that the request is being sent to the defined admin room' do
|
255
|
+
send_command('hipchat sponsor dummy.account@company.com')
|
256
|
+
expect(replies.last).to eq('Message to admins sent')
|
257
|
+
end
|
258
|
+
end
|
259
|
+
it 'replies correctly when not using an approved email domain' do
|
260
|
+
send_command('hipchat sponsor dummy.account@something.com')
|
261
|
+
expect(replies.last).to eq('The email address has to be one of: ["@company.com", "@network.net"]')
|
262
|
+
end
|
263
|
+
end # end hipchat_sponsor
|
264
|
+
|
265
|
+
describe '#identify_hipchat_admins' do
|
266
|
+
describe 'successful HTTP request against the API' do
|
267
|
+
before(:each) do
|
268
|
+
stub_request(:get, 'https://api.hipchat.com/v1/users/list?auth_token=123&format=json')
|
269
|
+
.with(
|
270
|
+
headers: {
|
271
|
+
'Accept' => 'application/json',
|
272
|
+
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
273
|
+
'Content-Type' => 'application/json',
|
274
|
+
'User-Agent' => 'Faraday v0.9.2' })
|
275
|
+
.to_return(
|
276
|
+
status: 200,
|
277
|
+
body: all_user_json,
|
278
|
+
headers: {}
|
279
|
+
)
|
280
|
+
end
|
281
|
+
it 'receives a list of admins from a JSON payload' do
|
282
|
+
send_command('identify hipchat admins')
|
283
|
+
expect(replies.last).to eq('Admin list: complete ( 0 s. to respond )')
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
describe 'handles Bad Gateway errors' do
|
288
|
+
before(:each) do
|
289
|
+
stub_request(:get, 'https://api.hipchat.com/v1/users/list?auth_token=123&format=json')
|
290
|
+
.with(headers: { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Faraday v0.9.2' })
|
291
|
+
.to_return(status: 502, body: bad_gateway, headers: {})
|
292
|
+
end
|
293
|
+
it 'sends a request for admins that fails with a 502 and responds with exception details' do
|
294
|
+
send_command('identify hipchat admins')
|
295
|
+
expect(replies.last).to eq('Admin list: I ran into an HTTP error ( HTTP code: 502 ) ( 0 s. to respond )')
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
describe 'handles non-200 series' do
|
300
|
+
before(:each) do
|
301
|
+
stub_request(:get, 'https://api.hipchat.com/v1/users/list?auth_token=123&format=json')
|
302
|
+
.with(headers: { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Faraday v0.9.2' })
|
303
|
+
.to_return(status: 501, body: bad_gateway, headers: {})
|
304
|
+
end
|
305
|
+
it 'sends a request for admins that fails with a 501 and responds with exception details' do
|
306
|
+
send_command('identify hipchat admins')
|
307
|
+
expect(replies.last).to eq('Admin list: I ran into an HTTP error ( HTTP code: 501 ) ( 0 s. to respond )')
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end # end identify_hipchat_admins
|
311
|
+
|
312
|
+
describe '#identify_status' do
|
313
|
+
context 'parses the status message' do
|
314
|
+
it 'sends status message and parses results' do
|
315
|
+
send_command('identify status')
|
316
|
+
expect(replies.last).to include('Status of hipchat: Code:')
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end # end identify_status
|
320
|
+
|
321
|
+
describe '#email_domain_name' do
|
322
|
+
context 'valid email domains are validated' do
|
323
|
+
before(:each) do
|
324
|
+
allow(described_class).to receive(:email_domain_name).and_return(Lita.config.handlers.hcadmin.email_domain_name)
|
325
|
+
end
|
326
|
+
it 'returns the approved email domains' do
|
327
|
+
expect(described_class.email_domain_name).to include('@company.com') # individual strings
|
328
|
+
expect(described_class.email_domain_name).to include('@network.net')
|
329
|
+
expect(described_class.email_domain_name).to include('@company.com', '@network.net') # multiple strings
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'does not include email domains outside of the config' do
|
333
|
+
expect(described_class.email_domain_name).to_not include('@dummycorp.com')
|
334
|
+
end
|
335
|
+
end
|
336
|
+
end # end email_domain_name
|
337
|
+
|
338
|
+
describe '#identify_room_owner' do
|
339
|
+
context 'getting the list of rooms' do
|
340
|
+
it 'replies with the room_id for a real room name' do
|
341
|
+
send_command('identify room owner floppy drive')
|
342
|
+
expect(replies.last).to eq('The owner of floppy drive is AwesomeSauce')
|
343
|
+
end
|
344
|
+
|
345
|
+
it 'handles room names with numbers' do
|
346
|
+
send_command('identify room owner f00_bar')
|
347
|
+
expect(replies.last).to eq 'Room f00_bar apparently does not have an owner or I could not find a room with that name ( 0 s. to respond )'
|
348
|
+
end
|
349
|
+
|
350
|
+
it 'handles UCASE NAMES' do
|
351
|
+
send_command('identify room owner FOO_BAR')
|
352
|
+
expect(replies.last).to_not eq 'Sorry, no room found with that name FOO_BAR'
|
353
|
+
end
|
354
|
+
|
355
|
+
it 'handles NAMES-WITH-HYPHENS' do
|
356
|
+
send_command('identify room owner NAMES-WITH-HYPHENS')
|
357
|
+
expect(replies.last).to_not eq 'Sorry, no room found with that name NAMES-WITH-HYPHENS'
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end # end identify_room_owner
|
361
|
+
|
362
|
+
describe '#fetch' do
|
363
|
+
context 'fetches JSON payload of rooms from the HipChat API' do
|
364
|
+
before(:each) do
|
365
|
+
allow(described_class).to receive(:fetch_rooms).and_return(room_json)
|
366
|
+
end
|
367
|
+
|
368
|
+
it 'returns JSON payload on fetch commands' do
|
369
|
+
expect(described_class.fetch_rooms).to eq room_json
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
context 'fetches JSON payload of users from the HipChat API' do
|
374
|
+
before(:each) do
|
375
|
+
allow(described_class).to receive(:fetch_user).with(2_341_755).and_return(user_json)
|
376
|
+
end
|
377
|
+
|
378
|
+
it 'returns JSON payload on fetch user commands' do
|
379
|
+
expect(described_class.fetch_user(2_341_755)).to eq user_json
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
context 'fetches JSON payload of a user through the V2 api' do
|
384
|
+
before(:each) do
|
385
|
+
allow(described_class).to receive(:fetch_user_v2).with('valid_user@company.com').and_return(user_v2_json)
|
386
|
+
end
|
387
|
+
it 'returns JSON of the requested user' do
|
388
|
+
expect(described_class.fetch_user_v2('valid_user@company.com')).to eq user_v2_json
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end # end fetch
|
392
|
+
|
393
|
+
describe '#parse' do
|
394
|
+
before(:each) do
|
395
|
+
allow(described_class).to receive(:parse).with(room_json, 'rooms').and_return(JSON.parse(room_json))
|
396
|
+
end
|
397
|
+
let(:test_room_data) { described_class.parse(room_json, 'rooms') }
|
398
|
+
let(:test_room_details) { test_room_data['rooms'] }
|
399
|
+
|
400
|
+
context 'JSON data from parse should return a JSON object' do
|
401
|
+
it 'gets a JSON object during parse' do
|
402
|
+
expect(test_room_details.first['room_id']).to eq(31)
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
describe '#owner_name_from_id' do
|
408
|
+
before(:each) do
|
409
|
+
allow(described_class).to receive(:owner_name_from_id).with(31, user_json).and_return('AwesomeSauce')
|
410
|
+
end
|
411
|
+
context 'an owner id can be translated to an owner name' do
|
412
|
+
it 'gets the name of the room when presented a room ID' do
|
413
|
+
expect(described_class.owner_name_from_id(31, user_json)).to eq 'AwesomeSauce'
|
414
|
+
end
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
describe '#id_from_name' do
|
419
|
+
before(:each) do
|
420
|
+
allow(described_class).to receive(:id_from_name).with('floppy drive', room_json).and_return(31)
|
421
|
+
end
|
422
|
+
|
423
|
+
context 'returns the room_id from the room_name' do
|
424
|
+
it 'does not error when getting the ID from name' do
|
425
|
+
expect do
|
426
|
+
described_class.id_from_name('floppy drive', room_json)
|
427
|
+
end.to_not raise_error
|
428
|
+
end
|
429
|
+
it 'returns the room_id when given a room name' do
|
430
|
+
expect(described_class.id_from_name('floppy drive', room_json)).to eq 31
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
describe '#identify_room_count' do
|
436
|
+
context 'room count is returned when called' do
|
437
|
+
it 'returns the number of rooms when requested' do
|
438
|
+
send_command('identify room count')
|
439
|
+
expect(replies.last).to include('Rooms in hipchat')
|
440
|
+
end
|
441
|
+
end
|
442
|
+
end
|
443
|
+
# end identify_room_count
|
444
|
+
|
445
|
+
describe '#identify_user_count' do
|
446
|
+
before(:each) do
|
447
|
+
stub_request(:get, 'https://api.hipchat.com/v2/group/171096/statistics?auth_token=abc&format=json')
|
448
|
+
.with(headers: { 'Accept' => 'application/json', 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Type' => 'application/json', 'User-Agent' => 'Faraday v0.9.2' })
|
449
|
+
.to_return(status: 200, body: group_stats, headers: {})
|
450
|
+
end
|
451
|
+
context 'grabs the statistics from HipChats API' do
|
452
|
+
it 'replies with the user count from the statistics URL' do
|
453
|
+
send_command('identify user count')
|
454
|
+
expect(replies.last).to include('Users in hipchat:')
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
# end identify_user_count
|
459
|
+
|
460
|
+
describe '#identify_room_change_admins' do
|
461
|
+
context 'returns the room change admins' do
|
462
|
+
it 'names are returned' do
|
463
|
+
send_command('identify room change admins')
|
464
|
+
expect(replies.last).to include('room change admins')
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
context 'shows TestAdmin name from hcadmin.config' do
|
469
|
+
it 'shows the TestAdmin was returned' do
|
470
|
+
send_command('identify room change admins')
|
471
|
+
expect(replies).to include('TestAdmin')
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end # end room change admins
|
475
|
+
|
476
|
+
describe '#room_owner_change' do
|
477
|
+
it 'replies with some feedback to the member' do
|
478
|
+
send_command('room owner change')
|
479
|
+
expect(replies).to_not eq '' || nil
|
480
|
+
end
|
481
|
+
it 'validates a regular member is identified' do
|
482
|
+
send_command('room owner change testmember testroom', as: regular_member)
|
483
|
+
expect(replies.last).to eq 'You are not represented in the room owner change admin group'
|
484
|
+
end
|
485
|
+
it 'tells you bad arguments passed' do
|
486
|
+
send_command('room owner change testroom', as: room_change_admin_member)
|
487
|
+
expect(replies.last).to include('Wrong number of arguments; expected format of owner_name & room_name received arguments')
|
488
|
+
end
|
489
|
+
it 'tells you bad arguments passed' do
|
490
|
+
send_command('room owner change testroom', as: regular_member)
|
491
|
+
expect(replies.last).to eq 'You are not represented in the room owner change admin group'
|
492
|
+
end
|
493
|
+
|
494
|
+
it 'tells you when a user is not found' do
|
495
|
+
send_command('room owner change testmember realroom', as: room_change_admin_member)
|
496
|
+
expect(replies.last).to eq 'Uh-oh, 404 returned! The user testmember not found'
|
497
|
+
end
|
498
|
+
|
499
|
+
it 'tells you when a room is not found' do
|
500
|
+
send_command('room owner change realmember foobar', as: room_change_admin_member)
|
501
|
+
expect(replies.last).to eq 'Uh-oh, 404 returned! The room foobar not found'
|
502
|
+
end
|
503
|
+
|
504
|
+
it 'does not cry when a real user and a real room are passed' do
|
505
|
+
send_command('room owner change realmember realroom', as: room_change_admin_member)
|
506
|
+
expect(replies.last).to include('Room update request sent. HTTP response code:')
|
507
|
+
end
|
508
|
+
end # end room owner change
|
509
|
+
|
510
|
+
describe '#fetch_data' do
|
511
|
+
context 'accepts API v2 requests' do
|
512
|
+
it 'accepts multiple parameters' do
|
513
|
+
expect(subject).to respond_to(:fetch_data)
|
514
|
+
end
|
515
|
+
|
516
|
+
it 'returns feedback when v2 is not expressed' do
|
517
|
+
expect(subject.fetch_data('v1', 'foo', 'bar')).to eq 'Wrong API version provided'
|
518
|
+
end
|
519
|
+
it 'only accepts room and user object types' do
|
520
|
+
expect(subject.fetch_data('v2', 'foo', 'bar')).to eq "Wrong HipChat object type (foo). Only accepts 'room' or 'user'"
|
521
|
+
end
|
522
|
+
it 'requires an object id to not be nil' do
|
523
|
+
expect(subject.fetch_data('v2', 'user', nil)).to eq 'Please provide the object id of the room or user you want information for'
|
524
|
+
end
|
525
|
+
it 'gets parseable JSON data from the api' do
|
526
|
+
expect do
|
527
|
+
JSON.parse(subject.fetch_data('v2', 'user', '1234').to_json)
|
528
|
+
end.to_not raise_error
|
529
|
+
end
|
530
|
+
end
|
531
|
+
end # end fetch_data
|
532
|
+
|
533
|
+
describe '#unarchive_room' do
|
534
|
+
context 'accepts room name' do
|
535
|
+
it 'replies with some feedback to the member' do
|
536
|
+
send_command('room unarchive foobar')
|
537
|
+
expect(replies).to_not eq '' || nil
|
538
|
+
end
|
539
|
+
it 'validates a regular member is identified' do
|
540
|
+
send_command('room unarchive foobar', as: regular_member)
|
541
|
+
expect(replies.last).to eq 'You are not represented in the room owner change admin group'
|
542
|
+
end
|
543
|
+
it 'tells you bad arguments passed' do
|
544
|
+
send_command('room unarchive', as: room_change_admin_member)
|
545
|
+
expect(replies.last).to include('Wrong number of arguments; expected format of room_name received arguments')
|
546
|
+
end
|
547
|
+
it 'tells you when a room is not found' do
|
548
|
+
send_command('room unarchive foobar', as: room_change_admin_member)
|
549
|
+
expect(replies.last).to include('Uh-oh, 404 returned! The room foobar not found')
|
550
|
+
end
|
551
|
+
it 'does not cry when a real user and a real room are passed' do
|
552
|
+
send_command('room unarchive realroom', as: room_change_admin_member)
|
553
|
+
expect(replies.last).to include('Room update request sent. HTTP response code:')
|
554
|
+
end
|
555
|
+
it 'handles multi-word names' do
|
556
|
+
send_command('room unarchive real room', as: room_change_admin_member)
|
557
|
+
expect(replies.last).to include('Room update request sent. HTTP response code:')
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|