1
0
Fork 0
mirror of https://github.com/mperham/sidekiq.git synced 2022-11-09 13:52:34 -05:00
mperham--sidekiq/lib/sidekiq/testing.rb

111 lines
3 KiB
Ruby
Raw Normal View History

module Sidekiq
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
module Worker
2012-02-10 23:30:14 -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
# 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.
#
# 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
#
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]
end
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
def drain
while job = jobs.shift do
new.perform(*job['args'])
end
end
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
until jobs.values.all?(&:empty?) do
jobs.keys.each(&:drain)
end
2012-10-19 00:16:28 -04:00
end
end
end
end