Skip to content

Commit 2194a73

Browse files
committed
Active Job: Correctly use the desired test adapter in tests
1 parent 25f2250 commit 2194a73

File tree

12 files changed

+1882
-1451
lines changed

12 files changed

+1882
-1451
lines changed

activejob/CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
* All tests now respect the `active_job.queue_adapter` config
2+
3+
Previously if you had set `config.active_job.queue_adapter` in your `config/application.rb`
4+
or `config/environments/test.rb` file, the adapter you selected was previously not used consistently
5+
across all tests. In some tests your adapter would be used, but other tests would use the `TestAdapter`.
6+
7+
In Rails 7.2, all tests will respect the `queue_adapter` config if provided. If no config is provided,
8+
the `TestAdapter` will continue to be used.
9+
10+
See [#48585](https://github.com/rails/rails/pull/48585) for more details.
11+
12+
*Alex Ghiculescu*
13+
114
* Make Active Job transaction aware when used conjointly with Active Record.
215

316
A common mistake with Active Job is to enqueue jobs from inside a transaction,

activejob/lib/active_job/queue_adapter.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ def adapter_name(adapter) # :nodoc:
1515
# = Active Job Queue adapter
1616
#
1717
# The +ActiveJob::QueueAdapter+ module is used to load the
18-
# correct adapter. The default queue adapter is the +:async+ queue.
18+
# correct adapter. The default queue adapter is +:async+,
19+
# which loads the ActiveJob::QueueAdapters::AsyncAdapter.
1920
module QueueAdapter # :nodoc:
2021
extend ActiveSupport::Concern
2122

@@ -24,21 +25,21 @@ module QueueAdapter # :nodoc:
2425
class_attribute :_queue_adapter, instance_accessor: false, instance_predicate: false
2526

2627
delegate :queue_adapter, to: :class
27-
28-
self.queue_adapter = :async
2928
end
3029

3130
# Includes the setter method for changing the active queue adapter.
3231
module ClassMethods
3332
# Returns the backend queue provider. The default queue adapter
34-
# is the +:async+ queue. See QueueAdapters for more information.
33+
# is +:async+. See QueueAdapters for more information.
3534
def queue_adapter
35+
self.queue_adapter = :async if _queue_adapter.nil?
3636
_queue_adapter
3737
end
3838

3939
# Returns string denoting the name of the configured queue adapter.
4040
# By default returns <tt>"async"</tt>.
4141
def queue_adapter_name
42+
self.queue_adapter = :async if _queue_adapter_name.nil?
4243
_queue_adapter_name
4344
end
4445

activejob/lib/active_job/railtie.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class Railtie < Rails::Railtie # :nodoc:
4141

4242
initializer "active_job.set_configs" do |app|
4343
options = app.config.active_job
44-
options.queue_adapter ||= :async
44+
options.queue_adapter ||= (Rails.env.test? ? :test : :async)
4545

4646
config.after_initialize do
4747
options.each do |k, v|

activejob/lib/active_job/test_helper.rb

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@ def enable_test_adapter(test_adapter)
3939
end
4040

4141
def before_setup # :nodoc:
42-
test_adapter = queue_adapter_for_test
43-
4442
queue_adapter_changed_jobs.each do |klass|
45-
klass.enable_test_adapter(test_adapter)
43+
if (queue_adapter_specific_to_this_test_class = queue_adapter_for_test)
44+
klass.enable_test_adapter(queue_adapter_specific_to_this_test_class)
45+
elsif klass._queue_adapter.nil?
46+
klass.enable_test_adapter(ActiveJob::QueueAdapters::TestAdapter.new)
47+
end
4648
end
4749

4850
clear_enqueued_jobs
@@ -61,7 +63,6 @@ def after_teardown # :nodoc:
6163
# Override this method to specify a different adapter. The adapter must
6264
# implement the same interface as ActiveJob::QueueAdapters::TestAdapter.
6365
def queue_adapter_for_test
64-
ActiveJob::QueueAdapters::TestAdapter.new
6566
end
6667

6768
# Asserts that the number of enqueued jobs matches the given number.
@@ -118,6 +119,8 @@ def queue_adapter_for_test
118119
# end
119120
# end
120121
def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil, &block)
122+
require_active_job_test_adapter!("assert_enqueued_jobs")
123+
121124
if block_given?
122125
original_jobs = enqueued_jobs_with(only: only, except: except, queue: queue)
123126

