rocketjob 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,122 +5,24 @@ require_relative 'jobs/test_job'
5
5
  class DirmonJobTest < Minitest::Test
6
6
  context RocketJob::Jobs::DirmonJob do
7
7
  setup do
8
- @worker = RocketJob::Worker.new
9
- @worker.started
10
- @dirmon_job = RocketJob::Jobs::DirmonJob.new
8
+ @dirmon_job = RocketJob::Jobs::DirmonJob.new
9
+ @directory = '/tmp/directory'
11
10
  @archive_directory = '/tmp/archive_directory'
12
- @entry = RocketJob::DirmonEntry.new(
13
- path: 'abc/*',
14
- job_name: 'Jobs::TestJob',
15
- arguments: [ { input: 'yes' } ],
16
- properties: { priority: 23, perform_method: :event },
11
+ @entry = RocketJob::DirmonEntry.new(
12
+ pattern: "#{@directory}/abc/*",
13
+ job_class_name: 'Jobs::TestJob',
14
+ arguments: [{input: 'yes'}],
15
+ properties: {priority: 23, perform_method: :event},
17
16
  archive_directory: @archive_directory
18
17
  )
19
- @job = Jobs::TestJob.new
20
- @paths = {
21
- 'abc/*' => %w(abc/file1 abc/file2)
22
- }
18
+ FileUtils.makedirs("#{@directory}/abc")
19
+ FileUtils.makedirs(@archive_directory)
23
20
  end
24
21
 
25
22
  teardown do
26
23
  @dirmon_job.destroy if @dirmon_job && !@dirmon_job.new_record?
27
24
  FileUtils.remove_dir(@archive_directory, true) if Dir.exist?(@archive_directory)
28
- end
29
-
30
- context '#archive_file' do
31
- should 'archive absolute path file' do
32
- begin
33
- file = Tempfile.new('archive')
34
- file_name = file.path
35
- File.open(file_name, 'w') { |file| file.write('Hello World') }
36
- assert File.exists?(file_name)
37
- @dirmon_job.archive_file(file_name, @archive_directory)
38
- archive_file_name = File.join(@archive_directory, File.basename(file_name))
39
- assert File.exists?(archive_file_name), archive_file_name
40
- ensure
41
- file.delete if file
42
- end
43
- end
44
-
45
- should 'archive relative path file' do
46
- begin
47
- relative_path = 'tmp'
48
- FileUtils.mkdir_p(relative_path)
49
- file_name = File.join(relative_path, 'dirmon_job_test.txt')
50
- File.open(file_name, 'w') { |file| file.write('Hello World') }
51
- @dirmon_job.archive_file(file_name, @archive_directory)
52
- archive_file_name = File.join(@archive_directory, file_name)
53
- assert File.exists?(archive_file_name), archive_file_name
54
- ensure
55
- File.delete(file_name) if file_name && File.exists?(file_name)
56
- end
57
- end
58
- end
59
-
60
- context '#upload_default' do
61
- should 'upload default case with no archive_directory' do
62
- job = Jobs::TestJob.new
63
- file_name = 'abc/myfile.txt'
64
- archived_file_name = 'abc/_archive/myfile.txt'
65
- @dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [archived_file_name, 'abc/_archive'], [fn, tp] }) do
66
- @dirmon_job.upload_default(job, file_name, nil)
67
- end
68
- assert_equal File.absolute_path(archived_file_name), job.arguments.first[:full_file_name]
69
- end
70
-
71
- should 'upload default case with archive_directory' do
72
- job = Jobs::TestJob.new
73
- file_name = 'abc/myfile.txt'
74
- archived_file_name = "#{@archive_directory}/myfile.txt"
75
- @dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [archived_file_name, @archive_directory], [fn, tp] }) do
76
- @dirmon_job.upload_default(job, file_name, @archive_directory)
77
- end
78
- assert_equal File.absolute_path(archived_file_name), job.arguments.first[:full_file_name]
79
- end
80
- end
81
-
82
- context '#upload_file' do
83
- should 'upload using #file_store_upload' do
84
- job = Jobs::TestJob.new
85
- job.define_singleton_method(:file_store_upload) do |file_name|
86
- file_name
87
- end
88
- file_name = 'abc/myfile.txt'
89
- @dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [file_name, @archive_directory], [fn, tp] }) do
90
- @dirmon_job.upload_file(job, file_name, @archive_directory)
91
- end
92
- end
93
-
94
- should 'upload using #upload' do
95
- job = Jobs::TestJob.new
96
- job.define_singleton_method(:upload) do |file_name|
97
- file_name
98
- end
99
- file_name = 'abc/myfile.txt'
100
- @dirmon_job.stub(:archive_file, -> fn, tp { assert_equal [file_name, @archive_directory], [fn, tp] }) do
101
- @dirmon_job.upload_file(job, file_name, @archive_directory)
102
- end
103
- end
104
- end
105
-
106
- context '#start_job' do
107
- setup do
108
- RocketJob::Config.inline_mode = true
109
- end
110
-
111
- teardown do
112
- RocketJob::Config.inline_mode = false
113
- end
114
-
115
- should 'upload using #upload' do
116
- file_name = 'abc/myfile.txt'
117
- job = @dirmon_job.stub(:upload_file, -> j, fn, sp { assert_equal [file_name, @archive_directory], [fn, sp] }) do
118
- @dirmon_job.start_job(@entry, file_name)
119
- end
120
- assert_equal @entry.job_name, job.class.name
121
- assert_equal 23, job.priority
122
- assert_equal [ {:input=>"yes", "before_event"=>true, "event"=>true, "after_event"=>true} ], job.arguments
123
- end
25
+ FileUtils.remove_dir(@directory, true) if Dir.exist?(@directory)
124
26
  end
