delayed_job 3.0.3 → 3.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- h1. Delayed::Job "!http://travis-ci.org/collectiveidea/delayed_job.png!":http://travis-ci.org/collectiveidea/delayed_job "!https://gemnasium.com/collectiveidea/delayed_job.png?travis!":https://gemnasium.com/collectiveidea/delayed_job
1
+ h1. Delayed::Job "!https://travis-ci.org/collectiveidea/delayed_job.png!":http://travis-ci.org/collectiveidea/delayed_job "!https://gemnasium.com/collectiveidea/delayed_job.png?travis!":https://gemnasium.com/collectiveidea/delayed_job
2
2
 
3
3
  Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background.
4
4
 
@@ -275,18 +275,3 @@ You can invoke @rake jobs:clear@ to delete all jobs in the queue.
275
275
  h2. Mailing List
276
276
 
277
277
  Join us on the "mailing list":http://groups.google.com/group/delayed_job
278
-
279
- h2. How to contribute
280
-
281
- If you find what looks like a bug:
282
-
283
- # Search the "mailing list":http://groups.google.com/group/delayed_job to see if anyone else had the same issue.
284
- # Check the "GitHub issue tracker":http://github.com/collectiveidea/delayed_job/issues/ to see if anyone else has reported issue.
285
- # If you don't see anything, create an issue with information on how to reproduce it.
286
-
287
- If you want to contribute an enhancement or a fix:
288
-
289
- # Fork the project on github.
290
- # Make your changes with tests.
291
- # Commit the changes without making changes to the Rakefile or any other files that aren't related to your enhancement or fix
292
- # Send a pull request.
@@ -3,21 +3,32 @@
3
3
  # To use:
4
4
  # 1. copy to /var/www/apps/{app_name}/shared/delayed_job.monitrc
5
5
  # 2. replace {app_name} as appropriate
6
+ # you might also need to change the program strings to
7
+ # "/bin/su - {username} -c '/usr/bin/env ...'"
8
+ # to load your shell environment.
9
+ #
6
10
  # 3. add this to your /etc/monit/monitrc
7
11
  #
8
12
  # include /var/www/apps/{app_name}/shared/delayed_job.monitrc
13
+ #
14
+ # The processes are grouped so that monit can act on them as a whole, e.g.
15
+ #
16
+ # monit -g delayed_job restart
9
17
 
10
18
  check process delayed_job_0
11
19
  with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.0.pid
12
20
  start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start -i 0"
13
21
  stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop -i 0"
22
+ group delayed_job
14
23
 
15
24
  check process delayed_job_1
16
25
  with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.1.pid
17
26
  start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start -i 1"
18
27
  stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop -i 1"
28
+ group delayed_job
19
29
 
20
30
  check process delayed_job_2
21
31
  with pidfile /var/www/apps/{app_name}/shared/pids/delayed_job.2.pid
22
32
  start program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job start -i 2"
23
33
  stop program = "/usr/bin/env RAILS_ENV=production /var/www/apps/{app_name}/current/script/delayed_job stop -i 2"
34
+ group delayed_job
@@ -9,7 +9,8 @@ module Delayed
9
9
  # Add a job to the queue
10
10
  def enqueue(*args)
11
11
  options = {
12
- :priority => Delayed::Worker.default_priority
12
+ :priority => Delayed::Worker.default_priority,
13
+ :queue => Delayed::Worker.default_queue_name
13
14
  }.merge!(args.extract_options!)
14
15
 
15
16
  options[:payload_object] ||= args.shift
@@ -2,7 +2,7 @@ require File.expand_path('../../../../spec/sample_jobs', __FILE__)
2
2
 
3
3
  require 'active_support/core_ext'
4
4
 
5
- shared_examples_for 'a delayed_job backend' do
5
+ shared_examples_for "a delayed_job backend" do
6
6
  let(:worker) { Delayed::Worker.new }
7
7
 
8
8
  def create_job(opts = {})
@@ -18,85 +18,85 @@ shared_examples_for 'a delayed_job backend' do
18
18
  described_class.delete_all
19
19
  end
20
20
 
21
- it "should set run_at automatically if not set" do
22
- described_class.create(:payload_object => ErrorJob.new ).run_at.should_not be_nil
21
+ it "sets run_at automatically if not set" do
22
+ expect(described_class.create(:payload_object => ErrorJob.new ).run_at).not_to be_nil
23
23
  end
