flapjack 0.8.10 → 0.8.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/Gemfile +1 -1
  4. data/bin/flapjack +10 -1
  5. data/bin/flapjack-nagios-receiver +1 -2
  6. data/bin/simulate-failed-check +12 -4
  7. data/etc/flapjack_config.yaml.example +2 -1
  8. data/flapjack.gemspec +1 -0
  9. data/lib/flapjack/data/contact.rb +46 -26
  10. data/lib/flapjack/data/entity.rb +28 -0
  11. data/lib/flapjack/data/entity_check.rb +52 -11
  12. data/lib/flapjack/data/event.rb +9 -3
  13. data/lib/flapjack/data/notification_rule.rb +8 -0
  14. data/lib/flapjack/gateways/api.rb +0 -1
  15. data/lib/flapjack/gateways/api/entity_check_presenter.rb +2 -1
  16. data/lib/flapjack/gateways/email.rb +1 -2
  17. data/lib/flapjack/gateways/jabber.rb +3 -3
  18. data/lib/flapjack/gateways/jsonapi.rb +186 -38
  19. data/lib/flapjack/gateways/jsonapi/check_methods.rb +120 -0
  20. data/lib/flapjack/gateways/jsonapi/{entity_check_presenter.rb → check_presenter.rb} +7 -6
  21. data/lib/flapjack/gateways/jsonapi/contact_methods.rb +61 -352
  22. data/lib/flapjack/gateways/jsonapi/entity_methods.rb +117 -248
  23. data/lib/flapjack/gateways/jsonapi/medium_methods.rb +179 -0
  24. data/lib/flapjack/gateways/jsonapi/notification_rule_methods.rb +124 -0
  25. data/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods.rb +128 -0
  26. data/lib/flapjack/gateways/jsonapi/rack/json_params_parser.rb +4 -5
  27. data/lib/flapjack/gateways/jsonapi/report_methods.rb +143 -0
  28. data/lib/flapjack/gateways/web.rb +1 -0
  29. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +165 -101
  30. data/lib/flapjack/gateways/web/public/js/contacts.js +34 -46
  31. data/lib/flapjack/gateways/web/public/js/select2.js +232 -90
  32. data/lib/flapjack/gateways/web/public/js/select2.min.js +4 -4
  33. data/lib/flapjack/gateways/web/views/check.html.erb +11 -2
  34. data/lib/flapjack/processor.rb +6 -6
  35. data/lib/flapjack/version.rb +1 -1
  36. data/spec/lib/flapjack/data/entity_check_spec.rb +1 -1
  37. data/spec/lib/flapjack/data/event_spec.rb +10 -9
  38. data/spec/lib/flapjack/gateways/api/entity_methods_spec.rb +25 -25
  39. data/spec/lib/flapjack/gateways/api_spec.rb +23 -1
  40. data/spec/lib/flapjack/gateways/email_spec.rb +40 -2
  41. data/spec/lib/flapjack/gateways/jabber_spec.rb +1 -1
  42. data/spec/lib/flapjack/gateways/jsonapi/check_methods_spec.rb +134 -0
  43. data/spec/lib/flapjack/gateways/jsonapi/{entity_check_presenter_spec.rb → check_presenter_spec.rb} +17 -17
  44. data/spec/lib/flapjack/gateways/jsonapi/contact_methods_spec.rb +27 -232
  45. data/spec/lib/flapjack/gateways/jsonapi/entity_methods_spec.rb +217 -687
  46. data/spec/lib/flapjack/gateways/jsonapi/medium_methods_spec.rb +232 -0
  47. data/spec/lib/flapjack/gateways/jsonapi/notification_rule_methods_spec.rb +131 -0
  48. data/spec/lib/flapjack/gateways/jsonapi/pagerduty_credential_methods_spec.rb +113 -0
  49. data/spec/lib/flapjack/gateways/jsonapi/report_methods_spec.rb +546 -0
  50. data/spec/lib/flapjack/gateways/jsonapi_spec.rb +10 -1
  51. data/spec/lib/flapjack/gateways/web_spec.rb +1 -0
  52. data/spec/support/jsonapi_helper.rb +62 -0
  53. metadata +36 -8
  54. data/lib/flapjack/gateways/jsonapi/entity_presenter.rb +0 -75
  55. data/spec/lib/flapjack/gateways/jsonapi/entity_presenter_spec.rb +0 -108
