flapjack 0.9.6 → 1.0.0rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +6 -0
  4. data/.travis.yml +20 -16
  5. data/CHANGELOG.md +11 -25
  6. data/Dockerfile +8 -0
  7. data/Gemfile +2 -5
  8. data/bin/flapjack +24 -213
  9. data/etc/flapjack_config.yaml.example +6 -30
  10. data/features/cli.feature +16 -14
  11. data/features/cli_flapjack-feed-events.feature +12 -13
  12. data/features/cli_flapjack-nagios-receiver.feature +14 -15
  13. data/features/cli_flapjack-populator.feature +16 -15
  14. data/features/cli_flapper.feature +12 -12
  15. data/features/cli_receive-events.feature +6 -5
  16. data/features/cli_simulate-failed-check.feature +7 -6
  17. data/features/steps/cli_steps.rb +2 -2
  18. data/features/support/env.rb +1 -0
  19. data/flapjack.gemspec +1 -0
  20. data/lib/flapjack/cli/flapper.rb +200 -0
  21. data/lib/flapjack/cli/import.rb +102 -0
  22. data/lib/flapjack/cli/receiver.rb +656 -0
  23. data/lib/flapjack/cli/server.rb +256 -0
  24. data/lib/flapjack/cli/simulate.rb +180 -0
  25. data/lib/flapjack/configuration.rb +2 -0
  26. data/lib/flapjack/data/entity_check.rb +5 -22
  27. data/lib/flapjack/data/event.rb +7 -12
  28. data/lib/flapjack/gateways/email.rb +4 -1
  29. data/lib/flapjack/gateways/jabber.rb +12 -36
  30. data/lib/flapjack/gateways/jsonapi/check_presenter.rb +6 -6
  31. data/lib/flapjack/gateways/jsonapi/report_methods.rb +5 -3
  32. data/lib/flapjack/gateways/pagerduty.rb +1 -1
  33. data/lib/flapjack/gateways/web/public/js/backbone.jsonapi.js +1 -1
  34. data/lib/flapjack/gateways/web/public/js/modules/contact.js +2 -2
  35. data/lib/flapjack/gateways/web/public/js/modules/entity.js +2 -2
  36. data/lib/flapjack/gateways/web/public/js/modules/medium.js +4 -4
  37. data/lib/flapjack/gateways/web/public/js/self_stats.js +1 -1
  38. data/lib/flapjack/gateways/web/views/check.html.erb +7 -7
  39. data/lib/flapjack/gateways/web/views/checks.html.erb +2 -3
  40. data/lib/flapjack/gateways/web/views/contact.html.erb +4 -4
  41. data/lib/flapjack/gateways/web/views/contacts.html.erb +2 -2
  42. data/lib/flapjack/gateways/web/views/edit_contacts.html.erb +1 -1
  43. data/lib/flapjack/gateways/web/views/entities.html.erb +1 -1
  44. data/lib/flapjack/gateways/web/views/entity.html.erb +1 -1
  45. data/lib/flapjack/gateways/web/views/index.html.erb +2 -2
  46. data/lib/flapjack/gateways/web/views/layout.erb +10 -10
  47. data/lib/flapjack/gateways/web/views/self_stats.html.erb +1 -1
  48. data/lib/flapjack/gateways/web.rb +36 -7
  49. data/lib/flapjack/pikelet.rb +0 -2
  50. data/lib/flapjack/processor.rb +3 -1
  51. data/lib/flapjack/redis_pool.rb +2 -6
  52. data/lib/flapjack/version.rb +1 -1
  53. data/spec/lib/flapjack/coordinator_spec.rb +3 -3
  54. data/spec/lib/flapjack/data/entity_check_spec.rb +2 -6
  55. data/spec/lib/flapjack/data/event_spec.rb +0 -31
  56. data/spec/lib/flapjack/gateways/email_spec.rb +109 -0
  57. data/spec/lib/flapjack/gateways/jabber_spec.rb +18 -16
  58. data/spec/lib/flapjack/gateways/jsonapi/check_presenter_spec.rb +12 -24
  59. data/spec/lib/flapjack/gateways/pagerduty_spec.rb +1 -1
  60. data/spec/lib/flapjack/gateways/web/views/check.html.erb_spec.rb +2 -0
  61. data/spec/lib/flapjack/gateways/web/views/contact.html.erb_spec.rb +2 -0
  62. data/spec/lib/flapjack/gateways/web/views/index.html.erb_spec.rb +2 -0
  63. data/spec/lib/flapjack/gateways/web_spec.rb +194 -145
  64. data/spec/lib/flapjack/redis_pool_spec.rb +0 -1
  65. data/spec/support/profile_all_formatter.rb +44 -0
  66. data/spec/support/uncolored_doc_formatter.rb +9 -0
  67. data/tasks/benchmarks.rake +0 -4
  68. metadata +28 -38
  69. data/.ruby-version +0 -1
  70. data/Gemfile-ruby1.9 +0 -28
  71. data/Gemfile-ruby1.9.lock +0 -227
  72. data/bin/flapjack-feed-events +0 -124
  73. data/bin/flapjack-nagios-receiver +0 -246
  74. data/bin/flapjack-nsca-receiver +0 -246
  75. data/bin/flapjack-populator +0 -132
  76. data/bin/flapper +0 -152
  77. data/bin/receive-events +0 -179
  78. data/bin/simulate-failed-check +0 -151
  79. data/lib/flapjack/data/migration.rb +0 -36
  80. data/lib/flapjack/gateways/api/contact_methods.rb +0 -369
  81. data/lib/flapjack/gateways/api/entity_check_presenter.rb +0 -218
  82. data/lib/flapjack/gateways/api/entity_methods.rb +0 -361
  83. data/lib/flapjack/gateways/api/entity_presenter.rb +0 -75
  84. data/lib/flapjack/gateways/api/rack/json_params_parser.rb +0 -26
  85. data/lib/flapjack/gateways/api.rb +0 -124
  86. data/spec/lib/flapjack/gateways/api/contact_methods_spec.rb +0 -772
  87. data/spec/lib/flapjack/gateways/api/entity_check_presenter_spec.rb +0 -211
  88. data/spec/lib/flapjack/gateways/api/entity_methods_spec.rb +0 -863
  89. data/spec/lib/flapjack/gateways/api/entity_presenter_spec.rb +0 -108
  90. data/spec/lib/flapjack/gateways/api_spec.rb +0 -30