24
24
 
25
- it "should not set run_at automatically if already set" do
25
+ it "does not set run_at automatically if already set" do
26
26
  later = described_class.db_time_now + 5.minutes
27
27
  job = described_class.create(:payload_object => ErrorJob.new, :run_at => later)
28
- job.run_at.should be_within(1).of(later)
28
+ expect(job.run_at).to be_within(1).of(later)
29
29
  end
30
30
 
31
31
  describe "#reload" do
32
- it 'should cause the payload to be reloaded' do
32
+ it "reloads the payload" do
33
33
  job = described_class.enqueue :payload_object => SimpleJob.new
34
- job.payload_object.object_id.should_not == job.reload.payload_object.object_id
34
+ expect(job.payload_object.object_id).not_to eq(job.reload.payload_object.object_id)
35
35
  end
36
36
  end
37
37
 
38
38
  describe "enqueue" do
39
39
  context "with a hash" do
40
- it "should raise ArgumentError when handler doesn't respond_to :perform" do
41
- lambda { described_class.enqueue(:payload_object => Object.new) }.should raise_error(ArgumentError)
40
+ it "raises ArgumentError when handler doesn't respond_to :perform" do
41
+ expect{described_class.enqueue(:payload_object => Object.new)}.to raise_error(ArgumentError)
42
42
  end
43
43
 
44
- it "should be able to set priority" do
44
+ it "is able to set priority" do
45
45
  job = described_class.enqueue :payload_object => SimpleJob.new, :priority => 5
46
- job.priority.should == 5
46
+ expect(job.priority).to eq(5)
47
47
  end
48
48
 
49
- it "should use default priority" do
49
+ it "uses default priority" do
50
50
  job = described_class.enqueue :payload_object => SimpleJob.new
51
- job.priority.should == 99
51
+ expect(job.priority).to eq(99)
52
52
  end
53
53
 
54
- it "should be able to set run_at" do
54
+ it "is able to set run_at" do
55
55
  later = described_class.db_time_now + 5.minutes
56
56
  job = described_class.enqueue :payload_object => SimpleJob.new, :run_at => later
57
- job.run_at.should be_within(1).of(later)
57
+ expect(job.run_at).to be_within(1).of(later)
58
58
  end
59
59
 
60
- it "should be able to set queue" do
60
+ it "is able to set queue" do
61
61
  job = described_class.enqueue :payload_object => SimpleJob.new, :queue => 'tracking'
62
- job.queue.should == 'tracking'
62
+ expect(job.queue).to eq('tracking')
63
63
  end
64
64
  end
65
65
 
66
66
  context "with multiple arguments" do
67
- it "should raise ArgumentError when handler doesn't respond_to :perform" do
68
- lambda { described_class.enqueue(Object.new) }.should raise_error(ArgumentError)
67
+ it "raises ArgumentError when handler doesn't respond_to :perform" do
68
+ expect{described_class.enqueue(Object.new)}.to raise_error(ArgumentError)
69
69
  end
70
70
 
71
- it "should increase count after enqueuing items" do
71
+ it "increases count after enqueuing items" do
72
72
  described_class.enqueue SimpleJob.new
73
- described_class.count.should == 1
73
+ expect(described_class.count).to eq(1)
74
74
  end
75
75
 
76
- it "should be able to set priority [DEPRECATED]" do
76
+ it "is able to set priority [DEPRECATED]" do
77
77
  silence_warnings do
78
78
  job = described_class.enqueue SimpleJob.new, 5
79
- job.priority.should == 5
79
+ expect(job.priority).to eq(5)
80
80
  end
81
81
  end
82
82
 
83
- it "should use default priority when it is not set" do
83
+ it "uses default priority when it is not set" do
84
84
  @job = described_class.enqueue SimpleJob.new
85
- @job.priority.should == 99
85
+ expect(@job.priority).to eq(99)
86
86
  end
87
87
 
88
- it "should be able to set run_at [DEPRECATED]" do
88
+ it "is able to set run_at [DEPRECATED]" do
89
89
  silence_warnings do
90
90
  later = described_class.db_time_now + 5.minutes
91
91
  @job = described_class.enqueue SimpleJob.new, 5, later
92
- @job.run_at.should be_within(1).of(later)
92
+ expect(@job.run_at).to be_within(1).of(later)
93
93
  end
