sidekiq-unique-jobs 4.0.0 → 4.0.7

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +1 -1
  3. data/.travis.yml +1 -2
  4. data/Appraisals +1 -1
  5. data/CHANGELOG.md +44 -1
  6. data/Gemfile +1 -2
  7. data/README.md +49 -51
  8. data/circle.yml +3 -1
  9. data/gemfiles/sidekiq_2.17.gemfile +7 -5
  10. data/gemfiles/sidekiq_3.0.gemfile +6 -4
  11. data/gemfiles/sidekiq_3.1.gemfile +6 -4
  12. data/gemfiles/sidekiq_3.2.gemfile +6 -4
  13. data/gemfiles/sidekiq_3.3.gemfile +6 -4
  14. data/gemfiles/sidekiq_develop.gemfile +6 -4
  15. data/lib/sidekiq-unique-jobs.rb +3 -6
  16. data/lib/sidekiq_unique_jobs/config.rb +1 -6
  17. data/lib/sidekiq_unique_jobs/constants.rb +17 -0
  18. data/lib/sidekiq_unique_jobs/core_ext.rb +28 -23
  19. data/lib/sidekiq_unique_jobs/lock.rb +1 -1
  20. data/lib/sidekiq_unique_jobs/lock/until_and_while_executing.rb +13 -0
  21. data/lib/sidekiq_unique_jobs/lock/until_executed.rb +17 -3
  22. data/lib/sidekiq_unique_jobs/lock/until_executing.rb +4 -0
  23. data/lib/sidekiq_unique_jobs/lock/until_timeout.rb +9 -2
  24. data/lib/sidekiq_unique_jobs/lock/while_executing.rb +17 -5
  25. data/lib/sidekiq_unique_jobs/options_with_fallback.rb +14 -5
  26. data/lib/sidekiq_unique_jobs/server/middleware.rb +3 -40
  27. data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +29 -2
  28. data/lib/sidekiq_unique_jobs/testing/sidekiq_overrides.rb +6 -2
  29. data/lib/sidekiq_unique_jobs/timeout_calculator.rb +42 -0
  30. data/lib/sidekiq_unique_jobs/unique_args.rb +31 -29
  31. data/lib/sidekiq_unique_jobs/version.rb +1 -1
  32. data/redis/synchronize.lua +1 -1
  33. data/sidekiq-unique-jobs.gemspec +1 -2
  34. data/spec/{workers/unique_worker.rb → jobs/another_unique_job.rb} +3 -3
  35. data/spec/{workers/queue_worker.rb → jobs/custom_queue_job.rb} +1 -1
  36. data/spec/jobs/custom_queue_job_with_filter_method.rb +7 -0
  37. data/spec/{workers/queue_worker_with_filter_proc.rb → jobs/custom_queue_job_with_filter_proc.rb} +2 -3
  38. data/spec/jobs/expiring_job.rb +4 -0
  39. data/spec/{workers → jobs}/inline_worker.rb +1 -1
  40. data/spec/jobs/just_a_worker.rb +8 -0
  41. data/spec/jobs/main_job.rb +8 -0
  42. data/spec/{workers/my_worker.rb → jobs/my_job.rb} +2 -3
  43. data/spec/jobs/my_unique_job.rb +7 -0
  44. data/spec/{workers → jobs}/plain_class.rb +0 -0
  45. data/spec/{workers → jobs}/test_class.rb +0 -0
  46. data/spec/{workers → jobs}/unique_job_with_filter_method.rb +2 -2
  47. data/spec/{workers/unique_on_all_queues_worker.rb → jobs/unique_on_all_queues_job.rb} +3 -3
  48. data/spec/jobs/until_and_while_executing_job.rb +8 -0
  49. data/spec/{workers/another_unique_worker.rb → jobs/until_executed_job.rb} +6 -2
  50. data/spec/jobs/until_executing_job.rb +8 -0
  51. data/spec/jobs/until_global_timeout_job.rb +8 -0
  52. data/spec/{workers/inline_expiration_worker.rb → jobs/until_timeout_job.rb} +2 -2
  53. data/spec/{workers/after_unlock_worker.rb → jobs/while_executing_job.rb} +2 -3
  54. data/spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb +60 -44
  55. data/spec/lib/sidekiq_unique_jobs/lock/until_and_while_executing_spec.rb +39 -0
  56. data/spec/lib/sidekiq_unique_jobs/lock/until_executed_spec.rb +40 -0
  57. data/spec/lib/sidekiq_unique_jobs/lock/while_executing_spec.rb +15 -4
  58. data/spec/lib/sidekiq_unique_jobs/options_with_fallback_spec.rb +25 -0
  59. data/spec/lib/sidekiq_unique_jobs/scripts_spec.rb +3 -4
  60. data/spec/lib/sidekiq_unique_jobs/server/middleware_spec.rb +51 -68
  61. data/spec/lib/sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb +75 -79
  62. data/spec/lib/sidekiq_unique_jobs/sidekiq_unique_ext_spec.rb +2 -2
  63. data/spec/lib/sidekiq_unique_jobs/{lock/time_calculator_spec.rb → timeout_calculator_spec.rb} +10 -11
  64. data/spec/lib/sidekiq_unique_jobs/unique_args_spec.rb +28 -45
  65. data/spec/spec_helper.rb +23 -15
  66. data/spec/support/unique_macros.rb +20 -1
  67. metadata +30 -42
  68. data/lib/sidekiq_unique_jobs/lock/time_calculator.rb +0 -44
  69. data/spec/workers/after_yield_worker.rb +0 -17
  70. data/spec/workers/before_yield_worker.rb +0 -9
  71. data/spec/workers/expiring_worker.rb +0 -4
  72. data/spec/workers/inline_unlock_order_worker.rb +0 -8
  73. data/spec/workers/just_a_worker.rb +0 -8
  74. data/spec/workers/main_job.rb +0 -8
  75. data/spec/workers/my_unique_worker.rb +0 -8
  76. data/spec/workers/queue_worker_with_filter_method.rb +0 -7
  77. data/spec/workers/run_lock_with_retries_worker.rb +0 -12
  78. data/spec/workers/run_lock_worker.rb +0 -7
  79. data/spec/workers/while_executing_worker.rb +0 -13
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SidekiqUniqueJobs::Lock::UntilAndWhileExecuting do
4
+ let(:item) do
5
+ {
6
+ 'jid' => 'maaaahjid',
7
+ 'queue' => 'dupsallowed',
8
+ 'class' => 'UntilAndWhileExecuting',
9
+ 'unique' => 'until_executed',
10
+ 'args' => [1]
11
+ }
12
+ end
13
+ let(:callback) { -> {} }
14
+ subject { described_class.new(item) }
15
+ describe '#execute' do
16
+ before { subject.lock(:client) }
17
+ let(:runtime_lock) { SidekiqUniqueJobs::Lock::WhileExecuting.new(item, nil) }
18
+
19
+ it 'unlocks the unique key before yielding' do
20
+ expect(SidekiqUniqueJobs::Lock::WhileExecuting)
21
+ .to receive(:new).with(item, nil)
22
+ .and_return(runtime_lock)
23
+
24
+ expect(callback).to receive(:call)
25
+
26
+ subject.execute(callback) do
27
+ Sidekiq.redis do |c|
28
+ expect(c.keys('uniquejobs:*').size).to eq(1)
29
+ end
30
+
31
+ 10.times { Sidekiq::Client.push(item) }
32
+
33
+ Sidekiq.redis do |c|
34
+ expect(c.keys('uniquejobs:*').size).to eq(2)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SidekiqUniqueJobs::Lock::UntilExecuted do
4
+ describe '#execute' do
5
+ subject { described_class.new(item) }
6
+ let(:item) do
7
+ { 'jid' => 'maaaahjid', 'class' => 'UntilExecutedJob', 'unique' => 'until_executed' }
8
+ end
9
+ let(:empty_callback) { -> {} }
10
+
11
+ def execute
12
+ subject.execute(empty_callback)
13
+ end
14
+
15
+ context 'when yield fails with Sidekiq::Shutdown' do
16
+ before do
17
+ allow(subject).to receive(:after_yield_yield) { fail Sidekiq::Shutdown }
18
+ end
19
+
20
+ it 'raises Sidekiq::Shutdown' do
21
+ allow(subject).to receive(:unlock).and_return(true)
22
+ expect(subject).not_to receive(:unlock)
23
+ expect(empty_callback).not_to receive(:call)
24
+ expect { subject.execute(empty_callback) }.to raise_error(Sidekiq::Shutdown)
25
+ end
26
+ end
27
+
28
+ context 'when yield fails with other errors' do
29
+ before do
30
+ allow(subject).to receive(:after_yield_yield) { fail 'Hell' }
31
+ end
32
+
33
+ it 'raises Sidekiq::Shutdown' do
34
+ expect(subject).to receive(:unlock).and_return(true)
35
+ expect(empty_callback).to receive(:call)
36
+ expect { subject.execute(empty_callback) }.to raise_error('Hell')
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,9 +1,20 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe SidekiqUniqueJobs::Lock::WhileExecuting do
4
+ let(:item) do
5
+ {
6
+ 'jid' => 'maaaahjid',
7
+ 'queue' => 'dupsallowed',
8
+ 'class' => 'UntilAndWhileExecuting',
9
+ 'unique' => 'until_executed',
10
+ 'unique_digest' => 'test_mutex_key',
11
+ 'args' => [1]
12
+ }
13
+ end
14
+
4
15
  it 'allows only one mutex object to have the lock at a time' do
