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