94
94
  end
95
95
 
96
- it "should work with jobs in modules" do
96
+ it "works with jobs in modules" do
97
97
  M::ModuleJob.runs = 0
98
98
  job = described_class.enqueue M::ModuleJob.new
99
- lambda { job.invoke_job }.should change { M::ModuleJob.runs }.from(0).to(1)
99
+ expect{job.invoke_job}.to change { M::ModuleJob.runs }.from(0).to(1)
100
100
  end
101
101
  end
102
102
 
@@ -105,19 +105,19 @@ shared_examples_for 'a delayed_job backend' do
105
105
  Delayed::Worker.delay_jobs = false
106
106
  end
107
107
 
108
- it "should not increase count after enqueuing items" do
108
+ it "does not increase count after enqueuing items" do
109
109
  described_class.enqueue SimpleJob.new
110
- described_class.count.should == 0
110
+ expect(described_class.count).to eq(0)
111
111
  end
112
112
 
113
- it 'should invoke the enqueued job' do
113
+ it "invokes the enqueued job" do
114
114
  job = SimpleJob.new
115
115
  job.should_receive(:perform)
116
116
  described_class.enqueue job
117
117
  end
118
118
 
119
- it 'should return a job, not the result of invocation' do
120
- described_class.enqueue(SimpleJob.new).should be_instance_of(described_class)
119
+ it "returns a job, not the result of invocation" do
120
+ expect(described_class.enqueue(SimpleJob.new)).to be_instance_of(described_class)
121
121
  end
122
122
  end
123
123
  end
@@ -128,51 +128,51 @@ shared_examples_for 'a delayed_job backend' do
128
128
  end
129
129
 
130
130
  %w(before success after).each do |callback|
131
- it "should call #{callback} with job" do
131
+ it "calls #{callback} with job" do
132
132
  job = described_class.enqueue(CallbackJob.new)
133
133
  job.payload_object.should_receive(callback).with(job)
134
134
  job.invoke_job
135
135
  end
136
136
  end
137
137
 
138
- it "should call before and after callbacks" do
138
+ it "calls before and after callbacks" do
139
139
  job = described_class.enqueue(CallbackJob.new)
140
- CallbackJob.messages.should == ["enqueue"]
140
+ expect(CallbackJob.messages).to eq(["enqueue"])
141
141
  job.invoke_job
142
- CallbackJob.messages.should == ["enqueue", "before", "perform", "success", "after"]
142
+ expect(CallbackJob.messages).to eq(["enqueue", "before", "perform", "success", "after"])
143
143
  end
144
144
 
145
- it "should call the after callback with an error" do
145
+ it "calls the after callback with an error" do
146
146
  job = described_class.enqueue(CallbackJob.new)
147
147
  job.payload_object.should_receive(:perform).and_raise(RuntimeError.new("fail"))
148
148
 
149
- lambda { job.invoke_job }.should raise_error
150
- CallbackJob.messages.should == ["enqueue", "before", "error: RuntimeError", "after"]
149
+ expect{job.invoke_job}.to raise_error
150
+ expect(CallbackJob.messages).to eq(["enqueue", "before", "error: RuntimeError", "after"])
151
151
  end
152
152
 
153
- it "should call error when before raises an error" do
153
+ it "calls error when before raises an error" do
154
154
  job = described_class.enqueue(CallbackJob.new)
155
155
  job.payload_object.should_receive(:before).and_raise(RuntimeError.new("fail"))
156
- lambda { job.invoke_job }.should raise_error(RuntimeError)
157
- CallbackJob.messages.should == ["enqueue", "error: RuntimeError", "after"]
156
+ expect{job.invoke_job}.to raise_error(RuntimeError)
157
+ expect(CallbackJob.messages).to eq(["enqueue", "error: RuntimeError", "after"])
158
158
  end
159
159
  end
160
160
 
161
161
  describe "payload_object" do
162
- it "should raise a DeserializationError when the job class is totally unknown" do
162
+ it "raises a DeserializationError when the job class is totally unknown" do
163
163
  job = described_class.new :handler => "--- !ruby/object:JobThatDoesNotExist {}"
164
- lambda { job.payload_object }.should raise_error(Delayed::DeserializationError)
164
+ expect{job.payload_object}.to raise_error(Delayed::DeserializationError)
165
165
  end
166
166
 
