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