5
16
  mutexes = (1..10).map do
6
- described_class.new('test_mutex_key')
17
+ described_class.new(item)
7
18
  end
8
19
 
9
20
  x = 0
@@ -21,10 +32,10 @@ RSpec.describe SidekiqUniqueJobs::Lock::WhileExecuting do
21
32
  end
22
33
 
23
34
  it 'handles auto cleanup correctly' do
24
- m = described_class.new('test_mutex_key')
35
+ m = described_class.new(item)
25
36
 
26
37
  SidekiqUniqueJobs.connection do |conn|
27
- conn.set 'test_mutex_key', Time.now.to_i - 1, nx: true
38
+ conn.set 'test_mutex_key:run', Time.now.to_i - 1, nx: true
28
39
  end
29
40
 
30
41
  start = Time.now.to_i
@@ -37,7 +48,7 @@ RSpec.describe SidekiqUniqueJobs::Lock::WhileExecuting do
37
48
  end
38
49
 
39
50
  it 'maintains mutex semantics' do
40
- m = described_class.new('test_mutex_key')
51
+ m = described_class.new(item)
41
52
 
42
53
  expect do
43
54
  m.synchronize do
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe SidekiqUniqueJobs::OptionsWithFallback do
4
+ include described_class
5
+ subject { self }
6
+
7
+ let(:options) { {} }
8
+ let(:item) { {} }
9
+
10
+ describe '#unique_lock' do
11
+ context 'when options have `unique: true`' do
12
+ let(:options) { { 'unique' => true } }
13
+
14
+ it 'warns when unique is set to true' do
15
+ expect(subject)
16
+ .to receive(:warn)
17
+ .with(
18
+ 'unique: true is no longer valid. Please set it to the type of lock required like: ' \
19
+ '`unique: :until_executed`')
20
+
21
+ subject.unique_lock
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
  RSpec.describe SidekiqUniqueJobs::Scripts do
