spec/lib/flapjack/gateways/web_spec.rb in flapjack-0.9.6 vs spec/lib/flapjack/gateways/web_spec.rb in flapjack-1.0.0rc1

- old
+ new

@@ -21,17 +21,10 @@ set :raise_errors, true set :show_exceptions, false } end - before(:each) do - expect(Flapjack::RedisPool).to receive(:new).and_return(redis) - Flapjack::Gateways::Web.instance_variable_set('@config', {}) - Flapjack::Gateways::Web.instance_variable_set('@logger', @logger) - Flapjack::Gateways::Web.start - end - def expect_stats expect(redis).to receive(:dbsize).and_return(3) expect(redis).to receive(:keys).with('executive_instance:*').and_return(["executive_instance:foo-app-01"]) expect(redis).to receive(:hget).once.and_return(Time.now.to_i - 60) expect(redis).to receive(:hgetall).twice.and_return({'all' => '8001', 'ok' => '8002'}, @@ -67,188 +60,244 @@ expect(ec).to receive(:last_notification_for_state).with(:acknowledgement).and_return({:timestamp => nil}) expect(ec).to receive(:in_scheduled_maintenance?).and_return(false) expect(ec).to receive(:in_unscheduled_maintenance?).and_return(false) end - # TODO add data, test that pages contain representations of it - # (for the methods that access redis directly) + context "Web page design" do - it "shows a page listing all checks" do - #redis.should_receive(:keys).with('*:*:states').and_return(["#{entity_name}:#{check}"]) - expect(Flapjack::Data::EntityCheck).to receive(:find_all_by_entity). - with(:redis => redis).and_return({entity_name => [check]}) - expect_check_stats + before(:each) do + expect(Flapjack::RedisPool).to receive(:new).and_return(redis) + Flapjack::Gateways::Web.instance_variable_set('@logger', @logger) + end - expect_entity_check_status(entity_check) + it "displays a custom logo if configured" do + image_path = '/tmp/branding.png' + config = {"logo_image_path" => image_path} - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + allow(File).to receive(:file?).and_call_original + allow(File).to receive(:file?).with(image_path) { true } - expect(Flapjack::Data::EntityCheck).to receive(:for_entity). - with(entity, 'ping', :redis => redis).and_return(entity_check) + Flapjack::Gateways::Web.instance_variable_set('@config', config) + Flapjack::Gateways::Web.start - aget '/checks_all' - expect(last_response).to be_ok - end + # NOTE Reuse enough of the stats specs to be able to build a page quickly + expect_stats + expect_check_stats + expect_entity_stats - it "shows a page listing failing checks" do - #redis.should_receive(:zrange).with('failed_checks', 0, -1).and_return(["#{entity_name}:#{check}"]) + logo_image_tag = '<img alt="Flapjack" class="logo" src="/img/branding.png">' - expect_check_stats + aget '/self_stats' - expect_entity_check_status(entity_check) + expect( last_response.body ).to include(logo_image_tag) + end - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + it "displays the standard logo if no custom logo configured" do + Flapjack::Gateways::Web.instance_variable_set('@config', {}) + Flapjack::Gateways::Web.start + # NOTE Reuse enough of the stats specs to be able to build a page quickly + expect_stats + expect_check_stats + expect_entity_stats - expect(Flapjack::Data::EntityCheck).to receive(:find_all_failing_by_entity). - with(:redis => redis).and_return({entity_name => [check]}) + logo_image_tag = '<img alt="Flapjack" class="logo" src="/img/flapjack-2013-notext-transparent-300-300.png">' - expect(Flapjack::Data::EntityCheck).to receive(:for_entity). - with(entity, 'ping', :redis => redis).and_return(entity_check) - aget '/checks_failing' - expect(last_response).to be_ok + aget '/self_stats' + + expect( last_response.body ).to include(logo_image_tag) + end end - it "shows a page listing flapjack statistics" do - #redis.should_receive(:keys).with('check:*').and_return([]) - #redis.should_receive(:zrange).with('failed_checks', 0, -1).and_return(["#{entity_name}:#{check}"]) - expect_stats - expect_check_stats - expect_entity_stats + context "Web page behavior" do - aget '/self_stats' - expect(last_response).to be_ok - end + before(:each) do + expect(Flapjack::RedisPool).to receive(:new).and_return(redis) + Flapjack::Gateways::Web.instance_variable_set('@config', {}) + Flapjack::Gateways::Web.instance_variable_set('@logger', @logger) + Flapjack::Gateways::Web.start + end - it "shows the state of a check for an entity" do - time = Time.now - expect(Time).to receive(:now).exactly(5).times.and_return(time) + # TODO add data, test that pages contain representations of it + # (for the methods that access redis directly) - last_notifications = {:problem => {:timestamp => time.to_i - ((3 * 60 * 60) + (5 * 60)), :summary => 'prob'}, - :recovery => {:timestamp => time.to_i - (3 * 60 * 60), :summary => nil}, - :acknowledgement => {:timestamp => nil, :summary => nil} } + it "shows a page listing all checks" do + #redis.should_receive(:keys).with('*:*:states').and_return(["#{entity_name}:#{check}"]) + expect(Flapjack::Data::EntityCheck).to receive(:find_all_by_entity). + with(:redis => redis).and_return({entity_name => [check]}) + expect_check_stats - expect_check_stats - expect(entity_check).to receive(:state).and_return('ok') - expect(entity_check).to receive(:last_update).and_return(time.to_i - (3 * 60 * 60)) - expect(entity_check).to receive(:last_change).and_return(time.to_i - (3 * 60 * 60)) - expect(entity_check).to receive(:summary).and_return('all good') - expect(entity_check).to receive(:details).and_return('seriously, all very wonderful') - expect(entity_check).to receive(:perfdata).and_return([{"key" => "foo", "value" => "bar"}]) - expect(entity_check).to receive(:last_notifications_of_each_type).and_return(last_notifications) - expect(entity_check).to receive(:maintenances).with(nil, nil, :scheduled => true).and_return([]) - expect(entity_check).to receive(:failed?).and_return(false) - expect(entity_check).to receive(:current_maintenance).with(:scheduled => true).and_return(false) - expect(entity_check).to receive(:current_maintenance).with(:scheduled => false).and_return(false) - expect(entity_check).to receive(:contacts).and_return([]) - expect(entity_check).to receive(:historical_states). - with(nil, time.to_i, :order => 'desc', :limit => 20).and_return([]) - expect(entity_check).to receive(:enabled?).and_return(true) + expect_entity_check_status(entity_check) - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) - expect(Flapjack::Data::EntityCheck).to receive(:for_entity). - with(entity, 'ping', :redis => redis).and_return(entity_check) + expect(Flapjack::Data::EntityCheck).to receive(:for_entity). + with(entity, 'ping', :redis => redis).and_return(entity_check) - aget "/check?entity=#{entity_name_esc}&check=ping" - expect(last_response).to be_ok - # TODO test instance variables set to appropriate values - end + aget '/checks_all' + expect(last_response).to be_ok + end - it "returns 404 if an unknown entity is requested" do - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name_esc, :redis => redis).and_return(nil) + it "shows a page listing failing checks" do + #redis.should_receive(:zrange).with('failed_checks', 0, -1).and_return(["#{entity_name}:#{check}"]) - aget "/check?entity=#{entity_name_esc}&check=ping" - expect(last_response).to be_not_found - end + expect_check_stats - # TODO shouldn't create actual entity record - it "returns 404 if no entity check is passed" do - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + expect_entity_check_status(entity_check) - aget "/check?entity=#{entity_name_esc}" - expect(last_response).to be_not_found - end + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) - it "creates an acknowledgement for an entity check" do - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + expect(Flapjack::Data::EntityCheck).to receive(:find_all_failing_by_entity). + with(:redis => redis).and_return({entity_name => [check]}) - expect(Flapjack::Data::EntityCheck).to receive(:for_entity). - with(entity, 'ping', :redis => redis).and_return(entity_check) + expect(Flapjack::Data::EntityCheck).to receive(:for_entity). + with(entity, 'ping', :redis => redis).and_return(entity_check) + aget '/checks_failing' + expect(last_response).to be_ok + end - expect(Flapjack::Data::Event).to receive(:create_acknowledgement). - with(entity_name, 'ping', :summary => "", :duration => (4 * 60 * 60), - :acknowledgement_id => '1234', :redis => redis) + it "shows a page listing flapjack statistics" do + #redis.should_receive(:keys).with('check:*').and_return([]) + #redis.should_receive(:zrange).with('failed_checks', 0, -1).and_return(["#{entity_name}:#{check}"]) + expect_stats + expect_check_stats + expect_entity_stats - apost "/acknowledgements/#{entity_name_esc}/ping?acknowledgement_id=1234" - expect(last_response.status).to eq(302) - end + aget '/self_stats' + expect(last_response).to be_ok + end - it "creates a scheduled maintenance period for an entity check" do - t = Time.now.to_i + it "shows the state of a check for an entity" do + time = Time.now + expect(Time).to receive(:now).exactly(5).times.and_return(time) - start_time = Time.at(t - (24 * 60 * 60)) - duration = 30 * 60 - summary = 'wow' + last_notifications = {:problem => {:timestamp => time.to_i - ((3 * 60 * 60) + (5 * 60)), :summary => 'prob'}, + :recovery => {:timestamp => time.to_i - (3 * 60 * 60), :summary => nil}, + :acknowledgement => {:timestamp => nil, :summary => nil} } - expect(Chronic).to receive(:parse).with('1 day ago').and_return(start_time) - expect(ChronicDuration).to receive(:parse).with('30 minutes').and_return(duration) + expect_check_stats + expect(entity_check).to receive(:state).and_return('ok') + expect(entity_check).to receive(:last_update).and_return(time.to_i - (3 * 60 * 60)) + expect(entity_check).to receive(:last_change).and_return(time.to_i - (3 * 60 * 60)) + expect(entity_check).to receive(:summary).and_return('all good') + expect(entity_check).to receive(:details).and_return('seriously, all very wonderful') + expect(entity_check).to receive(:perfdata).and_return([{"key" => "foo", "value" => "bar"}]) + expect(entity_check).to receive(:last_notifications_of_each_type).and_return(last_notifications) + expect(entity_check).to receive(:maintenances).with(nil, nil, :scheduled => true).and_return([]) + expect(entity_check).to receive(:failed?).and_return(false) + expect(entity_check).to receive(:current_maintenance).with(:scheduled => true).and_return(false) + expect(entity_check).to receive(:current_maintenance).with(:scheduled => false).and_return(false) + expect(entity_check).to receive(:contacts).and_return([]) + expect(entity_check).to receive(:historical_states). + with(nil, time.to_i, :order => 'desc', :limit => 20).and_return([]) + expect(entity_check).to receive(:enabled?).and_return(true) - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) - expect(Flapjack::Data::EntityCheck).to receive(:for_entity). - with(entity, 'ping', :redis => redis).and_return(entity_check) + expect(Flapjack::Data::EntityCheck).to receive(:for_entity). + with(entity, 'ping', :redis => redis).and_return(entity_check) - expect(entity_check).to receive(:create_scheduled_maintenance). - with(start_time.to_i, duration, :summary => summary) + aget "/check?entity=#{entity_name_esc}&check=ping" + expect(last_response).to be_ok + # TODO test instance variables set to appropriate values + end - apost "/scheduled_maintenances/#{entity_name_esc}/ping?"+ - "start_time=1+day+ago&duration=30+minutes&summary=wow" + it "returns 404 if an unknown entity is requested" do + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name_esc, :redis => redis).and_return(nil) - expect(last_response.status).to eq(302) - end + aget "/check?entity=#{entity_name_esc}&check=ping" + expect(last_response).to be_not_found + end - it "deletes a scheduled maintenance period for an entity check" do - t = Time.now.to_i + # TODO shouldn't create actual entity record + it "returns 404 if no entity check is passed" do + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) - start_time = t - (24 * 60 * 60) + aget "/check?entity=#{entity_name_esc}" + expect(last_response).to be_not_found + end - expect(Flapjack::Data::Entity).to receive(:find_by_name). - with(entity_name, :redis => redis).and_return(entity) + it "creates an acknowledgement for an entity check" do + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) - expect(Flapjack::Data::EntityCheck).to receive(:for_entity). - with(entity, 'ping', :redis => redis).and_return(entity_check) + expect(Flapjack::Data::EntityCheck).to receive(:for_entity). + with(entity, 'ping', :redis => redis).and_return(entity_check) - expect(entity_check).to receive(:end_scheduled_maintenance).with(start_time) + expect(Flapjack::Data::Event).to receive(:create_acknowledgement). + with(entity_name, 'ping', :summary => "", :duration => (4 * 60 * 60), + :acknowledgement_id => '1234', :redis => redis) - adelete "/scheduled_maintenances/#{entity_name_esc}/ping?start_time=#{start_time}" - expect(last_response.status).to eq(302) - end + apost "/acknowledgements/#{entity_name_esc}/ping?acknowledgement_id=1234" + expect(last_response.status).to eq(302) + end - it "shows a list of all known contacts" do - expect(Flapjack::Data::Contact).to receive(:all) + it "creates a scheduled maintenance period for an entity check" do + t = Time.now.to_i - aget "/contacts" - expect(last_response).to be_ok - end + start_time = Time.at(t - (24 * 60 * 60)) + duration = 30 * 60 + summary = 'wow' - it "shows details of an individual contact found by id" do - contact = double('contact') - expect(contact).to receive(:name).and_return("Smithson Smith") - expect(contact).to receive(:media).exactly(3).times.and_return({}) - expect(contact).to receive(:entities).with(:checks => true).and_return([]) - expect(contact).to receive(:notification_rules).and_return([]) + expect(Chronic).to receive(:parse).with('1 day ago').and_return(start_time) + expect(ChronicDuration).to receive(:parse).with('30 minutes').and_return(duration) - expect(Flapjack::Data::Contact).to receive(:find_by_id). - with('0362', :redis => redis).and_return(contact) + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) - aget "/contacts/0362" - expect(last_response).to be_ok + expect(Flapjack::Data::EntityCheck).to receive(:for_entity). + with(entity, 'ping', :redis => redis).and_return(entity_check) + + expect(entity_check).to receive(:create_scheduled_maintenance). + with(start_time.to_i, duration, :summary => summary) + + apost "/scheduled_maintenances/#{entity_name_esc}/ping?"+ + "start_time=1+day+ago&duration=30+minutes&summary=wow" + + expect(last_response.status).to eq(302) + end + + it "deletes a scheduled maintenance period for an entity check" do + t = Time.now.to_i + + start_time = t - (24 * 60 * 60) + + expect(Flapjack::Data::Entity).to receive(:find_by_name). + with(entity_name, :redis => redis).and_return(entity) + + expect(Flapjack::Data::EntityCheck).to receive(:for_entity). + with(entity, 'ping', :redis => redis).and_return(entity_check) + + expect(entity_check).to receive(:end_scheduled_maintenance).with(start_time) + + adelete "/scheduled_maintenances/#{entity_name_esc}/ping?start_time=#{start_time}" + expect(last_response.status).to eq(302) + end + + it "shows a list of all known contacts" do + expect(Flapjack::Data::Contact).to receive(:all) + + aget "/contacts" + expect(last_response).to be_ok + end + + it "shows details of an individual contact found by id" do + contact = double('contact') + expect(contact).to receive(:name).and_return("Smithson Smith") + expect(contact).to receive(:media).exactly(3).times.and_return({}) + expect(contact).to receive(:entities).with(:checks => true).and_return([]) + expect(contact).to receive(:notification_rules).and_return([]) + + expect(Flapjack::Data::Contact).to receive(:find_by_id). + with('0362', :redis => redis).and_return(contact) + + aget "/contacts/0362" + expect(last_response).to be_ok + end end + end