Commit 30b0eff4 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

better api_spec + fixed api vs. inbound stream issues

parent 5464d2cd
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ require 'securerandom'
class FnordMetric::API
  @@opts = nil
  def initialize opts
    @@opts = FnordMetric.default_options opts
    @@opts = FnordMetric.default_options(opts)
    connect
  end
  
@@ -11,8 +11,9 @@ class FnordMetric::API
    @redis = Redis.connect(:url => @@opts[:redis_url])
  end
  
  def event event_data
    push_event get_next_uuid, event_data
  def event(event_data)
    event_data = event_data.to_json if event_data.is_a?(Hash)
    push_event(get_next_uuid, event_data)
  end

  def disconnect
+2 −2
Original line number Diff line number Diff line
@@ -25,8 +25,8 @@ class FnordMetric::InboundStream < EventMachine::Connection

  def push_next_event
    return true if @events.empty?
    @api.event event_data
    @events_buffered -= 1
    @api.event(@events.pop)
    close_connection?
    EM.next_tick(&method(:push_next_event))    
  end
@@ -36,7 +36,7 @@ class FnordMetric::InboundStream < EventMachine::Connection
  end

  def post_init
    @api = API.new(@@opts)
    @api = FnordMetric::API.new(@@opts)
    @events_buffered = 0
    @streaming = true
    @buffer = ""
+15 −73
Original line number Diff line number Diff line
@@ -20,88 +20,30 @@ describe FnordMetric::Event do
    @api = API.new @opts
  end

  describe "finding events using API" do
  describe "creating events using API" do

    before(:each) do        
      @redis.keys("fnordmetric-test-*").each { |k| @redis.del(k) }     
    end

    it "should find all events" do
      create_event({:_type => "foo", :_time => @now})
      create_event({:_type => "foo", :_time => @now})
      Event.all(@opts).length.should == 2
    end

    it "should find all events and return event objects" do
      create_event({:_type => "foo", :_time => @now})
      Event.all(@opts).first.should be_a(FnordMetric::Event)
    end

    it "should find all events and returnevent objects with time" do
      create_event({:_type => "Fn0rd", :blah => :blubb, :_time => @now})
      events = Event.all(@opts) 
      events.first.time.to_i.should == @now
    end

    it "should find an event and return a event object" do
      event_id = create_event({:_type => "Fn0rd", :_time => @now})
    it "should create an event from a (json-)string" do
      json_string = {
        :_type => "Fn0rd123", 
        :_time => @now
      }.to_json
      event_id = @api.event(json_string)
      event = Event.find(event_id, @opts)
      event.should be_a(FnordMetric::Event)
      event.type.should == "Fn0rd"
      event.type.should == "Fn0rd123"
    end

    it "should find an event and return a event object with data" do
      event_id = create_event({:_type => "Fn0rd", :blah => :blubb, :_time => @now})
    it "should create an event from a hash" do
      event_id = @api.event(
        :_type => "Fn0rd234", 
        :_time => @now
      )
      event = Event.find(event_id, @opts)
      event.data(:blah).should == "blubb"
    end

    it "should find an event and return a event object with id" do
      event_id = create_event({:_type => "Fn0rd", :blah => :blubb, :_time => @now})
      event = Event.find(event_id, @opts) 
      event.id.should == event_id
    end

    it "should find all in the correct order" do
      create_event({:_type => "foo", :_time => @now-17})
      create_event({:_type => "foo", :_time => @now-23})
      create_event({:_type => "foo", :_time => @now-42})
      create_event({:_type => "foo", :_time => @now-5})
      Event.all(@opts).length.should == 4
      event.type.should == "Fn0rd234"
    end

    it "should find all events since a given time, including that exact time" do
      create_event({:_type => "foo", :_time => @now-42})
      create_event({:_type => "foo", :_time => @now-23})
      create_event({:_type => "foo", :_time => @now-17})
      create_event({:_type => "foo", :_time => @now-5})
      Event.all(@opts).length.should == 4
      Event.all(@opts.merge(:since => @now-42)).length.should == 4
      Event.all(@opts.merge(:since => @now-23)).length.should == 3
      Event.all(@opts.merge(:since => @now-22)).length.should == 2
      Event.all(@opts.merge(:since => @now-17)).length.should == 2
      Event.all(@opts.merge(:since => @now-16)).length.should == 1
      Event.all(@opts.merge(:since => @now-5)).length.should == 1
  end

    it "should find a maximum number of events" do
      create_event( {:_type => "foo", :_time => @now-42})
      create_event( {:_type => "foo", :_time => @now-23})
      create_event( {:_type => "foo", :_time => @now-17})
      create_event( {:_type => "foo", :_time => @now-5})
      Event.all(@opts).length.should == 4
      Event.all(@opts.merge(:limit => 2)).length.should == 2
    end



    def create_event(event_data)
      event_id = @api.event event_data.to_json
      @redis_wrap.zadd(@timeline, event_data.delete(:_time), event_id)
      event_id
    end

  end


end