3
- include ActiveSupport::Testing::TimeHelpers
4
3
  MD5_DIGEST ||= 'unique'.freeze
5
4
  UNIQUE_KEY ||= 'uniquejobs:unique'.freeze
6
5
  JID ||= 'fuckit'.freeze
@@ -36,7 +35,7 @@ RSpec.describe SidekiqUniqueJobs::Scripts do
36
35
  context 'when job is unique' do
37
36
  specify { expect(lock_for).to eq(1) }
38
37
  specify do
39
- expect(lock_for(0.5.seconds)).to eq(1)
38
+ expect(lock_for(0.5)).to eq(1)
40
39
  expect(Redis)
41
40
  .to have_key(UNIQUE_KEY)
42
41
  .for_seconds(1)
@@ -54,7 +53,7 @@ RSpec.describe SidekiqUniqueJobs::Scripts do
54
53
 
55
54
  describe '.release_lock' do
56
55
  context 'when job is locked by another jid' do
57
- before { expect(lock_for(10.seconds, 'anotherjid')).to eq(1) }
56
+ before { expect(lock_for(10, 'anotherjid')).to eq(1) }
58
57
  specify { expect(unlock).to eq(0) }
59
58
  after { unlock(UNIQUE_KEY, ANOTHER_JID) }
60
59
  end
