lita-pagerduty 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c1976196f33f4a430eff395034fd70aeb5ad0ade
4
+ data.tar.gz: 59f6a07f7e158675e73c5729241adf9d4dc3bc8c
5
+ SHA512:
6
+ metadata.gz: dbc56aedef1af70d73ce6bdb4cc50c6794c1e48e446f06e7727567a3f5a8b75a828b609768145c8d0dcd6c063ebae756793d28e694158a041e55de16974678c0
7
+ data.tar.gz: 5e60c4a48e19be645a661c8e91dfd3cd1e2fb01cbb940f78719d935a14e4245dfe6f1723aa759cb7313440922848c4c2bbc895382353510114dd7b9f1e3cb72d
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rubocop.yml ADDED
@@ -0,0 +1,8 @@
1
+ MethodLength:
2
+ Max: 20
3
+
4
+ ClassLength:
5
+ Max: 400
6
+
7
+ Documentation:
8
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ script: bundle exec rake
5
+ before_install:
6
+ - gem update --system
7
+ services:
8
+ - redis-server
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2014 Eric Sigler
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ # lita-pagerduty
2
+
3
+ [![Build Status](https://travis-ci.org/esigler/lita-pagerduty.png?branch=master)](https://travis-ci.org/esigler/lita-pagerduty)
4
+ [![Code Climate](https://codeclimate.com/github/esigler/lita-pagerduty.png)](https://codeclimate.com/github/esigler/lita-pagerduty)
5
+ [![Coverage Status](https://coveralls.io/repos/esigler/lita-pagerduty/badge.png?branch=master)](https://coveralls.io/r/esigler/lita-pagerduty?branch=master)
6
+
7
+ PagerDuty (http://pagerduty.com) handler for checking who's on call, scheduling, ack, resolve, etc.
8
+
9
+ ## Installation
10
+
11
+ Add lita-pagerduty to your Lita instance's Gemfile:
12
+
13
+ ``` ruby
14
+ gem "lita-pagerduty"
15
+ ```
16
+
17
+ ## Configuration
18
+
19
+ Add the following variables to your Lita config file:
20
+
21
+ ``` ruby
22
+ config.handlers.pagerduty.api_key = ''
23
+ config.handlers.pagerduty.subdomain = ''
24
+ ```
25
+
26
+ ## Usage
27
+
28
+ ### Specific incidents
29
+
30
+ ```
31
+ Lita pager incidents all - Show all open incidents
32
+ Lita pager incidents mine - Show all open incidents assigned to me
33
+ Lita pager incident <incident ID> - Show a specific incident
34
+ ```
35
+
36
+ ### Incident notes
37
+
38
+ ```
39
+ Lita pager notes <incident ID> - Show all notes for a specific incident
40
+ ```
41
+
42
+ ### Acknowledging an incident
43
+
44
+ ```
45
+ Lita pager ack all - Acknowledge all triggered incidents
46
+ Lita pager ack mine - Acknowledge all triggered incidents assigned to me
47
+ Lita pager ack <incident ID> - Acknowledge a specific incident
48
+ ```
49
+
50
+ ### Resolving an incident
51
+
52
+ ```
53
+ Lita pager resolve all - Resolve all triggered incidents
54
+ Lita pager resolve mine - Resolve all triggered incidents assigned to me
55
+ Lita pager resolve <incident ID> - Resolve a specific incident
56
+ ```
57
+
58
+ ### Misc
59
+
60
+ ```
61
+ Lita pager identify <email address> - Associate your chat user with your email address
62
+ Lita pager forget - Remove your chat user / email association
63
+ ```
64
+
65
+ ## License
66
+
67
+ [MIT](http://opensource.org/licenses/MIT)
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,401 @@
1
+ require 'lita'
2
+ require 'pagerduty'
3
+
4
+ module Lita
5
+ module Handlers
6
+ class Pagerduty < Handler
7
+ route(
8
+ /^who\'s\son\scall\?*$/,
9
+ :whos_on_call,
10
+ command: true,
11
+ help: {
12
+ 'who\'s on call?' =>
13
+ 'Show everyone currently on call (not implemented yet)'
14
+ }
15
+ )
16
+
17
+ route(
18
+ /^pager\sincidents\sall$/,
19
+ :incidents_all,
20
+ command: true,
21
+ help: {
22
+ 'pager incidents all' => 'Show all open incidents'
23
+ }
24
+ )
25
+
26
+ route(
27
+ /^pager\sincidents\smine$/,
28
+ :incidents_mine,
29
+ command: true,
30
+ help: {
31
+ 'pager incidents mine' => 'Show all open incidents assigned to me'
32
+ }
33
+ )
34
+
35
+ route(
36
+ /^pager\sincident\s(\w+)$/,
37
+ :incident,
38
+ command: true,
39
+ help: {
40
+ 'pager incident 1234' => 'Show a specific incident'
41
+ }
42
+ )
43
+
44
+ route(
45
+ /^pager\snotes\s(\w+)$/,
46
+ :notes,
47
+ command: true,
48
+ help: {
49
+ 'pager notes 1234' => 'Show all notes for a specific incident'
50
+ }
51
+ )
52
+
53
+ route(
54
+ /^pager\snote\s(\w+)\s(.+)$/,
55
+ :note,
56
+ command: true,
57
+ help: {
58
+ 'pager note 1234 some text' =>
59
+ 'Add a note to a specific incident (not implemented yet)'
60
+ }
61
+ )
62
+
63
+ route(
64
+ /^pager\sack\sall$/,
65
+ :ack_all,
66
+ command: true,
67
+ help: {
68
+ 'pager ack all' => 'Acknowledge all triggered incidents'
69
+ }
70
+ )
71
+
72
+ route(
73
+ /^pager\sack\smine$/,
74
+ :ack_mine,
75
+ command: true,
76
+ help: {
77
+ 'pager ack mine' =>
78
+ 'Acknowledge all triggered incidents assigned to me'
79
+ }
80
+ )
81
+
82
+ route(
83
+ /^pager\sack\s(\w+)$/,
84
+ :ack,
85
+ command: true,
86
+ help: {
87
+ 'pager ack 1234' => 'Acknowledge a specific incident'
88
+ }
89
+ )
90
+
91
+ route(
92
+ /^pager\sresolve\sall$/,
93
+ :resolve_all,
94
+ command: true,
95
+ help: {
96
+ 'pager resolve all' => 'Resolve all triggered incidents'
97
+ }
98
+ )
99
+
100
+ route(
101
+ /^pager\sresolve\smine$/,
102
+ :resolve_mine,
103
+ command: true,
104
+ help: {
105
+ 'pager resolve mine' =>
106
+ 'Resolve all triggered incidents assigned to me'
107
+ }
108
+ )
109
+
110
+ route(
111
+ /^pager\sresolve\s(\w+)$/,
112
+ :resolve,
113
+ command: true,
114
+ help: {
115
+ 'pager resolve 1234' => 'Resolve a specific incident'
116
+ }
117
+ )
118
+
119
+ route(
120
+ /^pager\sidentify\s(.+)$/,
121
+ :identify,
122
+ command: true,
123
+ help: {
124
+ 'pager identify <email address>' =>
125
+ 'Associate your chat user with your email address'
126
+ }
127
+ )
128
+
129
+ route(
130
+ /^pager\sforget$/,
131
+ :forget,
132
+ command: true,
133
+ help: {
134
+ 'pager forget' => 'Remove your chat user / email association'
135
+ }
136
+ )
137
+
138
+ def self.default_config(config)
139
+ config.api_key = nil
140
+ config.subdomain = nil
141
+ end
142
+
143
+ def whos_on_call(response)
144
+ response.reply('Not implemented yet.')
145
+ end
146
+
147
+ def identify(response)
148
+ email = response.matches[0][0]
149
+ stored_email = redis.get("email_#{response.user.id}")
150
+ if !stored_email
151
+ redis.set("email_#{response.user.id}", email)
152
+ response.reply('You have now been identified.')
153
+ else
154
+ response.reply('You have already been identified!')
155
+ end
156
+ end
157
+
158
+ def forget(response)
159
+ stored_email = redis.get("email_#{response.user.id}")
160
+ if stored_email
161
+ redis.del("email_#{response.user.id}")
162
+ response.reply('Your email has now been forgotten.')
163
+ else
164
+ response.reply('No email on record for you.')
165
+ end
166
+ end
167
+
168
+ def incidents_all(response)
169
+ incidents = fetch_all_incidents
170
+ if incidents.count > 0
171
+ incidents.each do |incident|
172
+ response.reply("#{incident.id}: " \
173
+ "\"#{incident.trigger_summary_data.subject}\", " \
174
+ "assigned to: #{incident.assigned_to_user.email}")
175
+ end
176
+ else
177
+ response.reply('No triggered, open, or acknowledged incidents')
178
+ end
179
+ end
180
+
181
+ def incidents_mine(response)
182
+ email = redis.get("email_#{response.user.id}")
183
+ if email
184
+ incidents = fetch_my_incidents(email)
185
+ if incidents.count > 0
186
+ incidents.each do |incident|
187
+ response.reply("#{incident.id}: " \
188
+ "\"#{incident.trigger_summary_data.subject}\", " \
189
+ "assigned to: #{incident.assigned_to_user.email}")
190
+ end
191
+ else
192
+ response.reply('You have no triggered, open, or acknowledged ' \
193
+ 'incidents')
194
+ end
195
+ else
196
+ response.reply('You have not identified yourself (use the help ' \
197
+ 'command for more info)')
198
+ end
199
+ end
200
+
201
+ def incident(response)
202
+ incident_id = response.matches[0][0]
203
+ incident = fetch_incident(incident_id)
204
+ if incident != 'No results'
205
+ response.reply("#{incident_id}: " \
206
+ "\"#{incident.trigger_summary_data.subject}\", " \
207
+ "assigned to: #{incident.assigned_to_user.email}")
208
+ else
209
+ response.reply("#{incident_id}: Incident not found")
210
+ end
211
+ end
212
+
213
+ def notes(response)
214
+ incident_id = response.matches[0][0]
215
+ incident = fetch_incident(incident_id)
216
+ if incident != 'No results'
217
+ if incident.notes.notes.count > 0
218
+ incident.notes.notes.each do |note|
219
+ response.reply("#{incident_id}: #{note.content} "\
220
+ "(#{note.user.email})")
221
+ end
222
+ else
223
+ response.reply("#{incident_id}: No notes")
224
+ end
225
+ else
226
+ response.reply("#{incident_id}: Incident not found")
227
+ end
228
+ end
229
+
230
+ def note(response)
231
+ response.reply('Not implemented yet.')
232
+ end
233
+
234
+ def ack_all(response)
235
+ incidents = fetch_all_incidents
236
+ if incidents.count > 0
237
+ completed = []
238
+ incidents.each do |incident|
239
+ result = acknowledge_incident(incident.id)
240
+ if result == "#{incident.id}: Incident acknowledged"
241
+ completed.push(incident.id)
242
+ end
243
+ response.reply("Acknowledged: #{completed.join(",")}")
244
+ end
245
+ else
246
+ response.reply('No triggered, open, or acknowledged incidents')
247
+ end
248
+ end
249
+
250
+ def ack_mine(response)
251
+ email = redis.get("email_#{response.user.id}")
252
+ if email
253
+ incidents = fetch_my_incidents(email)
254
+ if incidents.count > 0
255
+ completed = []
256
+ incidents.each do |incident|
257
+ result = acknowledge_incident(incident.id)
258
+ if result == "#{incident.id}: Incident acknowledged"
259
+ completed.push(incident.id)
260
+ end
261
+ response.reply("Acknowledged: #{completed.join(",")}")
262
+ end
263
+ else
264
+ response.reply('You have no triggered, open, or acknowledged ' \
265
+ 'incidents')
266
+ end
267
+ else
268
+ response.reply('You have not identified yourself (use the help ' \
269
+ 'command for more info)')
270
+ end
271
+ end
272
+
273
+ def ack(response)
274
+ incident_id = response.matches[0][0]
275
+ return if incident_id == 'all' || incident_id == 'mine'
276
+ response.reply(acknowledge_incident(incident_id))
277
+ end
278
+
279
+ def resolve_all(response)
280
+ incidents = fetch_all_incidents
281
+ if incidents.count > 0
282
+ completed = []
283
+ incidents.each do |incident|
284
+ result = resolve_incident(incident.id)
285
+ if result == "#{incident.id}: Incident resolved"
286
+ completed.push(incident.id)
287
+ end
288
+ response.reply("Resolved: #{completed.join(",")}")
289
+ end
290
+ else
291
+ response.reply('No triggered, open, or acknowledged incidents')
292
+ end
293
+ end
294
+
295
+ def resolve_mine(response)
296
+ email = redis.get("email_#{response.user.id}")
297
+ if email
298
+ incidents = fetch_my_incidents(email)
299
+ if incidents.count > 0
300
+ completed = []
301
+ incidents.each do |incident|
302
+ result = resolve_incident(incident.id)
303
+ if result == "#{incident.id}: Incident resolved"
304
+ completed.push(incident.id)
305
+ end
306
+ response.reply("Resolved: #{completed.join(",")}")
307
+ end
308
+ else
309
+ response.reply('You have no triggered, open, or acknowledged ' \
310
+ 'incidents')
311
+ end
312
+ else
313
+ response.reply('You have not identified yourself (use the help ' \
314
+ 'command for more info)')
315
+ end
316
+ end
317
+
318
+ def resolve(response)
319
+ incident_id = response.matches[0][0]
320
+ return if incident_id == 'all' || incident_id == 'mine'
321
+ response.reply(resolve_incident(incident_id))
322
+ end
323
+
324
+ private
325
+
326
+ def pd_client
327
+ if Lita.config.handlers.pagerduty.api_key.nil? ||
328
+ Lita.config.handlers.pagerduty.subdomain.nil?
329
+ fail 'Bad config'
330
+ end
331
+
332
+ ::Pagerduty.new(token: Lita.config.handlers.pagerduty.api_key,
333
+ subdomain: Lita.config.handlers.pagerduty.subdomain)
334
+ end
335
+
336
+ def fetch_all_incidents
337
+ client = pd_client
338
+ list = []
339
+ # FIXME: Workaround on current PD Gem
340
+ client.incidents.incidents.each do |incident|
341
+ list.push(incident) if incident.status != 'resolved'
342
+ end
343
+ list
344
+ end
345
+
346
+ def fetch_my_incidents(email)
347
+ # FIXME: Workaround
348
+ incidents = fetch_all_incidents
349
+ list = []
350
+ incidents.each do |incident|
351
+ list.push(incident) if incident.assigned_to_user.email == email
352
+ end
353
+ list
354
+ end
355
+
356
+ def fetch_incident(incident_id)
357
+ client = pd_client
358
+ client.get_incident(id: incident_id)
359
+ end
360
+
361
+ def acknowledge_incident(incident_id)
362
+ incident = fetch_incident(incident_id)
363
+ if incident != 'No results'
364
+ if incident.status != 'acknowledged' &&
365
+ incident.status != 'resolved'
366
+ results = incident.acknowledge
367
+ if results.key?('status') && results['status'] == 'acknowledged'
368
+ "#{incident_id}: Incident acknowledged"
369
+ else
370
+ "#{incident_id}: Unable to acknowledge incident"
371
+ end
372
+ else
373
+ "#{incident_id}: Incident already #{incident.status}"
374
+ end
375
+ else
376
+ "#{incident_id}: Incident not found"
377
+ end
378
+ end
379
+
380
+ def resolve_incident(incident_id)
381
+ incident = fetch_incident(incident_id)
382
+ if incident != 'No results'
383
+ if incident.status != 'resolved'
384
+ results = incident.resolve
385
+ if results.key?('status') && results['status'] == 'resolved'
386
+ "#{incident_id}: Incident resolved"
387
+ else
388
+ "#{incident_id}: Unable to resolve incident"
389
+ end
390
+ else
391
+ "#{incident_id}: Incident already #{incident.status}"
392
+ end
393
+ else
394
+ "#{incident_id}: Incident not found"
395
+ end
396
+ end
397
+ end
398
+
399
+ Lita.register_handler(Pagerduty)
400
+ end
401
+ end
@@ -0,0 +1 @@
1
+ require 'lita/handlers/pagerduty'
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-pagerduty"
3
+ spec.version = "0.0.1"
4
+ spec.authors = ["Eric Sigler"]
5
+ spec.email = ["me@esigler.com"]
6
+ spec.description = %q{A Lita handler to interact with PagerDuty}
7
+ spec.summary = %q{A Lita handler to interact with PagerDuty}
8
+ spec.homepage = "http://github.com/esigler/lita-pagerduty"
9
+ spec.license = "MIT"
10
+ spec.metadata = { "lita_plugin_type" => "handler" }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_runtime_dependency "lita", ">= 3.0"
18
+ spec.add_runtime_dependency "pagerduty-sdk"
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "rspec", ">= 3.0.0.beta2"
23
+ spec.add_development_dependency "simplecov"
24
+ spec.add_development_dependency "coveralls"
25
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,4 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ pagerduty:
@@ -0,0 +1,457 @@
1
+ require 'spec_helper'
2
+ require 'pagerduty'
3
+
4
+ describe Lita::Handlers::Pagerduty, lita_handler: true do
5
+ let(:no_incident) do
6
+ client = double
7
+ expect(client).to receive(:get_incident) { 'No results' }
8
+ client
9
+ end
10
+
11
+ let(:no_incidents) do
12
+ client = double
13
+ expect(client).to receive(:incidents) do
14
+ double(
15
+ incidents: []
16
+ )
17
+ end
18
+ client
19
+ end
20
+
21
+ let(:incidents) do
22
+ client = double
23
+ expect(client).to receive(:incidents) do
24
+ double(
25
+ incidents: [
26
+ double(
27
+ id: 'ABC123',
28
+ status: 'resolved',
29
+ trigger_summary_data: double(subject: 'something broke'),
30
+ assigned_to_user: double(email: 'foo@example.com')
31
+ ),
32
+ double(
33
+ id: 'ABC789',
34
+ status: 'triggered',
35
+ trigger_summary_data: double(subject: 'Still broke'),
36
+ assigned_to_user: double(email: 'bar@example.com')
37
+ )
38
+ ]
39
+ )
40
+ end
41
+ allow(client).to receive(:get_incident) do
42
+ double(
43
+ status: 'triggered',
44
+ trigger_summary_data: double(subject: 'Still broke'),
45
+ assigned_to_user: double(email: 'bar@example.com'),
46
+ acknowledge: { 'id' => 'ABC789', 'status' => 'acknowledged' },
47
+ resolve: { 'id' => 'ABC789', 'status' => 'resolved' },
48
+ notes: double(notes: [])
49
+ )
50
+ end
51
+ client
52
+ end
53
+
54
+ let(:new_incident) do
55
+ client = double
56
+ expect(client).to receive(:get_incident) do
57
+ double(
58
+ status: 'triggered',
59
+ trigger_summary_data: double(subject: 'something broke'),
60
+ assigned_to_user: double(email: 'foo@example.com'),
61
+ acknowledge: { 'id' => 'ABC123', 'status' => 'acknowledged' },
62
+ resolve: { 'id' => 'ABC123', 'status' => 'resolved' },
63
+ notes: double(notes: [])
64
+ )
65
+ end
66
+ client
67
+ end
68
+
69
+ let(:acknowledged_incident) do
70
+ client = double
71
+ expect(client).to receive(:get_incident) do
72
+ double(
73
+ status: 'acknowledged',
74
+ trigger_summary_data: double(subject: 'something broke'),
75
+ assigned_to_user: double(email: 'foo@example.com'),
76
+ acknowledge: { 'error' =>
77
+ { 'message' => 'Incident Already Acknowledged', 'code' => 1002 }
78
+ },
79
+ resolve: { 'id' => 'ABC123', 'status' => 'resolved' },
80
+ notes: double(notes: [])
81
+ )
82
+ end
83
+ client
84
+ end
85
+
86
+ let(:resolved_incident) do
87
+ client = double
88
+ expect(client).to receive(:get_incident) do
89
+ double(
90
+ status: 'resolved',
91
+ trigger_summary_data: double(subject: 'something broke'),
92
+ assigned_to_user: double(email: 'foo@example.com'),
93
+ notes: double(notes: [])
94
+ )
95
+ end
96
+ client
97
+ end
98
+
99
+ let(:incident_with_notes) do
100
+ client = double
101
+ expect(client).to receive(:get_incident) do
102
+ double(
103
+ status: 'resolved',
104
+ trigger_summary_data: double(subject: 'something broke'),
105
+ assigned_to_user: double(email: 'foo@example.com'),
106
+ notes: double(
107
+ notes: [double(content: 'Hi!',
108
+ user: double(email: 'foo@example.com'))]
109
+ )
110
+ )
111
+ end
112
+ client
113
+ end
114
+
115
+ it { routes_command('who\'s on call').to(:whos_on_call) }
116
+ it { routes_command('who\'s on call?').to(:whos_on_call) }
117
+ it { routes_command('pager identify foobar@example.com').to(:identify) }
118
+ it { routes_command('pager forget').to(:forget) }
119
+ it { routes_command('pager incidents all').to(:incidents_all) }
120
+ it { routes_command('pager incidents mine').to(:incidents_mine) }
121
+ it { routes_command('pager incident ABC123').to(:incident) }
122
+ it { routes_command('pager notes ABC123').to(:notes) }
123
+ it { routes_command('pager note ABC123 some text').to(:note) }
124
+ it { routes_command('pager ack all').to(:ack_all) }
125
+ it { routes_command('pager ack mine').to(:ack_mine) }
126
+ it { routes_command('pager ack ABC123').to(:ack) }
127
+ it { routes_command('pager resolve all').to(:resolve_all) }
128
+ it { routes_command('pager resolve mine').to(:resolve_mine) }
129
+ it { routes_command('pager resolve ABC123').to(:resolve) }
130
+
131
+ describe '.default_config' do
132
+ it 'sets api_key to nil' do
133
+ expect(Lita.config.handlers.pagerduty.api_key).to be_nil
134
+ end
135
+
136
+ it 'sets subdomain to nil' do
137
+ expect(Lita.config.handlers.pagerduty.subdomain).to be_nil
138
+ end
139
+ end
140
+
141
+ describe 'without valid config' do
142
+ it 'should error out on any command' do
143
+ expect { send_command('pager ack ABC123') }.to raise_error('Bad config')
144
+ end
145
+ end
146
+
147
+ describe 'with valid config' do
148
+ before do
149
+ Lita.config.handlers.pagerduty.api_key = 'foo'
150
+ Lita.config.handlers.pagerduty.subdomain = 'bar'
151
+ end
152
+
153
+ describe '#whos_on_call' do
154
+ it 'shows a warning' do
155
+ send_command("who's on call?")
156
+ expect(replies.last).to eq('Not implemented yet.')
157
+ end
158
+ end
159
+
160
+ describe '#identify' do
161
+ describe 'when that email is new' do
162
+ it 'shows a successful identification' do
163
+ foo = Lita::User.create(123, name: 'foo')
164
+ send_command('pager identify foo@example.com', as: foo)
165
+ expect(replies.last).to eq('You have now been identified.')
166
+ end
167
+ end
168
+
169
+ # TODO: It'd be great to validate this against the existing
170
+ # users on the PD account.
171
+
172
+ describe 'when that email exists already' do
173
+ it 'shows a warning' do
174
+ baz = Lita::User.create(321, name: 'baz')
175
+ send_command('pager identify baz@example.com', as: baz)
176
+ send_command('pager identify baz@example.com', as: baz)
177
+ expect(replies.last).to eq('You have already been identified!')
178
+ end
179
+ end
180
+ end
181
+
182
+ describe '#forget' do
183
+ describe 'when that user is associated' do
184
+ it 'shows a successful forget' do
185
+ foo = Lita::User.create(123, name: 'foo')
186
+ send_command('pager identify foo@example.com', as: foo)
187
+ send_command('pager forget', as: foo)
188
+ expect(replies.last).to eq('Your email has now been forgotten.')
189
+ end
190
+ end
191
+
192
+ describe 'when that user is not associated' do
193
+ it 'shows a warning' do
194
+ foo = Lita::User.create(123, name: 'foo')
195
+ send_command('pager forget', as: foo)
196
+ expect(replies.last).to eq('No email on record for you.')
197
+ end
198
+ end
199
+ end
200
+
201
+ describe '#incidents_all' do
202
+ describe 'when there are open incidents' do
203
+ it 'shows a list of incidents' do
204
+ expect(Pagerduty).to receive(:new) { incidents }
205
+ send_command('pager incidents all')
206
+ expect(replies.last).to eq('ABC789: "Still broke", assigned to: '\
207
+ 'bar@example.com')
208
+ end
209
+ end
210
+
211
+ describe 'when there are no open incidents' do
212
+ it 'shows a warning' do
213
+ expect(Pagerduty).to receive(:new) { no_incidents }
214
+ send_command('pager incidents all')
215
+ expect(replies.last).to eq('No triggered, open, or acknowledged ' \
216
+ 'incidents')
217
+ end
218
+ end
219
+ end
220
+
221
+ describe '#incidents_mine' do
222
+ describe 'when there are open incidents for the user' do
223
+ it 'shows a list of incidents' do
224
+ bar = Lita::User.create(123, name: 'bar')
225
+ expect(Pagerduty).to receive(:new) { incidents }
226
+ send_command('pager identify bar@example.com', as: bar)
227
+ send_command('pager incidents mine', as: bar)
228
+ expect(replies.last).to eq('ABC789: "Still broke", assigned to: ' \
229
+ 'bar@example.com')
230
+ end
231
+ end
232
+
233
+ describe 'when there are no open incidents for the user' do
234
+ it 'shows no incidents' do
235
+ foo = Lita::User.create(123, name: 'foo')
236
+ expect(Pagerduty).to receive(:new) { incidents }
237
+ send_command('pager identify foo@example.com', as: foo)
238
+ send_command('pager incidents mine', as: foo)
239
+ expect(replies.last).to eq('You have no triggered, open, or ' \
240
+ 'acknowledged incidents')
241
+ end
242
+ end
243
+
244
+ describe 'when the user has not identified themselves' do
245
+ it 'shows a warning' do
246
+ send_command('pager incidents mine')
247
+ expect(replies.last).to eq('You have not identified yourself (use ' \
248
+ 'the help command for more info)')
249
+ end
250
+ end
251
+ end
252
+
253
+ describe '#incident' do
254
+ describe 'when the incident exists' do
255
+ it 'shows incident details' do
256
+ expect(Pagerduty).to receive(:new) { new_incident }
257
+ send_command('pager incident ABC123')
258
+ expect(replies.last).to eq('ABC123: "something broke", ' \
259
+ 'assigned to: foo@example.com')
260
+ end
261
+ end
262
+
263
+ describe 'when the incident does not exist' do
264
+ it 'shows an error' do
265
+ expect(Pagerduty).to receive(:new) { no_incident }
266
+ send_command('pager incident ABC123')
267
+ expect(replies.last).to eq('ABC123: Incident not found')
268
+ end
269
+ end
270
+ end
271
+
272
+ describe '#notes' do
273
+ describe 'when the incident has notes' do
274
+ it 'shows incident notes' do
275
+ expect(Pagerduty).to receive(:new) { incident_with_notes }
276
+ send_command('pager notes ABC123')
277
+ expect(replies.last).to eq('ABC123: Hi! (foo@example.com)')
278
+ end
279
+ end
280
+
281
+ describe 'when the incident doesnt have notes' do
282
+ it 'shows no notes' do
283
+ expect(Pagerduty).to receive(:new) { new_incident }
284
+ send_command('pager notes ABC123')
285
+ expect(replies.last).to eq('ABC123: No notes')
286
+ end
287
+ end
288
+
289
+ describe 'when the incident does not exist' do
290
+ it 'shows an error' do
291
+ expect(Pagerduty).to receive(:new) { no_incident }
292
+ send_command('pager notes ABC123')
293
+ expect(replies.last).to eq('ABC123: Incident not found')
294
+ end
295
+ end
296
+ end
297
+
298
+ describe '#note' do
299
+ it 'shows a warning' do
300
+ send_command('pager note ABC123 some text')
301
+ expect(replies.last).to eq('Not implemented yet.')
302
+ end
303
+ end
304
+
305
+ describe '#ack_all' do
306
+ describe 'when there are acknowledgable incidents' do
307
+ it 'shows them as acknowledged' do
308
+ expect(Pagerduty).to receive(:new).twice { incidents }
309
+ send_command('pager ack all')
310
+ expect(replies.last).to eq('Acknowledged: ABC789')
311
+ end
312
+ end
313
+
314
+ describe 'when there are no acknowledgable incidents' do
315
+ it 'shows a warning' do
316
+ expect(Pagerduty).to receive(:new) { no_incidents }
317
+ send_command('pager ack all')
318
+ expect(replies.last).to eq('No triggered, open, or acknowledged ' \
319
+ 'incidents')
320
+ end
321
+ end
322
+ end
323
+
324
+ describe '#ack_mine' do
325
+ describe 'when there are acknowledgable incidents for the user' do
326
+ it 'shows them as acknowledged' do
327
+ bar = Lita::User.create(123, name: 'bar')
328
+ expect(Pagerduty).to receive(:new).twice { incidents }
329
+ send_command('pager identify bar@example.com', as: bar)
330
+ send_command('pager ack mine', as: bar)
331
+ expect(replies.last).to eq('Acknowledged: ABC789')
332
+ end
333
+ end
334
+
335
+ describe 'when there are no acknowledgable incidents for the user' do
336
+ it 'shows a warning' do
337
+ foo = Lita::User.create(123, name: 'foo')
338
+ expect(Pagerduty).to receive(:new) { incidents }
339
+ send_command('pager identify foo@example.com', as: foo)
340
+ send_command('pager ack mine', as: foo)
341
+ expect(replies.last).to eq('You have no triggered, open, or ' \
342
+ 'acknowledged incidents')
343
+ end
344
+ end
345
+
346
+ describe 'when the user has not identified themselves' do
347
+ it 'shows a warning' do
348
+ send_command('pager ack mine')
349
+ expect(replies.last).to eq('You have not identified yourself (use ' \
350
+ 'the help command for more info)')
351
+ end
352
+ end
353
+ end
354
+
355
+ describe '#ack' do
356
+ describe 'when the incident has not been acknowledged' do
357
+ it 'shows the acknowledgement' do
358
+ expect(Pagerduty).to receive(:new) { new_incident }
359
+ send_command('pager ack ABC123')
360
+ expect(replies.last).to eq('ABC123: Incident acknowledged')
361
+ end
362
+ end
363
+
364
+ describe 'when the incident has already been acknowledged' do
365
+ it 'shows the warning' do
366
+ expect(Pagerduty).to receive(:new) { acknowledged_incident }
367
+ send_command('pager ack ABC123')
368
+ expect(replies.last).to eq('ABC123: Incident already acknowledged')
369
+ end
370
+ end
371
+
372
+ describe 'when the incident does not exist' do
373
+ it 'shows an error' do
374
+ expect(Pagerduty).to receive(:new) { no_incident }
375
+ send_command('pager ack ABC123')
376
+ expect(replies.last).to eq('ABC123: Incident not found')
377
+ end
378
+ end
379
+ end
380
+
381
+ describe '#resolve_all' do
382
+ describe 'when there are resolvable incidents' do
383
+ it 'shows them as resolved' do
384
+ expect(Pagerduty).to receive(:new).twice { incidents }
385
+ send_command('pager resolve all')
386
+ expect(replies.last).to eq('Resolved: ABC789')
387
+ end
388
+ end
389
+
390
+ describe 'when there are no resolvable incidents' do
391
+ it 'shows a warning' do
392
+ expect(Pagerduty).to receive(:new) { no_incidents }
393
+ send_command('pager resolve all')
394
+ expect(replies.last).to eq('No triggered, open, or acknowledged ' \
395
+ 'incidents')
396
+ end
397
+ end
398
+ end
399
+
400
+ describe '#resolve_mine' do
401
+ describe 'when there are resolvable incidents for the user' do
402
+ it 'shows them as acknowledged' do
403
+ bar = Lita::User.create(123, name: 'bar')
404
+ expect(Pagerduty).to receive(:new).twice { incidents }
405
+ send_command('pager identify bar@example.com', as: bar)
406
+ send_command('pager resolve mine', as: bar)
407
+ expect(replies.last).to eq('Resolved: ABC789')
408
+ end
409
+ end
410
+
411
+ describe 'when there are no resolvable incidents for the user' do
412
+ it 'shows a warning' do
413
+ foo = Lita::User.create(123, name: 'foo')
414
+ expect(Pagerduty).to receive(:new) { incidents }
415
+ send_command('pager identify foo@example.com', as: foo)
416
+ send_command('pager resolve mine', as: foo)
417
+ expect(replies.last).to eq('You have no triggered, open, or ' \
418
+ 'acknowledged incidents')
419
+ end
420
+ end
421
+
422
+ describe 'when the user has not identified themselves' do
423
+ it 'shows a warning' do
424
+ send_command('pager resolve mine')
425
+ expect(replies.last).to eq('You have not identified yourself (use ' \
426
+ 'the help command for more info)')
427
+ end
428
+ end
429
+ end
430
+
431
+ describe '#resolve' do
432
+ describe 'when the incident has not been resolved' do
433
+ it 'shows the resolve' do
434
+ expect(Pagerduty).to receive(:new) { new_incident }
435
+ send_command('pager resolve ABC123')
436
+ expect(replies.last).to eq('ABC123: Incident resolved')
437
+ end
438
+ end
439
+
440
+ describe 'when the incident has already been resolved' do
441
+ it 'shows the warning' do
442
+ expect(Pagerduty).to receive(:new) { resolved_incident }
443
+ send_command('pager resolve ABC123')
444
+ expect(replies.last).to eq('ABC123: Incident already resolved')
445
+ end
446
+ end
447
+
448
+ describe 'when the incident does not exist' do
449
+ it 'shows an error' do
450
+ expect(Pagerduty).to receive(:new) { no_incident }
451
+ send_command('pager resolve ABC123')
452
+ expect(replies.last).to eq('ABC123: Incident not found')
453
+ end
454
+ end
455
+ end
456
+ end
457
+ end
@@ -0,0 +1,10 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
4
+ SimpleCov::Formatter::HTMLFormatter,
5
+ Coveralls::SimpleCov::Formatter
6
+ ]
7
+ SimpleCov.start { add_filter '/spec/' }
8
+
9
+ require 'lita-pagerduty'
10
+ require 'lita/rspec'
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-pagerduty
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Eric Sigler
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pagerduty-sdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 3.0.0.beta2
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: 3.0.0.beta2
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A Lita handler to interact with PagerDuty
112
+ email:
113
+ - me@esigler.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rubocop.yml"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - LICENSE
123
+ - README.md
124
+ - Rakefile
125
+ - lib/lita-pagerduty.rb
126
+ - lib/lita/handlers/pagerduty.rb
127
+ - lita-pagerduty.gemspec
128
+ - locales/en.yml
129
+ - spec/lita/handlers/pagerduty_spec.rb
130
+ - spec/spec_helper.rb
131
+ homepage: http://github.com/esigler/lita-pagerduty
132
+ licenses:
133
+ - MIT
134
+ metadata:
135
+ lita_plugin_type: handler
136
+ post_install_message:
137
+ rdoc_options: []
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ requirements: []
151
+ rubyforge_project:
152
+ rubygems_version: 2.2.1
153
+ signing_key:
154
+ specification_version: 4
155
+ summary: A Lita handler to interact with PagerDuty
156
+ test_files:
157
+ - spec/lita/handlers/pagerduty_spec.rb
158
+ - spec/spec_helper.rb