@@ -10,18 +10,14 @@ require 'redis'
10
10
 
11
11
  require 'em-synchrony/connection_pool'
12
12
 
13
- require 'flapjack/data/migration'
14
-
15
13
  module Flapjack
16
14
  class RedisPool < EventMachine::Synchrony::ConnectionPool
17
15
 
18
16
  def initialize(opts = {})
19
17
  config = opts.delete(:config)
20
- @size = opts[:size] || 5
18
+ @size = opts[:size] || 5
21
19
  super(:size => @size) {
22
- redis = ::Redis.new(config)
23
- Flapjack::Data::Migration.refresh_archive_index(:redis => redis)
24
- redis
20
+ ::Redis.new(config)
25
21
  }
26
22
  end
27
23
 
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  module Flapjack
4
- VERSION = "0.9.6"
4
+ VERSION = "1.0.0rc1"
5
5
  end
6
6
 
@@ -33,7 +33,7 @@ describe Flapjack::Coordinator do
33
33
  and_return(processor)
34
34
 
35
35
  expect(EM).to receive(:stop)
36
- expect(EM::Synchrony).to receive(:sleep) {
36
+ expect(EM::Synchrony).to receive(:sleep).and_return {
37
37
  fc.instance_variable_set('@received_signals', ['INT'])
38
38
  }
39
39
 
@@ -102,7 +102,7 @@ describe Flapjack::Coordinator do
102
102
  and_return(notifier)
103
103
 
104
104
  expect(EM).to receive(:stop)
105
- expect(EM::Synchrony).to receive(:sleep) {
105
+ expect(EM::Synchrony).to receive(:sleep).and_return {
106
106
  fc.instance_variable_set('@received_signals', ['INT'])
107
107
  }
108
108
 
@@ -136,7 +136,7 @@ describe Flapjack::Coordinator do
136
136
  and_return(processor)
137
137
 
138
138
  expect(EM).to receive(:stop)
139
- expect(EM::Synchrony).to receive(:sleep) {
139
+ expect(EM::Synchrony).to receive(:sleep).and_return {
140
140
  fc.instance_variable_set('@received_signals', ['INT'])
141
141
  }
142
142
 
@@ -180,7 +180,7 @@ describe Flapjack::Data::EntityCheck, :redis => true do
180
180
  expect(duration_curr).to eq(half_an_hour)
181
181
  end
182
182
 
183
- it "ends an unscheduled maintenance period" do
183
+ it "ends an unscheduled maintenance period", :time => true do
184
184
  t = Time.now.to_i
185
185
  later_t = t + (15 * 60)
186
186
  ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
@@ -233,6 +233,7 @@ describe Flapjack::Data::EntityCheck, :redis => true do
233
233
  expect(duration).to eq(half_an_hour)
234
234
  end
235
235
 
236
+ # TODO this should probably enforce that it starts in the future
236
237
  it "creates a scheduled maintenance period covering the current time" do
237
238
  t = Time.now.to_i
238
239
  ec = Flapjack::Data::EntityCheck.for_entity_name(name, check, :redis => @redis)
@@ -254,11 +255,6 @@ describe Flapjack::Data::EntityCheck, :redis => true do
254
255
  expect(duration).not_to be_nil
255
256
  expect(duration).to be_a(Float)
256
257
  expect(duration).to eq(2 * (60 * 60))
257
-
258
- ttl = @redis.ttl("#{name}:#{check}:scheduled_maintenance")
259
- expect(ttl).to be_within(20).of(60 * 60) # 20-second margin of error,
260
- # should be large enough for a slow machine running the test -- duration
261
- # is considered to start at the begininng of the period
262
258
  end
263
259
 
264
260
  it "removes a scheduled maintenance period for a future time" do
@@ -22,18 +22,11 @@ describe Flapjack::Data::Event do
22
22
  'tags' => ['dev'] }
23
23
  }
24
24
 
25
- before(:each) do
26
- Flapjack::Data::Event.instance_variable_set('@previous_base_time_str', nil)
27
- end
28
-
29
25
  context 'class' do
30
26
 
31
27
  it "returns the next event (blocking, archiving)" do
32
28
  expect(mock_redis).to receive(:brpoplpush).
33
29
  with('events', /^events_archive:/, 0).and_return(event_data.to_json)
34
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
35
- expect(mock_redis).to receive(:sadd).
36
- with('known_events_archive_keys', /^events_archive:/)
37
30
  expect(mock_redis).to receive(:expire)
38
31
 
39
32
  result = Flapjack::Data::Event.next('events', :block => true,
@@ -53,9 +46,6 @@ describe Flapjack::Data::Event do
53
46
  it "returns the next event (non-blocking, archiving)" do
54
47
  expect(mock_redis).to receive(:rpoplpush).
55
48
  with('events', /^events_archive:/).and_return(event_data.to_json)
56
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
57
- expect(mock_redis).to receive(:sadd).
58
- with('known_events_archive_keys', /^events_archive:/)
59
49
  expect(mock_redis).to receive(:expire)
60
50
 
61
51
  result = Flapjack::Data::Event.next('events', :block => false,
@@ -76,9 +66,6 @@ describe Flapjack::Data::Event do
76
66
  bad_event_json = '{{{'
77
67
  expect(mock_redis).to receive(:brpoplpush).
78
68
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
79
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
80
- expect(mock_redis).to receive(:sadd).
81
- with('known_events_archive_keys', /^events_archive:/)
82
69
  expect(mock_redis).to receive(:multi)
83
70
  expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
84
71
  expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
@@ -107,9 +94,6 @@ describe Flapjack::Data::Event do
107
94
  bad_event_data = event_data.clone
108
95
  bad_event_data.delete(required_key)
109
96
  bad_event_json = bad_event_data.to_json
110
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
111
- expect(mock_redis).to receive(:sadd).
112
- with('known_events_archive_keys', /^events_archive:/)
113
97
  expect(mock_redis).to receive(:brpoplpush).
114
98
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
115
99
  expect(mock_redis).to receive(:multi)
@@ -142,9 +126,6 @@ describe Flapjack::Data::Event do
142
126
  bad_event_json = bad_event_data.to_json
143
127
  expect(mock_redis).to receive(:brpoplpush).
144
128
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
145
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
146
- expect(mock_redis).to receive(:sadd).
147
- with('known_events_archive_keys', /^events_archive:/)
148
129
  expect(mock_redis).to receive(:multi)
149
130
  expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
150
131
  expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
@@ -175,9 +156,6 @@ describe Flapjack::Data::Event do
175
156
  bad_event_data = event_data.clone
176
157
  bad_event_data[optional_key] = {'hello' => 'there'}
177
158
  bad_event_json = bad_event_data.to_json
178
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
179
- expect(mock_redis).to receive(:sadd).
180
- with('known_events_archive_keys', /^events_archive:/)
181
159
  expect(mock_redis).to receive(:brpoplpush).
182
160
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
183
161
  expect(mock_redis).to receive(:multi)
@@ -210,9 +188,6 @@ describe Flapjack::Data::Event do
210
188
  it "it matches case-insensitively for #{key} (archiving)" do
211
189
  case_event_data = event_data.clone
212
190
  case_event_data[key] = event_data[key].upcase
213
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
214
- expect(mock_redis).to receive(:sadd).
215
- with('known_events_archive_keys', /^events_archive:/)
216
191
  expect(mock_redis).to receive(:brpoplpush).
217
192
  with('events', /^events_archive:/, 0).and_return(case_event_data.to_json)
218
193
  expect(mock_redis).to receive(:expire)
@@ -239,9 +214,6 @@ describe Flapjack::Data::Event do
239
214
  it "it accepts an event with a numeric #{key} key (archiving)" do
240
215
  num_event_data = event_data.clone
241
216
  num_event_data[key] = event_data[key].to_i.to_s
242
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
243
- expect(mock_redis).to receive(:sadd).
244
- with('known_events_archive_keys', /^events_archive:/)
245
217
  expect(mock_redis).to receive(:brpoplpush).
246
218
  with('events', /^events_archive:/, 0).and_return(num_event_data.to_json)
247
219
  expect(mock_redis).to receive(:expire)
@@ -268,9 +240,6 @@ describe Flapjack::Data::Event do
268
240
  bad_event_json = bad_event_data.to_json
269
241
  expect(mock_redis).to receive(:brpoplpush).
270
242
  with('events', /^events_archive:/, 0).and_return(bad_event_json)
271
- expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => mock_redis)
272
- expect(mock_redis).to receive(:sadd).
273
- with('known_events_archive_keys', /^events_archive:/)
274
243
  expect(mock_redis).to receive(:multi)
275
244
  expect(mock_redis).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json)
276
245
  expect(mock_redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json)
@@ -38,6 +38,115 @@ describe Flapjack::Gateways::Email, :logger => true do
38
38
  Flapjack::Gateways::Email.perform(notification)
39
39
  end
40
40
 
41
+ it "can have a full name in custom from email address" do
42
+ email = double('email')
43
+ redis = double('redis')
44
+
45
+ expect(EM::P::SmtpClient).to receive(:send).with(
46
+ hash_including(host: 'localhost',
47
+ port: 25,
48
+ from: "Full Name <from@example.org>")
49
+ ).and_return(email)
50
+
51
+ response = double(response)
52
+ expect(response).to receive(:"respond_to?").with(:code).and_return(true)
53
+ expect(response).to receive(:code).and_return(250)
54
+
55
+ expect(EM::Synchrony).to receive(:sync).with(email).and_return(response)
56
+
57
+ notification = {'notification_type' => 'recovery',
58
+ 'contact_first_name' => 'John',
59
+ 'contact_last_name' => 'Smith',
60
+ 'state' => 'ok',
61
+ 'state_duration' => 2,
62
+ 'summary' => 'smile',
63
+ 'last_state' => 'problem',
64
+ 'last_summary' => 'frown',
65
+ 'time' => Time.now.to_i,
66
+ 'event_id' => 'example.com:ping'}
67
+
68
+ config = {"smtp_config" => {'from' => 'Full Name <from@example.org>'}}
69
+ Flapjack::Gateways::Email.instance_variable_set('@config', config)
70
+ Flapjack::Gateways::Email.instance_variable_set('@redis', redis)
71
+ Flapjack::Gateways::Email.instance_variable_set('@logger', @logger)
72
+ Flapjack::Gateways::Email.start
73
+ Flapjack::Gateways::Email.perform(notification)
74
+ end
75
+
76
+ it "can have a custom reply-to address" do
77
+ email = double('email')
78
+ redis = double('redis')
79
+
80
+ expect(EM::P::SmtpClient).to receive(:send) { |message|
81
+ # NOTE No access to headers directly. Must be determined from message content
82
+ expect( message[:content] ).to include("Reply-To: reply-to@example.com")
83
+ # NOTE Ensure we haven't trashed any other arguments
84
+ expect( message[:host] ).to eql('localhost')
85
+ expect( message[:port] ).to eql(25)
86
+ expect( message[:from] ).to eql('from@example.org')
87
+ }.and_return(email)
88
+
89
+ response = double(response)
90
+ expect(response).to receive(:"respond_to?").with(:code).and_return(true)
91
+ expect(response).to receive(:code).and_return(250)
92
+
93
+ expect(EM::Synchrony).to receive(:sync).with(email).and_return(response)
94
+
95
+ notification = {'notification_type' => 'recovery',
96
+ 'contact_first_name' => 'John',
97
+ 'contact_last_name' => 'Smith',
98
+ 'state' => 'ok',
99
+ 'state_duration' => 2,
100
+ 'summary' => 'smile',
101
+ 'last_state' => 'problem',
102
+ 'last_summary' => 'frown',
103
+ 'time' => Time.now.to_i,
104
+ 'event_id' => 'example.com:ping'}
105
+
106
+ config = {"smtp_config" => {'from' => 'from@example.org', 'reply_to' => 'reply-to@example.com'}}
107
+
108
+ Flapjack::Gateways::Email.instance_variable_set('@config', config)
109
+ Flapjack::Gateways::Email.instance_variable_set('@redis', redis)
110
+ Flapjack::Gateways::Email.instance_variable_set('@logger', @logger)
111
+ Flapjack::Gateways::Email.start
112
+ Flapjack::Gateways::Email.perform(notification)
113
+ end
114
+
115
+ it "must default to from address if no reply-to given" do
116
+ email = double('email')
117
+ redis = double('redis')
118
+
119
+ expect(EM::P::SmtpClient).to receive(:send) { |message|
120
+ # NOTE No access to headers directly. Must be determined from message content
121
+ expect( message[:content] ).to include("Reply-To: from@example.org")
122
+ }.and_return(email)
123
+
124
+ response = double(response)
125
+ expect(response).to receive(:"respond_to?").with(:code).and_return(true)
126
+ expect(response).to receive(:code).and_return(250)
127
+
128
+ expect(EM::Synchrony).to receive(:sync).with(email).and_return(response)
129
+
130
+ notification = {'notification_type' => 'recovery',
131
+ 'contact_first_name' => 'John',
132
+ 'contact_last_name' => 'Smith',
133
+ 'state' => 'ok',
134
+ 'state_duration' => 2,
135
+ 'summary' => 'smile',
136
+ 'last_state' => 'problem',
137
+ 'last_summary' => 'frown',
138
+ 'time' => Time.now.to_i,
139
+ 'event_id' => 'example.com:ping'}
140
+
141
+ config = {"smtp_config" => {'from' => 'from@example.org'}}
142
+
143
+ Flapjack::Gateways::Email.instance_variable_set('@config', config)
144
+ Flapjack::Gateways::Email.instance_variable_set('@redis', redis)
145
+ Flapjack::Gateways::Email.instance_variable_set('@logger', @logger)
146
+ Flapjack::Gateways::Email.start
147
+ Flapjack::Gateways::Email.perform(notification)
148
+ end
149
+
41
150
  it "sends a mail with text, html parts and default from address" do
42
151
  email = double('email')
43
152
 
@@ -3,14 +3,13 @@ require 'flapjack/gateways/jabber'
3
3
 
4
4
  describe Flapjack::Gateways::Jabber, :logger => true do
5
5
 
6
- let(:config) { {'queue' => 'jabber_notifications',
7
- 'server' => 'example.com',
8
- 'port' => '5222',
9
- 'jabberid' => 'flapjack@example.com',
10
- 'password' => 'password',
11
- 'alias' => 'flapjack',
12
- 'identifiers' => ['@flapjack'],
13
- 'rooms' => ['flapjacktest@conference.example.com']
6
+ let(:config) { {'queue' => 'jabber_notifications',
7
+ 'server' => 'example.com',
8
+ 'port' => '5222',
9
+ 'jabberid' => 'flapjack@example.com',
10
+ 'password' => 'password',
11
+ 'alias' => 'flapjack',
12
+ 'rooms' => ['flapjacktest@conference.example.com']
14
13
  }
15
14
  }
16
15
 
@@ -27,11 +26,10 @@ describe Flapjack::Gateways::Jabber, :logger => true do
27
26
  expect(fj).to receive(:register_handler).with(:ready).and_yield(stanza)
28
27
  expect(fj).to receive(:on_ready).with(stanza)
29
28
 
30
- body_matchers = [{:body => /^@flapjack[:\s]/}, {:body => /^flapjack[:\s]/}]
31
- expect(fj).to receive(:register_handler).with(:message, :groupchat?, body_matchers).and_yield(stanza)
29
+ expect(fj).to receive(:register_handler).with(:message, :groupchat?, :body => /^flapjack:\s+/).and_yield(stanza)
32
30
  expect(fj).to receive(:on_groupchat).with(stanza)
33
31
 
34
- expect(fj).to receive(:register_handler).with(:message, :chat?, :body).and_yield(stanza)
32
+ expect(fj).to receive(:register_handler).with(:message, :chat?).and_yield(stanza)
35
33
  expect(fj).to receive(:on_chat).with(stanza)
36
34
 
37
35
  expect(fj).to receive(:register_handler).with(:disconnected).and_yield(stanza)
@@ -54,8 +52,9 @@ describe Flapjack::Gateways::Jabber, :logger => true do
54
52
  end
55
53
 
56
54
  it "receives an acknowledgement message" do
57
- expect(stanza).to receive(:body).twice.and_return('flapjack: ACKID 1f8ac10f fixing now duration: 90m')
55
+ expect(stanza).to receive(:body).and_return('flapjack: ACKID 1f8ac10f fixing now duration: 90m')
58
56
  from = double('from')
57
+ expect(from).to receive(:resource).and_return('sender')
59
58
  expect(from).to receive(:stripped).and_return('sender')
60
59
  expect(stanza).to receive(:from).and_return(from)
61
60
 
@@ -86,11 +85,12 @@ describe Flapjack::Gateways::Jabber, :logger => true do
86
85
  end
87
86
 
88
87
  it "strips XML tags from the received message" do
89
- expect(stanza).to receive(:body).twice.
88
+ expect(stanza).to receive(:body).
90
89
  and_return('flapjack: tell me about <span style="text-decoration: underline;">' +
91
90
  '<a href="http://example.org/">example.org</a></span>')
92
91
 
93
92
  from = double('from')
93
+ expect(from).to receive(:resource).and_return('sender')
94
94
  expect(from).to receive(:stripped).and_return('sender')
95
95
  expect(stanza).to receive(:from).and_return(from)
96
96
 
@@ -119,10 +119,11 @@ describe Flapjack::Gateways::Jabber, :logger => true do
119
119
  end
120
120
 
121
121
  it "handles a message with a newline in it" do
122
- expect(stanza).to receive(:body).twice.
122
+ expect(stanza).to receive(:body).
123
123
  and_return("flapjack: tell me about \nexample.com")
124
124
 
125
125
  from = double('from')
126
+ expect(from).to receive(:resource).and_return('sender')
126
127
  expect(from).to receive(:stripped).and_return('sender')
127
128
  expect(stanza).to receive(:from).and_return(from)
128
129
 
@@ -151,8 +152,9 @@ describe Flapjack::Gateways::Jabber, :logger => true do
151
152
  end
152
153
 
153
154
  it "receives a message it doesn't understand" do
154
- expect(stanza).to receive(:body).twice.and_return('flapjack: hello!')
155
+ expect(stanza).to receive(:body).once.and_return('flapjack: hello!')
155
156
  from = double('from')
157
+ expect(from).to receive(:resource).and_return('sender')
156
158
  expect(from).to receive(:stripped).and_return('sender')
157
159
  expect(stanza).to receive(:from).and_return(from)
158
160
 
@@ -174,7 +176,7 @@ describe Flapjack::Gateways::Jabber, :logger => true do
174
176
 
175
177
  expect(EventMachine::Synchrony).to receive(:sleep).with(5).exactly(1).times
176
178
  expect(EventMachine::Synchrony).to receive(:sleep).with(2).exactly(3).times
177
- expect(fj).to receive(:connect).exactly(4).times {
179
+ expect(fj).to receive(:connect).exactly(4).times.and_return {
178
180
  attempts +=1
179
181
  raise StandardError.new unless attempts > 3
180
182
  }
@@ -47,10 +47,8 @@ describe 'Flapjack::Gateways::JSONAPI::CheckPresenter' do
47
47
  ecp = Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)
48
48
  outages = ecp.outage(time - (5 * 60 * 60), time - (2 * 60 * 60))
49
49
  expect(outages).not_to be_nil
50
- expect(outages).to be_a(Hash)
51
- expect(outages).to have_key(:outages)
52
- expect(outages[:outages]).to be_an(Array)
53
- expect(outages[:outages].size).to eq(4)
50
+ expect(outages).to be_an(Array)
51
+ expect(outages.size).to eq(4)
54
52
 
55
53
  # TODO check the data in those hashes
56
54
  end
@@ -65,10 +63,8 @@ describe 'Flapjack::Gateways::JSONAPI::CheckPresenter' do
65
63
  ecp = Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)
66
64
  outages = ecp.outage(nil, nil)
67
65
  expect(outages).not_to be_nil
68
- expect(outages).to be_a(Hash)
69
- expect(outages).to have_key(:outages)
70
- expect(outages[:outages]).to be_an(Array)
71
- expect(outages[:outages].size).to eq(4)
66
+ expect(outages).to be_an(Array)
67
+ expect(outages.size).to eq(4)
72
68
 
73
69
  # TODO check the data in those hashes
74
70
  end
@@ -86,10 +82,8 @@ describe 'Flapjack::Gateways::JSONAPI::CheckPresenter' do
86
82
  ecp = Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)
87
83
  outages = ecp.outage(nil, nil)
88
84
  expect(outages).not_to be_nil
89
- expect(outages).to be_a(Hash)
90
- expect(outages).to have_key(:outages)
91
- expect(outages[:outages]).to be_an(Array)
92
- expect(outages[:outages].size).to eq(3)
85
+ expect(outages).to be_an(Array)
86
+ expect(outages.size).to eq(3)
93
87
  end
94
88
 
95
89
  it "returns a (small) outage hash for a single state change" do
@@ -101,10 +95,8 @@ describe 'Flapjack::Gateways::JSONAPI::CheckPresenter' do
101
95
  ecp = Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)
