spec/reporter_spec.rb in adhearsion-reporter-2.1.0 vs spec/reporter_spec.rb in adhearsion-reporter-2.2.0

- old
+ new

@@ -2,10 +2,15 @@ describe Adhearsion::Reporter do EventClass = Class.new ExceptionClass = Class.new StandardError + before do + Adhearsion::Reporter.config.notifier = nil + Adhearsion::Reporter.config.notifiers = [] + end + context "with a DummyNotifier" do class DummyNotifier include Singleton attr_reader :initialized, :notified def init @@ -26,60 +31,60 @@ Adhearsion::Plugin.init_plugins Adhearsion::Events.trigger_immediately :exception, ExceptionClass.new end it "calls init on the notifier instance" do - Adhearsion::Reporter.config.notifier.instance.initialized.should == true + expect(Adhearsion::Reporter.config.notifier.instance.initialized).to be(true) end it "logs an exception event" do sleep 0.25 - Adhearsion::Reporter.config.notifier.instance.notified.class.should == ExceptionClass + expect(Adhearsion::Reporter.config.notifier.instance.notified.class).to eq(ExceptionClass) end end context "with a AirbrakeNotifier" do before(:each) do Adhearsion::Reporter.config.notifier = Adhearsion::Reporter::AirbrakeNotifier end it "should initialize correctly" do - Toadhopper.should_receive(:new).with(Adhearsion::Reporter.config.api_key, notify_host: Adhearsion::Reporter.config.url) + expect(Toadhopper).to receive(:new).with(Adhearsion::Reporter.config.api_key, notify_host: Adhearsion::Reporter.config.url) Adhearsion::Plugin.init_plugins end context "exceptions" do let(:mock_notifier) { double 'notifier' } let(:event_error) { ExceptionClass.new } - let(:response) { double('response').as_null_object } + let(:response) { double('response', status: '200').as_null_object } - before { Toadhopper.should_receive(:new).at_least(:once).and_return(mock_notifier) } + before { expect(Toadhopper).to receive(:new).at_least(:once).and_return(mock_notifier) } after do Adhearsion::Plugin.init_plugins Adhearsion::Events.trigger_immediately :exception, event_error end it "should notify Airbrake" do - mock_notifier.should_receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :production)).and_return(response) + expect(mock_notifier).to receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :production)).and_return(response) end context "with an environment set" do before { Adhearsion.config.platform.environment = :foo } it "notifies airbrake with that environment" do - mock_notifier.should_receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :foo)).and_return(response) + expect(mock_notifier).to receive(:post!).at_least(:once).with(event_error, hash_including(framework_env: :foo)).and_return(response) end end context "in excluded environments" do before do Adhearsion.config.platform.environment = :development Adhearsion::Plugin.init_plugins end it "should not report errors for excluded environments" do - mock_notifier.should_not_receive(:post!) + expect(mock_notifier).to_not receive(:post!) end end end end @@ -87,20 +92,150 @@ before(:each) do Adhearsion::Reporter.config.notifier = Adhearsion::Reporter::NewrelicNotifier end it "should initialize correctly" do - NewRelic::Agent.should_receive(:manual_start).with(Adhearsion::Reporter.config.newrelic.to_hash) + expect(NewRelic::Agent).to receive(:manual_start).with(Adhearsion::Reporter.config.newrelic.to_hash) Adhearsion::Plugin.init_plugins end it "should notify Newrelic" do - NewRelic::Agent.should_receive(:manual_start) + expect(NewRelic::Agent).to receive(:manual_start) event_error = ExceptionClass.new - NewRelic::Agent.should_receive(:notice_error).at_least(:once).with(event_error) + expect(NewRelic::Agent).to receive(:notice_error).at_least(:once).with(event_error) Adhearsion::Plugin.init_plugins Adhearsion::Events.trigger_immediately :exception, event_error + end + end + + context 'with an EmailNotifier' do + let(:email_options) do + { + via: :sendmail, + to: 'recv@domain.ext' + } + end + + let(:time_freeze) { Time.parse("2014-07-24 17:30:00") } + + let(:fake_backtrace) do + [ + '1: foo', + '2: bar' + ] + end + + let(:error_message) { "Something bad" } + + before(:each) do + Adhearsion::Reporter.config.notifier = Adhearsion::Reporter::EmailNotifier + Adhearsion::Reporter.config.email = email_options + end + + it "should initialize correctly" do + Adhearsion::Plugin.init_plugins + expect(Pony.options).to be(email_options) + end + + it "should notify via email" do + + event_error = ExceptionClass.new error_message + event_error.set_backtrace(fake_backtrace) + + hostname = Socket.gethostname + environment = Adhearsion.config.platform.environment.to_s.upcase + + Timecop.freeze(time_freeze) do + expect(Pony).to receive(:mail).at_least(:once).with({ + subject: "[#{Adhearsion::Reporter.config.app_name}-#{environment}] Exception: ExceptionClass (#{error_message})", + body: "#{Adhearsion::Reporter.config.app_name} reported an exception at #{time_freeze.to_s}\n\nExceptionClass (#{error_message}):\n#{event_error.backtrace.join("\n")}\n\n", + from: hostname + }) + + Adhearsion::Plugin.init_plugins + Adhearsion::Events.trigger_immediately :exception, event_error + end + end + end + + context "with a SentryNotifier" do + let(:sentry_options) do + { + "dsn" => 'https://123abc:def456@app.getsentry.com/98765', + "environments" => ['production', 'staging'], + "current_environment" => 'production' + } + end + + before(:each) do + Adhearsion::Reporter.config.notifier = Adhearsion::Reporter::SentryNotifier + Adhearsion::Reporter.config.sentry = sentry_options + end + + it "should initialize correctly" do + Adhearsion::Plugin.init_plugins + + config = Raven.configuration + sentry_options.each do |k, v| + if k == "dsn" #There is no getter for this attribute, so we have to get it through it components + expect("#{config.scheme}://#{config.public_key}:#{config.secret_key}@#{config.host}/#{config.path}#{config.project_id}").to eq v + else + expect(Raven.configuration.send("#{k}")).to eq v + end + end + end + + it "should notify Sentry" do + expect(Raven).to receive(:configure) + event_error = ExceptionClass.new + expect(Raven).to receive(:capture_exception).at_least(:once).with(event_error) + + Adhearsion::Plugin.init_plugins + Adhearsion::Events.trigger_immediately :exception, event_error + end + end + + context "with multiple notifiers" do + + class BaseNotifier + include Singleton + + attr_reader :initialized, :notified + + def init + @initialized = true + end + + def notify(ex) + @notified = ex + end + + def self.method_missing(m, *args, &block) + instance.send m, *args, &block + end + end + + class MockNotifier < BaseNotifier; end + class AnotherMockNotifier < BaseNotifier; end + + before(:each) do + Adhearsion::Events.clear_handlers(:exception) + Adhearsion::Reporter::config.notifiers = [MockNotifier, AnotherMockNotifier] + Adhearsion::Plugin.init_plugins + Adhearsion::Events.trigger_immediately :exception, ExceptionClass.new + end + + it "calls init on each of the notifier instances" do + Adhearsion::Reporter::config.notifiers.each do |notifier| + expect(notifier.instance.initialized).to be(true) + end + end + + it "logs an exception in each of the registered notifiers" do + Adhearsion::Reporter::config.notifiers.each do |notifier| + expect(notifier.instance.notified.class).to eq(ExceptionClass) + end end end end