mirror of
https://github.com/mperham/sidekiq.git
synced 2022-11-09 13:52:34 -05:00
Add Worker clear_all and drain_all
This commit is contained in:
parent
7eca5a22e7
commit
2907777987
2 changed files with 127 additions and 3 deletions
|
@ -1,6 +1,5 @@
|
|||
module Sidekiq
|
||||
module Worker
|
||||
|
||||
##
|
||||
# The Sidekiq testing infrastructure overrides perform_async
|
||||
# so that it does not actually touch the network. Instead it
|
||||
|
@ -20,25 +19,83 @@ module Sidekiq
|
|||
# assert_equal :something, HardWorker.jobs[0]['args'][0]
|
||||
#
|
||||
# assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
||||
# MyMailer.delayed.send_welcome_email('foo@example.com')
|
||||
# MyMailer.delay.send_welcome_email('foo@example.com')
|
||||
# assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
|
||||
#
|
||||
# You can also clear and drain all workers' jobs:
|
||||
#
|
||||
# assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
||||
# assert_equal 0, Sidekiq::Extensions::DelayedModel.jobs.size
|
||||
#
|
||||
# MyMailer.delay.send_welcome_email('foo@example.com')
|
||||
# MyModel.delay.do_something_hard
|
||||
#
|
||||
# assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
|
||||
# assert_equal 1, Sidekiq::Extensions::DelayedModel.jobs.size
|
||||
#
|
||||
# Sidekiq::Worker.clear_all # or .drain_all
|
||||
#
|
||||
# assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
||||
# assert_equal 0, Sidekiq::Extensions::DelayedModel.jobs.size
|
||||
#
|
||||
# This can be useful to make sure jobs don't linger between tests:
|
||||
#
|
||||
# RSpec.configure do |config|
|
||||
# config.before(:each) do
|
||||
# Sidekiq::Worker.clear_all
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# or for acceptance testing, i.e. with cucumber:
|
||||
#
|
||||
# AfterStep do
|
||||
# Sidekiq::Worker.drain_all
|
||||
# end
|
||||
#
|
||||
# When I sign up as "foo@example.com"
|
||||
# Then I should receive a welcome email to "foo@example.com"
|
||||
#
|
||||
module ClassMethods
|
||||
alias_method :client_push_old, :client_push
|
||||
|
||||
def client_push(opts)
|
||||
jobs << opts
|
||||
true
|
||||
end
|
||||
|
||||
# Jobs queued for this worker
|
||||
def jobs
|
||||
@pushed ||= []
|
||||
Worker.jobs[self]
|
||||
end
|
||||
|
||||
# Clear all jobs for this worker
|
||||
def clear
|
||||
jobs.clear
|
||||
end
|
||||
|
||||
# Drain and run all jobs for this worker
|
||||
def drain
|
||||
while job = jobs.shift do
|
||||
new.perform(*job['args'])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class << self
|
||||
def jobs # :nodoc:
|
||||
@jobs ||= Hash.new { |hash, key| hash[key] = [] }
|
||||
end
|
||||
|
||||
# Clear all queued jobs across all workers
|
||||
def clear_all
|
||||
jobs.clear
|
||||
end
|
||||
|
||||
# Drain all queued jobs across all workers
|
||||
def drain_all
|
||||
jobs.keys.each(&:drain)
|
||||
clear_all
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -110,5 +110,72 @@ class TestTesting < MiniTest::Unit::TestCase
|
|||
end
|
||||
assert_equal 0, StoredWorker.jobs.size
|
||||
end
|
||||
|
||||
class FirstWorker
|
||||
include Sidekiq::Worker
|
||||
class_attribute :count
|
||||
self.count = 0
|
||||
def perform
|
||||
self.class.count += 1
|
||||
end
|
||||
end
|
||||
|
||||
class SecondWorker
|
||||
include Sidekiq::Worker
|
||||
class_attribute :count
|
||||
self.count = 0
|
||||
def perform
|
||||
self.class.count += 1
|
||||
end
|
||||
end
|
||||
|
||||
it 'clears jobs across all workers' do
|
||||
Sidekiq::Worker.jobs.clear
|
||||
FirstWorker.count = 0
|
||||
SecondWorker.count = 0
|
||||
|
||||
assert_equal 0, FirstWorker.jobs.size
|
||||
assert_equal 0, SecondWorker.jobs.size
|
||||
|
||||
FirstWorker.perform_async
|
||||
SecondWorker.perform_async
|
||||
|
||||
assert_equal 1, FirstWorker.jobs.size
|
||||
assert_equal 1, SecondWorker.jobs.size
|
||||
|
||||
Sidekiq::Worker.clear_all
|
||||
|
||||
assert_equal 0, FirstWorker.jobs.size
|
||||
assert_equal 0, SecondWorker.jobs.size
|
||||
|
||||
assert_equal 0, FirstWorker.count
|
||||
assert_equal 0, SecondWorker.count
|
||||
end
|
||||
|
||||
it 'drains jobs across all workers' do
|
||||
Sidekiq::Worker.jobs.clear
|
||||
FirstWorker.count = 0
|
||||
SecondWorker.count = 0
|
||||
|
||||
assert_equal 0, FirstWorker.jobs.size
|
||||
assert_equal 0, SecondWorker.jobs.size
|
||||
|
||||
assert_equal 0, FirstWorker.count
|
||||
assert_equal 0, SecondWorker.count
|
||||
|
||||
FirstWorker.perform_async
|
||||
SecondWorker.perform_async
|
||||
|
||||
assert_equal 1, FirstWorker.jobs.size
|
||||
assert_equal 1, SecondWorker.jobs.size
|
||||
|
||||
Sidekiq::Worker.drain_all
|
||||
|
||||
assert_equal 0, FirstWorker.jobs.size
|
||||
assert_equal 0, SecondWorker.jobs.size
|
||||
|
||||
assert_equal 1, FirstWorker.count
|
||||
assert_equal 1, SecondWorker.count
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Reference in a new issue