@@ -0,0 +1,232 @@
1
+ require 'spec_helper'
2
+ require 'flapjack/gateways/jsonapi'
3
+
4
+ describe 'Flapjack::Gateways::JSONAPI::MediumMethods', :sinatra => true, :logger => true do
5
+
6
+ include_context "jsonapi"
7
+
8
+ let(:medium_data) {
9
+ {:type => 'email',
10
+ :address => 'abc@example.com',
11
+ :interval => 120,
12
+ :rollup_threshold => 3
13
+ }
14
+ }
15
+
16
+ let(:contact) { double(Flapjack::Data::Contact, :id => '21') }
17
+
18
+ let(:semaphore) {
19
+ double(Flapjack::Data::Semaphore, :resource => 'folly',
20
+ :key => 'semaphores:folly', :expiry => 30, :token => 'spatulas-R-us')
21
+ }
22
+
23
+ it "returns a single medium" do
24
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
25
+ with(contact.id, :redis => redis, :logger => @logger).and_return(contact)
26
+
27
+ expect(contact).to receive(:media_list).and_return([medium_data[:type]])
28
+ expect(contact).to receive(:media).and_return(medium_data[:type] => medium_data[:address])
29
+ expect(contact).to receive(:media_intervals).and_return(medium_data[:type] => medium_data[:interval])
30
+ expect(contact).to receive(:media_rollup_thresholds).and_return(medium_data[:type] => medium_data[:rollup_threshold])
31
+
32
+ aget "/media/#{contact.id}_#{medium_data[:type]}"
33
+ expect(last_response).to be_ok
34
+ expect(last_response.body).to eq({:media => [{:id => "#{contact.id}_#{medium_data[:type]}"}.merge(medium_data).
35
+ merge(:links => {:contacts => [contact.id]})]}.to_json)
36
+ end
37
+
38
+ it "returns multiple media" do
39
+ contact_2 = double(Flapjack::Data::Contact, :id => '53')
40
+
41
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
42
+ with(contact.id, :redis => redis, :logger => @logger).and_return(contact)
43
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
44
+ with(contact_2.id, :redis => redis, :logger => @logger).and_return(contact_2)
45
+
46
+ expect(contact).to receive(:media_list).and_return([medium_data[:type]])
47
+ expect(contact).to receive(:media).and_return(medium_data[:type] => medium_data[:address])
48
+ expect(contact).to receive(:media_intervals).and_return(medium_data[:type] => medium_data[:interval])
49
+ expect(contact).to receive(:media_rollup_thresholds).and_return(medium_data[:type] => medium_data[:rollup_threshold])
50
+
51
+ medium_2_data = {:type => 'sms', :address => '0123456789',
52
+ :interval => 120, :rollup_threshold => 3}
53
+
54
+ expect(contact_2).to receive(:media_list).and_return([medium_2_data[:type]])
55
+ expect(contact_2).to receive(:media).and_return(medium_2_data[:type] => medium_2_data[:address])
56
+ expect(contact_2).to receive(:media_intervals).and_return(medium_2_data[:type] => medium_2_data[:interval])
57
+ expect(contact_2).to receive(:media_rollup_thresholds).and_return(medium_2_data[:type] => medium_2_data[:rollup_threshold])
58
+
59
+ aget "/media/#{contact.id}_#{medium_data[:type]},#{contact_2.id}_#{medium_2_data[:type]}"
60
+ expect(last_response).to be_ok
61
+ expect(last_response.body).to eq({:media => [{:id => "#{contact.id}_#{medium_data[:type]}"}.merge(medium_data).
62
+ merge(:links => {:contacts => [contact.id]}),
63
+ {:id => "#{contact_2.id}_#{medium_2_data[:type]}"}.merge(medium_2_data).
64
+ merge(:links => {:contacts => [contact_2.id]})]}.to_json)
65
+ end
66
+
67
+ it "returns all media" do
68
+ expect(Flapjack::Data::Contact).to receive(:all).
69
+ with(:redis => redis).and_return([contact])
70
+
71
+ expect(contact).to receive(:media_list).and_return([medium_data[:type]])
72
+ expect(contact).to receive(:media).and_return(medium_data[:type] => medium_data[:address])
73
+ expect(contact).to receive(:media_intervals).and_return(medium_data[:type] => medium_data[:interval])
74
+ expect(contact).to receive(:media_rollup_thresholds).and_return(medium_data[:type] => medium_data[:rollup_threshold])
75
+
76
+ aget '/media'
77
+ expect(last_response).to be_ok
78
+ expect(last_response.body).to eq({:media => [{:id => "#{contact.id}_#{medium_data[:type]}"}.merge(medium_data).
79
+ merge(:links => {:contacts => [contact.id]})]}.to_json)
80
+ end
81
+
82
+ it "does not return a medium if the contact is not present" do
83
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
84
+ with(contact.id, :redis => redis, :logger => @logger).and_return(nil)
85
+
86
+ aget "/media/#{contact.id}_email"
87
+ expect(last_response.status).to eq(404)
88
+ end
89
+
90
+ it "does not return a medium if the medium is not present" do
91
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
92
+ with(contact.id, :redis => redis, :logger => @logger).and_return(contact)
93
+
94
+ expect(contact).to receive(:media_list).and_return(['email'])
95
+
96
+ aget "/media/#{contact.id}_sms"
97
+ expect(last_response).to be_ok
98
+ expect(last_response.body).to eq({:media => []}.to_json)
99
+ end
100
+
101
+ it "creates a medium for a contact" do
102
+ expect(Flapjack::Data::Semaphore).to receive(:new).
103
+ with("contact_mass_update", :redis => redis, :expiry => 30).and_return(semaphore)
104
+
105
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
106
+ with(contact.id, :redis => redis).and_return(contact)
107
+
108
+ expect(contact).to receive(:set_address_for_media).
109
+ with(medium_data[:type], medium_data[:address])
110
+ expect(contact).to receive(:set_interval_for_media).
111
+ with(medium_data[:type], medium_data[:interval])
112
+ expect(contact).to receive(:set_rollup_threshold_for_media).
113
+ with(medium_data[:type], medium_data[:rollup_threshold])
114
+
115
+ expect(semaphore).to receive(:release).and_return(true)
116
+
117
+ apost "/contacts/#{contact.id}/media", {:media => [medium_data]}.to_json, jsonapi_post_env
118
+ expect(last_response.status).to eq(201)
119
+ expect(last_response.body).to eq('{"media":[' +
120
+ medium_data.merge(:id => "#{contact.id}_email",
121
+ :links => {:contacts => [contact.id]}).to_json + ']}')
122
+ end
123
+
124
+ it "does not create a medium for a contact that's not present" do
125
+ expect(Flapjack::Data::Semaphore).to receive(:new).
126
+ with("contact_mass_update", :redis => redis, :expiry => 30).and_return(semaphore)
127
+
128
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
129
+ with(contact.id, :redis => redis).and_return(nil)
130
+
131
+ medium_data = {:type => 'email',
132
+ :address => 'abc@example.com', :interval => 120, :rollup_threshold => 3}
133
+
134
+ expect(semaphore).to receive(:release).and_return(true)
135
+
136
+ apost "/contacts/#{contact.id}/media", {:media => [medium_data]}.to_json, jsonapi_post_env
137
+ expect(last_response.status).to eq(422)
138
+ end
139
+
140
+ it "updates a medium" do
141
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
142
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
143
+
144
+ expect(contact).to receive(:media_list).and_return(['email'])
145
+ expect(contact).to receive(:set_address_for_media).with('email', 'xyz@example.com')
146
+
147
+ apatch "/media/#{contact.id}_email",
148
+ [{:op => 'replace', :path => '/media/0/address', :value => 'xyz@example.com'}].to_json,
149
+ jsonapi_patch_env
150
+ expect(last_response.status).to eq(204)
151
+ end
152
+
153
+ it "updates multiple media" do
154
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
155
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
156
+
157
+ expect(contact).to receive(:media_list).and_return(['email', 'sms'])
158
+ expect(contact).to receive(:set_interval_for_media).with('email', 80)
159
+ expect(contact).to receive(:set_interval_for_media).with('sms', 80)
160
+
161
+ apatch "/media/#{contact.id}_email,#{contact.id}_sms",
162
+ [{:op => 'replace', :path => '/media/0/interval', :value => 80}].to_json,
163
+ jsonapi_patch_env
164
+ expect(last_response.status).to eq(204)
165
+ end
166
+
167
+ it "does not update a medium for a contact that's not present" do
168
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
169
+ with(contact.id, :logger => @logger, :redis => redis).and_return(nil)
170
+
171
+ apatch "/media/#{contact.id}_email",
172
+ [{:op => 'replace', :path => '/media/0/address', :value => 'xyz@example.com'}].to_json,
173
+ jsonapi_patch_env
174
+ expect(last_response.status).to eq(404)
175
+ end
176
+
177
+ it "does not update a medium that's not present" do
178
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
179
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
180
+
181
+ expect(contact).to receive(:media_list).and_return(['sms'])
182
+ expect(contact).not_to receive(:set_address_for_media).with('email', 'xyz@example.com')
183
+
184
+ apatch "/media/#{contact.id}_email",
185
+ [{:op => 'replace', :path => '/media/0/address', :value => 'xyz@example.com'}].to_json,
186
+ jsonapi_patch_env
187
+ expect(last_response.status).to eq(204)
188
+ end
189
+
190
+ it "deletes a medium" do
191
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
192
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
193
+
194
+ expect(contact).to receive(:media_list).and_return(['sms', 'email'])
195
+ expect(contact).to receive(:remove_media).with('email')
196
+
197
+ adelete "/media/#{contact.id}_email"
198
+ expect(last_response.status).to eq(204)
199
+ end
200
+
201
+ it "deletes multiple media" do
202
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
203
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
204
+
205
+ expect(contact).to receive(:media_list).and_return(['sms', 'email'])
206
+ expect(contact).to receive(:remove_media).with('email')
207
+ expect(contact).to receive(:remove_media).with('sms')
208
+
209
+ adelete "/media/#{contact.id}_email,#{contact.id}_sms"
210
+ expect(last_response.status).to eq(204)
211
+ end
212
+
213
+ it "does not delete a medium that's not found" do
214
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
215
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
216
+
217
+ expect(contact).to receive(:media_list).and_return(['sms'])
218
+ expect(contact).not_to receive(:remove_media).with('email')
219
+
220
+ adelete "/media/#{contact.id}_email"
221
+ expect(last_response.status).to eq(204)
222
+ end
223
+
224
+ it "does not delete a medium for a contact that's not found" do
225
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
226
+ with('23', :logger => @logger, :redis => redis).and_return(nil)
227
+
228
+ adelete '/media/23_email'
229
+ expect(last_response.status).to eq(404)
230
+ end
231
+
232
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+ require 'flapjack/gateways/jsonapi'
3
+
4
+ describe 'Flapjack::Gateways::JSONAPI::NotificationRuleMethods', :sinatra => true, :logger => true do
5
+
6
+ include_context "jsonapi"
7
+
8
+ let(:contact) { double(Flapjack::Data::Contact, :id => '21') }
9
+
10
+ let(:notification_rule) {
11
+ double(Flapjack::Data::NotificationRule, :id => '1', :contact_id => '21')
12
+ }
13
+
14
+ let(:notification_rule_data) {
15
+ {"tags" => ["database","physical"],
16
+ "regex_tags" => ["^data.*$","^(physical|bare_metal)$"],
17
+ "regex_entities" => ["^foo-\S{3}-\d{2}.example.com$"],
18
+ "time_restrictions" => nil,
19
+ "unknown_media" => ["jabber"],
20
+ "warning_media" => ["email"],
21
+ "critical_media" => ["sms", "email"],
22
+ "unknown_blackhole" => false,
23
+ "warning_blackhole" => false,
24
+ "critical_blackhole" => false
25
+ }
26
+ }
27
+
28
+ it "returns a specified notification rule" do
29
+ expect(notification_rule).to receive(:to_jsonapi).and_return('"rule_1"')
30
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
31
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
32
+
33
+ aget "/notification_rules/#{notification_rule.id}"
34
+ expect(last_response).to be_ok
35
+ expect(last_response.body).to eq('{"notification_rules":["rule_1"]}')
36
+ end
37
+
38
+ it "does not return a notification rule that does not exist" do
39
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
40
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(nil)
41
+
42
+ aget "/notification_rules/#{notification_rule.id}"
43
+ expect(last_response.status).to eq(404)
44
+ end
45
+
46
+ # POST /notification_rules
47
+ it "creates a new notification rule" do
48
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
49
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
50
+ expect(notification_rule).to receive(:respond_to?).with(:critical_media).and_return(true)
51
+ expect(notification_rule).to receive(:to_json).and_return('"rule_1"')
52
+
53
+ # symbolize the keys
54
+ notification_rule_data_sym = notification_rule_data.inject({}){|memo,(k,v)|
55
+ memo[k.to_sym] = v; memo
56
+ }
57
+
58
+ expect(contact).to receive(:add_notification_rule).
59
+ with(notification_rule_data_sym, :logger => @logger).and_return(notification_rule)
60
+
61
+ apost "/contacts/#{contact.id}/notification_rules",
62
+ {"notification_rules" => [notification_rule_data]}.to_json, jsonapi_post_env
63
+ expect(last_response.status).to eq(201)
64
+ expect(last_response.body).to eq('{"notification_rules":["rule_1"]}')
65
+ end
66
+
67
+ it "does not create a notification_rule for a contact that's not present" do
68
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
69
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
70
+
71
+ apost "/contacts/#{contact.id}/notification_rules",
72
+ {"notification_rules" => [notification_rule_data]}.to_json, jsonapi_post_env
73
+ expect(last_response.status).to eq(404)
74
+ end
75
+
76
+ # PATCH /notification_rules/RULE_ID
77
+ it "updates a notification rule" do
78
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
79
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
80
+
81
+ expect(notification_rule).to receive(:update).with({:warning_blackhole => true}, :logger => @logger).and_return(nil)
82
+
83
+ apatch "/notification_rules/#{notification_rule.id}",
84
+ [{:op => 'replace', :path => '/notification_rules/0/warning_blackhole', :value => true}].to_json,
85
+ jsonapi_patch_env
86
+ expect(last_response.status).to eq(204)
87
+ end
88
+
89
+ it "does not update a notification rule that's not present" do
90
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
91
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(nil)
92
+
93
+ apatch "/notification_rules/#{notification_rule.id}",
94
+ [{:op => 'replace', :path => '/notification_rules/0/warning_blackhole', :value => true}].to_json,
95
+ jsonapi_patch_env
96
+ expect(last_response.status).to eq(404)
97
+ end
98
+
99
+ # DELETE /notification_rules/RULE_ID
100
+ it "deletes a notification rule" do
101
+ expect(notification_rule).to receive(:contact_id).and_return(contact.id)
102
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
103
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
104
+ expect(contact).to receive(:delete_notification_rule).with(notification_rule)
105
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
106
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
107
+
108
+ adelete "/notification_rules/#{notification_rule.id}"
109
+ expect(last_response.status).to eq(204)
110
+ end
111
+
112
+ it "does not delete a notification rule that's not present" do
113
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
114
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(nil)
115
+
116
+ adelete "/notification_rules/#{notification_rule.id}"
117
+ expect(last_response.status).to eq(404)
118
+ end
119
+
120
+ it "does not delete a notification rule if the contact is not present" do
121
+ expect(notification_rule).to receive(:contact_id).and_return(contact.id)
122
+ expect(Flapjack::Data::NotificationRule).to receive(:find_by_id).
123
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
124
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
125
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
126
+
127
+ adelete "/notification_rules/#{notification_rule.id}"
128
+ expect(last_response.status).to eq(404)
129
+ end
130
+
131
+ end
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+ require 'flapjack/gateways/jsonapi'
3
+
4
+ describe 'Flapjack::Gateways::JSONAPI::PagerdutyCredentialMethods', :sinatra => true, :logger => true do
5
+
6
+ include_context "jsonapi"
7
+
8
+ let(:contact) { double(Flapjack::Data::Contact, :id => '21') }
9
+
10
+ let(:pagerduty_credentials) {
11
+ {'service_key' => 'abc',
12
+ 'subdomain' => 'def',
13
+ 'username' => 'ghi',
14
+ 'password' => 'jkl',
15
+ }
16
+ }
17
+
18
+ let(:semaphore) {
19
+ double(Flapjack::Data::Semaphore, :resource => 'folly',
20
+ :key => 'semaphores:folly', :expiry => 30, :token => 'spatulas-R-us')
21
+ }
22
+
23
+ it "returns pagerduty credentials" do
24
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
25
+ with(contact.id, :redis => redis, :logger => @logger).and_return(contact)
26
+
27
+ expect(contact).to receive(:pagerduty_credentials).and_return(pagerduty_credentials)
28
+
29
+ aget "/pagerduty_credentials/#{contact.id}"
30
+ expect(last_response).to be_ok
31
+ expect(last_response.body).to eq({:pagerduty_credentials => [pagerduty_credentials.
32
+ merge(:links => {:contacts => [contact.id]})]}.to_json)
33
+ end
34
+
35
+ it "does not return pagerduty credentials if the contact is not present" do
36
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
37
+ with(contact.id, :redis => redis, :logger => @logger).and_return(nil)
38
+
39
+ aget "/pagerduty_credentials/#{contact.id}"
40
+ expect(last_response.status).to eq(404)
41
+ end
42
+
43
+ it "creates pagerduty credentials for a contact" do
44
+ expect(Flapjack::Data::Semaphore).to receive(:new).
45
+ with("contact_mass_update", :redis => redis, :expiry => 30).and_return(semaphore)
46
+
47
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
48
+ with(contact.id, :redis => redis).and_return(contact)
49
+
50
+ expect(contact).to receive(:set_pagerduty_credentials).with(pagerduty_credentials)
51
+ expect(semaphore).to receive(:release).and_return(true)
52
+
53
+ apost "/contacts/#{contact.id}/pagerduty_credentials",
54
+ {:pagerduty_credentials => [pagerduty_credentials]}.to_json, jsonapi_post_env
55
+ expect(last_response.status).to eq(201)
56
+ expect(last_response.body).to eq('{"pagerduty_credentials":[' +
57
+ pagerduty_credentials.merge(:links => {:contacts => [contact.id]}).to_json + ']}')
58
+ end
59
+
60
+ it "does not create pagerduty credentials for a contact that's not present" do
61
+ expect(Flapjack::Data::Semaphore).to receive(:new).
62
+ with("contact_mass_update", :redis => redis, :expiry => 30).and_return(semaphore)
63
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
64
+ with(contact.id, :redis => redis).and_return(nil)
65
+ expect(semaphore).to receive(:release).and_return(true)
66
+
67
+ apost "/contacts/#{contact.id}/pagerduty_credentials",
68
+ {:pagerduty_credentials => [pagerduty_credentials]}.to_json, jsonapi_post_env
69
+ expect(last_response.status).to eq(422)
70
+ end
71
+
72
+ it "updates pagerduty credentials for a contact" do
73
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
74
+ with(contact.id, :logger => @logger, :redis => redis).and_return(contact)
75
+
76
+ expect(contact).to receive(:pagerduty_credentials).and_return(pagerduty_credentials)
77
+ expect(contact).to receive(:set_pagerduty_credentials).with(pagerduty_credentials.merge('service_key' => 'xyz'))
78
+
79
+ apatch "/pagerduty_credentials/#{contact.id}",
80
+ [{:op => 'replace', :path => '/pagerduty_credentials/0/service_key', :value => 'xyz'}].to_json,
81
+ jsonapi_patch_env
82
+ expect(last_response.status).to eq(204)
83
+ end
84
+
85
+ it "does not update pagerduty credentials for a contact that's not present" do
86
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
87
+ with(contact.id, :logger => @logger, :redis => redis).and_return(nil)
88
+
89
+ apatch "/pagerduty_credentials/#{contact.id}",
90
+ [{:op => 'replace', :path => '/pagerduty_credentials/0/service_key', :value => 'xyz'}].to_json,
91
+ jsonapi_patch_env
92
+ expect(last_response.status).to eq(404)
93
+ end
94
+
95
+ it "deletes the pagerduty credentials for a contact" do
96
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
97
+ with(contact.id, :redis => redis, :logger => @logger).and_return(contact)
98
+
99
+ expect(contact).to receive(:delete_pagerduty_credentials)
100
+
101
+ adelete "/pagerduty_credentials/#{contact.id}"
102
+ expect(last_response.status).to eq(204)
103
+ end
104
+
105
+ it "does not delete the pagerduty credentials of a contact that's not present" do
106
+ expect(Flapjack::Data::Contact).to receive(:find_by_id).
107
+ with(contact.id, :redis => redis, :logger => @logger).and_return(nil)
108
+
109
+ adelete "/pagerduty_credentials/#{contact.id}"
110
+ expect(last_response.status).to eq(404)
111
+ end
112
+
113
+ end