123456789_123456789_123456789_123456789_123456789_

Module: ActiveJob::Continuation::TestHelper

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Defined in: activejob/lib/active_job/continuation/test_helper.rb

Overview

Test helper for ::ActiveJob::Continuable jobs.

Constant Summary

::ActiveSupport::Testing::Assertions - Included

UNTRACKED

Instance Attribute Summary

Instance Method Summary

::ActiveJob::TestHelper - Included

#assert_enqueued_jobs

Asserts that the number of enqueued jobs matches the given number.

#assert_enqueued_with

Asserts that the job has been enqueued with the given arguments.

#assert_no_enqueued_jobs

Asserts that no jobs have been enqueued.

#assert_no_performed_jobs

Asserts that no jobs have been performed.

#assert_performed_jobs

Asserts that the number of performed jobs matches the given number.

#assert_performed_with

Asserts that the job has been performed with the given arguments.

#perform_enqueued_jobs

Performs all enqueued jobs.

#queue_adapter

Accesses the queue_adapter set by ::ActiveJob::Base.

#queue_adapter_for_test

Returns a queue adapter instance to use with all Active Job test helpers.

#clear_enqueued_jobs, #clear_performed_jobs, #deserialize_args_for_assertion, #enqueued_jobs_with, #filter_as_proc, #flush_enqueued_jobs, #instantiate_job, #jobs_with, #performed_jobs_with, #prepare_args_for_assertion, #queue_adapter_changed_jobs, #require_active_job_test_adapter!, #validate_option, #after_teardown, #before_setup

::ActiveSupport::Testing::Assertions - Included

#assert_changes

Assertion that the result of evaluating an expression is changed before and after invoking the passed in block.

#assert_difference

Test numeric difference between the return value of an expression as a result of what is evaluated in the yielded block.

#assert_no_changes

Assertion that the result of evaluating an expression is not changed before and after invoking the passed in block.

#assert_no_difference

Assertion that the numeric result of evaluating an expression is not changed before and after invoking the passed in block.

#assert_not

Asserts that an expression is not truthy.

#assert_nothing_raised

Assertion that the block should not raise an exception.

#assert_raise
#assert_raises

Asserts that a block raises one of exp.

#_assert_nothing_raised_or_warn, #_callable_to_source_string

Instance Method Details

#after_step?(job, step) ⇒ Boolean (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/continuation/test_helper.rb', line 80

def after_step?(job, step)
  if (continuation = continuation_for(job))
    continuation["completed"].last == step.to_s && continuation["current"].nil?
  end
end

#continuation_for(klass) (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/continuation/test_helper.rb', line 69

def continuation_for(klass)
  job = ActiveSupport::ExecutionContext.to_h[:job]
  job.send(:continuation)&.to_h if job && job.is_a?(klass)
end

#during_step?(job, step, cursor: nil) ⇒ Boolean (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/continuation/test_helper.rb', line 74

def during_step?(job, step, cursor: nil)
  if (continuation = continuation_for(job))
    continuation["current"] == [ step.to_s, cursor ]
  end
end

#interrupt_job_after_step(job, step, &block)

Interrupt a job after a step.

class MyJob < ApplicationJob
  include ActiveJob::Continuable

  cattr_accessor :items, default: []

  def perform
    step :step_one { items << 1 }
    step :step_two { items << 2 }
    step :step_three { items << 3 }
    step :step_four { items << 4 }
  end
end

test "interrupt job after step" do
  MyJob.perform_later
  interrupt_job_after_step(MyJob, :step_two) { perform_enqueued_jobs }
  assert_equal [1, 2], MyJob.items
  perform_enqueued_jobs
  assert_equal [1, 2, 3, 4], MyJob.items
end
[ GitHub ]

  
# File 'activejob/lib/active_job/continuation/test_helper.rb', line 63

def interrupt_job_after_step(job, step, &block)
  require_active_job_test_adapter!("interrupt_job_after_step")
  queue_adapter.with(stopping: ->() { after_step?(job, step) }, &block)
end

#interrupt_job_during_step(job, step, cursor: nil, &block)

Interrupt a job during a step.

class MyJob < ApplicationJob
  include ActiveJob::Continuable

  cattr_accessor :items, default: []
  def perform
    step :my_step, start: 1 do |step|
      (step.cursor..10).each do |i|
        items << i
        step.advance!
      end
    end
  end
end

test "interrupt job during step" do
  MyJob.perform_later
  interrupt_job_during_step(MyJob, :my_step, cursor: 6) { perform_enqueued_jobs }
  assert_equal [1, 2, 3, 4, 5], MyJob.items
  perform_enqueued_jobs
  assert_equal [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], MyJob.items
end
[ GitHub ]

  
# File 'activejob/lib/active_job/continuation/test_helper.rb', line 36

def interrupt_job_during_step(job, step, cursor: nil, &block)
  require_active_job_test_adapter!("interrupt_job_during_step")
  queue_adapter.with(stopping: ->() { during_step?(job, step, cursor: cursor) }, &block)
end