167
- it "should raise a DeserializationError when the job struct is totally unknown" do
167
+ it "raises a DeserializationError when the job struct is totally unknown" do
168
168
  job = described_class.new :handler => "--- !ruby/struct:StructThatDoesNotExist {}"
169
- lambda { job.payload_object }.should raise_error(Delayed::DeserializationError)
169
+ expect{job.payload_object}.to raise_error(Delayed::DeserializationError)
170
170
  end
171
171
 
172
- it "should raise a DeserializationError when the YAML.load raises argument error" do
172
+ it "raises a DeserializationError when the YAML.load raises argument error" do
173
173
  job = described_class.new :handler => "--- !ruby/struct:GoingToRaiseArgError {}"
174
174
  YAML.should_receive(:load).and_raise(ArgumentError)
175
- lambda { job.payload_object }.should raise_error(Delayed::DeserializationError)
175
+ expect{job.payload_object}.to raise_error(Delayed::DeserializationError)
176
176
  end
177
177
  end
178
178
 
@@ -181,70 +181,70 @@ shared_examples_for 'a delayed_job backend' do
181
181
  Delayed::Worker.max_run_time = 2.minutes
182
182
  end
183
183
 
184
- it "should not reserve failed jobs" do
184
+ it "does not reserve failed jobs" do
185
185
  create_job :attempts => 50, :failed_at => described_class.db_time_now
186
- described_class.reserve(worker).should be_nil
186
+ expect(described_class.reserve(worker)).to be_nil
187
187
  end
188
188
 
189
- it "should not reserve jobs scheduled for the future" do
189
+ it "does not reserve jobs scheduled for the future" do
190
190
  create_job :run_at => described_class.db_time_now + 1.minute
191
- described_class.reserve(worker).should be_nil
191
+ expect(described_class.reserve(worker)).to be_nil
192
192
  end
193
193
 
194
- it "should reserve jobs scheduled for the past" do
194
+ it "reserves jobs scheduled for the past" do
195
195
  job = create_job :run_at => described_class.db_time_now - 1.minute
196
- described_class.reserve(worker).should == job
196
+ expect(described_class.reserve(worker)).to eq(job)
197
197
  end
198
198
 
199
- it "should reserve jobs scheduled for the past when time zones are involved" do
199
+ it "reserves jobs scheduled for the past when time zones are involved" do
200
200
  Time.zone = 'US/Eastern'
201
201
  job = create_job :run_at => described_class.db_time_now - 1.minute
202
- described_class.reserve(worker).should == job
202
+ expect(described_class.reserve(worker)).to eq(job)
203
203
  end
204
204
 
205
- it "should not reserve jobs locked by other workers" do
205
+ it "does not reserve jobs locked by other workers" do
206
206
  job = create_job
207
207
  other_worker = Delayed::Worker.new
208
208
  other_worker.name = 'other_worker'
209
- described_class.reserve(other_worker).should == job
210
- described_class.reserve(worker).should be_nil
209
+ expect(described_class.reserve(other_worker)).to eq(job)
210
+ expect(described_class.reserve(worker)).to be_nil
211
211
  end
212
212
 
213
- it "should reserve open jobs" do
213
+ it "reserves open jobs" do
214
214
  job = create_job
215
- described_class.reserve(worker).should == job
215
+ expect(described_class.reserve(worker)).to eq(job)
216
216
  end
217
217
 
218
- it "should reserve expired jobs" do
218
+ it "reserves expired jobs" do
219
219
  job = create_job(:locked_by => 'some other worker', :locked_at => described_class.db_time_now - Delayed::Worker.max_run_time - 1.minute)
220
- described_class.reserve(worker).should == job
220
+ expect(described_class.reserve(worker)).to eq(job)
221
221
  end
222
222
 
223
- it "should reserve own jobs" do
223
+ it "reserves own jobs" do
224
224
  job = create_job(:locked_by => worker.name, :locked_at => (described_class.db_time_now - 1.minutes))
225
- described_class.reserve(worker).should == job
225
+ expect(described_class.reserve(worker)).to eq(job)
226
226
  end
227
227
  end
228
228
 
229
229
  context "#name" do
230
- it "should be the class name of the job that was enqueued" do
231
- described_class.create(:payload_object => ErrorJob.new ).name.should == 'ErrorJob'
230
+ it "is the class name of the job that was enqueued" do
231
+ expect(described_class.create(:payload_object => ErrorJob.new ).name).to eq('ErrorJob')
232
232
  end
