From ec1630148853c46a1e3b35cd48bf85aa0e049d81 Mon Sep 17 00:00:00 2001
From: Kevin Deisz <kevin.deisz@gmail.com>
Date: Wed, 15 Aug 2018 15:00:40 -0400
Subject: Allow `perform_enqueued_jobs` to be called without a block.

Performs all of the jobs that have been enqueued up to this point in the test.
---
 activejob/CHANGELOG.md                   |  6 ++++++
 activejob/lib/active_job/test_helper.rb  | 27 +++++++++++++++++++++------
 activejob/test/cases/test_helper_test.rb | 20 ++++++++++++++++++--
 3 files changed, 45 insertions(+), 8 deletions(-)

(limited to 'activejob')

diff --git a/activejob/CHANGELOG.md b/activejob/CHANGELOG.md
index 8526741383..8c4a74f739 100644
--- a/activejob/CHANGELOG.md
+++ b/activejob/CHANGELOG.md
@@ -1,3 +1,9 @@
+*   Allow `perform_enqueued_jobs` to be called without a block.
+
+    Performs all of the jobs that have been enqueued up to this point in the test.
+
+    *Kevin Deisz*
+
 *   Move `enqueue`/`enqueue_at` notifications to an around callback.
 
     Improves timing accuracy over the old after callback by including
diff --git a/activejob/lib/active_job/test_helper.rb b/activejob/lib/active_job/test_helper.rb
index 04cde28a96..e9b1d5c6fc 100644
--- a/activejob/lib/active_job/test_helper.rb
+++ b/activejob/lib/active_job/test_helper.rb
@@ -117,12 +117,12 @@ module ActiveJob
     #   end
     def assert_enqueued_jobs(number, only: nil, except: nil, queue: nil)
       if block_given?
-        original_count = enqueued_jobs_size(only: only, except: except, queue: queue)
+        original_count = enqueued_jobs_with(only: only, except: except, queue: queue)
         yield
-        new_count = enqueued_jobs_size(only: only, except: except, queue: queue)
+        new_count = enqueued_jobs_with(only: only, except: except, queue: queue)
         assert_equal number, new_count - original_count, "#{number} jobs expected, but #{new_count - original_count} were enqueued"
       else
-        actual_count = enqueued_jobs_size(only: only, except: except, queue: queue)
+        actual_count = enqueued_jobs_with(only: only, except: except, queue: queue)
         assert_equal number, actual_count, "#{number} jobs expected, but #{actual_count} were enqueued"
       end
     end
@@ -362,7 +362,9 @@ module ActiveJob
       instantiate_job(matching_job)
     end
 
-    # Performs all enqueued jobs in the duration of the block.
+    # Performs all enqueued jobs. If a block is given, performs all of the jobs
+    # that were enqueued throughout the duration of the block. If a block is
+    # not given, performs all of the enqueued jobs up to this point in the test.
     #
     #   def test_perform_enqueued_jobs
     #     perform_enqueued_jobs do
@@ -405,7 +407,8 @@ module ActiveJob
         queue_adapter.perform_enqueued_at_jobs = true
         queue_adapter.filter = only
         queue_adapter.reject = except
-        yield
+
+        block_given? ? yield : flush_enqueued_jobs(only: only, except: except)
       ensure
         queue_adapter.perform_enqueued_jobs = old_perform_enqueued_jobs
         queue_adapter.perform_enqueued_at_jobs = old_perform_enqueued_at_jobs
@@ -432,10 +435,12 @@ module ActiveJob
         performed_jobs.clear
       end
 
-      def enqueued_jobs_size(only: nil, except: nil, queue: nil)
+      def enqueued_jobs_with(only: nil, except: nil, queue: nil)
         validate_option(only: only, except: except)
+
         enqueued_jobs.count do |job|
           job_class = job.fetch(:job)
+
           if only
             next false unless Array(only).include?(job_class)
           elsif except
@@ -444,10 +449,20 @@ module ActiveJob
           if queue
             next false unless queue.to_s == job.fetch(:queue, job_class.queue_name)
           end
+
+          yield job if block_given?
           true
         end
       end
 
+      def flush_enqueued_jobs(only: nil, except: nil)
+        enqueued_jobs_with(only: only, except: except) do |payload|
+          args = ActiveJob::Arguments.deserialize(payload[:args])
+          instantiate_job(payload.merge(args: args)).perform_now
+          queue_adapter.performed_jobs << payload
+        end
+      end
+
       def serialize_args_for_assertion(args)
         args.dup.tap do |serialized_args|
           serialized_args[:args] = ActiveJob::Arguments.serialize(serialized_args[:args]) if serialized_args[:args]
diff --git a/activejob/test/cases/test_helper_test.rb b/activejob/test/cases/test_helper_test.rb
index d0a21a5da3..53b332f6e3 100644
--- a/activejob/test/cases/test_helper_test.rb
+++ b/activejob/test/cases/test_helper_test.rb
@@ -610,7 +610,7 @@ class EnqueuedJobsTest < ActiveJob::TestCase
 end
 
 class PerformedJobsTest < ActiveJob::TestCase
-  def test_performed_enqueue_jobs_with_only_option_doesnt_leak_outside_the_block
+  def test_perform_enqueued_jobs_with_only_option_doesnt_leak_outside_the_block
     assert_nil queue_adapter.filter
     perform_enqueued_jobs only: HelloJob do
       assert_equal HelloJob, queue_adapter.filter
@@ -618,7 +618,7 @@ class PerformedJobsTest < ActiveJob::TestCase
     assert_nil queue_adapter.filter
   end
 
-  def test_performed_enqueue_jobs_with_except_option_doesnt_leak_outside_the_block
+  def test_perform_enqueued_jobs_with_except_option_doesnt_leak_outside_the_block
     assert_nil queue_adapter.reject
     perform_enqueued_jobs except: HelloJob do
       assert_equal HelloJob, queue_adapter.reject
@@ -626,6 +626,22 @@ class PerformedJobsTest < ActiveJob::TestCase
     assert_nil queue_adapter.reject
   end
 
+  def test_perform_enqueued_jobs_without_block
+    HelloJob.perform_later("kevin")
+
+    assert_performed_jobs 1, only: HelloJob do
+      perform_enqueued_jobs
+    end
+  end
+
+  def test_perform_enqueued_jobs_without_block_respects_filter
+    HelloJob.perform_later("kevin")
+
+    assert_no_performed_jobs do
+      perform_enqueued_jobs only: LoggingJob
+    end
+  end
+
   def test_assert_performed_jobs
     assert_nothing_raised do
       assert_performed_jobs 1 do
-- 
cgit v1.2.3