spec/lib/flapjack/data/event_spec.rb in flapjack-1.6.0 vs spec/lib/flapjack/data/event_spec.rb in flapjack-2.0.0b1

- old
+ new

@@ -2,344 +2,129 @@ require 'flapjack/data/event' describe Flapjack::Data::Event do let(:entity_name) { 'xyz-example.com' } - let(:check) { 'ping' } - let(:redis) { double(::Redis) } - let(:multi) { double('multi') } + let(:check_name) { 'ping' } + let(:redis) { double(Redis) } let!(:time) { Time.now} - let(:event_data) { {'type' => 'service', - 'state' => 'critical', + let(:event_data) { {'state' => 'critical', 'entity' => entity_name, - 'check' => check, + 'check' => check_name, 'time' => time.to_i, 'summary' => 'timeout', 'details' => "couldn't access", 'perfdata' => "/=5504MB;5554;6348;0;7935", 'acknowledgement_id' => '1234', - 'duration' => (60 * 60), - 'tags' => ['dev'] } - } + 'duration' => (60 * 60) } + } - before(:each) do - Flapjack::Data::Event.instance_variable_set('@previous_base_time_str', nil) - end - context 'class' do - it "returns the next event (blocking, archiving)" do - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(event_data.to_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:expire) + let(:check) { double(Flapjack::Data::Check) } - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) + before(:each) do + allow(Flapjack).to receive(:redis).and_return(redis) end - it "returns the next event (blocking, not archiving)" do - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', event_data.to_json]) - - result = Flapjack::Data::Event.next('events',:block => true, - :archive_events => false, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - - it "returns the next event (non-blocking, archiving)" do - expect(redis).to receive(:rpoplpush). - with('events', /^events_archive:/).and_return(event_data.to_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => false, - :archive_events => true, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - - it "returns the next event (non-blocking, not archiving)" do - expect(redis).to receive(:rpop).with('events'). - and_return(event_data.to_json) - - result = Flapjack::Data::Event.next('events', :block => false, - :archive_events => false, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - - it "rejects invalid event JSON (archiving)" do - bad_event_json = '{{{' - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(bad_event_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:multi).and_yield(multi) - expect(multi).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json) - expect(multi).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_nil - end - - it "rejects invalid event JSON (not archiving)" do - bad_event_json = '{{{' - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', bad_event_json]) - expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => false, :redis => redis) - expect(result).to be_nil - end - - ['type', 'state', 'entity', 'check'].each do |required_key| - - it "rejects an event with missing '#{required_key}' key (archiving)" do - bad_event_data = event_data.clone - bad_event_data.delete(required_key) - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(bad_event_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:multi).and_yield(multi) - expect(multi).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json) - expect(multi).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_nil - end - - it "rejects an event with missing '#{required_key}' key (not archiving)" do - bad_event_data = event_data.clone - bad_event_data.delete(required_key) - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', bad_event_json]) - expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => false, :redis => redis) - expect(result).to be_nil - end - - it "rejects an event with invalid '#{required_key}' key (archiving)" do - bad_event_data = event_data.clone - bad_event_data[required_key] = {'hello' => 'there'} - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(bad_event_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:multi).and_yield(multi) - expect(multi).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json) - expect(multi).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_nil - end - - it "rejects an event with invalid '#{required_key}' key (not archiving)" do - bad_event_data = event_data.clone - bad_event_data[required_key] = {'hello' => 'there'} - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', bad_event_json]) - expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => false, :redis => redis) - expect(result).to be_nil - end - end - - ['time', 'summary', 'details', 'perfdata', 'acknowledgement_id', 'duration', 'tags'].each do |optional_key| - it "rejects an event with invalid '#{optional_key}' key (archiving)" do - bad_event_data = event_data.clone - bad_event_data[optional_key] = {'hello' => 'there'} - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(bad_event_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:multi).and_yield(multi) - expect(multi).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json) - expect(multi).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_nil - end - - it "rejects an event with invalid '#{optional_key}' key (not archiving)" do - bad_event_data = event_data.clone - bad_event_data[optional_key] = {'hello' => 'there'} - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', bad_event_json]) - expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => false, :redis => redis) - expect(result).to be_nil - end - end - - ['type', 'state'].each do |key| - - it "it matches case-insensitively for #{key} (archiving)" do - case_event_data = event_data.clone - case_event_data[key] = event_data[key].upcase - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(case_event_data.to_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - - it "it matches case-insensitively for #{key} (not archiving)" do - case_event_data = event_data.clone - case_event_data[key] = event_data[key].upcase - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', case_event_data.to_json]) - - result = Flapjack::Data::Event.next('events',:block => true, - :archive_events => false, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - end - - ['time', 'duration'].each do |key| - - it "it accepts an event with a numeric #{key} key (archiving)" do - num_event_data = event_data.clone - num_event_data[key] = event_data[key].to_i.to_s - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(num_event_data.to_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - - it "it accepts an event with a numeric #{key} key (not archiving)" do - num_event_data = event_data.clone - num_event_data[key] = event_data[key].to_i.to_s - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', num_event_data.to_json]) - - result = Flapjack::Data::Event.next('events',:block => true, - :archive_events => false, :redis => redis) - expect(result).to be_an_instance_of(Flapjack::Data::Event) - end - - it "rejects an event with a non-numeric string #{key} key (archiving)" do - bad_event_data = event_data.clone - bad_event_data[key] = 'NaN' - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpoplpush). - with('events', /^events_archive:/, 0).and_return(bad_event_json) - expect(Flapjack::Data::Migration).to receive(:purge_expired_archive_index).with(:redis => redis) - expect(redis).to receive(:sadd). - with('known_events_archive_keys', /^events_archive:/) - expect(redis).to receive(:multi).and_yield(multi) - expect(multi).to receive(:lrem).with(/^events_archive:/, 1, bad_event_json) - expect(multi).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - expect(redis).to receive(:expire) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => true, :redis => redis) - expect(result).to be_nil - end - - it "rejects an event with a non-numeric string #{key} key (not archiving)" do - bad_event_data = event_data.clone - bad_event_data[key] = 'NaN' - bad_event_json = bad_event_data.to_json - expect(redis).to receive(:brpop).with('events', 0). - and_return(['events', bad_event_json]) - expect(redis).to receive(:lpush).with(/^events_rejected:/, bad_event_json) - - result = Flapjack::Data::Event.next('events', :block => true, - :archive_events => false, :redis => redis) - expect(result).to be_nil - end - - end - it "returns a count of pending events" do events_len = 23 expect(redis).to receive(:llen).with('events').and_return(events_len) - pc = Flapjack::Data::Event.pending_count('events', :redis => redis) + pc = Flapjack::Data::Event.pending_count('events') expect(pc).to eq(events_len) end it "creates a notification testing event" do + expect(check).to receive(:name).and_return(check_name) + expect(Time).to receive(:now).and_return(time) + expect(redis).to receive(:multi).and_yield expect(redis).to receive(:lpush).with('events', /"testing"/ ) + expect(redis).to receive(:lpush).with('events_actions', anything) - Flapjack::Data::Event.test_notifications(entity_name, check, - :summary => 'test', :details => 'testing', :redis => redis) + Flapjack::Data::Event.test_notifications('events', [check], + :summary => 'test', :details => 'testing') end it "creates an acknowledgement event" do + expect(check).to receive(:name).and_return(check_name) + expect(Time).to receive(:now).and_return(time) + expect(redis).to receive(:multi).and_yield expect(redis).to receive(:lpush).with('events', /"acking"/ ) + expect(redis).to receive(:lpush).with('events_actions', anything) - Flapjack::Data::Event.create_acknowledgement(entity_name, check, - :summary => 'acking', :time => time.to_i, :redis => redis) + Flapjack::Data::Event.create_acknowledgements('events', [check], + :summary => 'acking', :time => time.to_i) end end context 'instance' do let(:event) { Flapjack::Data::Event.new(event_data) } it "matches the data it is initialised with" do - expect(event.entity).to eq(event_data['entity']) expect(event.state).to eq(event_data['state']) expect(event.duration).to eq(event_data['duration']) expect(event.time).to eq(event_data['time']) expect(event.id).to eq('xyz-example.com:ping') - expect(event.type).to eq('service') - expect(event.tags).to be_an_instance_of(Set) - expect(event.tags).to include('dev') - expect(event.tags).to_not include('prod') + end + end - expect(event).to be_a_service - expect(event).to be_a_service - expect(event).not_to be_an_acknowledgement - expect(event).not_to be_a_test_notifications - expect(event).not_to be_ok - expect(event).to be_a_failure + [:state, :check].each do |required_key| + it "rejects an event with missing '#{required_key}' key" do + bad_event_data = event_data.clone + bad_event_data.delete(required_key.to_s) + bad_event_json = Flapjack.dump_json(bad_event_data) + + _, errors = Flapjack::Data::Event.parse_and_validate(bad_event_json) + expect(errors).not_to be_empty + end + + it "rejects an event with invalid '#{required_key}' key" do + bad_event_data = event_data.clone + bad_event_data[required_key] = {'hello' => 'there'} + bad_event_json = Flapjack.dump_json(bad_event_data) + + _, errors = Flapjack::Data::Event.parse_and_validate(bad_event_json) + expect(errors).not_to be_empty + end + end + + [:entity, :time, :initial_failure_delay, :repeat_failure_delay, :summary, + :details, :perfdata, :acknowledgement_id, :duration].each do |optional_key| + + it "rejects an event with invalid '#{optional_key}' key" do + bad_event_data = event_data.clone + bad_event_data[optional_key.to_s] = {'hello' => 'there'} + bad_event_json = Flapjack.dump_json(bad_event_data) + + _, errors = Flapjack::Data::Event.parse_and_validate(bad_event_json) + expect(errors).not_to be_empty + end + + end + + [:time, :initial_failure_delay, :repeat_failure_delay, :duration].each do |key| + it "accepts an event with a numeric string #{key} key" do + numstr_event_data = event_data.clone + numstr_event_data[key.to_s] = '352' + numstr_event_json = Flapjack.dump_json(numstr_event_data) + + _, errors = Flapjack::Data::Event.parse_and_validate(numstr_event_json) + expect(errors).to be_empty + end + + it "rejects an event with a non-numeric or numeric string #{key} key" do + bad_event_data = event_data.clone + bad_event_data[key] = 'NaN' + bad_event_json = Flapjack.dump_json(bad_event_data) + + _, errors = Flapjack::Data::Event.parse_and_validate(bad_event_json) + expect(errors).not_to be_empty end end end