sidekiq 2.15.1 → 4.2.10

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (187) hide show
  1. checksums.yaml +7 -0
  2. data/.github/contributing.md +32 -0
  3. data/.github/issue_template.md +9 -0
  4. data/.gitignore +1 -0
  5. data/.travis.yml +16 -17
  6. data/3.0-Upgrade.md +70 -0
  7. data/4.0-Upgrade.md +53 -0
  8. data/COMM-LICENSE +56 -44
  9. data/Changes.md +644 -1
  10. data/Ent-Changes.md +173 -0
  11. data/Gemfile +27 -0
  12. data/LICENSE +1 -1
  13. data/Pro-2.0-Upgrade.md +138 -0
  14. data/Pro-3.0-Upgrade.md +44 -0
  15. data/Pro-Changes.md +457 -3
  16. data/README.md +46 -29
  17. data/Rakefile +6 -3
  18. data/bin/sidekiq +4 -0
  19. data/bin/sidekiqctl +41 -20
  20. data/bin/sidekiqload +154 -0
  21. data/code_of_conduct.md +50 -0
  22. data/lib/generators/sidekiq/templates/worker.rb.erb +9 -0
  23. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +6 -0
  24. data/lib/generators/sidekiq/templates/worker_test.rb.erb +8 -0
  25. data/lib/generators/sidekiq/worker_generator.rb +49 -0
  26. data/lib/sidekiq.rb +141 -29
  27. data/lib/sidekiq/api.rb +540 -106
  28. data/lib/sidekiq/cli.rb +131 -71
  29. data/lib/sidekiq/client.rb +168 -96
  30. data/lib/sidekiq/core_ext.rb +36 -8
  31. data/lib/sidekiq/exception_handler.rb +20 -28
  32. data/lib/sidekiq/extensions/action_mailer.rb +25 -5
  33. data/lib/sidekiq/extensions/active_record.rb +8 -4
  34. data/lib/sidekiq/extensions/class_methods.rb +9 -5
  35. data/lib/sidekiq/extensions/generic_proxy.rb +1 -0
  36. data/lib/sidekiq/fetch.rb +45 -101
  37. data/lib/sidekiq/launcher.rb +144 -30
  38. data/lib/sidekiq/logging.rb +69 -12
  39. data/lib/sidekiq/manager.rb +90 -140
  40. data/lib/sidekiq/middleware/chain.rb +18 -5
  41. data/lib/sidekiq/middleware/i18n.rb +9 -2
  42. data/lib/sidekiq/middleware/server/active_record.rb +1 -1
  43. data/lib/sidekiq/middleware/server/logging.rb +11 -11
  44. data/lib/sidekiq/middleware/server/retry_jobs.rb +98 -44
  45. data/lib/sidekiq/paginator.rb +20 -8
  46. data/lib/sidekiq/processor.rb +157 -96
  47. data/lib/sidekiq/rails.rb +109 -5
  48. data/lib/sidekiq/redis_connection.rb +70 -24
  49. data/lib/sidekiq/scheduled.rb +122 -50
  50. data/lib/sidekiq/testing.rb +171 -31
  51. data/lib/sidekiq/testing/inline.rb +1 -0
  52. data/lib/sidekiq/util.rb +31 -5
  53. data/lib/sidekiq/version.rb +2 -1
  54. data/lib/sidekiq/web.rb +136 -263
  55. data/lib/sidekiq/web/action.rb +93 -0
  56. data/lib/sidekiq/web/application.rb +336 -0
  57. data/lib/sidekiq/web/helpers.rb +278 -0
  58. data/lib/sidekiq/web/router.rb +100 -0
  59. data/lib/sidekiq/worker.rb +40 -7
  60. data/sidekiq.gemspec +18 -14
  61. data/web/assets/images/favicon.ico +0 -0
  62. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  63. data/web/assets/javascripts/application.js +67 -19
  64. data/web/assets/javascripts/dashboard.js +138 -29
  65. data/web/assets/stylesheets/application.css +267 -406
  66. data/web/assets/stylesheets/bootstrap.css +4 -8
  67. data/web/locales/cs.yml +78 -0
  68. data/web/locales/da.yml +9 -1
  69. data/web/locales/de.yml +18 -9
  70. data/web/locales/el.yml +68 -0
  71. data/web/locales/en.yml +19 -4
  72. data/web/locales/es.yml +10 -1
  73. data/web/locales/fa.yml +79 -0
  74. data/web/locales/fr.yml +50 -32
  75. data/web/locales/hi.yml +75 -0
  76. data/web/locales/it.yml +27 -18
  77. data/web/locales/ja.yml +27 -12
  78. data/web/locales/ko.yml +8 -3
  79. data/web/locales/{no.yml → nb.yml} +19 -5
  80. data/web/locales/nl.yml +8 -3
  81. data/web/locales/pl.yml +0 -1
  82. data/web/locales/pt-br.yml +11 -4
  83. data/web/locales/pt.yml +8 -1
  84. data/web/locales/ru.yml +39 -21
  85. data/web/locales/sv.yml +68 -0
  86. data/web/locales/ta.yml +75 -0
  87. data/web/locales/uk.yml +76 -0
  88. data/web/locales/zh-cn.yml +68 -0
  89. data/web/locales/zh-tw.yml +68 -0
  90. data/web/views/_footer.erb +17 -0
  91. data/web/views/_job_info.erb +72 -60
  92. data/web/views/_nav.erb +58 -25
  93. data/web/views/_paging.erb +5 -5
  94. data/web/views/_poll_link.erb +7 -0
  95. data/web/views/_summary.erb +20 -14
  96. data/web/views/busy.erb +94 -0
  97. data/web/views/dashboard.erb +34 -21
  98. data/web/views/dead.erb +34 -0
  99. data/web/views/layout.erb +8 -30
  100. data/web/views/morgue.erb +75 -0
  101. data/web/views/queue.erb +37 -30
  102. data/web/views/queues.erb +26 -20
  103. data/web/views/retries.erb +60 -47
  104. data/web/views/retry.erb +23 -19
  105. data/web/views/scheduled.erb +39 -35
  106. data/web/views/scheduled_job_info.erb +2 -1
  107. metadata +152 -195
  108. data/Contributing.md +0 -29
  109. data/config.ru +0 -18
  110. data/lib/sidekiq/actor.rb +0 -7
  111. data/lib/sidekiq/capistrano.rb +0 -54
  112. data/lib/sidekiq/yaml_patch.rb +0 -21
  113. data/test/config.yml +0 -11
  114. data/test/env_based_config.yml +0 -11
  115. data/test/fake_env.rb +0 -0
  116. data/test/helper.rb +0 -42
  117. data/test/test_api.rb +0 -341
  118. data/test/test_cli.rb +0 -326
  119. data/test/test_client.rb +0 -211
  120. data/test/test_exception_handler.rb +0 -124
  121. data/test/test_extensions.rb +0 -105
  122. data/test/test_fetch.rb +0 -44
  123. data/test/test_manager.rb +0 -83
  124. data/test/test_middleware.rb +0 -135
  125. data/test/test_processor.rb +0 -160
  126. data/test/test_redis_connection.rb +0 -97
  127. data/test/test_retry.rb +0 -306
  128. data/test/test_scheduled.rb +0 -86
  129. data/test/test_scheduling.rb +0 -47
  130. data/test/test_sidekiq.rb +0 -37
  131. data/test/test_testing.rb +0 -82
  132. data/test/test_testing_fake.rb +0 -265
  133. data/test/test_testing_inline.rb +0 -92
  134. data/test/test_util.rb +0 -18
  135. data/test/test_web.rb +0 -372
  136. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  137. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  138. data/web/assets/images/status/active.png +0 -0
  139. data/web/assets/images/status/idle.png +0 -0
  140. data/web/assets/javascripts/locales/README.md +0 -27
  141. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  142. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  143. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  144. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  145. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  146. data/web/assets/javascripts/locales/jquery.timeago.cz.js +0 -18
  147. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  148. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  149. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  150. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  151. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  152. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  153. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  154. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  155. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  156. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  157. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  158. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  159. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  160. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  161. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  162. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  163. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  164. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  165. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  166. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  167. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  168. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  169. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  170. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  171. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  172. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  173. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  174. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  175. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  176. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  177. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  178. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  179. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  180. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  181. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  182. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  183. data/web/assets/javascripts/locales/jquery.timeago.zh-CN.js +0 -20
  184. data/web/assets/javascripts/locales/jquery.timeago.zh-TW.js +0 -20
  185. data/web/views/_poll.erb +0 -14
  186. data/web/views/_workers.erb +0 -29
  187. data/web/views/index.erb +0 -16