@@ -65,7 +64,7 @@ RSpec.describe SidekiqUniqueJobs::Scripts do
65
64
 
66
65
  context 'when job is locked by the same jid' do
67
66
  specify do
68
- expect(lock_for(10.seconds)).to eq(1)
67
+ expect(lock_for(10)).to eq(1)
69
68
  expect(unlock).to eq(1)
70
69
  end
71
70
  end
@@ -5,95 +5,78 @@ require 'sidekiq/worker'
5
5
  require 'sidekiq_unique_jobs/server/middleware'
6
6
 
7
7
  RSpec.describe SidekiqUniqueJobs::Server::Middleware do
8
- QUEUE ||= 'unlock_ordering'
8
+ QUEUE ||= 'working'
9
9
 
10
10
  def digest_for(item)
11
11
  SidekiqUniqueJobs::UniqueArgs.digest(item)
12
12
  end
13
13
 
14
+ before do
15
+ Sidekiq.redis = REDIS
16
+ Sidekiq.redis(&:flushdb)
17
+ end
18
+
14
19
  describe '#call' do
15
- describe 'unlock order' do
16
- before do
17
- Sidekiq.redis = REDIS
18
- Sidekiq.redis(&:flushdb)
20
+ context 'when unique is disabled' do
21
+ it 'does not use locking' do
22
+ allow(subject).to receive(:unique_enabled?).and_return(false)
23
+ expect(subject).not_to receive(:lock)
24
+ args = [WhileExecutingJob, { 'class' => 'WhileExecutingJob' }, 'working', nil]
25
+ subject.call(*args) {}
19
26
  end
27
+ end
20
28
 
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
29
+ context 'when unique is enabled' do
30
+ it 'executes the lock' do
31
+ allow(subject).to receive(:unique_enabled?).and_return(true)
32
+ lock = instance_spy(SidekiqUniqueJobs::Lock::WhileExecuting)
33
+ expect(lock).to receive(:send).with(:execute, instance_of(Proc)).and_yield
34
+ expect(subject).to receive(:lock).and_return(lock)
28
35
 
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
36
+ args = [WhileExecutingJob, { 'class' => 'WhileExecutingJob' }, 'working', nil]
37
+ subject.call(*args) {}
35
38
  end
39
+ end
36
40
 
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
41
+ describe '#unlock' do
42
+ it 'does not unlock mutexes it does not own' do
43
+ jid = UntilExecutedJob.perform_async
44
+ item = Sidekiq::Queue.new(QUEUE).find_job(jid).item
45
+ Sidekiq.redis do |c|
46
+ c.set(digest_for(item), 'NOT_DELETED')
47
47
  end
48
- end
49
48
 
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
49
+ subject.call(UntilExecutedJob.new, item, QUEUE) do
50
+ Sidekiq.redis do |c|
51
+ expect(c.get(digest_for(item))).to eq('NOT_DELETED')
59
52
  end
60
53
  end
61
54
  end
62
55
  end
63
56
 
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)
57
+ describe ':before_yield' do
58
+ it 'removes the lock before yielding to the worker' do
59
+ jid = UntilExecutingJob.perform_async
60
+ item = Sidekiq::Queue.new(QUEUE).find_job(jid).item
61
+ worker = UntilExecutingJob.new
62
+ subject.call(worker, item, QUEUE) do
63
+ Sidekiq.redis do |c|
64
+ expect(c.ttl(digest_for(item))).to eq(-2) # key does not exist
65
+ end
66
+ end
89
67
  end
68
+ end
90
69
 
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
70
+ describe ':after_yield' do
71
+ it 'removes the lock after yielding to the worker' do
72
+ jid = UntilExecutedJob.perform_async
73
+ item = Sidekiq::Queue.new(QUEUE).find_job(jid).item
94
74
 
95
- expect(worker).to receive(:after_unlock)
96
- subject.call(worker, @item, 'unlock_ordering') { true }
75
+ subject.call('UntilExecutedJob', item, QUEUE) do
76
+ Sidekiq.redis do |c|
77
+ expect(c.get(digest_for(item))).to eq jid
78
+ end
79
+ end
97
80
  end
98
81
  end
99
82
  end
