flapjack 0.7.6 → 0.7.7

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.
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## Flapjack Changelog
2
2
 
3
+ # 0.7.7 - 2012-05-22
4
+ - Bug: relax notification rule validations somewhat gh-185 (@jessereynolds)
5
+ - Chore: log notification rule validation errors from api gh-183 (@jessereynolds)
6
+
3
7
  # 0.7.6 - 2013-05-20
4
8
  - Bug: Problems with email notifications (no name, text part missing fields) gh-158 (@ali-graham)
5
9
 
@@ -171,9 +171,12 @@ module Flapjack
171
171
  }.compact
172
172
  end
173
173
 
174
- def add_notification_rule(rule_data)
174
+ def add_notification_rule(rule_data, opts = {})
175
+ if logger = opts[:logger]
176
+ logger.debug("add_notification_rule: contact_id: #{self.id} (#{self.id.class})")
177
+ end
175
178
  Flapjack::Data::NotificationRule.add(rule_data.merge(:contact_id => self.id),
176
- :redis => @redis)
179
+ :redis => @redis, :logger => opts[:logger])
177
180
  end
178
181
 
179
182
  def delete_notification_rule(rule)
@@ -4,6 +4,9 @@
4
4
  # from which individual 'Message' objects are created, one for each
5
5
  # contact+media recipient.
6
6
 
7
+ require 'flapjack/data/contact'
8
+ require 'flapjack/data/notification'
9
+
7
10
  module Flapjack
8
11
  module Data
9
12
  class Message
@@ -17,9 +20,9 @@ module Flapjack
17
20
  def id
18
21
  return @id if @id
19
22
  t = Time.now
20
- # FIXME: consider just using a UUID here
23
+ # FIXME: consider using a UUID here
21
24
  # this is planned to be used as part of alert history keys
22
- @id = self.object_id.to_i.to_s + '-' + t.to_i.to_s + '.' + t.tv_usec.to_s
25
+ @id = "#{self.object_id.to_i}-#{t.to_i}.#{t.tv_usec}"
23
26
  end
24
27
 
25
28
  def contents
@@ -27,12 +30,12 @@ module Flapjack
27
30
  'address' => address,
28
31
  'id' => id}
29
32
  if contact
30
- c.merge('contact_id' => contact.id,
31
- 'contact_first_name' => contact.first_name,
32
- 'contact_last_name' => contact.last_name)
33
+ c.update('contact_id' => contact.id,
34
+ 'contact_first_name' => contact.first_name,
35
+ 'contact_last_name' => contact.last_name)
33
36
  end
34
37
  c['duration'] = duration if duration
35
- c.merge(notification.contents) if notification
38
+ c.update(notification.contents) if notification
36
39
  end
37
40
 
38
41
  private
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'flapjack/data/contact'
4
+ require 'flapjack/data/event'
3
5
  require 'flapjack/data/message'
4
6
 
5
7
  module Flapjack
@@ -19,15 +21,14 @@ module Flapjack
19
21
  return [] if contacts.nil?
