require 'spec_helper'

describe Honeybadger do
  def send_notice
    Honeybadger.sender.send_to_honeybadger('data')
  end

  def stub_verbose_log
    Honeybadger.stub(:write_verbose_log)
  end

  def configure
    Honeybadger.configure { |config| }
  end

  it "reports that notifier is ready when configured" do
    stub_verbose_log
    Honeybadger.should_receive(:write_verbose_log).with(/Notifier (.*) ready/, anything)
    configure
  end

  it "does not report that notifier is ready when internally configured" do
    stub_verbose_log
    Honeybadger.should_not_receive(:write_verbose_log)
    Honeybadger.configure(true) { |config| }
  end

  it "prints environment info on a failed notification without a body" do
    reset_config
    stub_verbose_log
    stub_http(:response => Net::HTTPError, :body => nil)
    Honeybadger.should_receive(:write_verbose_log).with(/Environment Info:/)
    Honeybadger.should_not_receive(:write_verbose_log).with(/Response from Honeybadger:/, anything)
    send_notice
  end

  it "prints environment info and response on a success with a body" do
    reset_config
    stub_verbose_log
    stub_http
    Honeybadger.should_receive(:write_verbose_log).with(/Environment Info:/)
    Honeybadger.should_receive(:write_verbose_log).with(/Response from Honeybadger:/)
    send_notice
  end

  it "prints environment info and response on a failure with a body" do
    reset_config
    stub_verbose_log
    stub_http(:response => Net::HTTPError)
    Honeybadger.should_receive(:write_verbose_log).with(/Environment Info:/)
    Honeybadger.should_receive(:write_verbose_log).with(/Response from Honeybadger:/)
    send_notice
  end

  context "429 error response" do
    let(:failure_class) do
      if RUBY_VERSION !~ /^1/
        Net::HTTPTooManyRequests
      else
        Net::HTTPClientError
      end
    end

    let(:http) { stub_http(:response => failure_class.new('1.2', '429', 'Peace out'), :body => '{"error":"something went wrong"}') }

    before do
      reset_config
      stub_verbose_log
    end

    it "logs the response" do
      http.should_receive(:post).with(Honeybadger::Sender::NOTICES_URI, kind_of(String), kind_of(Hash))
      Honeybadger.should_receive(:write_verbose_log).with(/Failure: #{failure_class.name}/, :error)
      Honeybadger.should_receive(:write_verbose_log).with(/Environment Info:/)
      Honeybadger.should_receive(:write_verbose_log).with(/something went wrong/)
      Honeybadger.notify(RuntimeError.new('oops!'))
    end
  end
end