1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
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")
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")
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 = 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
def setup_custom_queue
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")
end
test "a custom queue implementation can be provided" do
setup_custom_queue
assert_kind_of MyQueue, Rails.queue
job = 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
test "a custom consumer implementation can be provided" do
add_to_env_config "production", <<-RUBY
require "my_queue_consumer"
config.queue_consumer = MyQueueConsumer
RUBY
app_file "lib/my_queue_consumer.rb", <<-RUBY
class MyQueueConsumer < Rails::Queueing::ThreadedConsumer
attr_reader :started
def start
@started = true
self
end
end
RUBY
app("production")
assert_kind_of MyQueueConsumer, Rails.application.queue_consumer
assert Rails.application.queue_consumer.started
end
test "default consumer is not used with custom queue implementation" do
setup_custom_queue
assert_nil Rails.application.queue_consumer
end
end
end
|