102
96
  outages = ecp.outage(nil, nil)
103
97
  expect(outages).not_to be_nil
104
- expect(outages).to be_a(Hash)
105
- expect(outages).to have_key(:outages)
106
- expect(outages[:outages]).to be_an(Array)
107
- expect(outages[:outages].size).to eq(1)
98
+ expect(outages).to be_an(Array)
99
+ expect(outages.size).to eq(1)
108
100
  end
109
101
 
110
102
  it "a list of unscheduled maintenances for an entity check" do
@@ -117,10 +109,8 @@ describe 'Flapjack::Gateways::JSONAPI::CheckPresenter' do
117
109
  ecp = Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)
118
110
  unsched_maint = ecp.unscheduled_maintenance(time - (12 * 60 * 60), time)
119
111
 
120
- expect(unsched_maint).to be_a(Hash)
121
- expect(unsched_maint).to have_key(:unscheduled_maintenances)
122
- expect(unsched_maint[:unscheduled_maintenances]).to be_an(Array)
123
- expect(unsched_maint[:unscheduled_maintenances].size).to eq(4)
112
+ expect(unsched_maint).to be_an(Array)
113
+ expect(unsched_maint.size).to eq(4)
124
114
 
125
115
  # TODO check the data in those hashes
126
116
  end
@@ -135,10 +125,8 @@ describe 'Flapjack::Gateways::JSONAPI::CheckPresenter' do
135
125
  ecp = Flapjack::Gateways::JSONAPI::CheckPresenter.new(entity_check)
