From 154057b4f7d8bcf37637ec7185ede3c4d0cd6583 Mon Sep 17 00:00:00 2001
From: Rosa Gutierrez <rosa.ge@gmail.com>
Date: Mon, 7 Jan 2019 14:36:56 +0100
Subject: Rewrite ActiveJob exception tests so it runs with the real adapters

Previously, by extending ActiveJob::TestCase, the test adapter provided
for tests was being used always, in all executions where supposedly
different adapters were being used. As a consequence, some bugs visible
only for some adapters might have gone undetected. This commit changes
that, skipping queue adapters for which we can't test scheduling jobs
with a delay.
---
 activejob/test/cases/exceptions_test.rb | 165 +++++++++++++++-----------------
 activejob/test/jobs/retry_job.rb        |   8 +-
 2 files changed, 85 insertions(+), 88 deletions(-)

diff --git a/activejob/test/cases/exceptions_test.rb b/activejob/test/cases/exceptions_test.rb
index cac48cb6cb..c88162bf58 100644
--- a/activejob/test/cases/exceptions_test.rb
+++ b/activejob/test/cases/exceptions_test.rb
@@ -4,30 +4,26 @@ require "helper"
 require "jobs/retry_job"
 require "models/person"
 
-class ExceptionsTest < ActiveJob::TestCase
+class ExceptionsTest < ActiveSupport::TestCase
   setup do
     JobBuffer.clear
-    skip if ActiveJob::Base.queue_adapter.is_a?(ActiveJob::QueueAdapters::InlineAdapter)
+    skip if adapter_skips_scheduling?(ActiveJob::Base.queue_adapter)
   end
 
   test "successfully retry job throwing exception against defaults" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "DefaultsError", 5
+    RetryJob.perform_later "DefaultsError", 5
 
-      assert_equal [
-        "Raised DefaultsError for the 1st time",
-        "Raised DefaultsError for the 2nd time",
-        "Raised DefaultsError for the 3rd time",
-        "Raised DefaultsError for the 4th time",
-        "Successfully completed job" ], JobBuffer.values
-    end
+    assert_equal [
+      "Raised DefaultsError for the 1st time",
+      "Raised DefaultsError for the 2nd time",
+      "Raised DefaultsError for the 3rd time",
+      "Raised DefaultsError for the 4th time",
+      "Successfully completed job" ], JobBuffer.values
   end
 
   test "successfully retry job throwing exception against higher limit" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "ShortWaitTenAttemptsError", 9
-      assert_equal 9, JobBuffer.values.count
-    end
+    RetryJob.perform_later "ShortWaitTenAttemptsError", 9
+    assert_equal 9, JobBuffer.values.count
   end
 
   test "keeps the same attempts counter for several exceptions listed in the same retry_on declaration" do
@@ -35,9 +31,7 @@ class ExceptionsTest < ActiveJob::TestCase
                              SecondRetryableErrorOfTwo SecondRetryableErrorOfTwo)
 
     assert_raises SecondRetryableErrorOfTwo do
-      perform_enqueued_jobs do
-        RetryJob.perform_later(exceptions_to_raise, 5)
-      end
+      RetryJob.perform_later(exceptions_to_raise, 5)
 
       assert_equal [
         "Raised FirstRetryableErrorOfTwo for the 1st time",
@@ -54,9 +48,7 @@ class ExceptionsTest < ActiveJob::TestCase
                              FirstRetryableErrorOfTwo FirstRetryableErrorOfTwo FirstRetryableErrorOfTwo)
 
     assert_nothing_raised do