125
27
 
126
28
  context '#check_file' do
@@ -131,7 +33,9 @@ class DirmonJobTest < Minitest::Test
131
33
  file_name = file.path
132
34
  File.open(file_name, 'w') { |file| file.write('*' * new_size) }
133
35
  assert_equal new_size, File.size(file_name)
134
- result = @dirmon_job.check_file(@entry, file_name, previous_size)
36
+ result = @entry.stub(:later, nil) do
37
+ @dirmon_job.send(:check_file, @entry, file, previous_size)
38
+ end
135
39
  assert_equal new_size, result
136
40
  end
137
41
 
@@ -143,8 +47,8 @@ class DirmonJobTest < Minitest::Test
143
47
  File.open(file_name, 'w') { |file| file.write('*' * new_size) }
144
48
  assert_equal new_size, File.size(file_name)
145
49
  started = false
146
- result = @dirmon_job.stub(:start_job, -> e,fn { started = true } ) do
147
- @dirmon_job.check_file(@entry, file_name, previous_size)
50
+ result = @entry.stub(:later, -> fn { started = true }) do
51
+ @dirmon_job.send(:check_file, @entry, file, previous_size)
148
52
  end
149
53
  assert_equal nil, result
150
54
  assert started
@@ -152,15 +56,16 @@ class DirmonJobTest < Minitest::Test
152
56
 
153
57
  should 'check deleted file' do
154
58
  previous_size = 5
155
- file_name = 'blah'
156
- result = @dirmon_job.check_file(@entry, file_name, previous_size)
59
+ file_name = Pathname.new('blah')
60
+ result = @dirmon_job.send(:check_file, @entry, file_name, previous_size)
157
61
  assert_equal nil, result
158
62
  end
159
63
  end
160
64
 
161
65
  context '#check_directories' do
162
66
  setup do
163
- @entry.save!
67
+ RocketJob::DirmonEntry.destroy_all
68
+ @entry.enable!
164
69
  end
165
70
 
166
71
  teardown do
@@ -169,85 +74,80 @@ class DirmonJobTest < Minitest::Test
169
74
 
170
75
  should 'no files' do
171
76
  previous_file_names = {}