136
126
  sched_maint = ecp.scheduled_maintenance(time - (12 * 60 * 60), time)
137
127
 
138
- expect(sched_maint).to be_a(Hash)
139
- expect(sched_maint).to have_key(:scheduled_maintenances)
140
- expect(sched_maint[:scheduled_maintenances]).to be_an(Array)
141
- expect(sched_maint[:scheduled_maintenances].size).to eq(4)
128
+ expect(sched_maint).to be_an(Array)
129
+ expect(sched_maint.size).to eq(4)
142
130
 
143
131
  # TODO check the data in those hashes
144
132
  end
@@ -182,7 +182,7 @@ describe Flapjack::Gateways::Pagerduty, :logger => true do
182
182
 
183
183
  EM.synchrony do
184
184
  ret = fp.send(:send_pagerduty_event, evt)
185
- expect(ret).not_to be_nil
185
+ expect { ret }.not_to be_nil
186
186
  expect(ret).to eq([200, nil])
187
187
  EM.stop
188
188
  end
@@ -3,6 +3,8 @@ require 'spec_helper'
3
3
  describe 'web/views/check.html.erb', :erb_view => true do
4
4
 
5
5
  it "should escape unsafe check characters in URIs" do
6
+ @base_url = 'http://www.example.com/flapjack/'
7
+
6
8
  @entity = 'abc-xyz-01'
7
9
  @check = 'Disk / Utilisation'
8
10
  @last_notifications = {}
@@ -3,6 +3,8 @@ require 'spec_helper'
3
3
  describe 'web/views/contact.html.erb', :erb_view => true do
4
4
 
5
5
  it "should escape unsafe check characters in URI parameters" do
6
+ @base_url = 'http://www.example.com/flapjack/'
7
+
6
8
  @contact = double('contact')
7
9
  expect(@contact).to receive(:media)
8
10
  expect(@contact).to receive(:name).and_return('Aeschylus')
@@ -3,6 +3,8 @@ require 'spec_helper'
3
3
  describe 'web/views/checks.html.erb', :erb_view => true do
4
4
 
5
5
  it "should escape unsafe check characters in URI parameters" do
6
+ @base_url = 'http://www.example.com/flapjack/'
7
+
6
8
  @states = {'abc-xyz-01' => [['Disk / Utilisation', 'OK', 'Looking good', '-', '-', false, false, nil, nil]]}
7
9
  @entities_sorted = ['abc-xyz-01']
8
10
  @adjective = "all"