2012-02-10 00:46:44 -05:00
|
|
|
module Sidekiq
|
2013-03-28 00:24:47 -04:00
|
|
|
|
|
|
|
class Client
|
|
|
|
class << self
|
|
|
|
alias_method :raw_push_old, :raw_push
|
|
|
|
|
|
|
|
def raw_push(payloads)
|
|
|
|
payloads.each do |job|
|
|
|
|
job['class'].constantize.jobs << Sidekiq.load_json(Sidekiq.dump_json(job))
|
|
|
|
end
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-02-10 00:46:44 -05:00
|
|
|
module Worker
|
2012-02-10 23:30:14 -05:00
|
|
|
##
|
2012-02-14 12:00:26 -05:00
|
|
|
# The Sidekiq testing infrastructure overrides perform_async
|
2012-02-10 23:30:14 -05:00
|
|
|
# so that it does not actually touch the network. Instead it
|
2012-02-14 12:00:26 -05:00
|
|
|
# stores the asynchronous jobs in a per-class array so that
|
2012-02-10 23:30:14 -05:00
|
|
|
# their presence/absence can be asserted by your tests.
|
|
|
|
#
|
|
|
|
# This is similar to ActionMailer's :test delivery_method and its
|
|
|
|
# ActionMailer::Base.deliveries array.
|
2012-02-14 12:00:26 -05:00
|
|
|
#
|
|
|
|
# Example:
|
|
|
|
#
|
|
|
|
# require 'sidekiq/testing'
|
|
|
|
#
|
|
|
|
# assert_equal 0, HardWorker.jobs.size
|
|
|
|
# HardWorker.perform_async(:something)
|
|
|
|
# assert_equal 1, HardWorker.jobs.size
|
|
|
|
# assert_equal :something, HardWorker.jobs[0]['args'][0]
|
|
|
|
#
|
2012-04-05 23:06:47 -04:00
|
|
|
# assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
|
2012-10-19 00:16:28 -04:00
|
|
|
# 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
|
|
|
|
#
|
2012-04-05 23:06:47 -04:00
|
|
|
# assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
|
2012-10-19 00:16:28 -04:00
|
|
|
# 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"
|
2012-04-05 23:06:47 -04:00
|
|
|
#
|
2012-02-10 00:46:44 -05:00
|
|
|
module ClassMethods
|
2012-02-10 23:30:14 -05:00
|
|
|
|
2012-10-19 00:16:28 -04:00
|
|
|
# Jobs queued for this worker
|
2012-02-10 23:30:14 -05:00
|
|
|
def jobs
|
2012-10-19 00:16:28 -04:00
|
|
|
Worker.jobs[self]
|
2012-02-10 00:46:44 -05:00
|
|
|
end
|
2012-05-02 13:45:05 -04:00
|
|
|
|
2012-10-19 00:16:28 -04:00
|
|
|
# Clear all jobs for this worker
|
|
|
|
def clear
|
|
|
|
jobs.clear
|
|
|
|
end
|
|
|
|
|
|
|
|
# Drain and run all jobs for this worker
|
2012-05-02 13:59:31 -04:00
|
|
|
def drain
|
2012-05-02 13:45:05 -04:00
|
|
|
while job = jobs.shift do
|
|
|
|
new.perform(*job['args'])
|
|
|
|
end
|
|
|
|
end
|
2012-02-10 00:46:44 -05:00
|
|
|
end
|
2012-10-19 00:16:28 -04:00
|
|
|
|
|
|
|
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
|
2012-11-01 10:49:35 -04:00
|
|
|
until jobs.values.all?(&:empty?) do
|
|
|
|
jobs.keys.each(&:drain)
|
|
|
|
end
|
2012-10-19 00:16:28 -04:00
|
|
|
end
|
|
|
|
end
|
2012-02-10 00:46:44 -05:00
|
|
|
end
|
|
|
|
end
|