233
233
 
234
- it "should be the method that will be called if its a performable method object" do
234
+ it "is the method that will be called if its a performable method object" do
235
235
  job = described_class.new(:payload_object => NamedJob.new)
236
- job.name.should == 'named_job'
236
+ expect(job.name).to eq('named_job')
237
237
  end
238
238
 
239
- it "should be the instance method that will be called if its a performable method object" do
239
+ it "is the instance method that will be called if its a performable method object" do
240
240
  job = Story.create(:text => "...").delay.save
241
- job.name.should == 'Story#save'
241
+ expect(job.name).to eq('Story#save')
242
242
  end
243
243
 
244
- it "should parse from handler on deserialization error" do
244
+ it "parses from handler on deserialization error" do
245
245
  job = Story.create(:text => "...").delay.text
246
246
  job.payload_object.object.destroy
247
- job.reload.name.should == 'Delayed::PerformableMethod'
247
+ expect(job.reload.name).to eq('Delayed::PerformableMethod')
248
248
  end
249
249
  end
250
250
 
@@ -254,49 +254,28 @@ shared_examples_for 'a delayed_job backend' do
254
254
  Delayed::Worker.min_priority = nil
255
255
  end
256
256
 
257
- it "should fetch jobs ordered by priority" do
257
+ it "fetches jobs ordered by priority" do
258
258
  10.times { described_class.enqueue SimpleJob.new, :priority => rand(10) }
259
259
  jobs = []
260
260
  10.times { jobs << described_class.reserve(worker) }
261
- jobs.size.should == 10
261
+ expect(jobs.size).to eq(10)
262
262
  jobs.each_cons(2) do |a, b|
263
- a.priority.should <= b.priority
263
+ expect(a.priority).to be <= b.priority
264
264
  end
265
265
  end
266
266
 
267
- it "should only find jobs greater than or equal to min priority" do
267
+ it "only finds jobs greater than or equal to min priority" do
268
268
  min = 5
269
269
  Delayed::Worker.min_priority = min
270
270
  10.times {|i| described_class.enqueue SimpleJob.new, :priority => i }
271
- 5.times { described_class.reserve(worker).priority.should >= min }
271
+ 5.times { expect(described_class.reserve(worker).priority).to be >= min }
272
272
  end
273
273
 
274
- it "should only find jobs less than or equal to max priority" do
274
+ it "only finds jobs less than or equal to max priority" do
275
275
  max = 5
276
276
  Delayed::Worker.max_priority = max
277
277
  10.times {|i| described_class.enqueue SimpleJob.new, :priority => i }
278
- 5.times { described_class.reserve(worker).priority.should <= max }
279
- end
280
- end
281
-
282
- context "worker read-ahead" do
283
- before do
284
- @read_ahead = Delayed::Worker.read_ahead
285
- end
286
-
287
- after do
288
- Delayed::Worker.read_ahead = @read_ahead
289
- end
290
-
291
- it "should read five jobs" do
292
- described_class.should_receive(:find_available).with(anything, 5, anything).and_return([])
293
- described_class.reserve(worker)
294
- end
295
-
296
- it "should read a configurable number of jobs" do
297
- Delayed::Worker.read_ahead = 15
298
- described_class.should_receive(:find_available).with(anything, Delayed::Worker.read_ahead, anything).and_return([])
299
- described_class.reserve(worker)
278
+ 5.times { expect(described_class.reserve(worker).priority).to be <= max }
300
279
  end
301
280
  end
302
281
 
@@ -305,14 +284,14 @@ shared_examples_for 'a delayed_job backend' do
305
284
  @job = create_job(:locked_by => 'worker1', :locked_at => described_class.db_time_now)
306
285
  end
307
286
 
308
- it "should clear locks for the given worker" do
287
+ it "clears locks for the given worker" do
309
288
  described_class.clear_locks!('worker1')
310
- described_class.reserve(worker).should == @job
289
+ expect(described_class.reserve(worker)).to eq(@job)
311
290
  end
312
291
 
313
- it "should not clear locks for other workers" do
292
+ it "does not clear locks for other workers" do
314
293
  described_class.clear_locks!('different_worker')
315
- described_class.reserve(worker).should_not == @job
294
+ expect(described_class.reserve(worker)).not_to eq(@job)
316
295
  end