-      perform_enqueued_jobs do
-        RetryJob.perform_later(exceptions_to_raise, 10)
-      end
+      RetryJob.perform_later(exceptions_to_raise, 10)
 
       assert_equal [
         "Raised DefaultsError for the 1st time",
@@ -72,108 +64,107 @@ class ExceptionsTest < ActiveJob::TestCase
   end
 
   test "failed retry job when exception kept occurring against defaults" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "DefaultsError", 6
-      assert_equal "Raised DefaultsError for the 5th time", JobBuffer.last_value
-    rescue DefaultsError
-      pass
-    end
+    RetryJob.perform_later "DefaultsError", 6
+    assert_equal "Raised DefaultsError for the 5th time", JobBuffer.last_value
+  rescue DefaultsError
+    pass
   end
 
   test "failed retry job when exception kept occurring against higher limit" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "ShortWaitTenAttemptsError", 11
-      assert_equal "Raised ShortWaitTenAttemptsError for the 10th time", JobBuffer.last_value
-    rescue ShortWaitTenAttemptsError
-      pass
-    end
+    RetryJob.perform_later "ShortWaitTenAttemptsError", 11
+    assert_equal "Raised ShortWaitTenAttemptsError for the 10th time", JobBuffer.last_value
+  rescue ShortWaitTenAttemptsError
+    pass
   end
 
   test "discard job" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "DiscardableError", 2
-      assert_equal "Raised DiscardableError for the 1st time", JobBuffer.last_value
-    end
+    RetryJob.perform_later "DiscardableError", 2
+    assert_equal "Raised DiscardableError for the 1st time", JobBuffer.last_value
   end
 
   test "custom handling of discarded job" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "CustomDiscardableError", 2
-      assert_equal "Dealt with a job that was discarded in a custom way. Message: CustomDiscardableError", JobBuffer.last_value
-    end
+    RetryJob.perform_later "CustomDiscardableError", 2
+    assert_equal "Dealt with a job that was discarded in a custom way. Message: CustomDiscardableError", JobBuffer.last_value
   end
 
   test "custom handling of job that exceeds retry attempts" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "CustomCatchError", 6
-      assert_equal "Dealt with a job that failed to retry in a custom way after 6 attempts. Message: CustomCatchError", JobBuffer.last_value
-    end
+    RetryJob.perform_later "CustomCatchError", 6
+    assert_equal "Dealt with a job that failed to retry in a custom way after 6 attempts. Message: CustomCatchError", JobBuffer.last_value
   end
 
   test "long wait job" do
     travel_to Time.now
 
-    perform_enqueued_jobs do
-      assert_performed_with at: (Time.now + 3600.seconds).to_i do
-        RetryJob.perform_later "LongWaitError", 5
-      end
-    end
+    RetryJob.perform_later "LongWaitError", 2, :log_scheduled_at
+
+    assert_equal [
+      "Raised LongWaitError for the 1st time",
+      "Next execution scheduled at #{(Time.now + 3600.seconds).to_f}",
+      "Successfully completed job"
+    ], JobBuffer.values
   end
 
   test "exponentially retrying job" do
     travel_to Time.now
 
-    perform_enqueued_jobs do
-      assert_performed_with at: (Time.now + 3.seconds).to_i do
-        assert_performed_with at: (Time.now + 18.seconds).to_i do
-          assert_performed_with at: (Time.now + 83.seconds).to_i do
-            assert_performed_with at: (Time.now + 258.seconds).to_i do
-              RetryJob.perform_later "ExponentialWaitTenAttemptsError", 5
-            end
-          end
-        end
-      end
-    end
+    RetryJob.perform_later "ExponentialWaitTenAttemptsError", 5, :log_scheduled_at
+
+    assert_equal [
+      "Raised ExponentialWaitTenAttemptsError for the 1st time",
+      "Next execution scheduled at #{(Time.now + 3.seconds).to_f}",
+      "Raised ExponentialWaitTenAttemptsError for the 2nd time",
+      "Next execution scheduled at #{(Time.now + 18.seconds).to_f}",
+      "Raised ExponentialWaitTenAttemptsError for the 3rd time",
+      "Next execution scheduled at #{(Time.now + 83.seconds).to_f}",
+      "Raised ExponentialWaitTenAttemptsError for the 4th time",
+      "Next execution scheduled at #{(Time.now + 258.seconds).to_f}",
+      "Successfully completed job"
+    ], JobBuffer.values
   end
 
   test "custom wait retrying job" do
     travel_to Time.now
 
-    perform_enqueued_jobs do
-      assert_performed_with at: (Time.now + 2.seconds).to_i do
-        assert_performed_with at: (Time.now + 4.seconds).to_i do
-          assert_performed_with at: (Time.now + 6.seconds).to_i do
-            assert_performed_with at: (Time.now + 8.seconds).to_i do
-              RetryJob.perform_later "CustomWaitTenAttemptsError", 5
-            end
-          end
-        end
-      end
-    end
+    RetryJob.perform_later "CustomWaitTenAttemptsError", 5, :log_scheduled_at
+
+    assert_equal [
+      "Raised CustomWaitTenAttemptsError for the 1st time",
+      "Next execution scheduled at #{(Time.now + 2.seconds).to_f}",
+      "Raised CustomWaitTenAttemptsError for the 2nd time",
+      "Next execution scheduled at #{(Time.now + 4.seconds).to_f}",
+      "Raised CustomWaitTenAttemptsError for the 3rd time",
+      "Next execution scheduled at #{(Time.now + 6.seconds).to_f}",
+      "Raised CustomWaitTenAttemptsError for the 4th time",
+      "Next execution scheduled at #{(Time.now + 8.seconds).to_f}",
+      "Successfully completed job"
+    ], JobBuffer.values
   end
 
   test "successfully retry job throwing one of two retryable exceptions" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "SecondRetryableErrorOfTwo", 3
+    RetryJob.perform_later "SecondRetryableErrorOfTwo", 3
 
-      assert_equal [
-        "Raised SecondRetryableErrorOfTwo for the 1st time",
-        "Raised SecondRetryableErrorOfTwo for the 2nd time",
-        "Successfully completed job" ], JobBuffer.values
-    end
+    assert_equal [
+      "Raised SecondRetryableErrorOfTwo for the 1st time",
+      "Raised SecondRetryableErrorOfTwo for the 2nd time",
+      "Successfully completed job" ], JobBuffer.values
   end
 
   test "discard job throwing one of two discardable exceptions" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later "SecondDiscardableErrorOfTwo", 2
-      assert_equal [ "Raised SecondDiscardableErrorOfTwo for the 1st time" ], JobBuffer.values
-    end
+    RetryJob.perform_later "SecondDiscardableErrorOfTwo", 2
+    assert_equal [ "Raised SecondDiscardableErrorOfTwo for the 1st time" ], JobBuffer.values
   end
 
   test "successfully retry job throwing DeserializationError" do
-    perform_enqueued_jobs do
-      RetryJob.perform_later Person.new(404), 5
-      assert_equal ["Raised ActiveJob::DeserializationError for the 5 time"], JobBuffer.values
-    end
+    RetryJob.perform_later Person.new(404), 5
+    assert_equal ["Raised ActiveJob::DeserializationError for the 5 time"], JobBuffer.values
   end
+
+  private
+    def adapter_skips_scheduling?(queue_adapter)
+      [
+        ActiveJob::QueueAdapters::InlineAdapter,
+        ActiveJob::QueueAdapters::AsyncAdapter,
+        ActiveJob::QueueAdapters::SneakersAdapter
+      ].include?(queue_adapter.class)
+    end
 end
diff --git a/activejob/test/jobs/retry_job.rb b/activejob/test/jobs/retry_job.rb
index 3b0dce1a3c..112d672006 100644
--- a/activejob/test/jobs/retry_job.rb
+++ b/activejob/test/jobs/retry_job.rb
@@ -30,7 +30,13 @@ class RetryJob < ActiveJob::Base
   discard_on FirstDiscardableErrorOfTwo, SecondDiscardableErrorOfTwo
   discard_on(CustomDiscardableError) { |job, error| JobBuffer.add("Dealt with a job that was discarded in a custom way. Message: #{error.message}") }
 
-  def perform(raising, attempts)
+  before_enqueue do |job|
+    if job.arguments.include?(:log_scheduled_at) && job.scheduled_at
+      JobBuffer.add("Next execution scheduled at #{job.scheduled_at}")
+    end
+  end
+
+  def perform(raising, attempts, *)
     raising = raising.shift if raising.is_a?(Array)
     if raising && executions < attempts
       JobBuffer.add("Raised #{raising} for the #{executions.ordinalize} time")
-- 
cgit v1.2.3