@@ -2,8 +2,6 @@ require 'spec_helper'
2
2
  require 'sidekiq/worker'
3
3
  require 'sidekiq-unique-jobs'
4
4
  require 'sidekiq/scheduled'
5
- require 'active_support/core_ext/time'
6
- require 'active_support/testing/time_helpers'
7
5
 
8
6
  RSpec.describe 'When Sidekiq::Testing is enabled' do
9
7
  describe 'when set to :fake!', sidekiq: :fake do
@@ -15,117 +13,117 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
15
13
  context 'with unique worker' do
16
14
  it 'does not push duplicate messages' do
17
15
  param = 'work'
18
- expect(UniqueWorker.jobs.size).to eq(0)
19
- expect(UniqueWorker.perform_async(param)).to_not be_nil
20
- expect(UniqueWorker.jobs.size).to eq(1)
21
- expect(UniqueWorker).to have_enqueued_job(param)
22
- expect(UniqueWorker.perform_async(param)).to be_nil
23
- expect(UniqueWorker.jobs.size).to eq(1)
16
+ expect(UntilExecutedJob.jobs.size).to eq(0)
17
+ expect(UntilExecutedJob.perform_async(param)).to_not be_nil
18
+ expect(UntilExecutedJob.jobs.size).to eq(1)
19
+ expect(UntilExecutedJob).to have_enqueued_job(param)
20
+ expect(UntilExecutedJob.perform_async(param)).to be_nil
21
+ expect(UntilExecutedJob.jobs.size).to eq(1)
24
22
  end
25
23
 
26
24
  it 'unlocks jobs after draining a worker' do
27
25
  param = 'work'
28
26
  param2 = 'more work'
29
- expect(UniqueWorker.jobs.size).to eq(0)
30
- UniqueWorker.perform_async(param)
31
- UniqueWorker.perform_async(param2)
32
- expect(UniqueWorker.jobs.size).to eq(2)
33
- UniqueWorker.drain
34
- expect(UniqueWorker.jobs.size).to eq(0)
35
- UniqueWorker.perform_async(param)
36
- UniqueWorker.perform_async(param2)
37
- expect(UniqueWorker.jobs.size).to eq(2)
27
+ expect(UntilExecutedJob.jobs.size).to eq(0)
28
+ UntilExecutedJob.perform_async(param)
29
+ UntilExecutedJob.perform_async(param2)
30
+ expect(UntilExecutedJob.jobs.size).to eq(2)
31
+ UntilExecutedJob.drain
32
+ expect(UntilExecutedJob.jobs.size).to eq(0)
33
+ UntilExecutedJob.perform_async(param)
34
+ UntilExecutedJob.perform_async(param2)
35
+ expect(UntilExecutedJob.jobs.size).to eq(2)
38
36
  end
39
37
 
40
38
  it 'unlocks a single job when calling perform_one' do
41
39
  param = 'work'
42
40
  param2 = 'more work'
43
- expect(UniqueWorker.jobs.size).to eq(0)
44
- UniqueWorker.perform_async(param)
45
- UniqueWorker.perform_async(param2)
46
- expect(UniqueWorker.jobs.size).to eq(2)
47
- UniqueWorker.perform_one
48
- expect(UniqueWorker.jobs.size).to eq(1)
49
- UniqueWorker.perform_async(param2)
50
- expect(UniqueWorker.jobs.size).to eq(1)
51
- UniqueWorker.perform_async(param)
52
- expect(UniqueWorker.jobs.size).to eq(2)
41
+ expect(UntilExecutedJob.jobs.size).to eq(0)
42
+ UntilExecutedJob.perform_async(param)
43
+ UntilExecutedJob.perform_async(param2)
44
+ expect(UntilExecutedJob.jobs.size).to eq(2)
45
+ UntilExecutedJob.perform_one
46
+ expect(UntilExecutedJob.jobs.size).to eq(1)
47
+ UntilExecutedJob.perform_async(param2)
48
+ expect(UntilExecutedJob.jobs.size).to eq(1)
49
+ UntilExecutedJob.perform_async(param)
50
+ expect(UntilExecutedJob.jobs.size).to eq(2)
53
51
  end
54
52
 
55
53
  it 'unlocks jobs cleared from a single worker' do
56
54
  param = 'work'
