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.

Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +14 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +8 -0
  5. data/.simplecov +12 -0
  6. data/.travis.yml +16 -8
  7. data/Appraisals +10 -10
  8. data/CHANGELOG.md +11 -0
  9. data/Gemfile +11 -1
  10. data/README.md +58 -4
  11. data/Rakefile +2 -1
  12. data/circle.yml +36 -0
  13. data/gemfiles/sidekiq_2.17.gemfile +8 -1
  14. data/gemfiles/sidekiq_3.0.gemfile +8 -1
  15. data/gemfiles/sidekiq_3.1.gemfile +8 -1
  16. data/gemfiles/sidekiq_3.2.gemfile +8 -1
  17. data/gemfiles/sidekiq_3.3.gemfile +8 -1
  18. data/gemfiles/sidekiq_develop.gemfile +8 -1
  19. data/lib/sidekiq-unique-jobs.rb +44 -9
  20. data/lib/sidekiq_unique_jobs/client/middleware.rb +47 -0
  21. data/lib/sidekiq_unique_jobs/config.rb +9 -33
  22. data/lib/sidekiq_unique_jobs/core_ext.rb +46 -0
  23. data/lib/sidekiq_unique_jobs/lock.rb +10 -0
  24. data/lib/sidekiq_unique_jobs/lock/time_calculator.rb +44 -0
  25. data/lib/sidekiq_unique_jobs/lock/until_executed.rb +56 -0
  26. data/lib/sidekiq_unique_jobs/lock/until_executing.rb +6 -0
  27. data/lib/sidekiq_unique_jobs/lock/until_timeout.rb +10 -0
  28. data/lib/sidekiq_unique_jobs/lock/while_executing.rb +31 -0
  29. data/lib/sidekiq_unique_jobs/middleware.rb +30 -14
  30. data/lib/sidekiq_unique_jobs/normalizer.rb +7 -0
  31. data/lib/sidekiq_unique_jobs/options_with_fallback.rb +36 -0
  32. data/lib/sidekiq_unique_jobs/run_lock_failed.rb +1 -0
  33. data/lib/sidekiq_unique_jobs/scripts.rb +50 -0
  34. data/lib/sidekiq_unique_jobs/server/middleware.rb +73 -0
  35. data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +71 -9
  36. data/lib/sidekiq_unique_jobs/testing.rb +34 -0
  37. data/lib/sidekiq_unique_jobs/testing/sidekiq_overrides.rb +63 -0
  38. data/lib/sidekiq_unique_jobs/unique_args.rb +132 -0
  39. data/lib/sidekiq_unique_jobs/unlockable.rb +26 -0
  40. data/lib/sidekiq_unique_jobs/version.rb +1 -1
  41. data/redis/aquire_lock.lua +9 -0
  42. data/redis/release_lock.lua +14 -0
  43. data/redis/synchronize.lua +15 -0
  44. data/sidekiq-unique-jobs.gemspec +2 -4
  45. data/spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb +195 -0
  46. data/spec/lib/sidekiq_unique_jobs/core_ext_spec.rb +25 -0
  47. data/spec/lib/sidekiq_unique_jobs/lock/time_calculator_spec.rb +81 -0
  48. data/spec/lib/sidekiq_unique_jobs/lock/while_executing_spec.rb +48 -0
  49. data/spec/lib/sidekiq_unique_jobs/normalizer_spec.rb +21 -0
  50. data/spec/lib/sidekiq_unique_jobs/scripts_spec.rb +74 -0
  51. data/spec/lib/sidekiq_unique_jobs/server/middleware_spec.rb +100 -0
  52. data/spec/lib/{sidekiq_testing_enabled_spec.rb → sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb} +29 -68
  53. data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_ext_spec.rb +79 -0
  54. data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_jobs_spec.rb +36 -0
  55. data/spec/lib/sidekiq_unique_jobs/unique_args_spec.rb +106 -0
  56. data/spec/spec_helper.rb +40 -10
  57. data/spec/support/matchers/redis_matchers.rb +19 -0
  58. data/spec/support/ruby_meta.rb +10 -0
  59. data/spec/support/sidekiq_meta.rb +11 -2
  60. data/spec/support/unique_macros.rb +52 -0
  61. data/spec/workers/after_unlock_worker.rb +13 -0
  62. data/spec/{support → workers}/after_yield_worker.rb +6 -2
  63. data/spec/{support → workers}/another_unique_worker.rb +1 -1
  64. data/spec/workers/before_yield_worker.rb +9 -0
  65. data/spec/workers/expiring_worker.rb +4 -0
  66. data/spec/workers/inline_expiration_worker.rb +8 -0
  67. data/spec/workers/inline_unlock_order_worker.rb +8 -0
  68. data/spec/workers/inline_worker.rb +8 -0
  69. data/spec/workers/just_a_worker.rb +8 -0
  70. data/spec/workers/main_job.rb +8 -0
  71. data/spec/workers/my_unique_worker.rb +8 -0
  72. data/spec/{support → workers}/my_worker.rb +0 -0
  73. data/spec/workers/plain_class.rb +4 -0
  74. data/spec/workers/queue_worker.rb +6 -0
  75. data/spec/workers/queue_worker_with_filter_method.rb +7 -0
  76. data/spec/workers/queue_worker_with_filter_proc.rb +11 -0
  77. data/spec/workers/run_lock_with_retries_worker.rb +12 -0
  78. data/spec/workers/run_lock_worker.rb +7 -0
  79. data/spec/workers/test_class.rb +4 -0
  80. data/spec/workers/unique_job_with_filter_method.rb +18 -0
  81. data/spec/workers/unique_on_all_queues_worker.rb +13 -0
  82. data/spec/{support → workers}/unique_worker.rb +1 -1
  83. data/spec/workers/while_executing_worker.rb +13 -0
  84. metadata +65 -39
  85. data/lib/sidekiq_unique_jobs/connectors.rb +0 -16
  86. data/lib/sidekiq_unique_jobs/connectors/redis_pool.rb +0 -11
  87. data/lib/sidekiq_unique_jobs/connectors/sidekiq_redis.rb +0 -9
  88. data/lib/sidekiq_unique_jobs/connectors/testing.rb +0 -11
  89. data/lib/sidekiq_unique_jobs/inline_testing.rb +0 -12
  90. data/lib/sidekiq_unique_jobs/middleware/client/strategies/testing_inline.rb +0 -25
  91. data/lib/sidekiq_unique_jobs/middleware/client/strategies/unique.rb +0 -105
  92. data/lib/sidekiq_unique_jobs/middleware/client/unique_jobs.rb +0 -43
  93. data/lib/sidekiq_unique_jobs/middleware/server/unique_jobs.rb +0 -69
  94. data/lib/sidekiq_unique_jobs/payload_helper.rb +0 -42
  95. data/lib/sidekiq_unique_jobs/sidekiq_test_overrides.rb +0 -101
  96. data/spec/lib/client_spec.rb +0 -193
  97. data/spec/lib/middleware/server/unique_jobs_spec.rb +0 -112
  98. data/spec/lib/sidekiq_unique_ext_spec.rb +0 -70
  99. 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 unique_hash to the message' do
110
+ it 'adds the unique_digest to the message' do
113
111
  param = 'hash'
114
- hash = SidekiqUniqueJobs::PayloadHelper.get_payload(UniqueWorker, :working, [param])
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.first['unique_hash']).to eq(hash)
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).exactly(2).times
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('test')
187
- InlineUnlockOrderWorker.perform_async('test')
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
- it 'only allows 1 call per 10 minutes' do
193
- allow(TestClass).to receive(:run).with(1).and_return(true)
194
- allow(TestClass).to receive(:run).with(2).and_return(true)
195
-
196
- InlineExpirationWorker.perform_async(1)
197
- expect(TestClass).to have_received(:run).with(1).once
198
- 100.times do
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
- expect(TestClass).to have_received(:run).with(1).twice
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