20
22
  @messages ||= contacts.collect {|contact|
21
23
 
22
- # TODO don't include messages here if the contact doesn't have
23
- # the medium enabled or has blackholed at this level -- this
24
- # will simplify the executive logic
24
+ # TODO move the message filtering logic from executive into this
25
+ # class and apply here, don't generate message if it won't be sent
25
26
 
26
- contact.media.keys.inject([]) { |ret, mk|
27
+ contact.media.each_pair.inject([]) { |ret, (k, v)|
27
28
  m = Flapjack::Data::Message.for_contact(:contact => contact)
28
29
  m.notification = self
29
- m.medium = mk
30
- m.address = contact.media[mk]
30
+ m.medium = k
31
+ m.address = v
31
32
  ret << m
32
33
  ret
33
34
  }
@@ -37,13 +37,13 @@ module Flapjack
37
37
  raise "Redis connection not set" unless redis = options[:redis]
38
38
 
39
39
  rule_id = SecureRandom.uuid
40
- self.add_or_update(rule_data.merge(:id => rule_id), :redis => redis)
40
+ self.add_or_update(rule_data.merge(:id => rule_id), options)
41
41
  self.find_by_id(rule_id, :redis => redis)
42
42
  end
43
43
 
44
- def update(rule_data)
45
- return false unless self.class.add_or_update(rule_data.merge(:id => @id),
46
- :redis => @redis)
44
+ def update(rule_data, opts = {})
45
+ return false unless self.class.add_or_update({:contact_id => @contact_id}.merge(rule_data.merge(:id => @id)),
46
+ :redis => @redis, :logger => opts[:logger])
47
47
  refresh
48
48
  true
49
49
  end
@@ -108,6 +108,11 @@ module Flapjack
108
108
  def self.add_or_update(rule_data, options = {})
109
109
  redis = options[:redis]
110
110
  raise "a redis connection must be supplied" unless redis
111
+ logger = options[:logger]
112
+
113
+ # make some assumptions about the incoming data
114
+ rule_data[:warning_blackhole] = rule_data[:warning_blackhole] || false
115
+ rule_data[:critical_blackhole] = rule_data[:critical_blackhole] || false
111
116
 
112
117
  return unless self.validate_data(rule_data, options)
113
118
 
@@ -123,6 +128,7 @@ module Flapjack
123
128
  :warning_blackhole => rule_data[:warning_blackhole],
124
129
  :critical_blackhole => rule_data[:critical_blackhole],
125
130
  }
131
+ logger.debug("NotificationRule#add_or_update json_rule_data: #{json_rule_data.inspect}") if logger
126
132
 
127
133
  redis.sadd("contact_notification_rules:#{json_rule_data[:contact_id]}",
128
134
  json_rule_data[:id])
@@ -200,14 +206,16 @@ module Flapjack
200
206
  validations = {proc { d.has_key?(:id) } =>
201
207
  "id not set",
202
208
 
203
- proc { d.has_key?(:entities) &&
204
- d[:entities].is_a?(Array) &&
205
- d[:entities].all? {|e| e.is_a?(String)} } =>
209
+ proc { !d.has_key?(:entities) ||
210
+ ( d[:entities].nil? ||
211
+ d[:entities].is_a?(Array) &&
212
+ d[:entities].all? {|e| e.is_a?(String)} ) } =>
206
213
  "entities must be a list of strings",
207
214
 
208
- proc { d.has_key?(:entity_tags) &&
209
- d[:entity_tags].is_a?(Array) &&
210
- d[:entity_tags].all? {|et| et.is_a?(String)}} =>
215
+ proc { !d.has_key?(:entity_tags) ||
216
+ ( d[:entity_tags].nil? ||
217
+ d[:entity_tags].is_a?(Array) &&
218
+ d[:entity_tags].all? {|et| et.is_a?(String)} ) } =>
211
219
  "entity_tags must be a list of strings",
212
220
 
213
221
  proc { (d.has_key?(:entities) &&
@@ -218,29 +226,32 @@ module Flapjack
218
226
  (d[:entity_tags].size > 0)) } =>
219
227
  "entities or entity tags must have at least one value",
220
228
 
221
- proc { d.has_key?(:time_restrictions) &&
222
- d[:time_restrictions].all? {|tr|
223
- !!prepare_time_restriction(symbolize(tr))
224
- }
229
+ proc { !d.has_key?(:time_restrictions) ||
230
+ ( d[:time_restrictions].nil? ||
231
+ d[:time_restrictions].all? {|tr|
232
+ !!prepare_time_restriction(symbolize(tr))
233
+ } )
225
234
  } =>
226
235
  "time restrictions are invalid",
227
236
 
228
237
  # TODO should the media types be checked against a whitelist?
229
- proc { d.has_key?(:warning_media) &&
230
- d[:warning_media].is_a?(Array) &&
231
- d[:warning_media].all? {|et| et.is_a?(String)}} =>
238
+ proc { !d.has_key?(:warning_media) ||
239
+ ( d[:warning_media].nil? ||
240
+ d[:warning_media].is_a?(Array) &&
241
+ d[:warning_media].all? {|et| et.is_a?(String)} ) } =>
232
242
  "warning_media must be a list of strings",
233
243
 
234
- proc { d.has_key?(:critical_media) &&
235
- d[:critical_media].is_a?(Array) &&
236
- d[:critical_media].all? {|et| et.is_a?(String)}} =>
244
+ proc { !d.has_key?(:critical_media) ||
245
+ ( d[:critical_media].nil? ||
246
+ d[:critical_media].is_a?(Array) &&
247
+ d[:critical_media].all? {|et| et.is_a?(String)} ) } =>
237
248
  "critical_media must be a list of strings",
238
249
 
239
- proc { d.has_key?(:warning_blackhole) &&
250
+ proc { !d.has_key?(:warning_blackhole) ||
240
251
  [TrueClass, FalseClass].include?(d[:warning_blackhole].class) } =>
241
252
  "warning_blackhole must be true or false",
242
253
 
243
- proc { d.has_key?(:critical_blackhole) &&
254
+ proc { !d.has_key?(:critical_blackhole) ||
244
255
  [TrueClass, FalseClass].include?(d[:critical_blackhole].class) } =>
245
256
  "critical_blackhole must be true or false",
246
257
  }
@@ -255,6 +266,7 @@ module Flapjack
255
266
  if logger = options[:logger]
256
267
  error_str = errors.join(", ")
257
268
  logger.info "validation error: #{error_str}"
269
+ logger.debug "rule failing validations: #{d.inspect}"
258
270
  end
259
271
  false
260
272
  end
@@ -339,13 +339,16 @@ module Flapjack
339
339
  return error(403, "post cannot be used for update, do a put instead")
340
340
  end
341
341
 
342
+ logger.debug("post /notification_rules data: ")
343
+ logger.debug(params.inspect)
344
+
342
345
  find_contact(params[:contact_id]) do |contact|
343
346
 
344
347
  rule_data = hashify(:entities, :entity_tags,
345
348
  :warning_media, :critical_media, :time_restrictions,
346
349
  :warning_blackhole, :critical_blackhole) {|k| [k, params[k]]}
347
350
 
348
- unless rule = contact.add_notification_rule(rule_data)
351
+ unless rule = contact.add_notification_rule(rule_data, :logger => logger)
349
352
  return error(403, "invalid notification rule data")
350
353
  end
351
354
  rule.to_json
@@ -356,6 +359,9 @@ module Flapjack
356
359
  # https://github.com/flpjck/flapjack/wiki/API#wiki-put_notification_rules_id
357
360
  put('/notification_rules/:id') do
358
361
  content_type :json
362
+ logger.debug("put /notification_rules/#{params[:id]} data: ")
363
+ logger.debug(params.inspect)
364
+
359
365
  find_rule(params[:id]) do |rule|
360
366
  find_contact(rule.contact_id) do |contact|
361
367
 
@@ -363,7 +369,7 @@ module Flapjack
363
369
  :warning_media, :critical_media, :time_restrictions,
364
370
  :warning_blackhole, :critical_blackhole) {|k| [k, params[k]]}
365
371
 
366
- unless rule.update(rule_data)
372
+ unless rule.update(rule_data, :logger => logger)
367
373
  return error(403, "invalid notification rule data")
368
374
  end
369
375
  rule.to_json
@@ -374,7 +380,9 @@ module Flapjack
374
380
  # Deletes a notification rule
375
381
  # https://github.com/flpjck/flapjack/wiki/API#wiki-put_notification_rules_id
376
382
  delete('/notification_rules/:id') do
383
+ logger.debug("delete /notification_rules/#{params[:id]}")
377
384
  find_rule(params[:id]) do |rule|
385
+ logger.debug("rule to delete: #{rule.inspect}, contact_id: #{rule.contact_id}")
378
386
  find_contact(rule.contact_id) do |contact|
379
387
  contact.delete_notification_rule(rule)
380
388
  status 204
@@ -560,6 +568,7 @@ module Flapjack
560
568
  end
561
569
 
562
570
  not_found do
571
+ logger.debug("in not_found :-(")
563
572
  error(404, "not routable")
564
573
  end
565
574
 
@@ -587,13 +596,13 @@ module Flapjack
587
596
 
588
597
  # following a callback-heavy pattern -- feels like nodejs :)
589
598
  def find_contact(contact_id, &block)
590
- contact = Flapjack::Data::Contact.find_by_id(contact_id, :redis => redis)
599
+ contact = Flapjack::Data::Contact.find_by_id(contact_id.to_s, :redis => redis, :logger => logger)
591
600
  return(yield(contact)) if contact
592
601
  error(404, "could not find contact with id '#{contact_id}'")
593
602
  end
594
603
 
595
604
  def find_rule(rule_id, &block)
596
- rule = Flapjack::Data::NotificationRule.find_by_id(rule_id, :redis => redis)
605
+ rule = Flapjack::Data::NotificationRule.find_by_id(rule_id, :redis => redis, :logger => logger)
597
606
  return(yield(rule)) if rule
598
607
  error(404, "could not find notification rule with id '#{rule_id}'")
599
608
  end
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  module Flapjack
4
- VERSION = "0.7.6"
4
+ VERSION = "0.7.7"
5
5
  end
@@ -3,10 +3,34 @@ require 'flapjack/data/message'
3
3
 
4
4
  describe Flapjack::Data::Message do
5
5
 
6
- it "is generated for a contact"
6
+ let(:contact) { mock(Flapjack::Data::Contact) }
7
7
 
8
- it "assigns itself an ID"
8
+ it "assigns itself an ID" do
9
+ message = Flapjack::Data::Message.for_contact(:contact => contact)
10
+ mid = message.id
11
+ mid.should_not be_nil
12
+ mid.should be_a(String)
13
+ end
9
14
 
10
- it "returns its contained data"
15
+ it "returns its contained data" do
16
+ notification = mock(Flapjack::Data::Notification)
17
+ notification.should_receive(:contents).and_return('notification' => 'contents')
18
+
19
+ message = Flapjack::Data::Message.for_contact(:contact => contact)
20
+ message.notification = notification
21
+ message.medium = 'email'
22
+ message.address = 'jja@example.com'
23
+
24
+ contact.should_receive(:id).and_return('23')
25
+ contact.should_receive(:first_name).and_return('James')
26
+ contact.should_receive(:last_name).and_return('Jameson')
27
+
28
+ message.contents.should include('notification' => 'contents',
29
+ 'contact_id' => '23',
30
+ 'contact_first_name' => 'James',
31
+ 'contact_last_name' => 'Jameson',
32
+ 'media' => 'email',
33
+ 'address' => 'jja@example.com')
34
+ end
11
35
 
12
36
  end
@@ -1,12 +1,61 @@
1
1
  require 'spec_helper'
2
2
  require 'flapjack/data/notification'
3
3
 
4
- describe Flapjack::Data::Notification do
4
+ describe Flapjack::Data::Notification, :redis => true do
5
5
 
6
- it "generates a notification for an event"
6
+ let(:event) { mock(Flapjack::Data::Event) }
7
7
 
8
- it "generates messages for contacts"
8
+ let(:contact) { mock(Flapjack::Data::Contact) }
9
9
 
10
- it "returns its contained data"
10
+ it "generates a notification for an event" do
11
+ notification = Flapjack::Data::Notification.for_event(event, :type => 'problem',
12
+ :max_notified_severity => nil)
13
+ notification.should_not be_nil
14
+ notification.event.should == event
15
+ notification.type.should == 'problem'
16
+ end
17
+
18
+ it "generates messages for contacts" do
19
+ notification = Flapjack::Data::Notification.for_event(event, :type => 'problem',
20
+ :max_notified_severity => nil)
21
+ contact.should_receive(:media).and_return('email' => 'example@example.com',
22
+ 'sms' => '0123456789')
23
+
24
+ messages = notification.messages(:contacts => [contact])
25
+ messages.should_not be_nil
26
+ messages.should have(2).items
27
+
28
+ messages.first.notification.should == notification
29
+ messages.first.contact.should == contact
30
+ messages.first.medium.should == 'email'
31
+ messages.first.address.should == 'example@example.com'
32
+
33
+ messages.last.notification.should == notification
34
+ messages.last.contact.should == contact
35
+ messages.last.medium.should == 'sms'
36
+ messages.last.address.should == '0123456789'
37
+ end
38
+
39
+ it "returns its contained data" do
40
+ notification = Flapjack::Data::Notification.for_event(event, :type => 'problem',
41
+ :max_notified_severity => nil)
42
+
43
+ t = Time.now.to_i
44
+
45
+ event.should_receive(:id).and_return('example.com:ping')
46
+ event.should_receive(:state).and_return('ok')
47
+ event.should_receive(:summary).and_return('Shiny & happy')
48
+ event.should_receive(:time).and_return(t)
49
+ event.should_receive(:duration).and_return(nil)
50
+
51
+ notification.contents.should == {'event_id' => 'example.com:ping',
52
+ 'state' => 'ok',
53
+ 'summary' => 'Shiny & happy',
54
+ 'time' => t,
55
+ 'duration' => nil,
56
+ 'notification_type' => 'problem',
57
+ 'max_notified_severity' => nil}
58
+
59
+ end
11
60
 
12
61
  end
@@ -536,7 +536,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
536
536
  it "returns the core information of a specified contact" do
537
537
  contact.should_receive(:to_json).and_return(contact_core.to_json)
538
538
  Flapjack::Data::Contact.should_receive(:find_by_id).
539
- with(contact.id, :redis => redis).and_return(contact)
539
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
540
540
 
541
541
  get "/contacts/#{contact.id}"
542
542
  last_response.should be_ok
@@ -545,7 +545,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
545
545
 
546
546
  it "does not return information for a contact that does not exist" do
547
547
  Flapjack::Data::Contact.should_receive(:find_by_id).
548
- with(contact.id, :redis => redis).and_return(nil)
548
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
549
549
 
550
550
  get "/contacts/#{contact.id}"
551
551
  last_response.should be_not_found
@@ -559,7 +559,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
559
559
 
560
560
  contact.should_receive(:notification_rules).and_return(notification_rules)
561
561
  Flapjack::Data::Contact.should_receive(:find_by_id).
562
- with(contact.id, :redis => redis).and_return(contact)
562
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
563
563
 
564
564
  get "/contacts/#{contact.id}/notification_rules"
565
565
  last_response.should be_ok
@@ -568,7 +568,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
568
568
 
569
569
  it "does not list notification rules for a contact that does not exist" do
570
570
  Flapjack::Data::Contact.should_receive(:find_by_id).
571
- with(contact.id, :redis => redis).and_return(nil)
571
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
572
572
 
573
573
  get "/contacts/#{contact.id}/notification_rules"
574
574
  last_response.should be_not_found
@@ -577,7 +577,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
577
577
  it "returns a specified notification rule" do
578
578
  notification_rule.should_receive(:to_json).and_return('"rule_1"')
579
579
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
580
- with(notification_rule.id, :redis => redis).and_return(notification_rule)
580
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
581
581
 
582
582
  get "/notification_rules/#{notification_rule.id}"
583
583
  last_response.should be_ok
@@ -586,7 +586,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
586
586
 
587
587
  it "does not return a notification rule that does not exist" do
588
588
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
589
- with(notification_rule.id, :redis => redis).and_return(nil)
589
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(nil)
590
590
 
591
591
  get "/notification_rules/#{notification_rule.id}"
592
592
  last_response.should be_not_found
@@ -595,7 +595,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
595
595
  # POST /notification_rules
596
596
  it "creates a new notification rule" do
597
597
  Flapjack::Data::Contact.should_receive(:find_by_id).
598
- with(contact.id, :redis => redis).and_return(contact)
598
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
599
599
  notification_rule.should_receive(:to_json).and_return('"rule_1"')
600
600
 
601
601
  # symbolize the keys
@@ -605,7 +605,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
605
605
  notification_rule_data_sym.delete(:contact_id)
606
606
 
607
607
  contact.should_receive(:add_notification_rule).
608
- with(notification_rule_data_sym).and_return(notification_rule)
608
+ with(notification_rule_data_sym, :logger => @logger).and_return(notification_rule)
609
609
 
610
610
  post "/notification_rules", notification_rule_data.to_json,
611
611
  {'CONTENT_TYPE' => 'application/json'}
@@ -615,7 +615,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
615
615
 
616
616
  it "does not create a notification_rule for a contact that's not present" do
617
617
  Flapjack::Data::Contact.should_receive(:find_by_id).
618
- with(contact.id, :redis => redis).and_return(nil)
618
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
619
619
 
620
620
  post "/notification_rules", notification_rule_data.to_json,
621
621
  {'CONTENT_TYPE' => 'application/json'}
@@ -633,10 +633,10 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
633
633
  # PUT /notification_rules/RULE_ID
634
634
  it "updates a notification rule" do
635
635
  Flapjack::Data::Contact.should_receive(:find_by_id).
636
- with(contact.id, :redis => redis).and_return(contact)
636
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
637
637
  notification_rule.should_receive(:to_json).and_return('"rule_1"')
638
638
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
639
- with(notification_rule.id, :redis => redis).and_return(notification_rule)
639
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
640
640
 
641
641
  # symbolize the keys
642
642
  notification_rule_data_sym = notification_rule_data.inject({}){|memo,(k,v)|
@@ -644,7 +644,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
644
644
  }
645
645
  notification_rule_data_sym.delete(:contact_id)
646
646
 
647
- notification_rule.should_receive(:update).with(notification_rule_data_sym).and_return(true)
647
+ notification_rule.should_receive(:update).with(notification_rule_data_sym, :logger => @logger).and_return(true)
648
648
 
649
649
  put "/notification_rules/#{notification_rule.id}", notification_rule_data.to_json,
650
650
  {'CONTENT_TYPE' => 'application/json'}
@@ -654,7 +654,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
654
654
 
655
655
  it "does not update a notification rule that's not present" do
656
656
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
657
- with(notification_rule.id, :redis => redis).and_return(nil)
657
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(nil)
658
658
 
659
659
  put "/notification_rules/#{notification_rule.id}", notification_rule_data
660
660
  last_response.should be_not_found
@@ -662,9 +662,9 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
662
662
 
663
663
  it "does not update a notification_rule for a contact that's not present" do
664
664
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
665
- with(notification_rule.id, :redis => redis).and_return(notification_rule)
665
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
666
666
  Flapjack::Data::Contact.should_receive(:find_by_id).
667
- with(contact.id, :redis => redis).and_return(nil)
667
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
668
668
 
669
669
  put "/notification_rules/#{notification_rule.id}", notification_rule_data.to_json,
670
670
  {'CONTENT_TYPE' => 'application/json'}
@@ -675,10 +675,10 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
675
675
  it "deletes a notification rule" do
676
676
  notification_rule.should_receive(:contact_id).and_return(contact.id)
677
677
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
678
- with(notification_rule.id, :redis => redis).and_return(notification_rule)
678
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
679
679
  contact.should_receive(:delete_notification_rule).with(notification_rule)
680
680
  Flapjack::Data::Contact.should_receive(:find_by_id).
681
- with(contact.id, :redis => redis).and_return(contact)
681
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
682
682
 
683
683
  delete "/notification_rules/#{notification_rule.id}"
684
684
  last_response.status.should == 204
@@ -686,7 +686,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
686
686
 
687
687
  it "does not delete a notification rule that's not present" do
688
688
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
689
- with(notification_rule.id, :redis => redis).and_return(nil)
689
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(nil)
690
690
 
691
691
  delete "/notification_rules/#{notification_rule.id}"
692
692
  last_response.should be_not_found
@@ -695,9 +695,9 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
695
695
  it "does not delete a notification rule if the contact is not present" do
696
696
  notification_rule.should_receive(:contact_id).and_return(contact.id)
697
697
  Flapjack::Data::NotificationRule.should_receive(:find_by_id).
698
- with(notification_rule.id, :redis => redis).and_return(notification_rule)
698
+ with(notification_rule.id, {:redis => redis, :logger => @logger}).and_return(notification_rule)
699
699
  Flapjack::Data::Contact.should_receive(:find_by_id).
700
- with(contact.id, :redis => redis).and_return(nil)
700
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
701
701
 
702
702
  delete "/notification_rules/#{notification_rule.id}"
703
703
  last_response.should be_not_found
@@ -708,7 +708,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
708
708
  contact.should_receive(:media).and_return(media)
709
709
  contact.should_receive(:media_intervals).and_return(media_intervals)
710
710
  Flapjack::Data::Contact.should_receive(:find_by_id).
711
- with(contact.id, :redis => redis).and_return(contact)
711
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
712
712
  result = Hash[ *(media.keys.collect {|m|
713
713
  [m, {'address' => media[m],
714
714
  'interval' => media_intervals[m] }]
@@ -721,7 +721,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
721
721
 
722
722
  it "does not return the media of a contact if the contact is not present" do
723
723
  Flapjack::Data::Contact.should_receive(:find_by_id).
724
- with(contact.id, :redis => redis).and_return(nil)
724
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
725
725
 
726
726
  get "/contacts/#{contact.id}/media"
727
727
  last_response.should be_not_found
@@ -732,7 +732,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
732
732
  contact.should_receive(:media).twice.and_return(media)
733
733
  contact.should_receive(:media_intervals).and_return(media_intervals)
734
734
  Flapjack::Data::Contact.should_receive(:find_by_id).
735
- with(contact.id, :redis => redis).and_return(contact)
735
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
736
736
 
737
737
  result = {'address' => media['sms'], 'interval' => media_intervals['sms']}
738
738
 
@@ -743,7 +743,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
743
743
 
744
744
  it "does not return the media of a contact if the contact is not present" do
745
745
  Flapjack::Data::Contact.should_receive(:find_by_id).
746
- with(contact.id, :redis => redis).and_return(nil)
746
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
747
747
 
748
748
  get "/contacts/#{contact.id}/media/sms"
749
749
  last_response.should be_not_found
@@ -752,7 +752,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
752
752
  it "does not return the media of a contact if the media is not present" do
753
753
  contact.should_receive(:media).and_return(media)
754
754
  Flapjack::Data::Contact.should_receive(:find_by_id).
755
- with(contact.id, :redis => redis).and_return(contact)
755
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
756
756
 
757
757
  get "/contacts/#{contact.id}/media/telepathy"
758
758
  last_response.should be_not_found
@@ -770,7 +770,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
770
770
  contact.should_receive(:media).and_return(alt_media)
771
771
  contact.should_receive(:media_intervals).and_return(alt_media_intervals)
772
772
  Flapjack::Data::Contact.should_receive(:find_by_id).
773
- with(contact.id, :redis => redis).and_return(contact)
773
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
774
774
 
775
775
  result = {'address' => alt_media['sms'], 'interval' => alt_media_intervals['sms']}
776
776
 
@@ -781,7 +781,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
781
781
 
782
782
  it "does not create a media of a contact that's not present" do
783
783
  Flapjack::Data::Contact.should_receive(:find_by_id).
784
- with(contact.id, :redis => redis).and_return(nil)
784
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
785
785
 
786
786
  put "/contacts/#{contact.id}/media/sms", {:address => '04987654321', :interval => '200'}
787
787
  last_response.should be_not_found
@@ -789,7 +789,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
789
789
 
790
790
  it "does not create a media of a contact if no address is provided" do
791
791
  Flapjack::Data::Contact.should_receive(:find_by_id).
792
- with(contact.id, :redis => redis).and_return(contact)
792
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
793
793
 
794
794
  put "/contacts/#{contact.id}/media/sms", {:interval => '200'}
795
795
  last_response.should be_forbidden
@@ -797,7 +797,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
797
797
 
798
798
  it "does not create a media of a contact if no interval is provided" do
799
799
  Flapjack::Data::Contact.should_receive(:find_by_id).
800
- with(contact.id, :redis => redis).and_return(contact)
800
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
801
801
 
802
802
  put "/contacts/#{contact.id}/media/sms", {:address => '04987654321'}
803
803
  last_response.should be_forbidden
@@ -806,7 +806,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
806
806
  it "deletes a media of a contact" do
807
807
  contact.should_receive(:remove_media).with('sms')
808
808
  Flapjack::Data::Contact.should_receive(:find_by_id).
809
- with(contact.id, :redis => redis).and_return(contact)
809
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
810
810
 
811
811
  delete "/contacts/#{contact.id}/media/sms"
812
812
  last_response.status.should == 204
@@ -814,7 +814,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
814
814
 
815
815
  it "does not delete a media of a contact that's not present" do
816
816
  Flapjack::Data::Contact.should_receive(:find_by_id).
817
- with(contact.id, :redis => redis).and_return(nil)
817
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
818
818
 
819
819
  delete "/contacts/#{contact.id}/media/sms"
820
820
  last_response.should be_not_found
@@ -824,7 +824,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
824
824
  it "returns the timezone of a contact" do
825
825
  contact.should_receive(:timezone).and_return(::ActiveSupport::TimeZone.new('Australia/Sydney'))
826
826
  Flapjack::Data::Contact.should_receive(:find_by_id).
827
- with(contact.id, :redis => redis).and_return(contact)
827
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
828
828
 
829
829
  get "/contacts/#{contact.id}/timezone"
830
830
  last_response.should be_ok
@@ -833,7 +833,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
833
833
 
834
834
  it "doesn't get the timezone of a contact that doesn't exist" do
835
835
  Flapjack::Data::Contact.should_receive(:find_by_id).
836
- with(contact.id, :redis => redis).and_return(nil)
836
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
837
837
 
838
838
  get "/contacts/#{contact.id}/timezone"
839
839
  last_response.should be_not_found
@@ -844,7 +844,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
844
844
  contact.should_receive(:timezone=).with('Australia/Perth')
845
845
  contact.should_receive(:timezone).and_return(ActiveSupport::TimeZone.new('Australia/Perth'))
846
846
  Flapjack::Data::Contact.should_receive(:find_by_id).
847
- with(contact.id, :redis => redis).and_return(contact)
847
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
848
848
 
849
849
  put "/contacts/#{contact.id}/timezone", {:timezone => 'Australia/Perth'}
850
850
  last_response.should be_ok
@@ -852,7 +852,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
852
852
 
853
853
  it "doesn't set the timezone of a contact who can't be found" do
854
854
  Flapjack::Data::Contact.should_receive(:find_by_id).
855
- with(contact.id, :redis => redis).and_return(nil)
855
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
856
856
 
857
857
  put "/contacts/#{contact.id}/timezone", {:timezone => 'Australia/Perth'}
858
858
  last_response.should be_not_found
@@ -862,7 +862,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
862
862
  it "deletes the timezone of a contact" do
863
863
  contact.should_receive(:timezone=).with(nil)
864
864
  Flapjack::Data::Contact.should_receive(:find_by_id).
865
- with(contact.id, :redis => redis).and_return(contact)
865
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
866
866
 
867
867
  delete "/contacts/#{contact.id}/timezone"
868
868
  last_response.status.should == 204
@@ -870,7 +870,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
870
870
 
871
871
  it "does not delete the timezone of a contact that's not present" do
872
872
  Flapjack::Data::Contact.should_receive(:find_by_id).
873
- with(contact.id, :redis => redis).and_return(nil)
873
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
874
874
 
875
875
  delete "/contacts/#{contact.id}/timezone"
876
876
  last_response.should be_not_found
@@ -974,7 +974,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
974
974
  contact.should_receive(:add_tags).with('web')
975
975
  contact.should_receive(:tags).and_return(['web'])
976
976
  Flapjack::Data::Contact.should_receive(:find_by_id).
977
- with(contact.id, :redis => redis).and_return(contact)
977
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
978
978
 
979
979
  post "contacts/#{contact.id}/tags", :tag => 'web'
980
980
  last_response.should be_ok
@@ -983,7 +983,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
983
983
 
984
984
  it "does not set a single tag on a contact that's not found" do
985
985
  Flapjack::Data::Contact.should_receive(:find_by_id).
986
- with(contact.id, :redis => redis).and_return(nil)
986
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
987
987
 
988
988
  post "contacts/#{contact.id}/tags", :tag => 'web'
989
989
  last_response.should be_not_found
@@ -993,7 +993,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
993
993
  contact.should_receive(:add_tags).with('web', 'app')
994
994
  contact.should_receive(:tags).and_return(['web', 'app'])
995
995
  Flapjack::Data::Contact.should_receive(:find_by_id).
996
- with(contact.id, :redis => redis).and_return(contact)
996
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
997
997
 
998
998
  post "contacts/#{contact.id}/tags", :tag => ['web', 'app']
999
999
  last_response.should be_ok
@@ -1002,7 +1002,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1002
1002
 
1003
1003
  it "does not set multiple tags on a contact that's not found" do
1004
1004
  Flapjack::Data::Contact.should_receive(:find_by_id).
1005
- with(contact.id, :redis => redis).and_return(nil)
1005
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1006
1006
 
1007
1007
  post "contacts/#{contact.id}/tags", :tag => ['web', 'app']
1008
1008
  last_response.should be_not_found
@@ -1011,7 +1011,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1011
1011
  it "removes a single tag from a contact" do
1012
1012
  contact.should_receive(:delete_tags).with('web')
1013
1013
  Flapjack::Data::Contact.should_receive(:find_by_id).
1014
- with(contact.id, :redis => redis).and_return(contact)
1014
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
1015
1015
 
1016
1016
  delete "contacts/#{contact.id}/tags", :tag => 'web'
1017
1017
  last_response.status.should == 204
@@ -1019,7 +1019,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1019
1019
 
1020
1020
  it "does not remove a single tag from a contact that's not found" do
1021
1021
  Flapjack::Data::Contact.should_receive(:find_by_id).
1022
- with(contact.id, :redis => redis).and_return(nil)
1022
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1023
1023
 
1024
1024
  delete "contacts/#{contact.id}/tags", :tag => 'web'
1025
1025
  last_response.should be_not_found
@@ -1028,7 +1028,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1028
1028
  it "removes multiple tags from a contact" do
1029
1029
  contact.should_receive(:delete_tags).with('web', 'app')
1030
1030
  Flapjack::Data::Contact.should_receive(:find_by_id).
1031
- with(contact.id, :redis => redis).and_return(contact)
1031
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
1032
1032
 
1033
1033
  delete "contacts/#{contact.id}/tags", :tag => ['web', 'app']
1034
1034
  last_response.status.should == 204
@@ -1036,7 +1036,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1036
1036
 
1037
1037
  it "does not remove multiple tags from a contact that's not found" do
1038
1038
  Flapjack::Data::Contact.should_receive(:find_by_id).
1039
- with(contact.id, :redis => redis).and_return(nil)
1039
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1040
1040
 
1041
1041
  delete "contacts/#{contact.id}/tags", :tag => ['web', 'app']
1042
1042
  last_response.should be_not_found
@@ -1045,7 +1045,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1045
1045
  it "gets all tags on a contact" do
1046
1046
  contact.should_receive(:tags).and_return(['web', 'app'])
1047
1047
  Flapjack::Data::Contact.should_receive(:find_by_id).
1048
- with(contact.id, :redis => redis).and_return(contact)
1048
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
1049
1049
 
1050
1050
  get "contacts/#{contact.id}/tags"
1051
1051
  last_response.should be_ok
@@ -1054,7 +1054,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1054
1054
 
1055
1055
  it "does not get all tags on a contact that's not found" do
1056
1056
  Flapjack::Data::Contact.should_receive(:find_by_id).
1057
- with(contact.id, :redis => redis).and_return(nil)
1057
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1058
1058
 
1059
1059
  get "contacts/#{contact.id}/tags"
1060
1060
  last_response.should be_not_found
@@ -1071,7 +1071,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1071
1071
  and_return(tag_data)
1072
1072
 
1073
1073
  Flapjack::Data::Contact.should_receive(:find_by_id).
1074
- with(contact.id, :redis => redis).and_return(contact)
1074
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
1075
1075
 
1076
1076
  get "contacts/#{contact.id}/entity_tags"
1077
1077
  last_response.should be_ok
@@ -1082,7 +1082,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1082
1082
 
1083
1083
  it "does not get all entity tags for a contact that's not found" do
1084
1084
  Flapjack::Data::Contact.should_receive(:find_by_id).
1085
- with(contact.id, :redis => redis).and_return(nil)
1085
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1086
1086
 
1087
1087
  get "contacts/#{contact.id}/entity_tags"
1088
1088
  last_response.should be_not_found
@@ -1103,7 +1103,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1103
1103
  contact.should_receive(:entities).with(:tags => true).and_return(tag_data)
1104
1104
 
1105
1105
  Flapjack::Data::Contact.should_receive(:find_by_id).
1106
- with(contact.id, :redis => redis).and_return(contact)
1106
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
1107
1107
 
1108
1108
  post "contacts/#{contact.id}/entity_tags",
1109
1109
  :entity => {'entity_1' => ['web'], 'entity_2' => ['app']}
@@ -1115,7 +1115,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1115
1115
 
1116
1116
  it "does not add tags to multiple entities for a contact that's not found" do
1117
1117
  Flapjack::Data::Contact.should_receive(:find_by_id).
1118
- with(contact.id, :redis => redis).and_return(nil)
1118
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1119
1119
 
1120
1120
  post "contacts/#{contact.id}/entity_tags",
1121
1121
  :entity => {'entity_1' => ['web'], 'entity_2' => ['app']}
@@ -1134,7 +1134,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1134
1134
  contact.should_receive(:entities).and_return(entities)
1135
1135
 
1136
1136
  Flapjack::Data::Contact.should_receive(:find_by_id).
1137
- with(contact.id, :redis => redis).and_return(contact)
1137
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(contact)
1138
1138
 
1139
1139
  delete "contacts/#{contact.id}/entity_tags",
1140
1140
  :entity => {'entity_1' => ['web'], 'entity_2' => ['app']}
@@ -1143,7 +1143,7 @@ describe 'Flapjack::Gateways::API', :sinatra => true, :logger => true, :json =>
1143
1143
 
1144
1144
  it "does not delete tags from multiple entities for a contact that's not found" do
1145
1145
  Flapjack::Data::Contact.should_receive(:find_by_id).
1146
- with(contact.id, :redis => redis).and_return(nil)
1146
+ with(contact.id, {:redis => redis, :logger => @logger}).and_return(nil)
1147
1147
 
1148
1148
  delete "contacts/#{contact.id}/entity_tags",
1149
1149
  :entity => {'entity_1' => ['web'], 'entity_2' => ['app']}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flapjack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.6
4
+ version: 0.7.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-05-20 00:00:00.000000000 Z
14
+ date: 2013-05-22 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: dante
@@ -553,7 +553,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
553
553
  version: '0'
554
554
  segments:
555
555
  - 0
556
- hash: -549406373323108870
556
+ hash: 4574905656823869764
557
557
  required_rubygems_version: !ruby/object:Gem::Requirement
558
558
  none: false
559
559
  requirements:
@@ -562,7 +562,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
562
562
  version: '0'
563
563
  segments:
564
564
  - 0
565
- hash: -549406373323108870
565
+ hash: 4574905656823869764
566
566
  requirements: []
567
567
  rubyforge_project:
568
568
  rubygems_version: 1.8.23