317
296
  end
318
297
 
@@ -321,10 +300,10 @@ shared_examples_for 'a delayed_job backend' do
321
300
  @job = create_job(:locked_by => 'worker', :locked_at => described_class.db_time_now)
322
301
  end
323
302
 
324
- it "should clear locks" do
303
+ it "clears locks" do
325
304
  @job.unlock
326
- @job.locked_by.should be_nil
327
- @job.locked_at.should be_nil
305
+ expect(@job.locked_by).to be_nil
306
+ expect(@job.locked_at).to be_nil
328
307
  end
329
308
  end
330
309
 
@@ -334,8 +313,8 @@ shared_examples_for 'a delayed_job backend' do
334
313
  @job = described_class.enqueue Delayed::PerformableMethod.new(text, :length, {})
335
314
  end
336
315
 
337
- it "should have an id" do
338
- @job.id.should_not be_nil
316
+ it "has an id" do
317
+ expect(@job.id).not_to be_nil
339
318
  end
340
319
  end
341
320
 
@@ -345,14 +324,14 @@ shared_examples_for 'a delayed_job backend' do
345
324
  worker.queues = ['large']
346
325
  end
347
326
 
348
- it "should only work off jobs which are from its queue" do
349
- SimpleJob.runs.should == 0
327
+ it "only works off jobs which are from its queue" do
328
+ expect(SimpleJob.runs).to eq(0)
350
329
 
351
330
  create_job(:queue => "large")
352
331
  create_job(:queue => "small")
353
332
  worker.work_off
354
333
 
355
- SimpleJob.runs.should == 1
334
+ expect(SimpleJob.runs).to eq(1)
356
335
  end
357
336
  end
358
337
 
@@ -361,8 +340,8 @@ shared_examples_for 'a delayed_job backend' do
361
340
  worker.queues = ['large', 'small']
362
341
  end
363
342
 
364
- it "should only work off jobs which are from its queue" do
365
- SimpleJob.runs.should == 0
343
+ it "only works off jobs which are from its queue" do
344
+ expect(SimpleJob.runs).to eq(0)
366
345
 
367
346
  create_job(:queue => "large")
368
347
  create_job(:queue => "small")
@@ -370,7 +349,7 @@ shared_examples_for 'a delayed_job backend' do
370
349
  create_job
371
350
  worker.work_off
372
351
 
373
- SimpleJob.runs.should == 2
352
+ expect(SimpleJob.runs).to eq(2)
374
353
  end
375
354
  end
376
355
 
@@ -379,15 +358,15 @@ shared_examples_for 'a delayed_job backend' do
379
358
  worker.queues = []
380
359
  end
381
360
 
382
- it "should work off all jobs" do
383
- SimpleJob.runs.should == 0
361
+ it "works off all jobs" do
362
+ expect(SimpleJob.runs).to eq(0)
384
363
 
385
364
  create_job(:queue => "one")
386
365
  create_job(:queue => "two")
387
366
  create_job
388
367
  worker.work_off
389
368
 
390
- SimpleJob.runs.should == 3
369
+ expect(SimpleJob.runs).to eq(3)
391
370
  end
392
371
  end
393
372
  end
@@ -397,39 +376,40 @@ shared_examples_for 'a delayed_job backend' do
397
376
  @job = described_class.enqueue SimpleJob.new
398
377
  end
399
378
 
400
- it 'should not be defined' do
401
- @job.max_attempts.should be_nil
379
+ it "is not defined" do
380
+ expect(@job.max_attempts).to be_nil
402
381
  end
403
382
 
404
- it 'should use the max_retries value on the payload when defined' do
383
+ it "uses the max_retries value on the payload when defined" do
405
384
  @job.payload_object.stub!(:max_attempts).and_return(99)
406
- @job.max_attempts.should == 99
385
+ expect(@job.max_attempts).to eq(99)
407
386
  end
408
387
  end
409
388
 
410
389
  describe "yaml serialization" do
411
- it "should reload changed attributes" do
390
+ it "reloads changed attributes" do
412
391
  story = Story.create(:text => 'hello')
413
392
  job = story.delay.tell
414
393
  story.update_attributes :text => 'goodbye'
415
- job.reload.payload_object.object.text.should == 'goodbye'
394
+ expect(job.reload.payload_object.object.text).to eq('goodbye')
416
395
  end
