From 3860e6b2bf486d8b27d433daab358dbc68ae3448 Mon Sep 17 00:00:00 2001 From: Johannes Opper Date: Tue, 7 Jul 2015 21:52:28 +0200 Subject: Fixes #20799 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. --- activejob/test/cases/job_serialization_test.rb | 16 ++++++++++++++++ activejob/test/cases/translation_test.rb | 20 ++++++++++++++++++++ activejob/test/integration/queuing_test.rb | 17 +++++++++++++++++ activejob/test/jobs/translated_hello_job.rb | 10 ++++++++++ .../test/support/integration/dummy_app_template.rb | 6 +++++- .../test/support/integration/test_case_helpers.rb | 4 ++++ 6 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 activejob/test/cases/translation_test.rb create mode 100644 activejob/test/jobs/translated_hello_job.rb (limited to 'activejob/test') diff --git a/activejob/test/cases/job_serialization_test.rb b/activejob/test/cases/job_serialization_test.rb index db22783030..e23380a7bf 100644 --- a/activejob/test/cases/job_serialization_test.rb +++ b/activejob/test/cases/job_serialization_test.rb @@ -12,4 +12,20 @@ class JobSerializationTest < ActiveSupport::TestCase GidJob.perform_later @person assert_equal "Person with ID: 5", JobBuffer.last_value end + + test 'serialize includes current locale' do + assert_equal :en, HelloJob.new.serialize['locale'] + end + + test 'deserialize sets locale' do + job = HelloJob.new + job.deserialize 'locale' => :es + assert_equal :es, job.locale + end + + test 'deserialize sets default locale' do + job = HelloJob.new + job.deserialize({}) + assert_equal :en, job.locale + end end diff --git a/activejob/test/cases/translation_test.rb b/activejob/test/cases/translation_test.rb new file mode 100644 index 0000000000..d5e3aaf9e3 --- /dev/null +++ b/activejob/test/cases/translation_test.rb @@ -0,0 +1,20 @@ +require 'helper' +require 'jobs/translated_hello_job' + +class TranslationTest < ActiveSupport::TestCase + setup do + JobBuffer.clear + I18n.available_locales = [:en, :de] + @job = TranslatedHelloJob.new('Johannes') + end + + teardown do + I18n.available_locales = [:en] + end + + test 'it performs the job in the given locale' do + @job.locale = :de + @job.perform_now + assert_equal "Johannes says Guten Tag", JobBuffer.last_value + end +end diff --git a/activejob/test/integration/queuing_test.rb b/activejob/test/integration/queuing_test.rb index d345092dee..e1634972d1 100644 --- a/activejob/test/integration/queuing_test.rb +++ b/activejob/test/integration/queuing_test.rb @@ -68,4 +68,21 @@ class QueuingTest < ActiveSupport::TestCase 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 diff --git a/activejob/test/jobs/translated_hello_job.rb b/activejob/test/jobs/translated_hello_job.rb new file mode 100644 index 0000000000..9657cd3f54 --- /dev/null +++ b/activejob/test/jobs/translated_hello_job.rb @@ -0,0 +1,10 @@ +require_relative '../support/job_buffer' + +class TranslatedHelloJob < ActiveJob::Base + def perform(greeter = "David") + translations = { en: 'Hello', de: 'Guten Tag' } + hello = translations[I18n.locale] + + JobBuffer.add("#{greeter} says #{hello}") + end +end diff --git a/activejob/test/support/integration/dummy_app_template.rb b/activejob/test/support/integration/dummy_app_template.rb index 09a68738ad..4ffdb8cffa 100644 --- a/activejob/test/support/integration/dummy_app_template.rb +++ b/activejob/test/support/integration/dummy_app_template.rb @@ -8,13 +8,17 @@ require "#{File.expand_path("../jobs_manager.rb", __FILE__)}" JobsManager.current_manager.setup CODE +initializer 'i18n.rb', <<-CODE +I18n.available_locales = [:en, :de] +CODE + file 'app/jobs/test_job.rb', <<-CODE class TestJob < ActiveJob::Base queue_as :integration_tests def perform(x) File.open(Rails.root.join("tmp/\#{x}"), "w+") do |f| - f.write x + f.write I18n.locale end end end diff --git a/activejob/test/support/integration/test_case_helpers.rb b/activejob/test/support/integration/test_case_helpers.rb index 7e87ede275..39aee6d407 100644 --- a/activejob/test/support/integration/test_case_helpers.rb +++ b/activejob/test/support/integration/test_case_helpers.rb @@ -45,4 +45,8 @@ module TestCaseHelpers def job_executed Dummy::Application.root.join("tmp/#{@id}").exist? end + + def job_output + File.read Dummy::Application.root.join("tmp/#{@id}") + end end -- cgit v1.2.3 From a7fcb0e50a47d13e042f4fdc83da381d0c8a8825 Mon Sep 17 00:00:00 2001 From: Kasper Timm Hansen Date: Wed, 5 Aug 2015 21:55:42 +0200 Subject: Add missing HelloJob require. This way JobSerializationTest runs in isolation without errors. --- activejob/test/cases/job_serialization_test.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'activejob/test') diff --git a/activejob/test/cases/job_serialization_test.rb b/activejob/test/cases/job_serialization_test.rb index e23380a7bf..229517774e 100644 --- a/activejob/test/cases/job_serialization_test.rb +++ b/activejob/test/cases/job_serialization_test.rb @@ -1,5 +1,6 @@ require 'helper' require 'jobs/gid_job' +require 'jobs/hello_job' require 'models/person' class JobSerializationTest < ActiveSupport::TestCase -- cgit v1.2.3 From b6d3a478fa22365207637454e0ac5c805a67af06 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Thu, 23 Jul 2015 18:45:07 -0400 Subject: Make assert_enqueued_with and assert_performed_with returns the matched job --- activejob/test/cases/test_helper_test.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'activejob/test') diff --git a/activejob/test/cases/test_helper_test.rb b/activejob/test/cases/test_helper_test.rb index 04c4c446e2..8c60f037d2 100644 --- a/activejob/test/cases/test_helper_test.rb +++ b/activejob/test/cases/test_helper_test.rb @@ -165,6 +165,17 @@ class EnqueuedJobsTest < ActiveJob::TestCase end end + def test_assert_enqueued_job_returns + job = assert_enqueued_with(job: LoggingJob) do + LoggingJob.set(wait_until: 5.minutes.from_now).perform_later(1, 2, 3) + end + + assert_instance_of LoggingJob, job + assert_in_delta 5.minutes.from_now, job.scheduled_at, 1 + assert_equal 'default', job.queue_name + assert_equal [1, 2, 3], job.arguments + end + def test_assert_enqueued_job_failure assert_raise ActiveSupport::TestCase::Assertion do assert_enqueued_with(job: LoggingJob, queue: 'default') do @@ -397,6 +408,17 @@ class PerformedJobsTest < ActiveJob::TestCase end end + def test_assert_performed_job_returns + job = assert_performed_with(job: NestedJob, queue: 'default') do + NestedJob.perform_later + end + + assert_instance_of NestedJob, job + assert_nil job.scheduled_at + assert_equal [], job.arguments + assert_equal 'default', job.queue_name + end + def test_assert_performed_job_failure assert_raise ActiveSupport::TestCase::Assertion do assert_performed_with(job: LoggingJob, at: Date.tomorrow.noon, queue: 'default') do -- cgit v1.2.3 From 48a183ecb9992723a0b7dc8eee1c4bd41cf8d921 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Thu, 13 Aug 2015 09:20:39 +0200 Subject: use `assert_not` instead of `refute` as mentioned in our guides. As described in the "Follow Coding Conventions" section in our contribution guide (http://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#follow-the-coding-conventions) we favor `assert_not` over `refute`. While we don't usually make stylistic changes on it's own I opted to do it in this case. The reason being that test cases are usually copied as a starting point for new tests. This results in a spread of `refute` in files that have been using it already. --- activejob/test/integration/queuing_test.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'activejob/test') diff --git a/activejob/test/integration/queuing_test.rb b/activejob/test/integration/queuing_test.rb index e1634972d1..1d1e675435 100644 --- a/activejob/test/integration/queuing_test.rb +++ b/activejob/test/integration/queuing_test.rb @@ -59,14 +59,13 @@ class QueuingTest < ActiveSupport::TestCase 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' + assert test_job.provider_job_id, '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' + assert delayed_test_job.provider_job_id, 'Provider job id should by set for delayed jobs by provider' end test 'current locale is kept while running perform_later' do -- cgit v1.2.3 From 68e3279163d06e6b04e043f91c9470e9259bbbe0 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Thu, 13 Aug 2015 09:56:06 +0200 Subject: implement `provider_job_id` for `queue_classic`. The latest, currently unreleased, version of queue_classic is required for this to work. See https://github.com/QueueClassic/queue_classic/pull/262 for more details. --- activejob/test/integration/queuing_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'activejob/test') diff --git a/activejob/test/integration/queuing_test.rb b/activejob/test/integration/queuing_test.rb index 1d1e675435..ca8047ef0b 100644 --- a/activejob/test/integration/queuing_test.rb +++ b/activejob/test/integration/queuing_test.rb @@ -57,13 +57,13 @@ class QueuingTest < ActiveSupport::TestCase end test 'should supply a provider_job_id when available for immediate jobs' do - skip unless adapter_is?(:delayed_job, :sidekiq, :qu, :que) + skip unless adapter_is?(:delayed_job, :sidekiq, :qu, :que, :queue_classic) test_job = TestJob.perform_later @id assert test_job.provider_job_id, '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) + skip unless adapter_is?(:delayed_job, :sidekiq, :que, :queue_classic) delayed_test_job = TestJob.set(wait: 1.minute).perform_later @id assert delayed_test_job.provider_job_id, 'Provider job id should by set for delayed jobs by provider' end -- cgit v1.2.3 From e875273ebc4c7b63ca2b8dbb1d837a57f215d91c Mon Sep 17 00:00:00 2001 From: "yuuji.yaginuma" Date: Sat, 15 Aug 2015 22:41:46 +0900 Subject: use `average_scheduled_poll_interval` option instead of deprecated `poll_interval` this removes the following warning: ``` DEPRECATION: `config.poll_interval = 0.5` will be removed in Sidekiq 4. Please update to `config.average_scheduled_poll_interval = 0.5`. ``` --- activejob/test/support/integration/adapters/sidekiq.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activejob/test') diff --git a/activejob/test/support/integration/adapters/sidekiq.rb b/activejob/test/support/integration/adapters/sidekiq.rb index 4988cdb33f..d9938600f2 100644 --- a/activejob/test/support/integration/adapters/sidekiq.rb +++ b/activejob/test/support/integration/adapters/sidekiq.rb @@ -57,7 +57,7 @@ module SidekiqJobsManager concurrency: 1, timeout: 1, }) - Sidekiq.poll_interval = 0.5 + Sidekiq.average_scheduled_poll_interval = 0.5 Sidekiq::Scheduled.const_set :INITIAL_WAIT, 1 begin sidekiq.run -- cgit v1.2.3