57
55
  param2 = 'more work'
58
- expect(UniqueWorker.jobs.size).to eq(0)
59
- expect(AnotherUniqueWorker.jobs.size).to eq(0)
60
- UniqueWorker.perform_async(param)
61
- UniqueWorker.perform_async(param2)
62
- AnotherUniqueWorker.perform_async(param)
63
- expect(UniqueWorker.jobs.size).to eq(2)
64
- expect(AnotherUniqueWorker.jobs.size).to eq(1)
65
- UniqueWorker.clear
66
- expect(UniqueWorker.jobs.size).to eq(0)
67
- expect(AnotherUniqueWorker.jobs.size).to eq(1)
68
- UniqueWorker.perform_async(param)
69
- UniqueWorker.perform_async(param2)
70
- AnotherUniqueWorker.perform_async(param)
71
- expect(UniqueWorker.jobs.size).to eq(2)
72
- expect(AnotherUniqueWorker.jobs.size).to eq(1)
56
+ expect(UntilExecutedJob.jobs.size).to eq(0)
57
+ expect(AnotherUniqueJob.jobs.size).to eq(0)
58
+ UntilExecutedJob.perform_async(param)
59
+ UntilExecutedJob.perform_async(param2)
60
+ AnotherUniqueJob.perform_async(param)
61
+ expect(UntilExecutedJob.jobs.size).to eq(2)
62
+ expect(AnotherUniqueJob.jobs.size).to eq(1)
63
+ UntilExecutedJob.clear
64
+ expect(UntilExecutedJob.jobs.size).to eq(0)
65
+ expect(AnotherUniqueJob.jobs.size).to eq(1)
66
+ UntilExecutedJob.perform_async(param)
67
+ UntilExecutedJob.perform_async(param2)
68
+ AnotherUniqueJob.perform_async(param)
69
+ expect(UntilExecutedJob.jobs.size).to eq(2)
70
+ expect(AnotherUniqueJob.jobs.size).to eq(1)
73
71
  end
74
72
 
75
73
  it 'handles clearing an empty worker queue' do
76
74
  param = 'work'
77
- UniqueWorker.perform_async(param)
78
- UniqueWorker.clear
79
- expect(UniqueWorker.jobs.size).to eq(0)
80
- expect { UniqueWorker.clear }.not_to raise_error
75
+ UntilExecutedJob.perform_async(param)
76
+ UntilExecutedJob.clear
77
+ expect(UntilExecutedJob.jobs.size).to eq(0)
78
+ expect { UntilExecutedJob.clear }.not_to raise_error
81
79
  end
82
80
 
83
81
  it 'unlocks jobs when all workers are cleared' do
84
82
  param = 'work'
85
- expect(UniqueWorker.jobs.size).to eq(0)
86
- expect(AnotherUniqueWorker.jobs.size).to eq(0)
87
- UniqueWorker.perform_async(param)
88
- AnotherUniqueWorker.perform_async(param)
89
- expect(UniqueWorker.jobs.size).to eq(1)
90
- expect(AnotherUniqueWorker.jobs.size).to eq(1)
83
+ expect(UntilExecutedJob.jobs.size).to eq(0)
84
+ expect(AnotherUniqueJob.jobs.size).to eq(0)
85
+ UntilExecutedJob.perform_async(param)
86
+ AnotherUniqueJob.perform_async(param)
87
+ expect(UntilExecutedJob.jobs.size).to eq(1)
88
+ expect(AnotherUniqueJob.jobs.size).to eq(1)
91
89
  Sidekiq::Worker.clear_all
92
- expect(UniqueWorker.jobs.size).to eq(0)
93
- expect(AnotherUniqueWorker.jobs.size).to eq(0)
94
- UniqueWorker.perform_async(param)
95
- AnotherUniqueWorker.perform_async(param)
96
- expect(UniqueWorker.jobs.size).to eq(1)
97
- expect(AnotherUniqueWorker.jobs.size).to eq(1)
90
+ expect(UntilExecutedJob.jobs.size).to eq(0)
91
+ expect(AnotherUniqueJob.jobs.size).to eq(0)
92
+ UntilExecutedJob.perform_async(param)
93
+ AnotherUniqueJob.perform_async(param)
94
+ expect(UntilExecutedJob.jobs.size).to eq(1)
95
+ expect(AnotherUniqueJob.jobs.size).to eq(1)
98
96
  end
