sidekiq-unique-jobs 3.0.14 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq-unique-jobs might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.editorconfig +14 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +8 -0
- data/.simplecov +12 -0
- data/.travis.yml +16 -8
- data/Appraisals +10 -10
- data/CHANGELOG.md +11 -0
- data/Gemfile +11 -1
- data/README.md +58 -4
- data/Rakefile +2 -1
- data/circle.yml +36 -0
- data/gemfiles/sidekiq_2.17.gemfile +8 -1
- data/gemfiles/sidekiq_3.0.gemfile +8 -1
- data/gemfiles/sidekiq_3.1.gemfile +8 -1
- data/gemfiles/sidekiq_3.2.gemfile +8 -1
- data/gemfiles/sidekiq_3.3.gemfile +8 -1
- data/gemfiles/sidekiq_develop.gemfile +8 -1
- data/lib/sidekiq-unique-jobs.rb +44 -9
- data/lib/sidekiq_unique_jobs/client/middleware.rb +47 -0
- data/lib/sidekiq_unique_jobs/config.rb +9 -33
- data/lib/sidekiq_unique_jobs/core_ext.rb +46 -0
- data/lib/sidekiq_unique_jobs/lock.rb +10 -0
- data/lib/sidekiq_unique_jobs/lock/time_calculator.rb +44 -0
- data/lib/sidekiq_unique_jobs/lock/until_executed.rb +56 -0
- data/lib/sidekiq_unique_jobs/lock/until_executing.rb +6 -0
- data/lib/sidekiq_unique_jobs/lock/until_timeout.rb +10 -0
- data/lib/sidekiq_unique_jobs/lock/while_executing.rb +31 -0
- data/lib/sidekiq_unique_jobs/middleware.rb +30 -14
- data/lib/sidekiq_unique_jobs/normalizer.rb +7 -0
- data/lib/sidekiq_unique_jobs/options_with_fallback.rb +36 -0
- data/lib/sidekiq_unique_jobs/run_lock_failed.rb +1 -0
- data/lib/sidekiq_unique_jobs/scripts.rb +50 -0
- data/lib/sidekiq_unique_jobs/server/middleware.rb +73 -0
- data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +71 -9
- data/lib/sidekiq_unique_jobs/testing.rb +34 -0
- data/lib/sidekiq_unique_jobs/testing/sidekiq_overrides.rb +63 -0
- data/lib/sidekiq_unique_jobs/unique_args.rb +132 -0
- data/lib/sidekiq_unique_jobs/unlockable.rb +26 -0
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/redis/aquire_lock.lua +9 -0
- data/redis/release_lock.lua +14 -0
- data/redis/synchronize.lua +15 -0
- data/sidekiq-unique-jobs.gemspec +2 -4
- data/spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb +195 -0
- data/spec/lib/sidekiq_unique_jobs/core_ext_spec.rb +25 -0
- data/spec/lib/sidekiq_unique_jobs/lock/time_calculator_spec.rb +81 -0
- data/spec/lib/sidekiq_unique_jobs/lock/while_executing_spec.rb +48 -0
- data/spec/lib/sidekiq_unique_jobs/normalizer_spec.rb +21 -0
- data/spec/lib/sidekiq_unique_jobs/scripts_spec.rb +74 -0
- data/spec/lib/sidekiq_unique_jobs/server/middleware_spec.rb +100 -0
- data/spec/lib/{sidekiq_testing_enabled_spec.rb → sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb} +29 -68
- data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_ext_spec.rb +79 -0
- data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_jobs_spec.rb +36 -0
- data/spec/lib/sidekiq_unique_jobs/unique_args_spec.rb +106 -0
- data/spec/spec_helper.rb +40 -10
- data/spec/support/matchers/redis_matchers.rb +19 -0
- data/spec/support/ruby_meta.rb +10 -0
- data/spec/support/sidekiq_meta.rb +11 -2
- data/spec/support/unique_macros.rb +52 -0
- data/spec/workers/after_unlock_worker.rb +13 -0
- data/spec/{support → workers}/after_yield_worker.rb +6 -2
- data/spec/{support → workers}/another_unique_worker.rb +1 -1
- data/spec/workers/before_yield_worker.rb +9 -0
- data/spec/workers/expiring_worker.rb +4 -0
- data/spec/workers/inline_expiration_worker.rb +8 -0
- data/spec/workers/inline_unlock_order_worker.rb +8 -0
- data/spec/workers/inline_worker.rb +8 -0
- data/spec/workers/just_a_worker.rb +8 -0
- data/spec/workers/main_job.rb +8 -0
- data/spec/workers/my_unique_worker.rb +8 -0
- data/spec/{support → workers}/my_worker.rb +0 -0
- data/spec/workers/plain_class.rb +4 -0
- data/spec/workers/queue_worker.rb +6 -0
- data/spec/workers/queue_worker_with_filter_method.rb +7 -0
- data/spec/workers/queue_worker_with_filter_proc.rb +11 -0
- data/spec/workers/run_lock_with_retries_worker.rb +12 -0
- data/spec/workers/run_lock_worker.rb +7 -0
- data/spec/workers/test_class.rb +4 -0
- data/spec/workers/unique_job_with_filter_method.rb +18 -0
- data/spec/workers/unique_on_all_queues_worker.rb +13 -0
- data/spec/{support → workers}/unique_worker.rb +1 -1
- data/spec/workers/while_executing_worker.rb +13 -0
- metadata +65 -39
- data/lib/sidekiq_unique_jobs/connectors.rb +0 -16
- data/lib/sidekiq_unique_jobs/connectors/redis_pool.rb +0 -11
- data/lib/sidekiq_unique_jobs/connectors/sidekiq_redis.rb +0 -9
- data/lib/sidekiq_unique_jobs/connectors/testing.rb +0 -11
- data/lib/sidekiq_unique_jobs/inline_testing.rb +0 -12
- data/lib/sidekiq_unique_jobs/middleware/client/strategies/testing_inline.rb +0 -25
- data/lib/sidekiq_unique_jobs/middleware/client/strategies/unique.rb +0 -105
- data/lib/sidekiq_unique_jobs/middleware/client/unique_jobs.rb +0 -43
- data/lib/sidekiq_unique_jobs/middleware/server/unique_jobs.rb +0 -69
- data/lib/sidekiq_unique_jobs/payload_helper.rb +0 -42
- data/lib/sidekiq_unique_jobs/sidekiq_test_overrides.rb +0 -101
- data/spec/lib/client_spec.rb +0 -193
- data/spec/lib/middleware/server/unique_jobs_spec.rb +0 -112
- data/spec/lib/sidekiq_unique_ext_spec.rb +0 -70
- data/spec/lib/unlock_order_spec.rb +0 -64
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sidekiq/api'
|
3
|
+
require 'sidekiq/cli'
|
4
|
+
require 'sidekiq/worker'
|
5
|
+
require 'sidekiq_unique_jobs/server/middleware'
|
6
|
+
|
7
|
+
RSpec.describe SidekiqUniqueJobs::Server::Middleware do
|
8
|
+
QUEUE ||= 'unlock_ordering'
|
9
|
+
|
10
|
+
def digest_for(item)
|
11
|
+
SidekiqUniqueJobs::UniqueArgs.digest(item)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '#call' do
|
15
|
+
describe 'unlock order' do
|
16
|
+
before do
|
17
|
+
Sidekiq.redis = REDIS
|
18
|
+
Sidekiq.redis(&:flushdb)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#unlock' do
|
22
|
+
it 'does not unlock mutexes it does not own' do
|
23
|
+
jid = AfterYieldWorker.perform_async
|
24
|
+
item = Sidekiq::Queue.new(QUEUE).find_job(jid).item
|
25
|
+
Sidekiq.redis do |c|
|
26
|
+
c.set(digest_for(item), 'NOT_DELETED')
|
27
|
+
end
|
28
|
+
|
29
|
+
subject.call(AfterYieldWorker.new, item, QUEUE) do
|
30
|
+
Sidekiq.redis do |c|
|
31
|
+
expect(c.get(digest_for(item))).to eq('NOT_DELETED')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ':before_yield' do
|
38
|
+
it 'removes the lock before yielding to the worker' do
|
39
|
+
jid = BeforeYieldWorker.perform_async
|
40
|
+
item = Sidekiq::Queue.new(QUEUE).find_job(jid).item
|
41
|
+
worker = BeforeYieldWorker.new
|
42
|
+
subject.call(worker, item, QUEUE) do
|
43
|
+
Sidekiq.redis do |c|
|
44
|
+
expect(c.ttl(digest_for(item))).to eq(-2) # key does not exist
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe ':after_yield' do
|
51
|
+
it 'removes the lock after yielding to the worker' do
|
52
|
+
jid = AfterYieldWorker.perform_async
|
53
|
+
item = Sidekiq::Queue.new(QUEUE).find_job(jid).item
|
54
|
+
|
55
|
+
subject.call('AfterYieldWorker', item, QUEUE) do
|
56
|
+
Sidekiq.redis do |c|
|
57
|
+
expect(c.get(digest_for(item))).to eq jid
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'unlock' do
|
65
|
+
let(:worker) { AfterYieldWorker.new }
|
66
|
+
|
67
|
+
before do
|
68
|
+
jid = AfterYieldWorker.perform_async
|
69
|
+
@item = Sidekiq::Queue.new('unlock_ordering').find_job(jid).item
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'unlocks after yield when call succeeds' do
|
73
|
+
expect(subject).to receive(:unlock)
|
74
|
+
subject.call(worker, @item, 'unlock_ordering') { true }
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'unlocks after yield when call errors' do
|
78
|
+
expect(subject).to receive(:unlock)
|
79
|
+
allow(subject).to receive(:after_yield_yield) { fail 'WAT!' }
|
80
|
+
expect { subject.call(worker, @item, 'unlock_ordering') }
|
81
|
+
.to raise_error
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should not unlock after yield on shutdown, but still raise error' do
|
85
|
+
expect(subject).not_to receive(:unlock)
|
86
|
+
allow(subject).to receive(:after_yield_yield) { fail Sidekiq::Shutdown }
|
87
|
+
expect { subject.call(worker, @item, 'unlock_ordering') }
|
88
|
+
.to raise_error(Sidekiq::Shutdown)
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'calls after_unlock_hook if defined' do
|
92
|
+
allow(subject).to receive(:unlock).and_call_original
|
93
|
+
allow(subject).to receive(:after_unlock_hook).and_call_original
|
94
|
+
|
95
|
+
expect(worker).to receive(:after_unlock)
|
96
|
+
subject.call(worker, @item, 'unlock_ordering') { true }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -2,12 +2,10 @@ require 'spec_helper'
|
|
2
2
|
require 'sidekiq/worker'
|
3
3
|
require 'sidekiq-unique-jobs'
|
4
4
|
require 'sidekiq/scheduled'
|
5
|
-
require 'sidekiq_unique_jobs/middleware/server/unique_jobs'
|
6
5
|
require 'active_support/core_ext/time'
|
7
6
|
require 'active_support/testing/time_helpers'
|
8
|
-
require 'rspec-sidekiq'
|
9
7
|
|
10
|
-
describe 'When Sidekiq::Testing is enabled' do
|
8
|
+
RSpec.describe 'When Sidekiq::Testing is enabled' do
|
11
9
|
describe 'when set to :fake!', sidekiq: :fake do
|
12
10
|
before do
|
13
11
|
Sidekiq.redis = REDIS
|
@@ -109,12 +107,13 @@ describe 'When Sidekiq::Testing is enabled' do
|
|
109
107
|
expect { Sidekiq::Worker.jobs.size }.not_to raise_error
|
110
108
|
end
|
111
109
|
|
112
|
-
it 'adds the
|
110
|
+
it 'adds the unique_digest to the message' do
|
113
111
|
param = 'hash'
|
114
|
-
|
112
|
+
item = { 'class' => 'UniqueWorker', 'queue' => 'working', 'args' => [param] }
|
113
|
+
hash = SidekiqUniqueJobs::UniqueArgs.digest(item)
|
115
114
|
expect(UniqueWorker.perform_async(param)).to_not be_nil
|
116
115
|
expect(UniqueWorker.jobs.size).to eq(1)
|
117
|
-
expect(UniqueWorker.jobs.
|
116
|
+
expect(UniqueWorker.jobs.last['unique_digest']).to eq(hash)
|
118
117
|
end
|
119
118
|
end
|
120
119
|
|
@@ -132,81 +131,43 @@ describe 'When Sidekiq::Testing is enabled' do
|
|
132
131
|
end
|
133
132
|
|
134
133
|
describe 'when set to :inline!', sidekiq: :inline do
|
135
|
-
class InlineWorker
|
136
|
-
include Sidekiq::Worker
|
137
|
-
sidekiq_options unique: true
|
138
|
-
|
139
|
-
def perform(x)
|
140
|
-
TestClass.run(x)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
class InlineUnlockOrderWorker
|
145
|
-
include Sidekiq::Worker
|
146
|
-
sidekiq_options unique: true, unique_unlock_order: :never
|
147
|
-
|
148
|
-
def perform(x)
|
149
|
-
TestClass.run(x)
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
class InlineUnlockOrderWorker
|
154
|
-
include Sidekiq::Worker
|
155
|
-
sidekiq_options unique: true, unique_unlock_order: :never
|
156
|
-
|
157
|
-
def perform(x)
|
158
|
-
TestClass.run(x)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
class InlineExpirationWorker
|
163
|
-
include Sidekiq::Worker
|
164
|
-
sidekiq_options unique: true, unique_unlock_order: :never,
|
165
|
-
unique_job_expiration: 10 * 60
|
166
|
-
def perform(x)
|
167
|
-
TestClass.run(x)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
class TestClass
|
172
|
-
def self.run(_x)
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
134
|
it 'once the job is completed allows to run another one' do
|
177
|
-
expect(TestClass).to receive(:run).
|
178
|
-
|
135
|
+
expect(TestClass).to receive(:run).with('test').twice
|
179
136
|
InlineWorker.perform_async('test')
|
180
137
|
InlineWorker.perform_async('test')
|
181
138
|
end
|
182
139
|
|
183
140
|
it 'if the unique is kept forever it does not allows to run the job again' do
|
184
|
-
expect(TestClass).to receive(:run).once
|
141
|
+
expect(TestClass).to receive(:run).with('args').once
|
185
142
|
|
186
|
-
InlineUnlockOrderWorker.perform_async('
|
187
|
-
InlineUnlockOrderWorker.perform_async('
|
143
|
+
InlineUnlockOrderWorker.perform_async('args')
|
144
|
+
InlineUnlockOrderWorker.perform_async('args')
|
188
145
|
end
|
189
146
|
|
190
147
|
describe 'when a job is set to run once in 10 minutes' do
|
191
148
|
include ActiveSupport::Testing::TimeHelpers
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
InlineExpirationWorker.perform_async(1)
|
200
|
-
end
|
201
|
-
expect(TestClass).to have_received(:run).with(1).once
|
202
|
-
InlineExpirationWorker.perform_async(2)
|
203
|
-
expect(TestClass).to have_received(:run).with(1).once
|
204
|
-
expect(TestClass).to have_received(:run).with(2).once
|
205
|
-
travel_to(Time.now + (11 * 60)) do
|
206
|
-
InlineExpirationWorker.perform_async(1)
|
149
|
+
|
150
|
+
context 'when spammed' do
|
151
|
+
it 'only allows 1 call per 10 minutes' do
|
152
|
+
expect(TestClass).to receive(:run).with(1).once
|
153
|
+
100.times do
|
154
|
+
InlineExpirationWorker.perform_async(1)
|
155
|
+
end
|
207
156
|
end
|
157
|
+
end
|
208
158
|
|
209
|
-
|
159
|
+
context 'with different arguments' do
|
160
|
+
it 'only allows 1 call per 10 minutes' do
|
161
|
+
expect(TestClass).to receive(:run).with(9).once
|
162
|
+
2.times do
|
163
|
+
InlineExpirationWorker.perform_async(9)
|
164
|
+
end
|
165
|
+
|
166
|
+
expect(TestClass).to receive(:run).with(2).once
|
167
|
+
2.times do
|
168
|
+
InlineExpirationWorker.perform_async(2)
|
169
|
+
end
|
170
|
+
end
|
210
171
|
end
|
211
172
|
end
|
212
173
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sidekiq/api'
|
3
|
+
require 'sidekiq/worker'
|
4
|
+
require 'sidekiq_unique_jobs/server/middleware'
|
5
|
+
require 'sidekiq_unique_jobs/client/middleware'
|
6
|
+
require 'sidekiq_unique_jobs/sidekiq_unique_ext'
|
7
|
+
|
8
|
+
RSpec.describe 'Sidekiq::Api' do
|
9
|
+
before do
|
10
|
+
Sidekiq.redis = REDIS
|
11
|
+
Sidekiq.redis(&:flushdb)
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:item) do
|
15
|
+
{ 'class' => JustAWorker,
|
16
|
+
'queue' => 'testqueue',
|
17
|
+
'args' => [foo: 'bar'] }
|
18
|
+
end
|
19
|
+
|
20
|
+
def unique_key
|
21
|
+
SidekiqUniqueJobs::UniqueArgs.digest(
|
22
|
+
'class' => JustAWorker,
|
23
|
+
'queue' => 'testqueue',
|
24
|
+
'args' => [foo: 'bar'],
|
25
|
+
'at' => Time.now.tomorrow.to_i)
|
26
|
+
end
|
27
|
+
|
28
|
+
def schedule_job
|
29
|
+
JustAWorker.perform_in(60 * 60 * 3, foo: 'bar')
|
30
|
+
end
|
31
|
+
|
32
|
+
def perform_async
|
33
|
+
JustAWorker.perform_async(foo: 'bar')
|
34
|
+
end
|
35
|
+
|
36
|
+
describe Sidekiq::SortedEntry::UniqueExtension, sidekiq_ver: '>= 3.1' do
|
37
|
+
it 'deletes uniqueness lock on delete' do
|
38
|
+
expect(schedule_job).to be_truthy
|
39
|
+
|
40
|
+
Sidekiq::ScheduledSet.new.each(&:delete)
|
41
|
+
Sidekiq.redis do |c|
|
42
|
+
expect(c.exists(unique_key)).to be_falsy
|
43
|
+
end
|
44
|
+
|
45
|
+
expect(schedule_job).to be_truthy
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe Sidekiq::Job::UniqueExtension do
|
50
|
+
it 'deletes uniqueness lock on delete' do
|
51
|
+
jid = perform_async
|
52
|
+
Sidekiq::Queue.new('testqueue').find_job(jid).delete
|
53
|
+
Sidekiq.redis do |c|
|
54
|
+
expect(c.exists(unique_key)).to be_falsy
|
55
|
+
end
|
56
|
+
expect(true).to be_truthy
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe Sidekiq::Queue::UniqueExtension do
|
61
|
+
it 'deletes uniqueness locks on clear' do
|
62
|
+
perform_async
|
63
|
+
Sidekiq::Queue.new('testqueue').clear
|
64
|
+
Sidekiq.redis do |c|
|
65
|
+
expect(c.exists(unique_key)).to be_falsy
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe Sidekiq::JobSet::UniqueExtension, sidekiq_ver: '>= 3' do
|
71
|
+
it 'deletes uniqueness locks on clear' do
|
72
|
+
schedule_job
|
73
|
+
Sidekiq::JobSet.new('schedule').clear
|
74
|
+
Sidekiq.redis do |c|
|
75
|
+
expect(c.exists(unique_key)).to be_falsy
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
RSpec.describe SidekiqUniqueJobs do
|
3
|
+
describe '.configure_middleware' do
|
4
|
+
it 'configures both client and server middleware' do
|
5
|
+
expect(described_class).to receive(:configure_server_middleware)
|
6
|
+
expect(described_class).to receive(:configure_client_middleware)
|
7
|
+
|
8
|
+
described_class.configure_middleware
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.configure_server_middleware' do
|
13
|
+
let(:server_config) { class_double(Sidekiq) }
|
14
|
+
let(:server_middleware) { double(Sidekiq::Middleware::Chain) }
|
15
|
+
|
16
|
+
it 'adds server middleware when required' do
|
17
|
+
expect(Sidekiq).to receive(:configure_server).and_yield(server_config)
|
18
|
+
expect(server_config).to receive(:server_middleware).and_yield(server_middleware)
|
19
|
+
expect(server_middleware).to receive(:add).with(SidekiqUniqueJobs::Server::Middleware)
|
20
|
+
described_class.configure_server_middleware
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '.configure_client_middleware' do
|
25
|
+
let(:client_config) { class_double(Sidekiq) }
|
26
|
+
let(:client_middleware) { double(Sidekiq::Middleware::Chain) }
|
27
|
+
|
28
|
+
it 'adds client middleware when required' do
|
29
|
+
expect(Sidekiq).to receive(:configure_client).and_yield(client_config)
|
30
|
+
expect(client_config).to receive(:client_middleware).and_yield(client_middleware)
|
31
|
+
expect(client_middleware).to receive(:add).with(SidekiqUniqueJobs::Client::Middleware)
|
32
|
+
|
33
|
+
described_class.configure_client_middleware
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe SidekiqUniqueJobs::UniqueArgs do
|
4
|
+
let(:item) { { 'class' => 'UniqueWorker', 'queue' => 'myqueue', 'args' => [[1, 2]] } }
|
5
|
+
subject { described_class.new(item) }
|
6
|
+
|
7
|
+
describe '#unique_args_enabled_in_worker?' do
|
8
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args) do
|
9
|
+
its(:unique_args_enabled_in_worker?) { is_expected.to eq(:unique_args) }
|
10
|
+
end
|
11
|
+
|
12
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: false) do
|
13
|
+
its(:unique_args_enabled_in_worker?) { is_expected.to eq(false) }
|
14
|
+
end
|
15
|
+
|
16
|
+
# For when a worker doesn't exist in the current context
|
17
|
+
with_sidekiq_options_for('NotAWorker') do
|
18
|
+
its(:unique_args_enabled_in_worker?) { is_expected.to eq(nil) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#unique_args_enabled?' do
|
23
|
+
with_global_config(unique_args_enabled: true) do
|
24
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args) do
|
25
|
+
its(:unique_args_enabled?) { is_expected.to eq(:unique_args) }
|
26
|
+
end
|
27
|
+
|
28
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: false) do
|
29
|
+
its(:unique_args_enabled?) { is_expected.to eq(true) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
with_global_config(unique_args_enabled: false) do
|
34
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args) do
|
35
|
+
its(:unique_args_enabled?) { is_expected.to eq(:unique_args) }
|
36
|
+
end
|
37
|
+
|
38
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: false) do
|
39
|
+
its(:unique_args_enabled?) { is_expected.to eq(false) }
|
40
|
+
end
|
41
|
+
|
42
|
+
its(:unique_args_enabled?) { is_expected.to eq(false) }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe '#unique_on_all_queues?' do
|
47
|
+
with_global_config(unique_args_enabled: true) do
|
48
|
+
its(:unique_on_all_queues?) { is_expected.to eq(nil) }
|
49
|
+
|
50
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args, unique_on_all_queues: true) do
|
51
|
+
its(:unique_on_all_queues?) { is_expected.to eq(true) }
|
52
|
+
end
|
53
|
+
|
54
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args, unique_on_all_queues: false) do
|
55
|
+
its(:unique_on_all_queues?) { is_expected.to eq(false) }
|
56
|
+
end
|
57
|
+
|
58
|
+
# For when a worker doesn't exist in the current context
|
59
|
+
with_sidekiq_options_for('NotAWorker', unique_args: :unique_args, unique_on_all_queues: true) do
|
60
|
+
its(:unique_args_enabled_in_worker?) { is_expected.to eq(nil) }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
with_global_config(unique_args_enabled: false) do
|
65
|
+
its(:unique_on_all_queues?) { is_expected.to eq(nil) }
|
66
|
+
|
67
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args, unique_on_all_queues: false) do
|
68
|
+
its(:unique_on_all_queues?) { is_expected.to eq(false) }
|
69
|
+
end
|
70
|
+
|
71
|
+
with_sidekiq_options_for(UniqueWorker, unique_args: :unique_args, unique_on_all_queues: true) do
|
72
|
+
its(:unique_on_all_queues?) { is_expected.to eq(true) }
|
73
|
+
end
|
74
|
+
|
75
|
+
# For when a worker doesn't exist in the current context
|
76
|
+
with_sidekiq_options_for('NotAWorker', unique_args: :unique_args, unique_on_all_queues: true) do
|
77
|
+
its(:unique_args_enabled_in_worker?) { is_expected.to eq(nil) }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#filter_by_proc' do
|
83
|
+
let(:proc) { ->(args) { args[1]['test'] } }
|
84
|
+
before do
|
85
|
+
allow(subject).to receive(:unique_args_method).and_return(proc)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns the value of the provided ' do
|
89
|
+
expect(subject.filter_by_proc([1, 'test' => 'it'])).to eq('it')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe '#filter_by_symbol' do
|
94
|
+
let(:item) do
|
95
|
+
{ 'class' => 'UniqueJobWithFilterMethod',
|
96
|
+
'queue' => 'myqueue',
|
97
|
+
'args' => [[1, 2]] }
|
98
|
+
end
|
99
|
+
subject { described_class.new(item) }
|
100
|
+
|
101
|
+
it 'returns the value of the provided class method' do
|
102
|
+
expect(subject.filter_by_symbol(['name', 2, 'whatever' => nil, 'type' => 'test']))
|
103
|
+
.to eq(%w(name test))
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|