Skip to content

Instantly share code, notes, and snippets.

@ChuckJHardy
Last active March 12, 2025 21:24

Revisions

  1. ChuckJHardy revised this gist Mar 11, 2017. 1 changed file with 14 additions and 0 deletions.
    14 changes: 14 additions & 0 deletions example_activejob.rb
    Original file line number Diff line number Diff line change
    @@ -46,4 +46,18 @@ def perform(*args)
    clear_enqueued_jobs
    clear_performed_jobs
    end
    end

    # As of RSpec 3.4.0 we now have #have_enqueued_job
    # https://www.relishapp.com/rspec/rspec-rails/v/3-5/docs/matchers/have-enqueued-job-matcher
    RSpec.describe MyJob, type: :job do
    subject(:job) { described_class.perform_later(key) }

    let(:key) { 123 }

    it 'queues the job' do
    expect { job }.to have_enqueued_job(described_class)
    .with(key)
    .on_queue("urgent")
    end
    end
  2. ChuckJHardy revised this gist Jun 22, 2015. 1 changed file with 2 additions and 28 deletions.
    30 changes: 2 additions & 28 deletions example_activejob.rb
    Original file line number Diff line number Diff line change
    @@ -1,14 +1,8 @@
    class MyJob < ActiveJob::Base
    queue_as :urgent

    rescue_from(UnauthorizedError) {}

    rescue_from(ExternalAPIError) do
    retry_job wait: 10.minutes, queue: :low_priority
    end

    rescue_from(NoResultsError) do
    retry_job wait: 5.minutes, queue: :medium_priority
    retry_job wait: 5.minutes, queue: :default
    end

    def perform(*args)
    @@ -37,32 +31,12 @@ def perform(*args)
    perform_enqueued_jobs { job }
    end

    it 'handles no unauthorised error' do
    allow(MyService).to receive(:call).and_raise(UnauthorizedError)

    perform_enqueued_jobs do
    expect_any_instance_of(MyJob).to_not receive(:retry_job)
    job
    end
    end

    it 'handles no external api error' do
    allow(MyService).to receive(:call).and_raise(ExternalAPIError)

    perform_enqueued_jobs do
    expect_any_instance_of(MyJob)
    .to receive(:retry_job).with(wait: 10.minutes, queue: :low_priority)

    job
    end
    end

    it 'handles no results error' do
    allow(MyService).to receive(:call).and_raise(NoResultsError)

    perform_enqueued_jobs do
    expect_any_instance_of(MyJob)
    .to receive(:retry_job).with(wait: 10.minutes, queue: :medium_priority)
    .to receive(:retry_job).with(wait: 10.minutes, queue: :default)

    job
    end
  3. ChuckJHardy created this gist Jun 22, 2015.
    75 changes: 75 additions & 0 deletions example_activejob.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,75 @@
    class MyJob < ActiveJob::Base
    queue_as :urgent

    rescue_from(UnauthorizedError) {}

    rescue_from(ExternalAPIError) do
    retry_job wait: 10.minutes, queue: :low_priority
    end

    rescue_from(NoResultsError) do
    retry_job wait: 5.minutes, queue: :medium_priority
    end

    def perform(*args)
    MyService.call(*args)
    end
    end

    require 'rails_helper'

    RSpec.describe MyJob, type: :job do
    include ActiveJob::TestHelper

    subject(:job) { described_class.perform_later(123) }

    it 'queues the job' do
    expect { job }
    .to change(ActiveJob::Base.queue_adapter.enqueued_jobs, :size).by(1)
    end

    it 'is in urgent queue' do
    expect(MyJob.new.queue_name).to eq('urgent')
    end

    it 'executes perform' do
    expect(MyService).to receive(:call).with(123)
    perform_enqueued_jobs { job }
    end

    it 'handles no unauthorised error' do
    allow(MyService).to receive(:call).and_raise(UnauthorizedError)

    perform_enqueued_jobs do
    expect_any_instance_of(MyJob).to_not receive(:retry_job)
    job
    end
    end

    it 'handles no external api error' do
    allow(MyService).to receive(:call).and_raise(ExternalAPIError)

    perform_enqueued_jobs do
    expect_any_instance_of(MyJob)
    .to receive(:retry_job).with(wait: 10.minutes, queue: :low_priority)

    job
    end
    end

    it 'handles no results error' do
    allow(MyService).to receive(:call).and_raise(NoResultsError)

    perform_enqueued_jobs do
    expect_any_instance_of(MyJob)
    .to receive(:retry_job).with(wait: 10.minutes, queue: :medium_priority)

    job
    end
    end

    after do
    clear_enqueued_jobs
    clear_performed_jobs
    end
    end