172
- result = nil
173
- Dir.stub(:[], -> dir { [] }) do
174
- result = @dirmon_job.check_directories(previous_file_names)
175
- end
77
+ result = @dirmon_job.send(:check_directories, previous_file_names)
176
78
  assert_equal 0, result.count
177
79
  end
178
80
 
179
- should 'new files' do
81
+ should 'collect new files without enqueuing them' do
82
+ create_file("#{@directory}/abc/file1", 5)
83
+ create_file("#{@directory}/abc/file2", 10)
84
+
180
85
  previous_file_names = {}
181
- result = nil
182
- Dir.stub(:[], -> dir { @paths[dir] }) do
183
- result = @dirmon_job.stub(:check_file, -> e, fn, ps { 5 } ) do
184
- @dirmon_job.check_directories(previous_file_names)
185
- end
186
- end
187
- assert_equal result.count, @paths['abc/*'].count
188
- result.each_pair do |k,v|
189
- assert_equal 5, v
190
- end
86
+ result = @dirmon_job.send(:check_directories, previous_file_names)
87
+ assert_equal 2, result.count, result.inspect
88
+ assert_equal 5, result.values.first, result.inspect
89
+ assert_equal 10, result.values.second, result.inspect
191
90
  end
192
91
 
193
92
  should 'allow files to grow' do
93
+ create_file("#{@directory}/abc/file1", 5)
94
+ create_file("#{@directory}/abc/file2", 10)
194
95
  previous_file_names = {}
195
- @paths['abc/*'].each { |file_name| previous_file_names[file_name] = 5}
196
- result = nil
197
- Dir.stub(:[], -> dir { @paths[dir] }) do
198
- result = @dirmon_job.stub(:check_file, -> e, fn, ps { 10 } ) do
199
- @dirmon_job.check_directories(previous_file_names)
200
- end
201
- end
202
- assert_equal result.count, @paths['abc/*'].count
203
- result.each_pair do |k,v|
204
- assert_equal 10, v
205
- end
96
+ @dirmon_job.send(:check_directories, previous_file_names)
97
+ create_file("#{@directory}/abc/file1", 10)
98
+ create_file("#{@directory}/abc/file2", 15)
99
+ result = @dirmon_job.send(:check_directories, previous_file_names)
100
+ assert_equal 2, result.count, result.inspect
101
+ assert_equal 10, result.values.first, result.inspect
102
+ assert_equal 15, result.values.second, result.inspect
206
103
  end
207
104
 
208
105
  should 'start all files' do
209
- previous_file_names = {}
210
- @paths['abc/*'].each { |file_name| previous_file_names[file_name] = 10 }
211
- result = nil
212
- Dir.stub(:[], -> dir { @paths[dir] }) do
213
- result = @dirmon_job.stub(:check_file, -> e, fn, ps { nil } ) do
214
- @dirmon_job.check_directories(previous_file_names)
215
- end
106
+ create_file("#{@directory}/abc/file1", 5)
107
+ create_file("#{@directory}/abc/file2", 10)
108
+ previous_file_names = @dirmon_job.send(:check_directories, {})
109
+
110
+ count = 0
111
+ result = RocketJob::DirmonEntry.stub_any_instance(:later, -> path { count += 1 }) do
112
+ @dirmon_job.send(:check_directories, previous_file_names)
216
113
  end
217
- assert_equal 0, result.count
114
+ assert 2, count
115
+ assert_equal 0, result.count, result.inspect
218
116
  end
219
117
 
220
118
  should 'skip files in archive directory' do