417
396
 
418
- it "should raise error ArgumentError the record is not persisted" do
397
+ it "raises error ArgumentError the record is not persisted" do
419
398
  story = Story.new(:text => 'hello')
420
- lambda {
421
- story.delay.tell
422
- }.should raise_error(ArgumentError, "Jobs cannot be created for records before they've been persisted")
423
-
399
+ if story.respond_to?(:new_record?)
400
+ expect {
401
+ story.delay.tell
402
+ }.to raise_error(ArgumentError, "Jobs cannot be created for records before they've been persisted")
403
+ end
424
404
  end
425
405
 
426
- it "should raise deserialization error for destroyed records" do
406
+ it "raises deserialization error for destroyed records" do
427
407
  story = Story.create(:text => 'hello')
428
408
  job = story.delay.tell
429
409
  story.destroy
430
- lambda {
410
+ expect {
431
411
  job.reload.payload_object
432
- }.should raise_error(Delayed::DeserializationError)
412
+ }.to raise_error(Delayed::DeserializationError)
433
413
  end
434
414
  end
435
415
 
@@ -440,26 +420,26 @@ shared_examples_for 'a delayed_job backend' do
440
420
  end
441
421
 
442
422
  describe "running a job" do
443
- it "should fail after Worker.max_run_time" do
423
+ it "fails after Worker.max_run_time" do
444
424
  begin
445
425
  old_max_run_time = Delayed::Worker.max_run_time
446
426
  Delayed::Worker.max_run_time = 1.second
447
427
  job = Delayed::Job.create :payload_object => LongRunningJob.new
448
428
  worker.run(job)
449
- job.reload.last_error.should =~ /expired/
450
- job.attempts.should == 1
429
+ expect(job.reload.last_error).to match(/expired/)
430
+ expect(job.attempts).to eq(1)
451
431
  ensure
452
432
  Delayed::Worker.max_run_time = old_max_run_time
453
433
  end
454
434
  end
455
435
 
456
436
  context "when the job raises a deserialization error" do
457
- it "should mark the job as failed" do
437
+ it "marks the job as failed" do
458
438
  Delayed::Worker.destroy_failed_jobs = false
459
439
  job = described_class.create! :handler => "--- !ruby/object:JobThatDoesNotExist {}"
460
440
  worker.work_off
461
441
  job.reload
462
- job.should be_failed
442
+ expect(job).to be_failed
463
443
  end
464
444
  end
465
445
  end
@@ -473,41 +453,41 @@ shared_examples_for 'a delayed_job backend' do
473
453
  @job = Delayed::Job.enqueue(ErrorJob.new)
474
454
  end
475
455
 
476
- it "should record last_error when destroy_failed_jobs = false, max_attempts = 1" do
456
+ it "records last_error when destroy_failed_jobs = false, max_attempts = 1" do
477
457
  Delayed::Worker.destroy_failed_jobs = false
478
458
  Delayed::Worker.max_attempts = 1
479
459
  worker.run(@job)
480
460
  @job.reload
481
- @job.last_error.should =~ /did not work/
482
- @job.attempts.should == 1
483
- @job.should be_failed
461
+ expect(@job.last_error).to match(/did not work/)
462
+ expect(@job.attempts).to eq(1)
463
+ expect(@job).to be_failed
484
464
  end
485
465
 
486
- it "should re-schedule jobs after failing" do
466
+ it "re-schedules jobs after failing" do
487
467
  worker.work_off
488
468
  @job.reload
489
- @job.last_error.should =~ /did not work/
490
- @job.last_error.should =~ /sample_jobs.rb:\d+:in `perform'/
491
- @job.attempts.should == 1
492
- @job.run_at.should > Delayed::Job.db_time_now - 10.minutes
493
- @job.run_at.should < Delayed::Job.db_time_now + 10.minutes
494
- @job.locked_by.should be_nil
495
- @job.locked_at.should be_nil
469
+ expect(@job.last_error).to match(/did not work/)
470
+ expect(@job.last_error).to match(/sample_jobs.rb:\d+:in `perform'/)
471
+ expect(@job.attempts).to eq(1)
472
+ expect(@job.run_at).to be > Delayed::Job.db_time_now - 10.minutes
473
+ expect(@job.run_at).to be < Delayed::Job.db_time_now + 10.minutes
474
+ expect(@job.locked_by).to be_nil
475
+ expect(@job.locked_at).to be_nil
496
476
  end
