spec/lib/flapjack/data/notification_rule_spec.rb in flapjack-0.7.2 vs spec/lib/flapjack/data/notification_rule_spec.rb in flapjack-0.7.3
- old
+ new
@@ -1,22 +1,115 @@
require 'spec_helper'
require 'flapjack/data/notification_rule'
-describe Flapjack::Data::NotificationRule do
+describe Flapjack::Data::NotificationRule, :redis => true do
- it "checks that a notification rule exists"
+ let(:weekdays_8_18) {
+ wd = IceCube::Schedule.new(Time.local(2013,2,1,8,0,0), :duration => 60 * 60 * 10)
+ wd.add_recurrence_rule(IceCube::Rule.weekly.day(:monday, :tuesday, :wednesday, :thursday, :friday))
+ wd = wd.to_hash
+ wd[:start_time] = wd.delete(:start_date)
+ wd[:rrules].first[:rule_type] = wd[:rrules].first[:rule_type].sub(/\AIceCube::(\w+)Rule\z/, '\1')
+ wd
+ }
- it "returns a notification rule if it exists"
+ let(:rule_data) {
+ {:contact_id => '23',
+ :entity_tags => ["database","physical"],
+ :entities => ["foo-app-01.example.com"],
+ :time_restrictions => [ weekdays_8_18 ],
+ :warning_media => ["email"],
+ :critical_media => ["sms", "email"],
+ :warning_blackhole => false,
+ :critical_blackhole => false
+ }
+ }
- it "does not return a notification rule if it does not exist"
+ let(:rule_id) { 'ABC123' }
- it "updates a notification rule"
+ let(:timezone) { ActiveSupport::TimeZone.new("Europe/Moscow") }
- it "checks whether tag or entity names match"
+ let(:existing_rule) {
+ Flapjack::Data::NotificationRule.add(rule_data, :redis => @redis)
+ }
- it "checks whether times match"
+ it "checks that a notification rule exists" do
+ Flapjack::Data::NotificationRule.exists_with_id?(existing_rule.id, :redis => @redis).should be_true
+ Flapjack::Data::NotificationRule.exists_with_id?('not_there', :redis => @redis).should be_false
+ end
- it "checks if blackhole settings for a rule match a severity level"
+ it "returns a notification rule if it exists" do
+ rule = Flapjack::Data::NotificationRule.find_by_id(existing_rule.id, :redis => @redis)
+ rule.should_not be_nil
+ end
- it "returns the media settings for a rule's severity level"
+ it "does not return a notification rule if it does not exist" do
+ rule = Flapjack::Data::NotificationRule.find_by_id('not_there', :redis => @redis)
+ rule.should be_nil
+ end
+
+ it "updates a notification rule" do
+ rule = existing_rule
+
+ expect {
+ rule_data[:warning_blackhole] = true
+ success = rule.update(rule_data)
+ success.should be_true
+ }.to change { rule.warning_blackhole }.from(false).to(true)
+ end
+
+ it "converts time restriction data to an IceCube schedule" do
+ sched = Flapjack::Data::NotificationRule.
+ time_restriction_to_icecube_schedule(weekdays_8_18, timezone)
+ sched.should_not be_nil
+ end
+
+ it "generates a JSON string representing its data" do
+ rule = existing_rule
+ # bit of extra hackery for the inserted ID values
+ rule.to_json.should == {:id => rule.id}.merge(rule_data).to_json
+ end
+
+ it "checks whether entity names match" do
+ rule = existing_rule
+
+ rule.match_entity?('foo-app-01.example.com').should be_true
+ rule.match_entity?('foo-app-02.example.com').should be_false
+ end
+
+ pending "check whether entity tags match"
+
+ it "checks if blackhole settings for a rule match a severity level" do
+ rule_data[:warning_blackhole] = true
+ rule = Flapjack::Data::NotificationRule.add(rule_data, :redis => @redis)
+
+ rule.blackhole?('warning').should be_true
+ rule.blackhole?('critical').should be_false
+ end
+
+ it "returns the media settings for a rule's severity level" do
+ rule = existing_rule
+ rule.media_for_severity('warning').should == ['email']
+ rule.media_for_severity('critical').should =~ ['email', 'sms']
+ end
+
+ context 'validation' do
+
+ it "fails to add a notification rule with invalid data" do
+ rule_data[:entities] = []
+ rule_data[:entity_tags] = []
+ rule = Flapjack::Data::NotificationRule.add(rule_data, :redis => @redis)
+ rule.should be_nil
+ end
+
+ it "fails to update a notification rule with invalid data" do
+ rule = Flapjack::Data::NotificationRule.add(rule_data, :redis => @redis)
+ expect {
+ rule_data[:entities] = [57]
+ success = rule.update(rule_data)
+ success.should be_false
+ }.not_to change { rule.entities }
+ end
+
+ end
end
\ No newline at end of file