@@ -1,86 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/scheduled'
3
-
4
- class TestScheduled < Sidekiq::Test
5
- class ScheduledWorker
6
- include Sidekiq::Worker
7
- def perform(x)
8
- end
9
- end
10
-
11
- describe 'poller' do
12
- before do
13
- Sidekiq.redis = REDIS
14
- Sidekiq.redis do |conn|
15
- conn.flushdb
16
- end
17
-
18
- @error_1 = { 'class' => ScheduledWorker.name, 'args' => [0], 'queue' => 'queue_1' }
19
- @error_2 = { 'class' => ScheduledWorker.name, 'args' => [1], 'queue' => 'queue_2' }
20
- @error_3 = { 'class' => ScheduledWorker.name, 'args' => [2], 'queue' => 'queue_3' }
21
- @future_1 = { 'class' => ScheduledWorker.name, 'args' => [3], 'queue' => 'queue_4' }
22
- @future_2 = { 'class' => ScheduledWorker.name, 'args' => [4], 'queue' => 'queue_5' }
23
- @future_3 = { 'class' => ScheduledWorker.name, 'args' => [5], 'queue' => 'queue_6' }
24
-
25
- @retry = Sidekiq::RetrySet.new
26
- @scheduled = Sidekiq::ScheduledSet.new
27
- @poller = Sidekiq::Scheduled::Poller.new
28
- end
29
-
30
- class Stopper
31
- def call(worker_class, message, queue)
32
- yield if message['args'].first.odd?
33
- end
34
- end
35
-
36
- it 'executes client middleware' do
37
- Sidekiq.client_middleware.add Stopper
38
- begin
39
- @retry.schedule (Time.now - 60).to_f, @error_1
40
- @retry.schedule (Time.now - 60).to_f, @error_2
41
- @scheduled.schedule (Time.now - 60).to_f, @future_2
42
- @scheduled.schedule (Time.now - 60).to_f, @future_3
43
-
44
- @poller.poll
45
-
46
- Sidekiq.redis do |conn|
47
- assert_equal 0, conn.llen("queue:queue_1")
48
- assert_equal 1, conn.llen("queue:queue_2")
49
- assert_equal 0, conn.llen("queue:queue_5")
50
- assert_equal 1, conn.llen("queue:queue_6")
51
- end
52
- ensure
53
- Sidekiq.client_middleware.remove Stopper
54
- end
55
- end
56
-
57
- it 'should empty the retry and scheduled queues up to the current time' do
58
- enqueued_time = Time.new(2013, 2, 4)
59
-
60
- Time.stub(:now, enqueued_time) do
61
- @retry.schedule (Time.now - 60).to_f, @error_1
62
- @retry.schedule (Time.now - 50).to_f, @error_2
63
- @retry.schedule (Time.now + 60).to_f, @error_3
64
- @scheduled.schedule (Time.now - 60).to_f, @future_1
65
- @scheduled.schedule (Time.now - 50).to_f, @future_2
66
- @scheduled.schedule (Time.now + 60).to_f, @future_3
67
-
68
- @poller.poll
69
-
70
- Sidekiq.redis do |conn|
71
- assert_equal 1, conn.llen("queue:queue_1")
72
- assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_1", 0, -1)[0])['enqueued_at']
73
- assert_equal 1, conn.llen("queue:queue_2")
74
- assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_2", 0, -1)[0])['enqueued_at']
75
- assert_equal 1, conn.llen("queue:queue_4")
76
- assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_4", 0, -1)[0])['enqueued_at']
77
- assert_equal 1, conn.llen("queue:queue_5")
78
- assert_equal enqueued_time.to_f, Sidekiq.load_json(conn.lrange("queue:queue_5", 0, -1)[0])['enqueued_at']
79
- end
80
-
81
- assert_equal 1, @retry.size
82
- assert_equal 1, @scheduled.size
83
- end
84
- end
85
- end
86
- end
@@ -1,47 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/scheduled'
3
-
4
- class TestScheduling < Sidekiq::Test
5
- describe 'middleware' do
6
- before do
7
- @redis = Minitest::Mock.new
8
- # Ugh, this is terrible.
9
- Sidekiq.instance_variable_set(:@redis, @redis)
10
- def @redis.multi; [yield] * 2 if block_given?; end
11
- def @redis.with; yield self; end
12
- end
13
-
14
- class ScheduledWorker
15
- include Sidekiq::Worker
16
- sidekiq_options :queue => :custom_queue
17
- def perform(x)
18
- end
19
- end
20
-
21
- it 'schedules a job via interval' do
22
- @redis.expect :zadd, true, ['schedule', Array]
23
- assert ScheduledWorker.perform_in(600, 'mike')
24
- @redis.verify
25
- end
26
-
27
- it 'schedules a job via timestamp' do
28
- @redis.expect :zadd, true, ['schedule', Array]
29
- assert ScheduledWorker.perform_in(5.days.from_now, 'mike')
30
- @redis.verify
31
- end
32
-
33
- it 'schedules job right away on negative timestamp/interval' do
34
- @redis.expect :sadd, true, ['queues', :custom_queue]
35
- @redis.expect :lpush, true, ['queue:custom_queue', Array]
36
- assert ScheduledWorker.perform_in(-300, 'mike')
37
- @redis.verify
38
- end
39
-
40
- it 'schedules multiple jobs at once' do
41
- @redis.expect :zadd, true, ['schedule', Array]
42
- assert Sidekiq::Client.push_bulk('class' => ScheduledWorker, 'args' => [['mike'], ['mike']], 'at' => 600)
43
- @redis.verify
44
- end
45
- end
46
-
47
- end
@@ -1,37 +0,0 @@
1
- # encoding: utf-8
2
- require 'helper'
3
-
4
- class TestSidekiq < Sidekiq::Test
5
- describe 'json processing' do
6
- it 'loads json' do
7
- assert_equal ({"foo" => "bar"}), Sidekiq.load_json("{\"foo\":\"bar\"}")
8
- end
9
-
10
- it 'dumps json' do
11
- assert_equal "{\"foo\":\"bar\"}", Sidekiq.dump_json({ "foo" => "bar" })
12
- end
13
- end
14
-
15
- describe "redis connection" do
16
- it "returns error without creating a connection if block is not given" do
17
- mock = Minitest::Mock.new
18
- mock.expect :create, nil #Sidekiq::RedisConnection, create
19
- assert_raises(ArgumentError) {
20
- Sidekiq.redis
21
- }
22
- assert_raises(MockExpectationError, "create should not be called") do
23
- mock.verify
24
- end
25
- end
26
- end
27
-
28
- describe "❨╯°□°❩╯︵┻━┻" do
29
- before { $stdout = StringIO.new }
30
- after { $stdout = STDOUT }
31
-
32
- it "allows angry developers to express their emotional constitution and remedies it" do
33
- Sidekiq.❨╯°□°❩╯︵┻━┻
34
- assert_equal "Calm down, bro\n", $stdout.string
35
- end
36
- end
37
- end
@@ -1,82 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'sidekiq/worker'
4
- require 'active_record'
5
- require 'action_mailer'
6
- require 'sidekiq/rails'
7
- require 'sidekiq/extensions/action_mailer'
8
- require 'sidekiq/extensions/active_record'
9
-
10
- Sidekiq.hook_rails!
11
-
12
- class TestTesting < Sidekiq::Test
13
- describe 'sidekiq testing' do
14
- describe 'require/load sidekiq/testing.rb' do
15
- before do
16
- require 'sidekiq/testing.rb'
17
- end
18
-
19
- after do
20
- Sidekiq::Testing.disable!
21
- end
22
-
23
- it 'enables fake testing' do
24
- Sidekiq::Testing.fake!
25
- assert_equal true, Sidekiq::Testing.enabled?
26
- assert_equal true, Sidekiq::Testing.fake?
27
- end
28
-
29
- it 'enables fake testing in a block' do
30
- Sidekiq::Testing.disable!
31
- assert_equal true, Sidekiq::Testing.disabled?
32
-
33
- Sidekiq::Testing.fake! do
34
- assert_equal true, Sidekiq::Testing.enabled?
35
- assert_equal true, Sidekiq::Testing.fake?
36
- end
37
-
38
- assert_equal false, Sidekiq::Testing.enabled?
39
- assert_equal false, Sidekiq::Testing.fake?
40
- end
41
-
42
- it 'disables testing in a block' do
43
- Sidekiq::Testing.fake!
44
-
45
- Sidekiq::Testing.disable! do
46
- assert_equal true, Sidekiq::Testing.disabled?
47
- end
48
-
49
- assert_equal true, Sidekiq::Testing.enabled?
50
- end
51
- end
52
-
53
- describe 'require/load sidekiq/testing/inline.rb' do
54
- before do
55
- require 'sidekiq/testing/inline.rb'
56
- end
57
-
58
- after do
59
- Sidekiq::Testing.disable!
60
- end
61
-
62
- it 'enables inline testing' do
63
- Sidekiq::Testing.inline!
64
- assert_equal true, Sidekiq::Testing.enabled?
65
- assert_equal true, Sidekiq::Testing.inline?
66
- end
67
-
68
- it 'enables inline testing in a block' do
69
- Sidekiq::Testing.disable!
70
- assert_equal true, Sidekiq::Testing.disabled?
71
-
72
- Sidekiq::Testing.inline! do
73
- assert_equal true, Sidekiq::Testing.enabled?
74
- assert_equal true, Sidekiq::Testing.inline?
75
- end
76
-
77
- assert_equal false, Sidekiq::Testing.enabled?
78
- assert_equal false, Sidekiq::Testing.inline?
79
- end
80
- end
81
- end
82
- end
@@ -1,265 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'sidekiq/worker'
4
- require 'active_record'
5
- require 'action_mailer'
6
- require 'sidekiq/rails'
7
- require 'sidekiq/extensions/action_mailer'
8
- require 'sidekiq/extensions/active_record'
9
-
10
- Sidekiq.hook_rails!
11
-
12
- class TestTesting < Sidekiq::Test
13
- describe 'sidekiq testing' do
14
- class PerformError < RuntimeError; end
15
-
16
- class DirectWorker
17
- include Sidekiq::Worker
18
- def perform(a, b)
19
- a + b
20
- end
21
- end
22
-
23
- class EnqueuedWorker
24
- include Sidekiq::Worker
25
- def perform(a, b)
26
- a + b
27
- end
28
- end
29
-
30
- class StoredWorker
31
- include Sidekiq::Worker
32
- def perform(error)
33
- raise PerformError if error
34
- end
35
- end
36
-
37
- class FooMailer < ActionMailer::Base
38
- def bar(str)
39
- str
40
- end
41
- end
42
-
43
- class FooModel < ActiveRecord::Base
44
- def bar(str)
45
- str
46
- end
47
- end
48
-
49
- before do
50
- require 'sidekiq/testing.rb'
51
- Sidekiq::Testing.fake!
52
- EnqueuedWorker.jobs.clear
53
- DirectWorker.jobs.clear
54
- end
55
-
56
- after do
57
- Sidekiq::Testing.disable!
58
- end
59
-
60
- it 'stubs the async call' do
61
- assert_equal 0, DirectWorker.jobs.size
62
- assert DirectWorker.perform_async(1, 2)
63
- assert_equal 1, DirectWorker.jobs.size
64
- assert DirectWorker.perform_in(10, 1, 2)
65
- assert_equal 2, DirectWorker.jobs.size
66
- assert DirectWorker.perform_at(10, 1, 2)
67
- assert_equal 3, DirectWorker.jobs.size
68
- assert_in_delta 10.seconds.from_now.to_f, DirectWorker.jobs.last['at'], 0.01
69
- end
70
-
71
- it 'stubs the delay call on mailers' do
72
- assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
73
- FooMailer.delay.bar('hello!')
74
- assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
75
- end
76
-
77
- class Something
78
- def self.foo(x)
79
- end
80
- end
81
-
82
- it 'stubs the delay call on models' do
83
- assert_equal 0, Sidekiq::Extensions::DelayedClass.jobs.size
84
- Something.delay.foo(Date.today)
85
- assert_equal 1, Sidekiq::Extensions::DelayedClass.jobs.size
86
- end
87
-
88
- it 'stubs the enqueue call' do
89
- assert_equal 0, EnqueuedWorker.jobs.size
90
- assert Sidekiq::Client.enqueue(EnqueuedWorker, 1, 2)
91
- assert_equal 1, EnqueuedWorker.jobs.size
92
- end
93
-
94
- it 'stubs the enqueue_to call' do
95
- assert_equal 0, EnqueuedWorker.jobs.size
96
- assert Sidekiq::Client.enqueue_to('someq', EnqueuedWorker, 1, 2)
97
- assert_equal 1, EnqueuedWorker.jobs.size
98
- end
99
-
100
- it 'executes all stored jobs' do
101
- assert StoredWorker.perform_async(false)
102
- assert StoredWorker.perform_async(true)
103
-
104
- assert_equal 2, StoredWorker.jobs.size
105
- assert_raises PerformError do
106
- StoredWorker.drain
107
- end
108
- assert_equal 0, StoredWorker.jobs.size
109
-
110
- end
111
-
112
- class SpecificJidWorker
113
- include Sidekiq::Worker
114
- class_attribute :count
115
- self.count = 0
116
- def perform(worker_jid)
117
- return unless worker_jid == self.jid
118
- self.class.count += 1
119
- end
120
- end
121
-
122
- it 'execute only jobs with assigned JID' do
123
- 4.times do |i|
124
- jid = SpecificJidWorker.perform_async(nil)
125
- if i % 2 == 0
126
- SpecificJidWorker.jobs[-1]["args"] = ["wrong_jid"]
127
- else
128
- SpecificJidWorker.jobs[-1]["args"] = [jid]
129
- end
130
- end
131
-
132
- SpecificJidWorker.perform_one
133
- assert_equal 0, SpecificJidWorker.count
134
-
135
- SpecificJidWorker.perform_one
136
- assert_equal 1, SpecificJidWorker.count
137
-
138
- SpecificJidWorker.drain
139
- assert_equal 2, SpecificJidWorker.count
140
- end
141
-
142
- it 'round trip serializes the job arguments' do
143
- assert StoredWorker.perform_async(:mike)
144
- job = StoredWorker.jobs.first
145
- assert_equal "mike", job['args'].first
146
- StoredWorker.clear
147
- end
148
-
149
- it 'perform_one runs only one job' do
150
- DirectWorker.perform_async(1, 2)
151
- DirectWorker.perform_async(3, 4)
152
- assert_equal 2, DirectWorker.jobs.size
153
-
154
- DirectWorker.perform_one
155
- assert_equal 1, DirectWorker.jobs.size
156
-
157
- DirectWorker.clear
158
- end
159
-
160
- it 'perform_one raise error upon empty queue' do
161
- DirectWorker.clear
162
- assert_raises Sidekiq::EmptyQueueError do
163
- DirectWorker.perform_one
164
- end
165
- end
166
-
167
- class FirstWorker
168
- include Sidekiq::Worker
169
- class_attribute :count
170
- self.count = 0
171
- def perform
172
- self.class.count += 1
173
- end
174
- end
175
-
176
- class SecondWorker
177
- include Sidekiq::Worker
178
- class_attribute :count
179
- self.count = 0
180
- def perform
181
- self.class.count += 1
182
- end
183
- end
184
-
185
- class ThirdWorker
186
- include Sidekiq::Worker
187
- class_attribute :count
188
- def perform
189
- FirstWorker.perform_async
190
- SecondWorker.perform_async
191
- end
192
- end
193
-
194
- it 'clears jobs across all workers' do
195
- Sidekiq::Worker.jobs.clear
196
- FirstWorker.count = 0
197
- SecondWorker.count = 0
198
-
199
- assert_equal 0, FirstWorker.jobs.size
200
- assert_equal 0, SecondWorker.jobs.size
201
-
202
- FirstWorker.perform_async
203
- SecondWorker.perform_async
204
-
205
- assert_equal 1, FirstWorker.jobs.size
206
- assert_equal 1, SecondWorker.jobs.size
207
-
208
- Sidekiq::Worker.clear_all
209
-
210
- assert_equal 0, FirstWorker.jobs.size
211
- assert_equal 0, SecondWorker.jobs.size
212
-
213
- assert_equal 0, FirstWorker.count
214
- assert_equal 0, SecondWorker.count
215
- end
216
-
217
- it 'drains jobs across all workers' do
218
- Sidekiq::Worker.jobs.clear
219
- FirstWorker.count = 0
220
- SecondWorker.count = 0
221
-
222
- assert_equal 0, FirstWorker.jobs.size
223
- assert_equal 0, SecondWorker.jobs.size
224
-
225
- assert_equal 0, FirstWorker.count
226
- assert_equal 0, SecondWorker.count
227
-
228
- FirstWorker.perform_async
229
- SecondWorker.perform_async
230
-
231
- assert_equal 1, FirstWorker.jobs.size
232
- assert_equal 1, SecondWorker.jobs.size
233
-
234
- Sidekiq::Worker.drain_all
235
-
236
- assert_equal 0, FirstWorker.jobs.size
237
- assert_equal 0, SecondWorker.jobs.size
238
-
239
- assert_equal 1, FirstWorker.count
240
- assert_equal 1, SecondWorker.count
241
- end
242
-
243
- it 'drains jobs across all workers even when workers create new jobs' do
244
- Sidekiq::Worker.jobs.clear
245
- FirstWorker.count = 0
246
- SecondWorker.count = 0
247
-
248
- assert_equal 0, ThirdWorker.jobs.size
249
-
250
- assert_equal 0, FirstWorker.count
251
- assert_equal 0, SecondWorker.count
252
-
253
- ThirdWorker.perform_async
254
-
255
- assert_equal 1, ThirdWorker.jobs.size
256
-
257
- Sidekiq::Worker.drain_all
258
-
259
- assert_equal 0, ThirdWorker.jobs.size
260
-
261
- assert_equal 1, FirstWorker.count
262
- assert_equal 1, SecondWorker.count
263
- end
264
- end
265
- end