99
97
 
100
98
  it 'handles clearing all workers when there are no jobs' do
101
99
  param = 'work'
102
- UniqueWorker.perform_async(param)
103
- AnotherUniqueWorker.perform_async(param)
100
+ UntilExecutedJob.perform_async(param)
101
+ AnotherUniqueJob.perform_async(param)
104
102
  Sidekiq::Worker.clear_all
105
- expect(UniqueWorker.jobs.size).to eq(0)
106
- expect(AnotherUniqueWorker.jobs.size).to eq(0)
103
+ expect(UntilExecutedJob.jobs.size).to eq(0)
104
+ expect(AnotherUniqueJob.jobs.size).to eq(0)
107
105
  expect { Sidekiq::Worker.jobs.size }.not_to raise_error
108
106
  end
109
107
 
110
108
  it 'adds the unique_digest to the message' do
111
109
  param = 'hash'
112
- item = { 'class' => 'UniqueWorker', 'queue' => 'working', 'args' => [param] }
110
+ item = { 'class' => 'UntilExecutedJob', 'queue' => 'working', 'args' => [param] }
113
111
  hash = SidekiqUniqueJobs::UniqueArgs.digest(item)
114
- expect(UniqueWorker.perform_async(param)).to_not be_nil
115
- expect(UniqueWorker.jobs.size).to eq(1)
116
- expect(UniqueWorker.jobs.last['unique_digest']).to eq(hash)
112
+ expect(UntilExecutedJob.perform_async(param)).to_not be_nil
113
+ expect(UntilExecutedJob.jobs.size).to eq(1)
114
+ expect(UntilExecutedJob.jobs.last['unique_digest']).to eq(hash)
117
115
  end
118
116
  end
119
117
 
120
118
  context 'with non-unique worker' do
121
119
  it 'pushes duplicates messages' do
122
120
  param = 'work'
123
- expect(MyWorker.jobs.size).to eq(0)
124
- MyWorker.perform_async(param)
125
- expect(MyWorker.jobs.size).to eq(1)
126
- expect(MyWorker).to have_enqueued_job(param)
127
- MyWorker.perform_async(param)
128
- expect(MyWorker.jobs.size).to eq(2)
121
+ expect(MyJob.jobs.size).to eq(0)
122
+ MyJob.perform_async(param)
123
+ expect(MyJob.jobs.size).to eq(1)
124
+ expect(MyJob).to have_enqueued_job(param)
125
+ MyJob.perform_async(param)
126
+ expect(MyJob.jobs.size).to eq(2)
129
127
  end
130
128
  end
131
129
  end
@@ -140,18 +138,16 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
140
138
  it 'if the unique is kept forever it does not allows to run the job again' do
141
139
  expect(TestClass).to receive(:run).with('args').once
142
140
 
143
- InlineUnlockOrderWorker.perform_async('args')
144
- InlineUnlockOrderWorker.perform_async('args')
141
+ UntilGlobalTimeoutJob.perform_async('args')
142
+ UntilGlobalTimeoutJob.perform_async('args')
145
143
  end
146
144
 
147
145
  describe 'when a job is set to run once in 10 minutes' do
148
- include ActiveSupport::Testing::TimeHelpers
149
-
150
146
  context 'when spammed' do
151
147
  it 'only allows 1 call per 10 minutes' do
152
148
  expect(TestClass).to receive(:run).with(1).once
153
149
  100.times do
154
- InlineExpirationWorker.perform_async(1)
150
+ UntilTimeoutJob.perform_async(1)
155
151
  end
156
152
  end
157
153
  end
@@ -160,12 +156,12 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
160
156
  it 'only allows 1 call per 10 minutes' do
161
157
  expect(TestClass).to receive(:run).with(9).once
162
158
  2.times do
163
- InlineExpirationWorker.perform_async(9)
159
+ UntilTimeoutJob.perform_async(9)
164
160
  end
165
161
 
166
162
  expect(TestClass).to receive(:run).with(2).once
167
163
  2.times do
168
- InlineExpirationWorker.perform_async(2)
164
+ UntilTimeoutJob.perform_async(2)
169
165
  end
170
166
  end
171
167
  end