class RSpec::ActiveJob::Matchers::EnqueueA

Attributes

after_count[R]
argument_list_matcher[R]
before_count[R]
job_class[R]
number_of_times[R]
run_time[R]

Public Class Methods

new(job_class = nil) click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 7
def initialize(job_class = nil)
  @job_class = job_class
end

Public Instance Methods

description() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 72
def description
  return "enqueue a job" unless job_class
  return "enqueue a #{job_class.name}" unless argument_list_matcher
  "enqueue a #{job_class.name} with #{argument_list_matcher.expected_args}"
end
failure_message() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 45
def failure_message
  enqueued_nothing_message ||
    enqueued_wrong_class_message ||
    enqueued_at_wrong_time_message ||
    enqueued_wrong_number_of_times_message ||
    wrong_arguments_message
end
failure_message_when_negated() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 53
def failure_message_when_negated
  return "expected to not enqueue a job" unless job_class

  message = "expected to not enqueue a #{job_class}"
  if @argument_list_matcher
    message += " with #{argument_list_matcher.expected_args}"
  end

  message += ", but enqueued a #{enqueued_jobs.last[:job]}"

  return message unless enqueued_correct_class?

  message + " with #{new_jobs_with_correct_class.first[:args]}"
end
matches?(actual) click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 11
def matches?(actual)
  raise "must use a block with enqueue_a" if !actual.is_a?(Proc) && @job_class

  if actual.is_a?(Proc)
    @before_jobs = enqueued_jobs.dup
    actual.call
    all_checks_pass?
  else
    @job_class = actual
    @before_jobs = []
    all_checks_pass?
  end
end
once() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 35
def once
  @number_of_times = 1
  self
end
supports_block_expectations?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 68
def supports_block_expectations?
  true
end
times(n) click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 40
def times(n)
  @number_of_times = n
  self
end
to_run_at(time) click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 30
def to_run_at(time)
  @run_time = time.to_f
  self
end
with(*args) click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 25
def with(*args)
  @argument_list_matcher = RSpec::Mocks::ArgumentListMatcher.new(*args)
  self
end

Private Instance Methods

all_checks_pass?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 83
def all_checks_pass?
  enqueued_something? &&
    enqueued_correct_class? &&
    with_correct_args? &&
    at_correct_time? &&
    enqueued_correct_number_of_times?
end
at_correct_time?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 156
def at_correct_time?
  return true unless run_time

  !new_jobs_with_correct_class.find { |job| job[:at] == run_time }.nil?
end
enqueued_at_wrong_time_message() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 116
def enqueued_at_wrong_time_message
  return if at_correct_time?
  "expected to run job at #{Time.at(run_time).utc}, but enqueued to " \
    "run at #{format_enqueued_times}"
end
enqueued_correct_class?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 95
def enqueued_correct_class?
  return true unless job_class
  new_jobs_with_correct_class.any?
end
enqueued_correct_number_of_times?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 166
def enqueued_correct_number_of_times?
  return true unless number_of_times

  new_jobs_with_correct_class.count == number_of_times
end
enqueued_jobs() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 152
def enqueued_jobs
  ::ActiveJob::Base.queue_adapter.enqueued_jobs
end
enqueued_nothing_message() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 105
def enqueued_nothing_message
  return if enqueued_something?
  "expected to enqueue a #{job_class || 'job'}, enqueued nothing"
end
enqueued_something?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 91
def enqueued_something?
  new_jobs.any?
end
enqueued_wrong_class_message() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 110
def enqueued_wrong_class_message
  return if enqueued_correct_class?
  "expected to enqueue a #{job_class}, enqueued a " \
    "#{enqueued_jobs.last[:job]}"
end
enqueued_wrong_number_of_times_message() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 128
def enqueued_wrong_number_of_times_message
  return if enqueued_correct_number_of_times?
  "expected to enqueue a #{job_class} " \
  "#{times_count(number_of_times)}, but enqueued " \
  "#{times_count(new_jobs.count)}"
end
format_enqueued_times() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 162
def format_enqueued_times
  new_jobs_with_correct_class.map { |job| Time.at(job[:at]).utc.to_s }.join(', ')
end
new_jobs() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 139
def new_jobs
  enqueued_jobs - @before_jobs
end
new_jobs_with_correct_class() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 143
def new_jobs_with_correct_class
  new_jobs.select { |job| job[:job] == job_class }
end
new_jobs_with_correct_class_and_args() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 147
def new_jobs_with_correct_class_and_args
  new_jobs_with_correct_class.
    select { |job| argument_list_matcher.args_match?(*job[:args]) }
end
times_count(n) click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 135
def times_count(n)
  n == 1 ? 'once' : "#{n} times"
end
with_correct_args?() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 100
def with_correct_args?
  return true unless argument_list_matcher
  new_jobs_with_correct_class_and_args.any?
end
wrong_arguments_message() click to toggle source
# File lib/rspec/active_job/enqueue_a.rb, line 122
def wrong_arguments_message
  "expected to enqueue a #{job_class} with " \
  "#{argument_list_matcher.expected_args}, but enqueued with " \
  "#{new_jobs_with_correct_class.first[:args]}"
end