1
0
Fork 0
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:
Samuel Cochran 2012-10-19 12:16:28 +08:00
parent 7eca5a22e7
commit 2907777987
2 changed files with 127 additions and 3 deletions

View file

@ -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

View file

@ -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