Browse Source

fix setting of newest_event_id when there are no events; make specs better

Andrew Cantino 11 years ago
parent
commit
2ba447d143
2 changed files with 43 additions and 38 deletions
  1. 3 1
      app/models/agent.rb
  2. 40 37
      spec/models/agent_spec.rb

+ 3 - 1
app/models/agent.rb

@@ -134,7 +134,9 @@ class Agent < ActiveRecord::Base
   end
 
   def set_last_checked_event_id
-    self.last_checked_event_id = Event.last.id
+    if newest_event_id = Event.order("id desc").limit(1).pluck(:id).first
+      self.last_checked_event_id = newest_event_id
+    end
   end
 
   # Class Methods

+ 40 - 37
spec/models/agent_spec.rb

@@ -64,6 +64,12 @@ describe Agent do
 
     class Agents::CannotBeScheduled < Agent
       cannot_be_scheduled!
+
+      def receive(events)
+        events.each do |event|
+          create_event :payload => { :events_received => 1 }
+        end
+      end
     end
 
     before do
@@ -109,31 +115,31 @@ describe Agent do
 
     describe "#create_event" do
       it "should use the checker's user" do
-        @checker = Agents::SomethingSource.new(:name => "something")
-        @checker.user = users(:bob)
-        @checker.save!
+        checker = Agents::SomethingSource.new(:name => "something")
+        checker.user = users(:bob)
+        checker.save!
 
-        @checker.check
-        Event.last.user.should == @checker.user
+        checker.check
+        Event.last.user.should == checker.user
       end
     end
 
     describe ".async_check" do
       it "records last_check_at and calls check on the given Agent" do
-        @checker = Agents::SomethingSource.new(:name => "something")
-        @checker.user = users(:bob)
-        @checker.save!
+        checker = Agents::SomethingSource.new(:name => "something")
+        checker.user = users(:bob)
+        checker.save!
 
-        mock(@checker).check.once {
-          @checker.options[:new] = true
+        mock(checker).check.once {
+          checker.options[:new] = true
         }
 
-        mock(Agent).find(@checker.id) { @checker }
+        mock(Agent).find(checker.id) { checker }
 
-        @checker.last_check_at.should be_nil
-        Agents::SomethingSource.async_check(@checker.id)
-        @checker.reload.last_check_at.should be_within(2).of(Time.now)
-        @checker.reload.options[:new].should be_true # Show that we save options
+        checker.last_check_at.should be_nil
+        Agents::SomethingSource.async_check(checker.id)
+        checker.reload.last_check_at.should be_within(2).of(Time.now)
+        checker.reload.options[:new].should be_true # Show that we save options
       end
     end
 
@@ -149,7 +155,7 @@ describe Agent do
         Agent.receive!
       end
 
-      it "should track when events have been seen and not see them again" do
+      it "should track when events have been seen and not received them again" do
         mock.any_instance_of(Agents::TriggerAgent).receive(anything).once
         Agent.async_check(agents(:bob_weather_agent).id)
         Agent.receive!
@@ -171,30 +177,27 @@ describe Agent do
       end
     end
 
-    describe "creating a new agent and then .receive!" do
-      before do
-        stub_request(:any, /wunderground/).to_return(:body => File.read(Rails.root.join("spec/data_fixtures/weather.json")), :status => 200)
-        stub.any_instance_of(Agents::WeatherAgent).is_tomorrow?(anything) { true }
-      end
-
+    describe "creating a new agent and then calling .receive!" do
       it "should not backfill events for a newly created agent" do
-        Agent.async_check(agents(:bob_weather_agent).id)
+        Event.delete_all
+        sender = Agents::SomethingSource.new(:name => "Sending Agent")
+        sender.user = users(:bob)
+        sender.save!
+        sender.create_event :payload => {}
+        sender.create_event :payload => {}
+        sender.events.count.should == 2
+
+        receiver = Agents::CannotBeScheduled.new(:name => "Receiving Agent")
+        receiver.user = users(:bob)
+        receiver.sources << sender
+        receiver.save!
+
+        receiver.events.count.should == 0
         Agent.receive!
-        checker = Agents::TriggerAgent.new(:name => "New trigger agent", :options => {
-          :expected_receive_period_in_days => "2",
-          :rules => [{
-            :type => "regex",
-            :value => "rain",
-            :path => "conditions"
-          }],
-          :message => "Just so you know, it looks like '<conditions>' tomorrow in <zipcode>"
-        })
-        checker.user = users(:bob)
-        checker.sources << agents(:bob_weather_agent)
-        checker.save!
-        checker.sources.first.events.count.should be > 0
+        receiver.events.count.should == 0
+        sender.create_event :payload => {}
         Agent.receive!
-        checker.events.count.should eq(0)
+        receiver.events.count.should == 1
       end
     end