221
- previous_file_names = {}
222
- @paths['abc/*'].each { |file_name| previous_file_names[file_name] = 5}
223
- result = nil
224
- # Add a file in the archive directory
225
- @paths['abc/*'] << File.join('abc', RocketJob::Jobs::DirmonJob::DEFAULT_ARCHIVE_DIR, 'test.zip')
226
- Dir.stub(:[], -> dir { @paths[dir] }) do
227
- result = @dirmon_job.stub(:check_file, -> e, fn, ps { 10 } ) do
228
- @dirmon_job.check_directories(previous_file_names)
229
- end
230
- end
231
- assert_equal result.count, @paths['abc/*'].count - 1
232
- result.each_pair do |k,v|
233
- assert_equal 10, v
234
- end
119
+ @entry.archive_directory = nil
120
+ @entry.pattern = "#{@directory}/abc/**/*"
121
+
122
+ create_file("#{@directory}/abc/file1", 5)
123
+ create_file("#{@directory}/abc/file2", 10)
124
+ FileUtils.makedirs("#{@directory}/abc/#{@entry.archive_pathname}")
125
+ create_file("#{@directory}/abc/#{@entry.archive_pathname}/file3", 10)
126
+
127
+ result = @dirmon_job.send(:check_directories, {})
128
+
129
+ assert_equal 2, result.count, result.inspect
130
+ assert_equal 5, result.values.first, result.inspect
131
+ assert_equal 10, result.values.second, result.inspect
235
132
  end
236
133
  end
237
134
 
238
-
239
135
  context '#perform' do
240
136
  should 'check directories and reschedule' do
241
- dirmon_job = nil
242
- previous_file_names = {}
243
- @paths['abc/*'].each { |file_name| previous_file_names[file_name] = 5 }
244
- new_file_names = {}
245
- @paths['abc/*'].each { |file_name| new_file_names[file_name] = 10 }
137
+ dirmon_job = nil
138
+ previous_file_names = {
139
+ "#{@directory}/abc/file1" => 5,
140
+ "#{@directory}/abc/file2" => 10,
141
+ }
142
+ new_file_names = {
143
+ "#{@directory}/abc/file1" => 10,
144
+ "#{@directory}/abc/file2" => 10,
145
+ }
246
146
  RocketJob::Jobs::DirmonJob.destroy_all
247
147
  RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, new_file_names) do
248
148
  # perform_now does not save the job, just runs it
249
149
  dirmon_job = RocketJob::Jobs::DirmonJob.perform_now(previous_file_names) do |job|
250
- job.priority = 11
150
+ job.priority = 11
251
151
  job.check_seconds = 30
252
152
  end
253
153
  end
@@ -265,29 +165,32 @@ class DirmonJobTest < Minitest::Test
265
165
  new_dirmon_job.destroy
266
166
  end
267
167
 
268
- should 'check directories and reschedule even on exception' do
269
- dirmon_job = nil
270
- RocketJob::Jobs::DirmonJob.destroy_all
271
- RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, -> previous { raise RuntimeError.new("Oh no") }) do
272
- # perform_now does not save the job, just runs it
273
- dirmon_job = RocketJob::Jobs::DirmonJob.perform_now do |job|
274
- job.priority = 11
275
- job.check_seconds = 30
168
+ should 'check directories and reschedule even on exception' do
169
+ dirmon_job = nil
170
+ RocketJob::Jobs::DirmonJob.destroy_all
171
+ RocketJob::Jobs::DirmonJob.stub_any_instance(:check_directories, -> previous { raise RuntimeError.new("Oh no") }) do
172
+ # perform_now does not save the job, just runs it
173
+ dirmon_job = RocketJob::Jobs::DirmonJob.perform_now do |job|
174
+ job.priority = 11
175
+ job.check_seconds = 30
176
+ end
276
177
  end
277
- end
278
- assert dirmon_job.failed?, dirmon_job.status.inspect
178
+ assert dirmon_job.failed?, dirmon_job.status.inspect
279
179
 
280
- # It should have enqueued another instance to run in the future
281
- assert_equal 2, RocketJob::Jobs::DirmonJob.count
282
- assert new_dirmon_job = RocketJob::Jobs::DirmonJob.last
283
- assert new_dirmon_job.run_at
284
- assert_equal 11, new_dirmon_job.priority
285
- assert_equal 30, new_dirmon_job.check_seconds
286
- assert new_dirmon_job.queued?
180
+ # It should have enqueued another instance to run in the future
181
+ assert_equal 2, RocketJob::Jobs::DirmonJob.count
182
+ assert new_dirmon_job = RocketJob::Jobs::DirmonJob.last
183
+ assert new_dirmon_job.run_at
184
+ assert_equal 11, new_dirmon_job.priority
185
+ assert_equal 30, new_dirmon_job.check_seconds
186
+ assert new_dirmon_job.queued?
287
187
 
