Commit b82e2b6

mo khan <mo@mokhan.ca>
2014-11-11 21:23:23
publish error to configured endpoint.
1 parent 81587bf
bin/urkel
lib/urkel/configuration.rb
@@ -0,0 +1,23 @@
+module Urkel
+  class Configuration
+    attr_reader :uri, :api_key
+
+    def initialize(api_host, api_key)
+      @uri = URI.parse(api_host)
+      @api_key = api_key
+    end
+
+    def request(request)
+      request['authorization'] = "Token token=#{api_key}"
+      http_connection.request(request)
+    end
+
+    private
+
+    def http_connection
+      http = Net::HTTP.new(uri.host, uri.port)
+      http.use_ssl = (uri.scheme == "https")
+      http
+    end
+  end
+end
lib/urkel/connection.rb
@@ -0,0 +1,31 @@
+module Urkel
+  class Connection
+    API_ENDPOINT="/api/v1/failures"
+
+    def initialize(configuration)
+      @configuration = configuration
+    end
+
+    def publish(error)
+      response = @configuration.request(request_for(error))
+      response.is_a?(Net::HTTPOK)
+    end
+
+    private
+
+    def request_for(error)
+      Net::HTTP::Post.new(API_ENDPOINT).tap do |request|
+        request.set_form_data(form_payload_for(error))
+      end
+    end
+
+    def form_payload_for(error)
+      {
+        "error[message]" => error.message,
+        "error[hostname]" => Socket.gethostname,
+        "error[error_type]" => error.class.name,
+        "error[backtrace]" => error.backtrace,
+      }
+    end
+  end
+end
lib/urkel.rb
@@ -1,5 +1,7 @@
 require "urkel/version"
+require 'net/http'
+require 'urkel/configuration'
+require 'urkel/connection'
 
 module Urkel
-  # Your code goes here...
 end
spec/lib/urkel/connection_spec.rb
@@ -0,0 +1,37 @@
+require 'spec_helper'
+
+module Urkel
+  describe Connection do
+    subject { Connection.new(configuration) }
+
+    describe "#publish" do
+      let(:error) do
+        begin
+          1/0
+        rescue => error
+          error
+        end
+      end
+
+      context "given proper credentials" do
+        let(:configuration) { Configuration.new('http://localhost:3000', '02513a35-b875-40a1-a1fc-f2d2582bdcc5') }
+        let(:hostname) { Socket.gethostname }
+
+        it 'publishes a new error' do
+          stub_request(:post, "http://localhost:3000/api/v1/failures").
+            with(body: {
+            "error"=>
+            {
+              "message" => error.message,
+              "hostname" => hostname,
+              "error_type" => error.class.name,
+              "backtrace" => error.backtrace
+            }
+          }, :headers => { 'Authorization'=>'Token token=02513a35-b875-40a1-a1fc-f2d2582bdcc5' })
+            .to_return(status: 200, body: "", headers: {})
+            expect(subject.publish(error)).to be_truthy
+        end
+      end
+    end
+  end
+end
spec/spec_helper.rb
@@ -1,2 +1,3 @@
 $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
 require 'urkel'
+require 'webmock/rspec'
spec/urkel_spec.rb
@@ -5,7 +5,13 @@ describe Urkel do
     expect(Urkel::VERSION).not_to be nil
   end
 
-  it 'does something useful' do
-    expect(false).to eq(true)
+  describe ".oops" do
+    it 'publishes a new error' do
+      Urkel.configure do |configuration|
+        configuration.api_host = 'http://localhost:3000'
+        configuration.api_key = '02513a35-b875-40a1-a1fc-f2d2582bdcc5'
+      end
+      Urkel.oops(error)
+    end
   end
 end
urkel.gemspec
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
   spec.add_development_dependency "bundler", "~> 1.7"
   spec.add_development_dependency "rake", "~> 10.0"
   spec.add_development_dependency "rspec"
+  spec.add_development_dependency "webmock"
 end