lita-pagerduty 0.0.1

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 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