288
- new_dirmon_job.destroy
289
- end
188
+ new_dirmon_job.destroy
189
+ end
290
190
  end
191
+ end
291
192
 
193
+ def create_file(file_name, size)
194
+ File.open(file_name, 'w') { |file| file.write('*' * size) }
292
195
  end
293
196
  end
data/test/job_test.rb CHANGED
@@ -8,16 +8,22 @@ class JobTest < Minitest::Test
8
8
  @worker = RocketJob::Worker.new
9
9
  @worker.started
10
10
  @description = 'Hello World'
11
- @arguments = [ 1 ]
12
- @job = Jobs::TestJob.new(
11
+ @arguments = [1]
12
+ @job = Jobs::TestJob.new(
13
13
  description: @description,
14
14
  arguments: @arguments,
15
15
  destroy_on_complete: false
16
16
  )
17
+ @job2 = Jobs::TestJob.new(
18
+ description: "#{@description} 2",
19
+ arguments: @arguments,
20
+ destroy_on_complete: false
21
+ )
17
22
  end
18
23
 
19
24
  teardown do
20
25
  @job.destroy if @job && !@job.new_record?
26
+ @job2.destroy if @job2 && !@job2.new_record?
21
27
  end
22
28
 
23
29
  context '.config' do
@@ -30,34 +36,38 @@ class JobTest < Minitest::Test
30
36
  should 'handle hash' do
31
37
  @job = Jobs::TestJob.new(
32
38
  description: @description,
33
- arguments: [ { key: 'value' } ],
34
- destroy_on_complete: false
39
+ arguments: [{key: 'value'}],
40
+ destroy_on_complete: false,
41
+ worker_name: 'worker:123'
35
42
  )
36
43
 
37
44
  assert_equal 'value', @job.arguments.first[:key]
45
+ @job.worker_name = nil
38
46
  @job.save!
47
+ @job.worker_name = '123'
39
48
  @job.reload
40
49
  assert @job.arguments.first.is_a?(ActiveSupport::HashWithIndifferentAccess), @job.arguments.first.class.inspect
41
50
  assert_equal 'value', @job.arguments.first['key']
42
51
  assert_equal 'value', @job.arguments.first[:key]
52
+ assert_equal nil, @job.worker_name
43
53
  end
44
54
  end
45
55
 
46
56
  context '#save!' do
47
57
  should 'save a blank job' do
48
58
  @job.save!
49
- assert_nil @job.worker_name
50
- assert_nil @job.completed_at
51
- assert @job.created_at
59
+ assert_nil @job.worker_name
60
+ assert_nil @job.completed_at
61
+ assert @job.created_at
52
62
  assert_equal @description, @job.description
53
63
  assert_equal false, @job.destroy_on_complete
54
- assert_nil @job.expires_at
64
+ assert_nil @job.expires_at
55
65
  assert_equal @arguments, @job.arguments
56
66
  assert_equal 0, @job.percent_complete
57
67
  assert_equal 50, @job.priority
58
68
  assert_equal 0, @job.failure_count
59
- assert_nil @job.run_at
60
- assert_nil @job.started_at
69
+ assert_nil @job.run_at
70
+ assert_nil @job.started_at
61
71
  assert_equal :queued, @job.state
62
72
  end
63
73
  end
@@ -66,23 +76,59 @@ class JobTest < Minitest::Test
66
76
  should 'return status for a queued job' do
67
77
  assert_equal true, @job.queued?
68
78
  h = @job.status
69
- assert_equal :queued, h['state']
70
- assert_equal @description, h['description']
79
+ assert_equal :queued, h['state']
80
+ assert_equal @description, h['description']
71
81
  end
72
82
 
73
83
  should 'return status for a failed job' do
74
- @job.build_exception(
75
- class_name: 'Test',
76
- message: 'hello world'
77
- )
84
+ @job.start!
85
+ @job.fail!('worker:1234', 'oh no')
86
+ assert_equal true, @job.failed?
87
+ h = @job.status
88
+ assert_equal :failed, h['state']
89
+ assert_equal @description, h['description']
90
+ assert_equal 'RocketJob::JobException', h['exception']['class_name'], h
91
+ assert_equal 'oh no', h['exception']['message'], h
92
+ end
93
+
94
+ should 'mark user as reason for failure when not supplied' do
78
95
  @job.start!
79
96
  @job.fail!
80
97
  assert_equal true, @job.failed?
98
+ assert_equal @description, @job.description
99
+ assert_equal 'RocketJob::JobException', @job.exception.class_name
100
+ assert_equal 'Job failed through user action', @job.exception.message
101
+ assert_equal 'user', @job.exception.worker_name
102
+ end
103
+ end
104
+
105
+ context '#fail_with_exception!' do
106
+ should 'fail with message' do
107
+ @job.start!
108
+ @job.fail!('myworker:2323', 'oh no')
109
+ assert_equal true, @job.failed?
110
+ h = @job.status
111
+ assert_equal :failed, h['state']
112
+ assert_equal @description, h['description']
113
+ assert_equal 'RocketJob::JobException', h['exception']['class_name'], h
114
+ assert_equal 'oh no', h['exception']['message'], h
115
+ end
116
+
117
+ should 'fail with exception' do
118
+ @job.start!
119
+ exception = nil
120
+ begin
121
+ blah
122
+ rescue Exception => exc
123
+ exception = exc
124
+ end
125
+ @job.fail!('myworker:2323', exception)
126
+ assert_equal true, @job.failed?
81
127
  h = @job.status
82
- assert_equal :failed, h['state']
83
- assert_equal @description, h['description']
84
- assert_equal 'Test', h['exception']['class_name'], h
85
- assert_equal 'hello world', h['exception']['message'], h
128
+ assert_equal :failed, h['state']
129
+ assert_equal @description, h['description']
130
+ assert_equal exception.class.name.to_s, h['exception']['class_name'], h
131
+ assert h['exception']['message'].include?('undefined local variable or method'), h
86
132
  end
87
133
  end
88
134
 
@@ -90,17 +136,17 @@ class JobTest < Minitest::Test
90
136
  should 'call default perform method' do
91
137
  @job.start!
92
138
  assert_equal false, @job.work(@worker)
93
- assert_equal true, @job.completed?, @job.state
94
- assert_equal 2, Jobs::TestJob.result
139
+ assert_equal true, @job.completed?, @job.state
140
+ assert_equal 2, Jobs::TestJob.result
95
141
  end
96
142
 
97
143
  should 'call specific method' do
98
144
  @job.perform_method = :sum
99
- @job.arguments = [ 23, 45 ]
145
+ @job.arguments = [23, 45]
100
146
  @job.start!
101
147
  assert_equal false, @job.work(@worker)
102
148
  assert_equal true, @job.completed?
103
- assert_equal 68, Jobs::TestJob.result
149
+ assert_equal 68, Jobs::TestJob.result
104
150
  end
105
151
 
106
152
  should 'destroy on complete' do
@@ -117,7 +163,7 @@ class JobTest < Minitest::Test
117
163
  @job.arguments = []
118
164
  @job.start!
119
165
  logged = false
120
- Jobs::TestJob.logger.stub(:log_internal, -> level, index, message, payload, exception { logged = true if message.include?('some very noisy logging')}) do
166
+ Jobs::TestJob.logger.stub(:log_internal, -> level, index, message, payload, exception { logged = true if message.include?('some very noisy logging') }) do
121
167
  assert_equal false, @job.work(@worker), @job.inspect
122
168
  end
123
169
  assert_equal false, logged
@@ -140,9 +186,9 @@ class JobTest < Minitest::Test
140
186
  end
141
187
 
142
188
  should 'call before and after' do
143
- named_parameters = { 'counter' => 23 }
189
+ named_parameters = {'counter' => 23}
144
190
  @job.perform_method = :event
145
- @job.arguments = [ named_parameters ]
191
+ @job.arguments = [named_parameters]
146
192
  @job.start!
147
193
  assert_equal false, @job.work(@worker), @job.inspect
148
194
  assert_equal true, @job.completed?
@@ -162,7 +208,7 @@ class JobTest < Minitest::Test
162
208
 
163
209
  should 'return the first job' do
164
210
  @job.save!
165
- assert job = RocketJob::Job.next_job(@worker.name), "Failed to find job"
211
+ assert job = RocketJob::Job.next_job(@worker.name), 'Failed to find job'
166
212
  assert_equal @job.id, job.id
167
213
  end
168
214
 
@@ -175,18 +221,90 @@ class JobTest < Minitest::Test
175
221
  should 'Process future dated jobs when time is now' do
176
222
  @job.run_at = Time.now
177
223
  @job.save!
178
- assert job = RocketJob::Job.next_job(@worker.name), "Failed to find future job"
224
+ assert job = RocketJob::Job.next_job(@worker.name), 'Failed to find future job'
179
225
  assert_equal @job.id, job.id
180
226
  end
181
227
 
182
228
  should 'Skip expired jobs' do
183
- count = RocketJob::Job.count
229
+ count = RocketJob::Job.count
184
230
  @job.expires_at = Time.now - 100
185
231
  @job.save!
186
232
  assert_equal nil, RocketJob::Job.next_job(@worker.name)
187
233
  assert_equal count, RocketJob::Job.count
188
234
  end
235
+ end
236
+
237
+ context '#requeue!' do
238
+ should 'requeue jobs from dead workers' do
239
+ worker_name = 'server:12345'
240
+ @job.worker_name = worker_name
241
+ @job.start!
242
+ assert @job.running?
243
+
244
+ @job.requeue!
245
+ @job.reload
246
+
247
+ assert @job.queued?
248
+ assert_equal nil, @job.worker_name
249
+ end
250
+ end
251
+
252
+ context '#requeue' do
253
+ should 'requeue jobs from dead workers' do
254
+ worker_name = 'server:12345'
255
+ @job.worker_name = worker_name
256
+ @job.start!
257
+ assert @job.running?
258
+
259
+ @job.requeue
260
+ assert @job.queued?
261
+ assert_equal nil, @job.worker_name
189
262
 
263
+ @job.reload
264
+ assert @job.running?
265
+ assert_equal worker_name, @job.worker_name
266
+ end
190
267
  end
268
+
269
+ context '.requeue_dead_worker' do
270
+ should 'requeue jobs from dead workers' do
271
+ worker_name = 'server:12345'
272
+ @job.worker_name = worker_name
273
+ @job.start!
274
+ assert @job.running?
275
+
276
+ worker_name2 = 'server:76467'
277
+ @job2.worker_name = worker_name2
278
+ @job2.start!
279
+
280
+ RocketJob::Job.requeue_dead_worker(worker_name)
281
+ @job.reload
282
+
283
+ assert @job.queued?
284
+ assert_equal nil, @job.worker_name
285
+
286
+ @job2.reload
287
+ assert @job2.running?
288
+ assert_equal worker_name2, @job2.worker_name
289
+ end
290
+ end
291
+
292
+ context '#retry!' do
293
+ should 'retry failed jobs' do
294
+ worker_name = 'server:12345'
295
+ @job.worker_name = worker_name
296
+ @job.start!
297
+ assert @job.running?
298
+ assert_equal worker_name, @job.worker_name
299
+
300
+ @job.fail!(worker_name, 'oh no')
301
+ assert @job.failed?
302
+
303
+ @job.retry!
304
+ assert @job.queued?
305
+ assert_equal nil, @job.worker_name
306
+ end
307
+ end
308
+
191
309
  end
192
310
  end