require 'spec_helper' feature "Events from Rails" do before { Timecop.freeze Time.utc(2012, 8, 23, 16, 34, 19) } after { Timecop.return } scenario "reports errors to the Captivus API" do Captivus.config.environment = 'production' begin visit '/error?username=austin&password=secret' rescue Exception end expect(captivus_api.requests.size).to eq 1 last_request = captivus_api.requests[0] headers = { "CONTENT_TYPE"=>"application/json; charset=UTF-8", "HTTP_ACCEPT" => "*/*", "HTTP_USER_AGENT" => "Ruby", "HTTP_DATE" => "Thu, 23 Aug 2012 16:34:19 GMT", "HTTP_AUTHORIZATION" => "Captivus api-key:syLWMLH8mJ4jTFGO2lVe+9PfgVo=", "PATH_INFO" => "/events", "QUERY_STRING" => "", "REQUEST_METHOD"=>"POST", "SCRIPT_NAME" => "", "SERVER_NAME" => "api.captiv.us", "SERVER_PORT" => "80", "rack.url_scheme" => "http" } expect(last_request.values_at(*headers.keys)).to eq headers.values JSON(last_request['rack.input'].read).tap do |payload| expect(payload.keys).to match_array %w[notifier event backtrace environment context] payload['notifier'].tap do |notifier| expect(notifier.keys).to match_array %w[name version language] expect(notifier['name']).to eq 'captivus' expect(notifier['version']).to eq Captivus::VERSION expect(notifier['language']).to eq 'Ruby' end payload['event'].tap do |event| expect(event.keys).to match_array %w[type message timestamp] expect(event['type']).to eq 'Exception' expect(event['message']).to eq 'Error from Rails 3.2 app' expect(event['timestamp']).to eq '2012-08-23T16:34:19Z' end expect(payload['backtrace'].size > 10).to be_true expect(payload['backtrace'][0..2]).to eq [{ "file" => "/Users/austin/projects/captivus/gem/rails-3.1-app/app/controllers/errors_controller.rb", "number"=> 3, "method" => "show" }, { "file" => "/Users/austin/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.8/lib/action_controller/metal/implicit_render.rb", "number"=> 4, "method" => "send_action" }, { "file" => "/Users/austin/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.8/lib/abstract_controller/base.rb", "number"=> 167, "method" => "process_action" }] payload['environment'].tap do |environment| expect(environment.keys).to match_array %w[name] expect(environment['name']).to eq 'production' end payload['context'].tap do |context| expect(context.keys).to match_array %w[controller action params] expect(context['controller']).to eq 'errors' expect(context['action']).to eq 'show' expect(context['params']).to eq({'username' => 'austin', 'password' => '[FILTERED]'}) end end end scenario "by default, it doesn't report errors in development or test" do Captivus.config.environment = 'review' begin visit '/error' rescue Exception end expect(captivus_api.requests.size).to eq 1 Captivus.config.environment = 'demo' begin visit '/error' rescue Exception end expect(captivus_api.requests.size).to eq 2 Captivus.config.environment = 'development' begin visit '/error' rescue Exception end expect(captivus_api.requests.size).to eq 2 Captivus.config.environment = 'test' begin visit '/error' rescue Exception end expect(captivus_api.requests.size).to eq 2 end end