class RSpec::Rails::Matchers::ActiveJob::Base

rubocop: disable Metrics/ClassLength @private

Public Class Methods

new() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 14
def initialize
  @args = []
  @queue = nil
  @at = nil
  @block = proc { }
  set_expected_number(:exactly, 1)
end

Public Instance Methods

at(time_or_date) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 33
def at(time_or_date)
  case time_or_date
  when Time then @at = Time.at(time_or_date.to_f)
  else
    @at = time_or_date
  end
  self
end
at_least(count) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 47
def at_least(count)
  set_expected_number(:at_least, count)
  self
end
at_most(count) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 52
def at_most(count)
  set_expected_number(:at_most, count)
  self
end
exactly(count) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 42
def exactly(count)
  set_expected_number(:exactly, count)
  self
end
failure_message() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 73
def failure_message
  "expected to #{self.class::FAILURE_MESSAGE_EXPECTATION_ACTION} #{base_message}".tap do |msg|
    if @unmatching_jobs.any?
      msg << "\nQueued jobs:"
      @unmatching_jobs.each do |job|
        msg << "\n  #{base_job_message(job)}"
      end
    end
  end
end
failure_message_when_negated() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 84
def failure_message_when_negated
  "expected not to #{self.class::FAILURE_MESSAGE_EXPECTATION_ACTION} #{base_message}"
end
message_expectation_modifier() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 88
def message_expectation_modifier
  case @expectation_type
  when :exactly then "exactly"
  when :at_most then "at most"
  when :at_least then "at least"
  end
end
on_queue(queue) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 28
def on_queue(queue)
  @queue = queue.to_s
  self
end
once() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 61
def once
  exactly(:once)
end
supports_block_expectations?() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 96
def supports_block_expectations?
  true
end
thrice() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 69
def thrice
  exactly(:thrice)
end
times() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 57
def times
  self
end
twice() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 65
def twice
  exactly(:twice)
end
with(*args, &block) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 22
def with(*args, &block)
  @args = args
  @block = block if block.present?
  self
end

Private Instance Methods

arguments_match?(job) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 145
def arguments_match?(job)
  if @args.any?
    args = serialize_and_deserialize_arguments(@args)
    deserialized_args = deserialize_arguments(job)
    RSpec::Mocks::ArgumentListMatcher.new(*args).args_match?(*deserialized_args)
  else
    true
  end
end
at_match?(job) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 161
def at_match?(job)
  return true unless @at
  return job[:at].nil? if @at == :no_wait
  return false unless job[:at]

  values_match?(@at, Time.at(job[:at]))
end
base_job_message(job) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 130
def base_job_message(job)
  msg_parts = []
  msg_parts << "with #{deserialize_arguments(job)}" if job[:args].any?
  msg_parts << "on queue #{job[:queue]}" if job[:queue]
  msg_parts << "at #{Time.at(job[:at])}" if job[:at]

  "#{job[:job].name} job".tap do |msg|
    msg << " #{msg_parts.join(', ')}" if msg_parts.any?
  end
end
base_message() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 121
def base_message
  "#{message_expectation_modifier} #{@expected_number} jobs,".tap do |msg|
    msg << " with #{@args}," if @args.any?
    msg << " on queue #{@queue}," if @queue
    msg << " at #{@at.inspect}," if @at
    msg << " but #{self.class::MESSAGE_EXPECTATION_ACTION} #{@matching_jobs_count}"
  end
end
check(jobs) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 102
def check(jobs)
  @matching_jobs, @unmatching_jobs = jobs.partition do |job|
    if job_match?(job) && arguments_match?(job) && queue_match?(job) && at_match?(job)
      args = deserialize_arguments(job)
      @block.call(*args)
      true
    else
      false
    end
  end
  @matching_jobs_count = @matching_jobs.size

  case @expectation_type
  when :exactly then @expected_number == @matching_jobs_count
  when :at_most then @expected_number >= @matching_jobs_count
  when :at_least then @expected_number <= @matching_jobs_count
  end
end
deserialize_arguments(job) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 186
def deserialize_arguments(job)
  ::ActiveJob::Arguments.deserialize(job[:args])
rescue ::ActiveJob::DeserializationError
  job[:args]
end
job_match?(job) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 141
def job_match?(job)
  @job ? @job == job[:job] : true
end
queue_adapter() click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 192
def queue_adapter
  ::ActiveJob::Base.queue_adapter
end
queue_match?(job) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 155
def queue_match?(job)
  return true unless @queue

  @queue == job[:queue]
end
serialize_and_deserialize_arguments(args) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 179
def serialize_and_deserialize_arguments(args)
  serialized = ::ActiveJob::Arguments.serialize(args)
  ::ActiveJob::Arguments.deserialize(serialized)
rescue ::ActiveJob::SerializationError
  args
end
set_expected_number(relativity, count) click to toggle source
# File lib/rspec/rails/matchers/active_job.rb, line 169
def set_expected_number(relativity, count)
  @expectation_type = relativity
  @expected_number = case count
                     when :once then 1
                     when :twice then 2
                     when :thrice then 3
                     else Integer(count)
                     end
end