@@ -201,4 +201,68 @@ def recieve(msg)
201201 expect ( job . reload . state ) . to eql :passed
202202 end
203203 end
204+
205+ describe 'state update count' do
206+ let ( :job ) { FactoryGirl . create ( :job , state : :received ) }
207+ let ( :event ) { :start }
208+ let ( :data ) { { id : job . id , state : :started , meta : meta } }
209+
210+ before { ENV [ 'UPDATE_COUNT' ] = 'true' }
211+ after { ENV [ 'UPDATE_COUNT' ] = nil }
212+
213+ describe 'with no count stored' do
214+ describe 'given no meta' do
215+ let ( :meta ) { nil }
216+ before { subject . run }
217+
218+ it { expect ( job . reload . state ) . to eq :started }
219+ it { expect ( log ) . to include "W Received state update with no count for job id=#{ job . id } , last known count: 0" }
220+ end
221+
222+ describe 'given no count' do
223+ let ( :meta ) { { } }
224+ before { subject . run }
225+
226+ it { expect ( job . reload . state ) . to eq :started }
227+ it { expect ( log ) . to include "W Received state update with no count for job id=#{ job . id } , last known count: 0" }
228+ end
229+
230+ describe 'given a count' do
231+ let ( :meta ) { { state_update_count : 2 } }
232+ before { subject . run }
233+
234+ it { expect ( job . reload . state ) . to eq :started }
235+ it { expect ( log ) . to include "I Received state update 2 for job id=#{ job . id } , last known count: 0" }
236+ end
237+ end
238+
239+ describe 'with a count stored' do
240+ before { context . redis . set ( "job:state_update_count:#{ job . id } " , 3 ) }
241+
242+ describe 'given no meta it skips the message' do
243+ let ( :meta ) { nil }
244+ before { subject . run }
245+
246+ it { expect ( job . reload . state ) . to eq :started }
247+ it { expect ( log ) . to include "W Received state update with no count for job id=#{ job . id } , last known count: 3" }
248+ end
249+
250+ describe 'given no count it skips the message' do
251+ let ( :meta ) { { } }
252+ before { subject . run }
253+
254+ it { expect ( job . reload . state ) . to eq :started }
255+ it { expect ( log ) . to include "W Received state update with no count for job id=#{ job . id } , last known count: 3" }
256+ end
257+
258+ describe 'given a count it skips the message' do
259+ let ( :meta ) { { state_update_count : 2 } }
260+ before { subject . run }
261+
262+ it { expect ( job . reload . state ) . to eq :received }
263+ it { expect ( log ) . to include "W Received state update 2 for job id=#{ job . id } , last known count: 3. Skipping the message." }
264+ it { expect ( log ) . to include "W Skipped event job:start for <Job id=#{ job . id } > trying to update state from :received to :started" }
265+ end
266+ end
267+ end
204268end
0 commit comments