resque-approve 0.0.4 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/lib/resque-approve.rb +1 -0
- data/lib/resque/approve_server.rb +12 -1
- data/lib/resque/plugins/approve.rb +45 -1
- data/lib/resque/plugins/approve/approval_key_list.rb +1 -1
- data/lib/resque/plugins/approve/auto_approve_next.rb +38 -0
- data/lib/resque/plugins/approve/pending_job.rb +94 -28
- data/lib/resque/plugins/approve/pending_job_queue.rb +31 -1
- data/lib/resque/plugins/version.rb +1 -1
- data/lib/resque/server/views/_approval_key_rows.erb +4 -1
- data/lib/resque/server/views/approval_keys.erb +6 -0
- data/lib/resque/server/views/job_details.erb +3 -0
- data/lib/resque/server/views/job_list.erb +27 -13
- data/spec/approve/pending_job_queue_spec.rb +80 -2
- data/spec/approve/pending_job_spec.rb +222 -6
- data/spec/approve_spec.rb +53 -0
- data/spec/examples.txt +181 -149
- data/spec/server/views/job_list.erb_spec.rb +12 -0
- data/spec/support/jobs/default_approval_queue_job.rb +5 -0
- data/spec/support/jobs/max_active_job.rb +5 -0
- metadata +16 -26
@@ -28,6 +28,9 @@
|
|
28
28
|
order_param("num_jobs", @sort_by, @sort_order) }.to_param %>">
|
29
29
|
Pending Jobs
|
30
30
|
</a></th>
|
31
|
+
<th>
|
32
|
+
Num Running
|
33
|
+
</th>
|
31
34
|
<th><a href="<%= u("approve") %>?<%=
|
32
35
|
{ sort: "first_enqueued",
|
33
36
|
page_size: @page_size,
|
@@ -64,3 +67,6 @@
|
|
64
67
|
</div>
|
65
68
|
<div class="approve_reset"/>
|
66
69
|
<br/>
|
70
|
+
<div>
|
71
|
+
Approval v<%= VERSION %>
|
72
|
+
</div>
|
@@ -12,6 +12,10 @@
|
|
12
12
|
</a>
|
13
13
|
</p>
|
14
14
|
|
15
|
+
<p>
|
16
|
+
Num active jobs in this queue = <%= pending_queue.num_running %>
|
17
|
+
</p>
|
18
|
+
|
15
19
|
<% if pending_queue.paused? %>
|
16
20
|
<p>
|
17
21
|
Paused. Skipped <%= pending_queue.num_ignored %> resume actions.
|
@@ -39,23 +43,16 @@
|
|
39
43
|
|
40
44
|
<br/>
|
41
45
|
|
46
|
+
<form method="POST" action="<%= u("approve/reset_running") %>?<%=
|
47
|
+
{ approval_key: pending_queue.approval_key }.to_param %>">
|
48
|
+
<input type="submit" name="" value="Reset Running"/>
|
49
|
+
</form>
|
50
|
+
|
42
51
|
<form method="POST" action="<%= u("approve/delete_queue") %>?<%=
|
43
52
|
{ approval_key: pending_queue.approval_key }.to_param %>">
|
44
53
|
<input type="submit" name="" value="Delete All"/>
|
45
54
|
</form>
|
46
55
|
|
47
|
-
<% if pending_queue.paused? %>
|
48
|
-
<form method="POST" action="<%= u("approve/resume") %>?<%=
|
49
|
-
{ approval_key: pending_queue.approval_key }.to_param %>">
|
50
|
-
<input type="submit" name="" value="Resume"/>
|
51
|
-
</form>
|
52
|
-
<% else %>
|
53
|
-
<form method="POST" action="<%= u("approve/pause") %>?<%=
|
54
|
-
{ approval_key: pending_queue.approval_key }.to_param %>">
|
55
|
-
<input type="submit" name="" value="Pause"/>
|
56
|
-
</form>
|
57
|
-
<% end %>
|
58
|
-
|
59
56
|
<form method="POST" action="<%= u("approve/delete_one_queue") %>?<%=
|
60
57
|
{ approval_key: pending_queue.approval_key }.to_param %>">
|
61
58
|
<input type="submit" name="" value="Delete One"/>
|
@@ -72,5 +69,22 @@
|
|
72
69
|
</form>
|
73
70
|
<% end %>
|
74
71
|
|
72
|
+
<% if pending_queue.paused? %>
|
73
|
+
<form method="POST" action="<%= u("approve/resume") %>?<%=
|
74
|
+
{ approval_key: pending_queue.approval_key }.to_param %>">
|
75
|
+
<input type="submit" name="" value="Resume"/>
|
76
|
+
</form>
|
77
|
+
<% else %>
|
78
|
+
<form method="POST" action="<%= u("approve/pause") %>?<%=
|
79
|
+
{ approval_key: pending_queue.approval_key }.to_param %>">
|
80
|
+
<input type="submit" name="" value="Pause"/>
|
81
|
+
</form>
|
82
|
+
<% end %>
|
83
|
+
|
75
84
|
<div class="approve_reset"/>
|
76
|
-
<br/>
|
85
|
+
<br/>
|
86
|
+
<div>
|
87
|
+
<p>
|
88
|
+
Approval v<%= VERSION %>
|
89
|
+
</p>
|
90
|
+
</div>
|
@@ -123,6 +123,33 @@ RSpec.describe Resque::Plugins::Approve::PendingJobQueue do
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
|
126
|
+
describe "approve_num" do
|
127
|
+
it "enqueues the first x jobs" do
|
128
|
+
job_queue.approve_num 3
|
129
|
+
|
130
|
+
expect(Resque).to have_received(:enqueue_to).with "Some_Queue", BasicJob, 0
|
131
|
+
expect(Resque).to have_received(:enqueue_to).with "Some_Queue", BasicJob, 1
|
132
|
+
expect(Resque).to have_received(:enqueue_to).with "Some_Queue", BasicJob, 2
|
133
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 3
|
134
|
+
|
135
|
+
expect(job_queue.jobs).not_to be_include jobs[0]
|
136
|
+
expect(job_queue.num_jobs).to eq 1
|
137
|
+
end
|
138
|
+
|
139
|
+
it "does not enqueues the first x jobs if paused" do
|
140
|
+
job_queue.pause
|
141
|
+
job_queue.approve_num 3
|
142
|
+
|
143
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 0
|
144
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 1
|
145
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 2
|
146
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 3
|
147
|
+
|
148
|
+
expect(job_queue.jobs).to be_include jobs[0]
|
149
|
+
expect(job_queue.num_jobs).to eq 4
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
126
153
|
describe "pop_job" do
|
127
154
|
it "enqueues the last job" do
|
128
155
|
job_queue.pop_job
|
@@ -190,7 +217,7 @@ RSpec.describe Resque::Plugins::Approve::PendingJobQueue do
|
|
190
217
|
expect(job_queue.num_jobs).to eq 3
|
191
218
|
end
|
192
219
|
|
193
|
-
it "removes the first job" do
|
220
|
+
it "removes the first job if paused" do
|
194
221
|
job_queue.pause
|
195
222
|
job_queue.remove_one
|
196
223
|
|
@@ -204,6 +231,37 @@ RSpec.describe Resque::Plugins::Approve::PendingJobQueue do
|
|
204
231
|
end
|
205
232
|
end
|
206
233
|
|
234
|
+
describe "remove_num" do
|
235
|
+
it "removes the first x jobs" do
|
236
|
+
job_queue.remove_num 3
|
237
|
+
|
238
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 0
|
239
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 1
|
240
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 2
|
241
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 3
|
242
|
+
|
243
|
+
expect(job_queue.jobs).not_to be_include jobs[0]
|
244
|
+
expect(job_queue.jobs).not_to be_include jobs[1]
|
245
|
+
expect(job_queue.jobs).not_to be_include jobs[2]
|
246
|
+
expect(job_queue.num_jobs).to eq 1
|
247
|
+
end
|
248
|
+
|
249
|
+
it "removes the first x jobs if paused" do
|
250
|
+
job_queue.pause
|
251
|
+
job_queue.remove_num 3
|
252
|
+
|
253
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 0
|
254
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 1
|
255
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 2
|
256
|
+
expect(Resque).not_to have_received(:enqueue_to).with "Some_Queue", BasicJob, 3
|
257
|
+
|
258
|
+
expect(job_queue.jobs).not_to be_include jobs[0]
|
259
|
+
expect(job_queue.jobs).not_to be_include jobs[1]
|
260
|
+
expect(job_queue.jobs).not_to be_include jobs[2]
|
261
|
+
expect(job_queue.num_jobs).to eq 1
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
207
265
|
describe "remove_job_pop" do
|
208
266
|
it "removes the last job" do
|
209
267
|
job_queue.remove_job_pop
|
@@ -297,7 +355,7 @@ RSpec.describe Resque::Plugins::Approve::PendingJobQueue do
|
|
297
355
|
describe "first_enqueued" do
|
298
356
|
it "returns the time of the first enqueued item" do
|
299
357
|
4.times do |index|
|
300
|
-
expect(job_queue.first_enqueued).to be_within(
|
358
|
+
expect(job_queue.first_enqueued).to be_within(2.seconds).of((5 - index).hours.ago)
|
301
359
|
|
302
360
|
job_queue.remove_one
|
303
361
|
end
|
@@ -319,14 +377,34 @@ RSpec.describe Resque::Plugins::Approve::PendingJobQueue do
|
|
319
377
|
expect(job_queue).to be_paused
|
320
378
|
end
|
321
379
|
|
380
|
+
it "counts approvals while paused" do
|
381
|
+
expect(job_queue).not_to be_paused
|
382
|
+
job_queue.pause
|
383
|
+
expect(job_queue).to be_paused
|
384
|
+
job_queue.pause
|
385
|
+
expect(job_queue).to be_paused
|
386
|
+
|
387
|
+
job_queue.approve_num 8
|
388
|
+
job_queue.approve_one
|
389
|
+
expect(job_queue).to be_paused
|
390
|
+
expect(job_queue.num_ignored).to eq 9
|
391
|
+
end
|
392
|
+
|
322
393
|
it "can be resumed" do
|
323
394
|
expect(job_queue).not_to be_paused
|
324
395
|
job_queue.resume
|
325
396
|
expect(job_queue).not_to be_paused
|
326
397
|
job_queue.pause
|
327
398
|
expect(job_queue).to be_paused
|
399
|
+
|
400
|
+
job_queue.approve_num 8
|
401
|
+
job_queue.approve_one
|
402
|
+
expect(job_queue).to be_paused
|
403
|
+
expect(job_queue.num_ignored).to eq 9
|
404
|
+
|
328
405
|
job_queue.resume
|
329
406
|
expect(job_queue).not_to be_paused
|
407
|
+
expect(job_queue.num_ignored).to be_zero
|
330
408
|
end
|
331
409
|
end
|
332
410
|
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
|
3
3
|
require "rails_helper"
|
4
4
|
|
5
|
-
# rubocop:disable Layout/AlignHash
|
6
5
|
RSpec.describe Resque::Plugins::Approve::PendingJob do
|
7
6
|
let(:key_list) { Resque::Plugins::Approve::ApprovalKeyList.new }
|
8
7
|
let!(:key) { Faker::Lorem.sentence }
|
@@ -38,6 +37,20 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
38
37
|
|
39
38
|
job
|
40
39
|
end
|
40
|
+
let(:approval_require_approval_job) do
|
41
|
+
job = Resque::Plugins::Approve::PendingJob.new(SecureRandom.uuid, class_name: job_class, args: [requires_approval: true])
|
42
|
+
|
43
|
+
key_list.add_job(job)
|
44
|
+
|
45
|
+
job
|
46
|
+
end
|
47
|
+
let(:approval_hash_only_args_job) do
|
48
|
+
job = Resque::Plugins::Approve::PendingJob.new(SecureRandom.uuid, class_name: job_class, args: [some_hash: "hash", approval_key: key])
|
49
|
+
|
50
|
+
key_list.add_job(job)
|
51
|
+
|
52
|
+
job
|
53
|
+
end
|
41
54
|
let(:approval_no_hash_args_job) do
|
42
55
|
job = Resque::Plugins::Approve::PendingJob.new(SecureRandom.uuid,
|
43
56
|
class_name: job_class,
|
@@ -87,36 +100,58 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
87
100
|
describe "initialize" do
|
88
101
|
it "extracts delay arguments from job with no argument" do
|
89
102
|
expect(no_args_job.args).to eq []
|
103
|
+
expect(Resque::Plugins::Approve::PendingJob.new(no_args_job.id).args).to eq []
|
90
104
|
expect(no_args_job.approve_options).to eq({}.with_indifferent_access)
|
91
105
|
end
|
92
106
|
|
93
107
|
it "extracts delay arguments from job with no hash arguments" do
|
94
108
|
expect(no_hash_args_job.args).to eq [1, "fred", "something else", 888]
|
109
|
+
expect(Resque::Plugins::Approve::PendingJob.new(no_hash_args_job.id).args).to eq [1, "fred", "something else", 888]
|
95
110
|
expect(no_hash_args_job.approve_options).to eq({}.with_indifferent_access)
|
96
111
|
end
|
97
112
|
|
98
113
|
it "extracts delay arguments from job with no approval arguments" do
|
99
114
|
expect(hash_args_job.args).to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
115
|
+
expect(Resque::Plugins::Approve::PendingJob.new(hash_args_job.id).args).
|
116
|
+
to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
100
117
|
expect(hash_args_job.approve_options).to eq({}.with_indifferent_access)
|
101
118
|
end
|
102
119
|
|
103
120
|
it "extracts delay arguments from job with no argument and approval_args" do
|
104
121
|
expect(approval_only_args_job.args).to eq []
|
122
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_only_args_job.id).args).to eq []
|
105
123
|
expect(approval_only_args_job.approve_options).to eq("approval_key" => key)
|
106
124
|
end
|
107
125
|
|
126
|
+
it "extracts delay arguments from job with no argument and require_approval" do
|
127
|
+
expect(approval_require_approval_job.args).to eq []
|
128
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_require_approval_job.id).args).to eq []
|
129
|
+
expect(approval_require_approval_job.approve_options).to eq("approval_key" => "Some_Queue", "requires_approval" => true)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "extracts delay arguments from job with only hash arguments and approval_args" do
|
133
|
+
expect(approval_hash_only_args_job.args).to eq [{ "some_hash" => "hash" }]
|
134
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_hash_only_args_job.id).args).to eq [{ "some_hash" => "hash" }]
|
135
|
+
expect(approval_hash_only_args_job.approve_options).to eq("approval_key" => key)
|
136
|
+
end
|
137
|
+
|
108
138
|
it "extracts delay arguments from job with no hash arguments and approval args" do
|
109
139
|
expect(approval_no_hash_args_job.args).to eq [1, "fred", "something else", 888]
|
140
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_no_hash_args_job.id).args).to eq [1, "fred", "something else", 888]
|
110
141
|
expect(approval_no_hash_args_job.approve_options).to eq("approval_key" => key)
|
111
142
|
end
|
112
143
|
|
113
144
|
it "extracts delay arguments from job with no approval arguments and approval args" do
|
114
145
|
expect(approval_hash_args_job.args).to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
146
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_hash_args_job.id).args).
|
147
|
+
to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
115
148
|
expect(approval_hash_args_job.approve_options).to eq("approval_key" => key)
|
116
149
|
end
|
117
150
|
|
118
151
|
it "extracts all delay arguments from job with no approval arguments and approval args" do
|
119
152
|
expect(approval_all_args_job.args).to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
153
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_all_args_job.id).args).
|
154
|
+
to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
120
155
|
|
121
156
|
expect(approval_all_args_job.approve_options[:approval_key]).to eq key
|
122
157
|
expect(approval_all_args_job.approve_options["approval_key"]).to eq key
|
@@ -124,8 +159,8 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
124
159
|
expect(approval_all_args_job.approve_options[:approval_queue]).to eq "Another Queue"
|
125
160
|
expect(approval_all_args_job.approve_options["approval_queue"]).to eq "Another Queue"
|
126
161
|
|
127
|
-
expect(approval_all_args_job.approve_options[:approval_at]).to be_within(2.seconds).of(2.hours.from_now)
|
128
|
-
expect(approval_all_args_job.approve_options["approval_at"]).to be_within(2.seconds).of(2.hours.from_now)
|
162
|
+
expect(approval_all_args_job.approve_options[:approval_at].to_time).to be_within(2.seconds).of(2.hours.from_now)
|
163
|
+
expect(approval_all_args_job.approve_options["approval_at"].to_time).to be_within(2.seconds).of(2.hours.from_now)
|
129
164
|
end
|
130
165
|
end
|
131
166
|
|
@@ -165,6 +200,8 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
165
200
|
|
166
201
|
it "has args" do
|
167
202
|
expect(job.args).to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
203
|
+
expect(Resque::Plugins::Approve::PendingJob.new(job.id).args).
|
204
|
+
to eq [1, "fred", "something else", 888, "other_arg" => 1, "something else" => "something"]
|
168
205
|
end
|
169
206
|
|
170
207
|
it "has the approval_key" do
|
@@ -176,11 +213,11 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
176
213
|
end
|
177
214
|
|
178
215
|
it "has the approval_at" do
|
179
|
-
expect(job.approval_at).to be_within(
|
216
|
+
expect(job.approval_at).to be_within(2.seconds).of(2.hours.from_now)
|
180
217
|
end
|
181
218
|
|
182
219
|
it "has the queue_time" do
|
183
|
-
expect(job.queue_time).to be_within(
|
220
|
+
expect(job.queue_time).to be_within(2.seconds).of(2.hours.ago)
|
184
221
|
end
|
185
222
|
|
186
223
|
it "has the queue" do
|
@@ -245,6 +282,146 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
245
282
|
|
246
283
|
expect(job).not_to be_requires_approval
|
247
284
|
end
|
285
|
+
|
286
|
+
it "requires approval if requires_approval is passed" do
|
287
|
+
expect(approval_require_approval_job).to be_requires_approval
|
288
|
+
end
|
289
|
+
|
290
|
+
context "MaxActiveJob" do
|
291
|
+
let(:job_class) { MaxActiveJob }
|
292
|
+
let(:num_queue) { Resque::Plugins::Approve::PendingJobQueue.new("Some_Queue") }
|
293
|
+
|
294
|
+
before(:each) do
|
295
|
+
num_queue.reset_running
|
296
|
+
end
|
297
|
+
|
298
|
+
it "does not require approval if num jobs below max" do
|
299
|
+
expect(approval_require_approval_job).not_to be_requires_approval
|
300
|
+
|
301
|
+
expect(approval_require_approval_job.args).to eq ["approval_key" => "Some_Queue"]
|
302
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_require_approval_job.id).args).to eq ["approval_key" => "Some_Queue"]
|
303
|
+
expect(approval_require_approval_job.approve_options).to eq("approval_key" => "Some_Queue", "requires_approval" => true)
|
304
|
+
end
|
305
|
+
|
306
|
+
it "does require approval if num jobs above max" do
|
307
|
+
10.times { num_queue.increment_running }
|
308
|
+
|
309
|
+
expect(approval_require_approval_job).to be_requires_approval
|
310
|
+
|
311
|
+
expect(approval_require_approval_job.args).to eq ["approval_key" => "Some_Queue"]
|
312
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_require_approval_job.id).args).to eq ["approval_key" => "Some_Queue"]
|
313
|
+
expect(approval_require_approval_job.approve_options).to eq("approval_key" => "Some_Queue", "requires_approval" => true)
|
314
|
+
end
|
315
|
+
|
316
|
+
it "calls the perform function" do
|
317
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
318
|
+
|
319
|
+
MaxActiveJob.perform(*approval_require_approval_job.args)
|
320
|
+
|
321
|
+
expect(Resque.logger).to have_received(:warn).with("Args:\n[]").exactly(2).times
|
322
|
+
end
|
323
|
+
|
324
|
+
it "does not approve if number of running jobs too high" do
|
325
|
+
approval_require_approval_job
|
326
|
+
|
327
|
+
expect(Resque::Plugins::Approve::PendingJobQueue.new("Some_Queue").num_jobs).to eq 1
|
328
|
+
|
329
|
+
10.times { num_queue.increment_running }
|
330
|
+
|
331
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
332
|
+
|
333
|
+
job_class.approve_one
|
334
|
+
|
335
|
+
expect(Resque.logger).not_to have_received(:warn)
|
336
|
+
expect(Resque::Plugins::Approve::PendingJobQueue.new("Some_Queue").num_jobs).to eq 1
|
337
|
+
|
338
|
+
expect(num_queue.num_running.to_i).to eq 10
|
339
|
+
end
|
340
|
+
|
341
|
+
it "approves the next item in the queue" do
|
342
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
343
|
+
|
344
|
+
MaxActiveJob.perform(*approval_require_approval_job.args)
|
345
|
+
|
346
|
+
expect(Resque::Plugins::Approve).to have_received(:approve_one).with("Some_Queue").exactly(2).times
|
347
|
+
end
|
348
|
+
|
349
|
+
it "approves the next item in the queue even if there is an exception" do
|
350
|
+
allow(Resque.logger).to receive(:warn).with("Args:\n[]").and_raise "Error"
|
351
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
352
|
+
|
353
|
+
expect { MaxActiveJob.perform(*approval_require_approval_job.args) }.to raise_error
|
354
|
+
|
355
|
+
expect(Resque.logger).to have_received(:warn).with("Args:\n[]").exactly(2).times
|
356
|
+
expect(Resque::Plugins::Approve).to have_received(:approve_one).with("Some_Queue").exactly(2).times
|
357
|
+
end
|
358
|
+
|
359
|
+
it "approves the next item in the queue if non-default queue used" do
|
360
|
+
job = Resque::Plugins::Approve::PendingJob.new(SecureRandom.uuid, class_name: job_class, args: [approval_key: "New Key"])
|
361
|
+
|
362
|
+
key_list.add_job(job)
|
363
|
+
|
364
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
365
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
366
|
+
|
367
|
+
MaxActiveJob.perform(*job.args)
|
368
|
+
|
369
|
+
expect(Resque.logger).to have_received(:warn).with("Args:\n[]").exactly(2).times
|
370
|
+
expect(Resque::Plugins::Approve).to have_received(:approve_one).with("New Key").exactly(2).times
|
371
|
+
end
|
372
|
+
|
373
|
+
it "approves the next item in the queue if non-default queue used and queue full" do
|
374
|
+
job = Resque::Plugins::Approve::PendingJob.new(SecureRandom.uuid, class_name: job_class, args: [requires_approval: true])
|
375
|
+
|
376
|
+
10.times { num_queue.increment_running }
|
377
|
+
key_list.add_job(job)
|
378
|
+
|
379
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
380
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
381
|
+
|
382
|
+
MaxActiveJob.perform(*job.args)
|
383
|
+
|
384
|
+
expect(Resque::Plugins::Approve).to have_received(:approve_one).with("Some_Queue").exactly(2).times
|
385
|
+
expect(Resque.logger).to have_received(:warn).with("Args:\n[]").exactly(2).times
|
386
|
+
expect(num_queue.num_running.to_i).to eq 9
|
387
|
+
end
|
388
|
+
|
389
|
+
it "enqueues a job" do
|
390
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
391
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
392
|
+
|
393
|
+
Resque.enqueue MaxActiveJob, requires_approval: true
|
394
|
+
|
395
|
+
expect(Resque.logger).to have_received(:warn).with("Args:\n[]")
|
396
|
+
expect(Resque::Plugins::Approve).to have_received(:approve_one).with("Some_Queue")
|
397
|
+
end
|
398
|
+
|
399
|
+
it "enqueues a job with arguments" do
|
400
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
401
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
402
|
+
|
403
|
+
Resque.enqueue MaxActiveJob, param: "value", requires_approval: true
|
404
|
+
|
405
|
+
expect(Resque.logger).to have_received(:warn).with("Args:\n[{\"param\":\"value\"}]")
|
406
|
+
expect(Resque::Plugins::Approve).to have_received(:approve_one).with("Some_Queue")
|
407
|
+
end
|
408
|
+
|
409
|
+
it "does not enqueue a job if paused" do
|
410
|
+
num_queue.pause
|
411
|
+
|
412
|
+
expect(num_queue.num_jobs).to be_zero
|
413
|
+
|
414
|
+
allow(Resque.logger).to receive(:warn).and_call_original
|
415
|
+
allow(Resque::Plugins::Approve).to receive(:approve_one).and_call_original
|
416
|
+
|
417
|
+
Resque.enqueue MaxActiveJob, requires_approval: true
|
418
|
+
|
419
|
+
expect(Resque.logger).not_to have_received(:warn).with("Args:\n[]")
|
420
|
+
expect(Resque::Plugins::Approve).not_to have_received(:approve_one).with("Some_Queue")
|
421
|
+
|
422
|
+
expect(num_queue.num_jobs).to eq 1
|
423
|
+
end
|
424
|
+
end
|
248
425
|
end
|
249
426
|
|
250
427
|
describe "enqueue_job" do
|
@@ -322,5 +499,44 @@ RSpec.describe Resque::Plugins::Approve::PendingJob do
|
|
322
499
|
expect(Resque::Plugins::Approve::ApprovalKeyList.new.num_queues).to eq 0
|
323
500
|
end
|
324
501
|
end
|
502
|
+
|
503
|
+
describe "max_active_jobs?" do
|
504
|
+
it "returns false if not set on class" do
|
505
|
+
expect(no_args_job.max_active_jobs?).to be_falsey
|
506
|
+
end
|
507
|
+
|
508
|
+
context "MaxActiveJob" do
|
509
|
+
let(:job_class) { MaxActiveJob }
|
510
|
+
|
511
|
+
it "returns true if a max is set" do
|
512
|
+
expect(no_args_job.max_active_jobs?).to be_truthy
|
513
|
+
end
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
describe "requires_approval" do
|
518
|
+
context "DefaultApprovalQueue" do
|
519
|
+
let(:job_class) { DefaultApprovalQueue }
|
520
|
+
|
521
|
+
it "sets the key to the default queue" do
|
522
|
+
expect(approval_require_approval_job.args).to eq []
|
523
|
+
expect(Resque::Plugins::Approve::PendingJob.new(approval_require_approval_job.id).args).to eq []
|
524
|
+
expect(approval_require_approval_job.approve_options).to eq("approval_key" => "Default Approval Queue", "requires_approval" => true)
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
529
|
+
describe "max_active_jobs" do
|
530
|
+
it "returns -1 if not set on class" do
|
531
|
+
expect(no_args_job.max_active_jobs).to eq(-1)
|
532
|
+
end
|
533
|
+
|
534
|
+
context "MaxActiveJob" do
|
535
|
+
let(:job_class) { MaxActiveJob }
|
536
|
+
|
537
|
+
it "returns value if max set" do
|
538
|
+
expect(no_args_job.max_active_jobs).to eq 10
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
325
542
|
end
|
326
|
-
# rubocop:enable Layout/AlignHash
|