class RSpec::Sidekiq::Matchers::BeDelayed

Public Class Methods

new(*expected_arguments) click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 11
        def initialize(*expected_arguments)
          raise <<~MSG if RSpec::Sidekiq.configuration.sidekiq_gte_7?
            Use of the be_delayed matcher with Sidekiq 7+ is not possible. Try refactoring to a Sidekiq Job with `perform_at` or `perform_in` and the `have_enqueued_sidekiq_job` matcher
          MSG

          @expected_arguments = expected_arguments
        end

Public Instance Methods

description() click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 19
def description
  description = 'be delayed'
  description += " for #{@expected_interval} seconds" if @expected_interval
  description += " until #{@expected_time}" if @expected_time
  description += " with arguments #{@expected_arguments}" unless @expected_arguments.empty?
  description
end
failure_message() click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 27
def failure_message
  "expected #{@expected_method_receiver}.#{@expected_method.name} to " + description
end
failure_message_when_negated() click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 54
def failure_message_when_negated
  "expected #{@expected_method_receiver}.#{@expected_method.name} to not " + description
end
for(interval) click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 31
def for(interval)
  @expected_interval = interval
  self
end
matches?(expected_method) click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 36
def matches?(expected_method)
  @expected_method = expected_method
  @expected_method_receiver = @expected_method.is_a?(UnboundMethod) ? @expected_method.owner : @expected_method.receiver

  find_job @expected_method, @expected_arguments do |job|
    if @expected_interval
      created_enqueued_at = job['enqueued_at'] || job['created_at']
      return job['at'].to_i == Time.at(created_enqueued_at.to_f + @expected_interval.to_f).to_i
    elsif @expected_time
      return job['at'].to_i == @expected_time.to_i
    else
      return true
    end
  end

  false
end
until(time) click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 58
def until(time)
  @expected_time = time
  self
end

Private Instance Methods

find_job(method, arguments) { |job| ... } click to toggle source
# File lib/rspec/sidekiq/matchers/be_delayed.rb, line 65
def find_job(method, arguments, &block)
  job = (::Sidekiq::Extensions::DelayedClass.jobs + ::Sidekiq::Extensions::DelayedModel.jobs + ::Sidekiq::Extensions::DelayedMailer.jobs).find do |job|
    arg = job['args'].first
    yaml = begin
      YAML.load(arg, aliases: true) # Psych 4 required syntax
    rescue ArgumentError
      YAML.load(arg) # Pysch < 4 syntax
    end

    @expected_method_receiver == yaml[0] &&
      method.name == yaml[1] &&
      (arguments.empty? || RSpec::Mocks::ArgumentListMatcher.new(*arguments).args_match?(*yaml[2]))
  end

  yield job if block && job
end