aboutsummaryrefslogblamecommitdiffstats
path: root/railties/test/application/queue_test.rb
blob: ec809d7cc1085426a4fa99ebfd9658f7912da5bf (plain) (tree)



























                                                                        

                                                                    

















































                                                                                              
                                         
































                                                           
require 'isolation/abstract_unit'
require 'rack/test'

module ApplicationTests
  class GeneratorsTest < ActiveSupport::TestCase
    include ActiveSupport::Testing::Isolation

    def setup
      build_app
      boot_rails
    end

    def teardown
      teardown_app
    end

    def app_const
      @app_const ||= Class.new(Rails::Application)
    end

    test "the queue is a TestQueue in test mode" do
      app("test")
      assert_kind_of Rails::Queueing::TestQueue, Rails.application.queue
      assert_kind_of Rails::Queueing::TestQueue, Rails.queue
    end

    test "the queue is a Queue in development mode" do
      app("development")
      assert_kind_of Rails::Queueing::Queue, Rails.application.queue
      assert_kind_of Rails::Queueing::Queue, Rails.queue
    end

    test "in development mode, an enqueued job will be processed in a separate thread" do
      app("development")
      current = Thread.current

      job = Struct.new(:origin, :target).new(Thread.current)
      def job.run
        self.target = Thread.current
      end

      Rails.queue.push job
      sleep 0.1

      assert job.target, "The job was run"
      assert_not_equal job.origin, job.target
    end

    test "in test mode, explicitly draining the queue will process it in a separate thread" do
      app("test")
      current = Thread.current

      job = Struct.new(:origin, :target).new(Thread.current)
      def job.run
        self.target = Thread.current
      end

      Rails.queue.push job
      Rails.queue.drain

      assert job.target, "The job was run"
      assert_not_equal job.origin, job.target
    end

    test "in test mode, the queue can be observed" do
      app("test")

      job = Class.new(Struct.new(:id)) do
        def run
        end
      end

      jobs = (1..10).map do |id|
        job.new(id)
      end

      jobs.each do |job|
        Rails.queue.push job
      end

      assert_equal jobs, Rails.queue.jobs
    end

    test "a custom queue implementation can be provided" do
      add_to_env_config "production", <<-RUBY
        require "my_queue"
        config.queue = MyQueue
      RUBY

      app_file "lib/my_queue.rb", <<-RUBY
        class MyQueue
          def push(job)
            job.run
          end
        end
      RUBY

      app("production")

      assert_kind_of MyQueue, Rails.queue

      job = Class.new(Struct.new(:id, :ran)) do
        def run
          self.ran = true
        end
      end

      job1 = job.new(1)
      Rails.queue.push job1

      assert_equal true, job1.ran
    end
  end
end