rocketjob 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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