mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
3860e6b2bf
When `#perform_later` is called the locale isn't stored on the queue, which results in a locale reset when the job is performed. An example of the problem: I18n.locale = 'de' HelloJob.perform_now # german message, correct but I18n.locale = 'de' HelloJob.perform_later # english message, incorrect This PR attaches the current I18n.locale to every job during the serialization process. It is then restored during deserialization and used to perform the job with the correct locale. It falls back to the default locale if no serialized locale is found in order to provide backward compatibility with previously stored jobs. It is not necessary to clear the queue for the update.
88 lines
2.6 KiB
Ruby
88 lines
2.6 KiB
Ruby
require 'helper'
|
|
require 'jobs/logging_job'
|
|
require 'jobs/hello_job'
|
|
require 'active_support/core_ext/numeric/time'
|
|
|
|
class QueuingTest < ActiveSupport::TestCase
|
|
test 'should run jobs enqueued on a listening queue' do
|
|
TestJob.perform_later @id
|
|
wait_for_jobs_to_finish_for(5.seconds)
|
|
assert job_executed
|
|
end
|
|
|
|
test 'should not run jobs queued on a non-listening queue' do
|
|
skip if adapter_is?(:inline, :sucker_punch, :que)
|
|
old_queue = TestJob.queue_name
|
|
|
|
begin
|
|
TestJob.queue_as :some_other_queue
|
|
TestJob.perform_later @id
|
|
wait_for_jobs_to_finish_for(2.seconds)
|
|
assert_not job_executed
|
|
ensure
|
|
TestJob.queue_name = old_queue
|
|
end
|
|
end
|
|
|
|
test 'should supply a wrapped class name to Sidekiq' do
|
|
skip unless adapter_is?(:sidekiq)
|
|
Sidekiq::Testing.fake! do
|
|
::HelloJob.perform_later
|
|
hash = ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper.jobs.first
|
|
assert_equal "ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper", hash['class']
|
|
assert_equal "HelloJob", hash['wrapped']
|
|
end
|
|
end
|
|
|
|
test 'should not run job enqueued in the future' do
|
|
begin
|
|
TestJob.set(wait: 10.minutes).perform_later @id
|
|
wait_for_jobs_to_finish_for(5.seconds)
|
|
assert_not job_executed
|
|
rescue NotImplementedError
|
|
skip
|
|
end
|
|
end
|
|
|
|
test 'should run job enqueued in the future at the specified time' do
|
|
begin
|
|
TestJob.set(wait: 5.seconds).perform_later @id
|
|
wait_for_jobs_to_finish_for(2.seconds)
|
|
assert_not job_executed
|
|
wait_for_jobs_to_finish_for(10.seconds)
|
|
assert job_executed
|
|
rescue NotImplementedError
|
|
skip
|
|
end
|
|
end
|
|
|
|
test 'should supply a provider_job_id when available for immediate jobs' do
|
|
skip unless adapter_is?(:delayed_job, :sidekiq, :qu, :que)
|
|
test_job = TestJob.perform_later @id
|
|
refute test_job.provider_job_id.nil?, 'Provider job id should be set by provider'
|
|
end
|
|
|
|
test 'should supply a provider_job_id when available for delayed jobs' do
|
|
skip unless adapter_is?(:delayed_job, :sidekiq, :que)
|
|
delayed_test_job = TestJob.set(wait: 1.minute).perform_later @id
|
|
refute delayed_test_job.provider_job_id.nil?,
|
|
'Provider job id should by set for delayed jobs by provider'
|
|
end
|
|
|
|
test 'current locale is kept while running perform_later' do
|
|
skip if adapter_is?(:inline)
|
|
|
|
begin
|
|
I18n.available_locales = [:en, :de]
|
|
I18n.locale = :de
|
|
|
|
TestJob.perform_later @id
|
|
wait_for_jobs_to_finish_for(5.seconds)
|
|
assert job_executed
|
|
assert_equal 'de', job_output
|
|
ensure
|
|
I18n.available_locales = [:en]
|
|
I18n.locale = :en
|
|
end
|
|
end
|
|
end
|