497
477
 
498
- it 'should re-schedule with handler provided time if present' do
478
+ it "re-schedules jobs with handler provided time if present" do
499
479
  job = Delayed::Job.enqueue(CustomRescheduleJob.new(99.minutes))
500
480
  worker.run(job)
501
481
  job.reload
502
482
 
503
- (Delayed::Job.db_time_now + 99.minutes - job.run_at).abs.should < 1
483
+ expect((Delayed::Job.db_time_now + 99.minutes - job.run_at).abs).to be < 1
504
484
  end
505
485
 
506
- it "should not fail when the triggered error doesn't have a message" do
486
+ it "does not fail when the triggered error doesn't have a message" do
507
487
  error_with_nil_message = StandardError.new
508
488
  error_with_nil_message.stub!(:message).and_return nil
509
489
  @job.stub!(:invoke_job).and_raise error_with_nil_message
510
- lambda{worker.run(@job)}.should_not raise_error
490
+ expect{worker.run(@job)}.not_to raise_error
511
491
  end
512
492
  end
513
493
 
@@ -520,10 +500,10 @@ shared_examples_for 'a delayed_job backend' do
520
500
  context "when the job's payload has a #failure hook" do
521
501
  before do
522
502
  @job = Delayed::Job.create :payload_object => OnPermanentFailureJob.new
523
- @job.payload_object.should respond_to :failure
503
+ expect(@job.payload_object).to respond_to :failure
524
504
  end
525
505
 
526
- it "should run that hook" do
506
+ it "runs that hook" do
527
507
  @job.payload_object.should_receive :failure
528
508
  worker.reschedule(@job)
529
509
  end
@@ -543,13 +523,13 @@ shared_examples_for 'a delayed_job backend' do
543
523
  # failure method).
544
524
 
545
525
  before do
546
- @job.payload_object.should_not respond_to(:failure)
526
+ expect(@job.payload_object).not_to respond_to(:failure)
547
527
  end
548
528
 
549
- it "should not try to run that hook" do
550
- lambda do
529
+ it "does not try to run that hook" do
530
+ expect {
551
531
  Delayed::Worker.max_attempts.times { worker.reschedule(@job) }
552
- end.should_not raise_exception(NoMethodError)
532
+ }.not_to raise_exception(NoMethodError)
553
533
  end
554
534
  end
555
535
  end
@@ -561,12 +541,12 @@ shared_examples_for 'a delayed_job backend' do
561
541
 
562
542
  it_should_behave_like "any failure more than Worker.max_attempts times"
563
543
 
564
- it "should be destroyed if it failed more than Worker.max_attempts times" do
544
+ it "is destroyed if it failed more than Worker.max_attempts times" do
565
545
  @job.should_receive(:destroy)
566
546
  Delayed::Worker.max_attempts.times { worker.reschedule(@job) }
567
547
  end
568
548
 
569
- it "should not be destroyed if failed fewer than Worker.max_attempts times" do
549
+ it "is not destroyed if failed fewer than Worker.max_attempts times" do
570
550
  @job.should_not_receive(:destroy)
571
551
  (Delayed::Worker.max_attempts - 1).times { worker.reschedule(@job) }
572
552
  end
@@ -579,15 +559,15 @@ shared_examples_for 'a delayed_job backend' do
579
559
 
580
560
  it_should_behave_like "any failure more than Worker.max_attempts times"
581
561
 
582
- it "should be failed if it failed more than Worker.max_attempts times" do
583
- @job.reload.should_not be_failed
562
+ it "is failed if it failed more than Worker.max_attempts times" do
563
+ expect(@job.reload).not_to be_failed
584
564
  Delayed::Worker.max_attempts.times { worker.reschedule(@job) }
585
- @job.reload.should be_failed
565
+ expect(@job.reload).to be_failed
586
566
  end
587
567
 
588
- it "should not be failed if it failed fewer than Worker.max_attempts times" do
568
+ it "is not failed if it failed fewer than Worker.max_attempts times" do
589
569
  (Delayed::Worker.max_attempts - 1).times { worker.reschedule(@job) }
590
- @job.reload.should_not be_failed
570
+ expect(@job.reload).not_to be_failed
591
571
  end
592
572
  end
593
573
  end