require 'spec_helper' require 'flapjack/gateways/web' describe Flapjack::Gateways::Web, :sinatra => true, :pact_fixture => true, :logger => true do def app Flapjack::Gateways::Web end let(:redis) { double(Redis) } let(:config) { { 'api_url' => 'http://localhost:5081/' } } before(:all) do Flapjack::Gateways::Web.set :raise_errors, true end before(:each) do allow(Flapjack).to receive(:redis).and_return(redis) end # TODO add more data, test that pages contain representations of it context "web page design" do it "displays a custom logo if configured" do image_path = '/tmp/branding.png' allow(File).to receive(:file?).and_call_original allow(File).to receive(:file?).with(image_path) { true } Flapjack::Gateways::Web.instance_variable_set('@config', config.merge({"logo_image_path" => image_path})) Flapjack::Gateways::Web.start expect(Flapjack::Diner).to receive(:statistics).and_return([global_statistics_data]) expect(Flapjack::Diner).to receive(:metrics).and_return(metrics_data) logo_image_tag = '' get '/self_stats' expect( last_response.body ).to include(logo_image_tag) end it "displays the standard logo if no custom logo configured" do Flapjack::Gateways::Web.instance_variable_set('@config', config) Flapjack::Gateways::Web.start expect(Flapjack::Diner).to receive(:statistics).and_return([global_statistics_data]) expect(Flapjack::Diner).to receive(:metrics).and_return(metrics_data) logo_image_tag = '' get '/self_stats' expect( last_response.body ).to include(logo_image_tag) end end context 'web page behaviour' do before(:each) do Flapjack::Gateways::Web.instance_variable_set('@config', config) Flapjack::Gateways::Web.start end it "shows a page listing all checks" do expect(Flapjack::Diner).to receive(:checks).with(:filter => {}, :page => 1, :include => ['current_state', 'latest_notifications', 'current_scheduled_maintenances', 'current_unscheduled_maintenance']). and_return([]) get '/checks' expect(last_response).to be_ok end it "shows a page listing failing checks" do expect(Flapjack::Diner).to receive(:checks).with(:filter => {:failing => true}, :page => 1, :include => ['current_state', 'latest_notifications', 'current_scheduled_maintenances', 'current_unscheduled_maintenance']). and_return([]) get '/checks?failing=t' expect(last_response).to be_ok end it "shows a page listing flapjack statistics" do stats_resp_data = [global_statistics_json] expect(Flapjack::Diner).to receive(:statistics).and_return(resultify(stats_resp_data)) metrics_resp_data = metrics_json(metrics_data) expect(Flapjack::Diner).to receive(:metrics).and_return(resultify(metrics_resp_data)) get '/self_stats' expect(last_response).to be_ok end it "shows the state of a check" do resp_data = check_json(check_data).merge(:relationships => check_rel(check_data)) resp_data[:relationships][:contacts][:data] = [ {:type => 'contact', :id => contact_data[:id]} ] resp_data[:relationships][:current_state][:data] = {:type => 'state', :id => state_data[:id]} resp_data[:relationships][:latest_notifications][:data] = [] resp_data[:relationships][:current_scheduled_maintenances][:data] = [] resp_data[:relationships][:current_unscheduled_maintenance][:data] = nil resp_contact = contact_json(contact_data).merge(:relationships => contact_rel(contact_data)) resp_contact[:relationships][:media][:data] = [ {:type => 'medium', :id => email_data[:id]} ] resp_medium = medium_json(email_data) resp_state = state_json(state_data) expect(Flapjack::Diner).to receive(:checks). with(check_data[:id], :include => ['contacts.media', 'current_state', 'latest_notifications', 'current_scheduled_maintenances', 'current_unscheduled_maintenance']). and_return(resultify(resp_data)) expect(Flapjack::Diner).to receive(:check_link_states). with(check_data[:id], :include => 'states'). and_return([{:type => 'state', :id => state_data[:id]}]) expect(Flapjack::Diner).to receive(:check_link_scheduled_maintenances). with(check_data[:id], :include => 'scheduled_maintenances'). and_return([]) expect(Flapjack::Diner).to receive(:included_data).twice.and_return({}) expect(Flapjack::Diner).to receive(:related).with(resultify(resp_data), :contacts).and_return([resultify(resp_contact)]) expect(Flapjack::Diner).to receive(:related).twice.with(resultify(resp_data), :current_state).and_return(resultify(resp_state)) expect(Flapjack::Diner).to receive(:related).with(resultify(resp_data), :latest_notifications).and_return([]) expect(Flapjack::Diner).to receive(:related).twice.with(resultify(resp_data), :current_scheduled_maintenances).and_return([]) expect(Flapjack::Diner).to receive(:related).twice.with(resultify(resp_data), :current_unscheduled_maintenance).and_return(nil) expect(Flapjack::Diner).to receive(:related).with(resultify(resp_contact), :media).and_return([resultify(resp_medium)]) get "/checks/#{check_data[:id]}" expect(last_response).to be_ok end it "returns 404 if an unknown check is requested" do expect(Flapjack::Diner).to receive(:checks). with(check_data[:id], :include => ['contacts.media', 'current_state', 'latest_notifications', 'current_scheduled_maintenances', 'current_unscheduled_maintenance']). and_return(nil) get "/checks/#{check_data[:id]}" expect(last_response).to be_not_found end it "creates an acknowledgement for a check" do expect(Flapjack::Diner).to receive(:create_acknowledgements). with(:summary => 'oh no', :duration => 3600, :check => check_data[:id]). and_return(true) post "/acknowledgements", {:check_id => check_data[:id], :duration => '1 hour', :summary => 'oh no'} expect(last_response.status).to eq(302) end it "creates a scheduled maintenance period for a check" do expect(Flapjack::Diner).to receive(:create_scheduled_maintenances). with(:summary => 'wow', :start_time => an_instance_of(Time), :end_time => an_instance_of(Time), :check => check_data[:id]). and_return(true) post "/scheduled_maintenances", {:check_id => check_data[:id], :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 a check" do expect(Flapjack::Diner).to receive(:delete_scheduled_maintenances). with(scheduled_maintenance_data[:id]).and_return(true) delete "/scheduled_maintenances/#{scheduled_maintenance_data[:id]}" expect(last_response.status).to eq(302) end it "shows a list of all known contacts" do resp_data = [contact_json(contact_data).merge(:relationships => contact_rel(contact_data))] expect(Flapjack::Diner).to receive(:contacts).with(:filter => {}, :page => 1, :sort => '+name').and_return(resp_data) get "/contacts" expect(last_response).to be_ok end it "shows details of an individual contact found by id" do resp_data = contact_json(contact_data).merge(:relationships => contact_rel(contact_data)) resp_data[:relationships][:checks][:data] = [ {:type => 'check', :id => check_data[:id]} ] resp_data[:relationships][:media][:data] = [ {:type => 'medium', :id => email_data[:id]} ] resp_data[:relationships][:rules][:data] = [] resp_check = check_json(check_data) resp_medium = medium_json(email_data) resp_medium[:relationships] = {:alerting_checks => {:data => []}} expect(Flapjack::Diner).to receive(:related).with(resultify(resp_data), :checks).and_return([resultify(resp_check)]) expect(Flapjack::Diner).to receive(:related).with(resultify(resp_data), :media).and_return([resultify(resp_medium)]) expect(Flapjack::Diner).to receive(:related).with(resultify(resp_medium), :alerting_checks).and_return([]) expect(Flapjack::Diner).to receive(:related).with(resultify(resp_data), :rules).and_return([]) expect(Flapjack::Diner).to receive(:contacts). with(contact_data[:id], :include => ['checks', 'media.alerting_checks', 'rules.tags', 'rules.media']). and_return(resultify(resp_data)) get "/contacts/#{contact_data[:id]}" expect(last_response).to be_ok end end end