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

Andrew Cantino 11 年 前
コミット
2ba447d143
共有2 個のファイルを変更した43 個の追加38 個の削除を含む
  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
134 134
   end
135 135
 
136 136
   def set_last_checked_event_id
137
-    self.last_checked_event_id = Event.last.id
137
+    if newest_event_id = Event.order("id desc").limit(1).pluck(:id).first
138
+      self.last_checked_event_id = newest_event_id
139
+    end
138 140
   end
139 141
 
140 142
   # Class Methods

+ 40 - 37
spec/models/agent_spec.rb

@@ -64,6 +64,12 @@ describe Agent do
64 64
 
65 65
     class Agents::CannotBeScheduled < Agent
66 66
       cannot_be_scheduled!
67
+
68
+      def receive(events)
69
+        events.each do |event|
70
+          create_event :payload => { :events_received => 1 }
71
+        end
72
+      end
67 73
     end
68 74
 
69 75
     before do
@@ -109,31 +115,31 @@ describe Agent do
109 115
 
110 116
     describe "#create_event" do
111 117
       it "should use the checker's user" do
112
-        @checker = Agents::SomethingSource.new(:name => "something")
113
-        @checker.user = users(:bob)
114
-        @checker.save!
118
+        checker = Agents::SomethingSource.new(:name => "something")
119
+        checker.user = users(:bob)
120
+        checker.save!
115 121
 
116
-        @checker.check
117
-        Event.last.user.should == @checker.user
122
+        checker.check
123
+        Event.last.user.should == checker.user
118 124
       end
119 125
     end
120 126
 
121 127
     describe ".async_check" do
122 128
       it "records last_check_at and calls check on the given Agent" do
123
-        @checker = Agents::SomethingSource.new(:name => "something")
124
-        @checker.user = users(:bob)
125
-        @checker.save!
129
+        checker = Agents::SomethingSource.new(:name => "something")
130
+        checker.user = users(:bob)
131
+        checker.save!
126 132
 
127
-        mock(@checker).check.once {
128
-          @checker.options[:new] = true
133
+        mock(checker).check.once {
134
+          checker.options[:new] = true
129 135
         }
130 136
 
131
-        mock(Agent).find(@checker.id) { @checker }
137
+        mock(Agent).find(checker.id) { checker }
132 138
 
133
-        @checker.last_check_at.should be_nil
134
-        Agents::SomethingSource.async_check(@checker.id)
135
-        @checker.reload.last_check_at.should be_within(2).of(Time.now)
136
-        @checker.reload.options[:new].should be_true # Show that we save options
139
+        checker.last_check_at.should be_nil
140
+        Agents::SomethingSource.async_check(checker.id)
141
+        checker.reload.last_check_at.should be_within(2).of(Time.now)
142
+        checker.reload.options[:new].should be_true # Show that we save options
137 143
       end
138 144
     end
139 145
 
@@ -149,7 +155,7 @@ describe Agent do
149 155
         Agent.receive!
150 156
       end
151 157
 
152
-      it "should track when events have been seen and not see them again" do
158
+      it "should track when events have been seen and not received them again" do
153 159
         mock.any_instance_of(Agents::TriggerAgent).receive(anything).once
154 160
         Agent.async_check(agents(:bob_weather_agent).id)
155 161
         Agent.receive!
@@ -171,30 +177,27 @@ describe Agent do
171 177
       end
172 178
     end
173 179
 
174
-    describe "creating a new agent and then .receive!" do
175
-      before do
176
-        stub_request(:any, /wunderground/).to_return(:body => File.read(Rails.root.join("spec/data_fixtures/weather.json")), :status => 200)
177
-        stub.any_instance_of(Agents::WeatherAgent).is_tomorrow?(anything) { true }
178
-      end
179
-
180
+    describe "creating a new agent and then calling .receive!" do
180 181
       it "should not backfill events for a newly created agent" do
181
-        Agent.async_check(agents(:bob_weather_agent).id)
182
+        Event.delete_all
183
+        sender = Agents::SomethingSource.new(:name => "Sending Agent")
184
+        sender.user = users(:bob)
185
+        sender.save!
186
+        sender.create_event :payload => {}
187
+        sender.create_event :payload => {}
188
+        sender.events.count.should == 2
189
+
190
+        receiver = Agents::CannotBeScheduled.new(:name => "Receiving Agent")
191
+        receiver.user = users(:bob)
192
+        receiver.sources << sender
193
+        receiver.save!
194
+
195
+        receiver.events.count.should == 0
182 196
         Agent.receive!
183
-        checker = Agents::TriggerAgent.new(:name => "New trigger agent", :options => {
184
-          :expected_receive_period_in_days => "2",
185
-          :rules => [{
186
-            :type => "regex",
187
-            :value => "rain",
188
-            :path => "conditions"
189
-          }],
190
-          :message => "Just so you know, it looks like '<conditions>' tomorrow in <zipcode>"
191
-        })
192
-        checker.user = users(:bob)
193
-        checker.sources << agents(:bob_weather_agent)
194
-        checker.save!
195
-        checker.sources.first.events.count.should be > 0
197
+        receiver.events.count.should == 0
198
+        sender.create_event :payload => {}
196 199
         Agent.receive!
197
-        checker.events.count.should eq(0)
200
+        receiver.events.count.should == 1
198 201
       end
199 202
     end
200 203