@@ -180,6 +183,8 @@ def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil, &block)
180183
#
181184
# assert_enqueued_jobs 0, &block
182185
def assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block)
186+
require_active_job_test_adapter!("assert_no_enqueued_jobs")
187+
183188
assert_enqueued_jobs 0, only: only, except: except, queue: queue, &block
184189
end
185190

@@ -270,6 +275,8 @@ def assert_no_enqueued_jobs(only: nil, except: nil, queue: nil, &block)
270275
# end
271276
# end
272277
def assert_performed_jobs(number, only: nil, except: nil, queue: nil, &block)
278+
require_active_job_test_adapter!("assert_performed_jobs")
279+
273280
if block_given?
274281
original_count = performed_jobs.size
275282

@@ -338,6 +345,8 @@ def assert_performed_jobs(number, only: nil, except: nil, queue: nil, &block)
338345
#
339346
# assert_performed_jobs 0, &block
340347
def assert_no_performed_jobs(only: nil, except: nil, queue: nil, &block)
348+
require_active_job_test_adapter!("assert_no_performed_jobs")
349+
341350
assert_performed_jobs 0, only: only, except: except, queue: queue, &block
342351
end
343352

@@ -394,6 +403,8 @@ def assert_no_performed_jobs(only: nil, except: nil, queue: nil, &block)
394403
# end
395404
# end
396405
def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
406+
require_active_job_test_adapter!("assert_enqueued_with")
407+
397408
expected = { job: job, args: args, at: at, queue: queue, priority: priority }.compact
398409
expected_args = prepare_args_for_assertion(expected)
399410
potential_matches = []
@@ -496,6 +507,8 @@ def assert_enqueued_with(job: nil, args: nil, at: nil, queue: nil, priority: nil
496507
# end
497508
# end
498509
def assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: nil, &block)
510+
require_active_job_test_adapter!("assert_performed_with")
511+
499512
expected = { job: job, args: args, at: at, queue: queue, priority: priority }.compact
500513
expected_args = prepare_args_for_assertion(expected)
501514
potential_matches = []
@@ -604,7 +617,10 @@ def assert_performed_with(job: nil, args: nil, at: nil, queue: nil, priority: ni
604617
# If queue_adapter_for_test is overridden to return a different adapter,
605618
# +perform_enqueued_jobs+ will merely execute the block.
606619
def perform_enqueued_jobs(only: nil, except: nil, queue: nil, at: nil, &block)
607-
return flush_enqueued_jobs(only: only, except: except, queue: queue, at: at) unless block_given?
620+
unless block_given?
621+
require_active_job_test_adapter!("perform_enqueued_jobs (without a block)")
622+
return flush_enqueued_jobs(only: only, except: except, queue: queue, at: at)
623+
end
608624

609625
return _assert_nothing_raised_or_warn("perform_enqueued_jobs", &block) unless using_test_adapter?
610626

@@ -646,6 +662,12 @@ def queue_adapter
646662
end
647663

648664
private
665+
def require_active_job_test_adapter!(method)
666+
unless using_test_adapter?
667+
raise ArgumentError.new("#{method} requires the Active Job test adapter, you're using #{queue_adapter.class.name}.")
668+
end
669+
end
670+
649671
def using_test_adapter?
650672
queue_adapter.is_a?(ActiveJob::QueueAdapters::TestAdapter)
651673
end

activejob/test/cases/instrumentation_test.rb

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,20 @@ class InstrumentationTest < ActiveSupport::TestCase
2323
assert_equal 1, events.size
2424
end
2525

26-
test "retry emits an enqueue retry event" do
27-
events = subscribed("enqueue_retry.active_job") do
28-
perform_enqueued_jobs { RetryJob.perform_later("DefaultsError", 2) }
26+
unless adapter_is?(:inline, :sneakers)
27+
test "retry emits an enqueue retry event" do
28+
events = subscribed("enqueue_retry.active_job") do
29+
perform_enqueued_jobs { RetryJob.perform_later("DefaultsError", 2) }
30+
end
31+
assert_equal 1, events.size
2932
end
30-
assert_equal 1, events.size
31-
end
3233

33-
test "retry exhaustion emits a retry_stopped event" do
34-
events = subscribed("retry_stopped.active_job") do
35-
perform_enqueued_jobs { RetryJob.perform_later("CustomCatchError", 6) }
34+
test "retry exhaustion emits a retry_stopped event" do
35+
events = subscribed("retry_stopped.active_job") do
36+
perform_enqueued_jobs { RetryJob.perform_later("CustomCatchError", 6) }
37+
end
38+
assert_equal 1, events.size
3639
end
37-
assert_equal 1, events.size
3840
end
3941

4042
test "discard emits a discard event" do

activejob/test/cases/logging_test.rb

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,14 @@ def test_perform_nested_jobs_logging
213213
end
214214
end
215215

216-
def test_enqueue_at_job_logging
217-
events = subscribed { HelloJob.set(wait_until: 24.hours.from_now).perform_later "Cristian" }
218-
assert_match(/Enqueued HelloJob \(Job ID: .*\) to .*? at.*Cristian/, @logger.messages)
219-
assert_equal(1, events.count)
220-
key, * = events.first
221-
assert_equal("enqueue_at.active_job", key)
222-
rescue NotImplementedError
223-
skip
216+
unless adapter_is?(:inline, :sneakers)
217+
def test_enqueue_at_job_logging
218+
events = subscribed { HelloJob.set(wait_until: 24.hours.from_now).perform_later "Cristian" }
219+
assert_match(/Enqueued HelloJob \(Job ID: .*\) to .*? at.*Cristian/, @logger.messages)
220+
assert_equal(1, events.count)
221+
key, * = events.first
222+
assert_equal("enqueue_at.active_job", key)
223+
end
224224
end
225225

226226
def test_enqueue_at_job_log_error_when_callback_chain_is_halted
@@ -244,14 +244,14 @@ def test_enqueue_at_job_log_error_when_error_is_raised_during_callback_chain
244244
assert_equal("enqueue_at.active_job", key)
245245
end
246246

247-
def test_enqueue_in_job_logging
248-
events = subscribed { HelloJob.set(wait: 2.seconds).perform_later "Cristian" }
249-
assert_match(/Enqueued HelloJob \(Job ID: .*\) to .*? at.*Cristian/, @logger.messages)
250-
assert_equal(1, events.count)
251-
key, * = events.first
252-
assert_equal("enqueue_at.active_job", key)
253-
rescue NotImplementedError
254-
skip
247+
unless adapter_is?(:inline, :sneakers)
248+
def test_enqueue_in_job_logging
249+
events = subscribed { HelloJob.set(wait: 2.seconds).perform_later "Cristian" }
250+
assert_match(/Enqueued HelloJob \(Job ID: .*\) to .*? at.*Cristian/, @logger.messages)
251+
assert_equal(1, events.count)
252+
key, * = events.first
253+
assert_equal("enqueue_at.active_job", key)
254+
end
255255
end
256256

257257
def test_enqueue_log_when_enqueue_error_is_set
@@ -290,10 +290,12 @@ def test_job_no_error_logging_on_rescuable_job
290290
assert_no_match(/Error performing RescueJob \(Job ID: .*?\) from .*? in .*ms: ArgumentError \(Hair too good\):\n.*\brescue_job\.rb:\d+:in .*perform'/, @logger.messages)
291291
end
292292

293-
def test_enqueue_retry_logging
294-
perform_enqueued_jobs do
295-
RetryJob.perform_later "DefaultsError", 2
296-
assert_match(/Retrying RetryJob \(Job ID: .*?\) after \d+ attempts in 3 seconds, due to a DefaultsError.*\./, @logger.messages)
293+
unless adapter_is?(:inline, :sneakers)
294+
def test_enqueue_retry_logging
295+
perform_enqueued_jobs do
296+
RetryJob.perform_later "DefaultsError", 2
297+
assert_match(/Retrying RetryJob \(Job ID: .*?\) after \d+ attempts in 3 seconds, due to a DefaultsError.*\./, @logger.messages)
298+
end
297299
end
298300
end
299301

@@ -302,18 +304,20 @@ def test_enqueue_retry_logging_on_retry_job
302304
assert_match(/Retrying RescueJob \(Job ID: .*?\) after \d+ attempts in 0 seconds\./, @logger.messages)
303305
end
304306

305-
def test_retry_stopped_logging
306-
perform_enqueued_jobs do
307-
RetryJob.perform_later "CustomCatchError", 6
307+
unless adapter_is?(:inline, :sneakers)
308+
def test_retry_stopped_logging
309+
perform_enqueued_jobs do
310+
RetryJob.perform_later "CustomCatchError", 6
311+
end
312+
assert_match(/Stopped retrying RetryJob \(Job ID: .*?\) due to a CustomCatchError.*, which reoccurred on \d+ attempts\./, @logger.messages)
308313
end
309-
assert_match(/Stopped retrying RetryJob \(Job ID: .*?\) due to a CustomCatchError.*, which reoccurred on \d+ attempts\./, @logger.messages)
310-
end
311314

312-
def test_retry_stopped_logging_without_block
313-
perform_enqueued_jobs do
314-
RetryJob.perform_later "DefaultsError", 6
315-
rescue DefaultsError
316-
assert_match(/Stopped retrying RetryJob \(Job ID: .*?\) due to a DefaultsError.*, which reoccurred on \d+ attempts\./, @logger.messages)
315+
def test_retry_stopped_logging_without_block
316+
perform_enqueued_jobs do
317+
RetryJob.perform_later "DefaultsError", 6
318+
rescue DefaultsError
319+
assert_match(/Stopped retrying RetryJob \(Job ID: .*?\) due to a DefaultsError.*, which reoccurred on \d+ attempts\./, @logger.messages)
320+
end
317321
end
318322
end
319323

activejob/test/cases/queue_adapter_test.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ class QueueAdapterTest < ActiveJob::TestCase
5353
assert_equal base_queue_adapter, child_job_three.queue_adapter, "child_job_three's queue adapter should remain unchanged"
5454
end
5555

56+
test "should default to :async adapter if no adapters are set at all" do
57+
ActiveJob::Base.disable_test_adapter
58+
_queue_adapter_was = ActiveJob::Base._queue_adapter
59+
_queue_adapter_name_was = ActiveJob::Base._queue_adapter_name
60+
ActiveJob::Base._queue_adapter = ActiveJob::Base._queue_adapter_name = nil
61+
62+
assert_equal "async", ActiveJob::Base.queue_adapter_name
63+
assert_kind_of ActiveJob::QueueAdapters::AsyncAdapter, ActiveJob::Base.queue_adapter
64+
ensure
65+
ActiveJob::Base._queue_adapter = _queue_adapter_was
66+
ActiveJob::Base._queue_adapter_name = _queue_adapter_name_was
67+
end
68+
5669
test "should extract a reasonable name from a class instance" do
5770
child_job = Class.new(ActiveJob::Base)
5871
child_job.queue_adapter = ActiveJob::QueueAdapters::StubOneAdapter.new

activejob/test/cases/test_case_test.rb

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,37 @@ def test_include_helper
2020
end
2121

2222
def test_set_test_adapter
23-
assert_kind_of ActiveJob::QueueAdapters::TestAdapter, queue_adapter
23+
# The queue adapter the job uses depends on the Active Job config.
24+
# See https://github.com/rails/rails/pull/48585 for logic.
25+
expected = case ActiveJob::Base.queue_adapter_name.to_sym
26+
when :test
27+
ActiveJob::QueueAdapters::TestAdapter
28+
when :inline
29+
ActiveJob::QueueAdapters::InlineAdapter
30+
when :async
31+
ActiveJob::QueueAdapters::AsyncAdapter
32+
when :backburner
33+
ActiveJob::QueueAdapters::BackburnerAdapter
34+
when :delayed_job
35+
ActiveJob::QueueAdapters::DelayedJobAdapter
36+
when :queue_classic
37+
ActiveJob::QueueAdapters::QueueClassicAdapter
38+
when :resque
39+
ActiveJob::QueueAdapters::ResqueAdapter
40+
when :sidekiq
41+
ActiveJob::QueueAdapters::SidekiqAdapter
42+
when :sneakers
43+
ActiveJob::QueueAdapters::SneakersAdapter
44+
when :sucker_punch
45+
ActiveJob::QueueAdapters::SuckerPunchAdapter
46+
else
47+
raise NotImplementedError.new
48+
end
49+
50+
assert_kind_of expected, queue_adapter
2451
end
2552

2653
def test_does_not_perform_enqueued_jobs_by_default
27-
assert_nil queue_adapter.perform_enqueued_jobs
54+
assert_nil ActiveJob::QueueAdapters::TestAdapter.new.perform_enqueued_jobs
2855
end
2956
end

0 commit comments

Comments
 (0)