sidekiq 4.0.0 → 5.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 might be problematic. Click here for more details.

Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/{Contributing.md → .github/contributing.md} +0 -0
  3. data/.github/issue_template.md +9 -0
  4. data/.gitignore +1 -0
  5. data/.travis.yml +12 -10
  6. data/4.0-Upgrade.md +4 -1
  7. data/5.0-Upgrade.md +56 -0
  8. data/COMM-LICENSE +1 -1
  9. data/Changes.md +236 -7
  10. data/Ent-Changes.md +111 -3
  11. data/Gemfile +7 -6
  12. data/Pro-3.0-Upgrade.md +5 -7
  13. data/Pro-Changes.md +162 -5
  14. data/README.md +31 -21
  15. data/Rakefile +5 -2
  16. data/bin/sidekiq +0 -1
  17. data/bin/sidekiqctl +1 -1
  18. data/bin/sidekiqload +15 -33
  19. data/code_of_conduct.md +50 -0
  20. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +2 -2
  21. data/lib/generators/sidekiq/templates/worker_test.rb.erb +6 -6
  22. data/lib/sidekiq.rb +46 -21
  23. data/lib/sidekiq/api.rb +94 -30
  24. data/lib/sidekiq/cli.rb +38 -16
  25. data/lib/sidekiq/client.rb +32 -26
  26. data/lib/sidekiq/core_ext.rb +14 -0
  27. data/lib/sidekiq/delay.rb +21 -0
  28. data/lib/sidekiq/exception_handler.rb +2 -1
  29. data/lib/sidekiq/extensions/action_mailer.rb +1 -0
  30. data/lib/sidekiq/extensions/active_record.rb +1 -0
  31. data/lib/sidekiq/extensions/class_methods.rb +1 -0
  32. data/lib/sidekiq/extensions/generic_proxy.rb +8 -1
  33. data/lib/sidekiq/fetch.rb +2 -1
  34. data/lib/sidekiq/job_logger.rb +27 -0
  35. data/lib/sidekiq/job_retry.rb +235 -0
  36. data/lib/sidekiq/launcher.rb +42 -33
  37. data/lib/sidekiq/logging.rb +3 -1
  38. data/lib/sidekiq/manager.rb +9 -4
  39. data/lib/sidekiq/middleware/chain.rb +1 -0
  40. data/lib/sidekiq/middleware/i18n.rb +1 -0
  41. data/lib/sidekiq/middleware/server/active_record.rb +9 -0
  42. data/lib/sidekiq/paginator.rb +1 -0
  43. data/lib/sidekiq/processor.rb +73 -19
  44. data/lib/sidekiq/rails.rb +47 -25
  45. data/lib/sidekiq/redis_connection.rb +14 -3
  46. data/lib/sidekiq/scheduled.rb +12 -1
  47. data/lib/sidekiq/testing.rb +65 -13
  48. data/lib/sidekiq/testing/inline.rb +1 -0
  49. data/lib/sidekiq/util.rb +3 -15
  50. data/lib/sidekiq/version.rb +2 -1
  51. data/lib/sidekiq/web.rb +120 -184
  52. data/lib/sidekiq/web/action.rb +89 -0
  53. data/lib/sidekiq/web/application.rb +331 -0
  54. data/lib/sidekiq/{web_helpers.rb → web/helpers.rb} +57 -27
  55. data/lib/sidekiq/web/router.rb +100 -0
  56. data/lib/sidekiq/worker.rb +52 -11
  57. data/sidekiq.gemspec +12 -7
  58. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  59. data/web/assets/javascripts/application.js +24 -20
  60. data/web/assets/javascripts/dashboard.js +11 -13
  61. data/web/assets/stylesheets/application-rtl.css +246 -0
  62. data/web/assets/stylesheets/application.css +362 -5
  63. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  64. data/web/assets/stylesheets/bootstrap.css +4 -8
  65. data/web/locales/ar.yml +80 -0
  66. data/web/locales/cs.yml +11 -1
  67. data/web/locales/de.yml +1 -1
  68. data/web/locales/en.yml +2 -0
  69. data/web/locales/fa.yml +80 -0
  70. data/web/locales/fr.yml +21 -12
  71. data/web/locales/he.yml +79 -0
  72. data/web/locales/ja.yml +19 -10
  73. data/web/locales/ru.yml +3 -0
  74. data/web/locales/ur.yml +80 -0
  75. data/web/views/_footer.erb +2 -2
  76. data/web/views/_job_info.erb +5 -1
  77. data/web/views/_nav.erb +2 -2
  78. data/web/views/_paging.erb +1 -1
  79. data/web/views/busy.erb +14 -9
  80. data/web/views/dashboard.erb +5 -5
  81. data/web/views/dead.erb +1 -1
  82. data/web/views/layout.erb +13 -5
  83. data/web/views/morgue.erb +16 -12
  84. data/web/views/queue.erb +11 -11
  85. data/web/views/queues.erb +3 -3
  86. data/web/views/retries.erb +15 -13
  87. data/web/views/retry.erb +2 -2
  88. data/web/views/scheduled.erb +4 -4
  89. data/web/views/scheduled_job_info.erb +1 -1
  90. metadata +97 -148
  91. data/lib/sidekiq/middleware/server/logging.rb +0 -40
  92. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  93. data/test/config.yml +0 -9
  94. data/test/env_based_config.yml +0 -11
  95. data/test/fake_env.rb +0 -0
  96. data/test/fixtures/en.yml +0 -2
  97. data/test/helper.rb +0 -74
  98. data/test/test_actors.rb +0 -137
  99. data/test/test_api.rb +0 -494
  100. data/test/test_cli.rb +0 -335
  101. data/test/test_client.rb +0 -194
  102. data/test/test_exception_handler.rb +0 -55
  103. data/test/test_extensions.rb +0 -126
  104. data/test/test_fetch.rb +0 -49
  105. data/test/test_launcher.rb +0 -80
  106. data/test/test_logging.rb +0 -34
  107. data/test/test_manager.rb +0 -49
  108. data/test/test_middleware.rb +0 -157
  109. data/test/test_processor.rb +0 -200
  110. data/test/test_rails.rb +0 -21
  111. data/test/test_redis_connection.rb +0 -126
  112. data/test/test_retry.rb +0 -325
  113. data/test/test_scheduled.rb +0 -114
  114. data/test/test_scheduling.rb +0 -49
  115. data/test/test_sidekiq.rb +0 -99
  116. data/test/test_testing.rb +0 -142
  117. data/test/test_testing_fake.rb +0 -331
  118. data/test/test_testing_inline.rb +0 -93
  119. data/test/test_util.rb +0 -16
  120. data/test/test_web.rb +0 -608
  121. data/test/test_web_helpers.rb +0 -53
  122. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  123. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  124. data/web/assets/images/status/active.png +0 -0
  125. data/web/assets/images/status/idle.png +0 -0
  126. data/web/assets/javascripts/locales/README.md +0 -27
  127. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  128. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  129. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  130. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  131. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  132. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  133. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  134. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  135. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  136. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  137. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  138. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  139. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  140. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  141. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  142. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  143. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  144. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  145. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  146. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  147. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  148. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  149. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  150. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  151. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  152. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  153. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  154. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  155. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  156. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  157. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  158. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  159. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  160. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  161. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  162. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  163. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  164. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  165. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  166. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  167. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  168. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  169. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  170. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  171. data/web/views/_poll_js.erb +0 -5
@@ -1,114 +0,0 @@
1
- require_relative '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{|c| c.flushdb}
14
- @error_1 = { 'class' => ScheduledWorker.name, 'args' => [0], 'queue' => 'queue_1' }
15
- @error_2 = { 'class' => ScheduledWorker.name, 'args' => [1], 'queue' => 'queue_2' }
16
- @error_3 = { 'class' => ScheduledWorker.name, 'args' => [2], 'queue' => 'queue_3' }
17
- @future_1 = { 'class' => ScheduledWorker.name, 'args' => [3], 'queue' => 'queue_4' }
18
- @future_2 = { 'class' => ScheduledWorker.name, 'args' => [4], 'queue' => 'queue_5' }
19
- @future_3 = { 'class' => ScheduledWorker.name, 'args' => [5], 'queue' => 'queue_6' }
20
-
21
- @retry = Sidekiq::RetrySet.new
22
- @scheduled = Sidekiq::ScheduledSet.new
23
- @poller = Sidekiq::Scheduled::Poller.new
24
- end
25
-
26
- class Stopper
27
- def call(worker_class, job, queue, r)
28
- yield if job['args'].first.odd?
29
- end
30
- end
31
-
32
- it 'executes client middleware' do
33
- Sidekiq.client_middleware.add Stopper
34
- begin
35
- @retry.schedule (Time.now - 60).to_f, @error_1
36
- @retry.schedule (Time.now - 60).to_f, @error_2
37
- @scheduled.schedule (Time.now - 60).to_f, @future_2
38
- @scheduled.schedule (Time.now - 60).to_f, @future_3
39
-
40
- @poller.enqueue
41
-
42
- assert_equal 0, Sidekiq::Queue.new("queue_1").size
43
- assert_equal 1, Sidekiq::Queue.new("queue_2").size
44
- assert_equal 0, Sidekiq::Queue.new("queue_5").size
45
- assert_equal 1, Sidekiq::Queue.new("queue_6").size
46
- ensure
47
- Sidekiq.client_middleware.remove Stopper
48
- end
49
- end
50
-
51
- it 'should empty the retry and scheduled queues up to the current time' do
52
- created_time = Time.new(2013, 2, 3)
53
- enqueued_time = Time.new(2013, 2, 4)
54
-
55
- Time.stub(:now, created_time) do
56
- @retry.schedule (enqueued_time - 60).to_f, @error_1.merge!('created_at' => created_time.to_f)
57
- @retry.schedule (enqueued_time - 50).to_f, @error_2.merge!('created_at' => created_time.to_f)
58
- @retry.schedule (enqueued_time + 60).to_f, @error_3.merge!('created_at' => created_time.to_f)
59
- @scheduled.schedule (enqueued_time - 60).to_f, @future_1.merge!('created_at' => created_time.to_f)
60
- @scheduled.schedule (enqueued_time - 50).to_f, @future_2.merge!('created_at' => created_time.to_f)
61
- @scheduled.schedule (enqueued_time + 60).to_f, @future_3.merge!('created_at' => created_time.to_f)
62
- end
63
-
64
- Time.stub(:now, enqueued_time) do
65
- @poller.enqueue
66
-
67
- Sidekiq.redis do |conn|
68
- %w(queue:queue_1 queue:queue_2 queue:queue_4 queue:queue_5).each do |queue_name|
69
- assert_equal 1, conn.llen(queue_name)
70
- job = Sidekiq.load_json(conn.lrange(queue_name, 0, -1)[0])
71
- assert_equal enqueued_time.to_f, job['enqueued_at']
72
- assert_equal created_time.to_f, job['created_at']
73
- end
74
- end
75
-
76
- assert_equal 1, @retry.size
77
- assert_equal 1, @scheduled.size
78
- end
79
- end
80
-
81
- def with_sidekiq_option(name, value)
82
- _original, Sidekiq.options[name] = Sidekiq.options[name], value
83
- begin
84
- yield
85
- ensure
86
- Sidekiq.options[name] = _original
87
- end
88
- end
89
-
90
- it 'generates random intervals that target a configured average' do
91
- with_sidekiq_option(:poll_interval_average, 10) do
92
- i = 500
93
- intervals = i.times.map{ @poller.send(:random_poll_interval) }
94
-
95
- assert intervals.all?{|x| x >= 5}
96
- assert intervals.all?{|x| x <= 15}
97
- assert_in_delta 10, intervals.reduce(&:+).to_f / i, 0.5
98
- end
99
- end
100
-
101
- it 'calculates an average poll interval based on the number of known Sidekiq processes' do
102
- with_sidekiq_option(:average_scheduled_poll_interval, 10) do
103
- 3.times do |i|
104
- Sidekiq.redis do |conn|
105
- conn.sadd("processes", "process-#{i}")
106
- conn.hset("process-#{i}", "info", nil)
107
- end
108
- end
109
-
110
- assert_equal 30, @poller.send(:scaled_poll_interval)
111
- end
112
- end
113
- end
114
- end
@@ -1,49 +0,0 @@
1
- require_relative 'helper'
2
- require 'sidekiq/scheduled'
3
-
4
- class TestScheduling < Sidekiq::Test
5
- describe 'middleware' do
6
- class ScheduledWorker
7
- include Sidekiq::Worker
8
- sidekiq_options :queue => :custom_queue
9
- def perform(x)
10
- end
11
- end
12
-
13
- it 'schedules jobs' do
14
- ss = Sidekiq::ScheduledSet.new
15
- ss.clear
16
-
17
- assert_equal 0, ss.size
18
-
19
- assert ScheduledWorker.perform_in(600, 'mike')
20
- assert_equal 1, ss.size
21
-
22
- assert ScheduledWorker.perform_in(1.month, 'mike')
23
- assert_equal 2, ss.size
24
-
25
- assert ScheduledWorker.perform_in(5.days.from_now, 'mike')
26
- assert_equal 3, ss.size
27
-
28
- q = Sidekiq::Queue.new("custom_queue")
29
- qs = q.size
30
- assert ScheduledWorker.perform_in(-300, 'mike')
31
- assert_equal 3, ss.size
32
- assert_equal qs+1, q.size
33
-
34
- assert Sidekiq::Client.push_bulk('class' => ScheduledWorker, 'args' => [['mike'], ['mike']], 'at' => 600)
35
- assert_equal 5, ss.size
36
- end
37
-
38
- it 'removes the enqueued_at field when scheduling' do
39
- ss = Sidekiq::ScheduledSet.new
40
- ss.clear
41
-
42
- assert ScheduledWorker.perform_in(1.month, 'mike')
43
- job = ss.first
44
- assert job['created_at']
45
- refute job['enqueued_at']
46
- end
47
- end
48
-
49
- end
@@ -1,99 +0,0 @@
1
- # encoding: utf-8
2
- require_relative 'helper'
3
-
4
- class TestSidekiq < Sidekiq::Test
5
- describe 'json processing' do
6
- it 'handles json' do
7
- assert_equal({"foo" => "bar"}, Sidekiq.load_json("{\"foo\":\"bar\"}"))
8
- assert_equal "{\"foo\":\"bar\"}", Sidekiq.dump_json({ "foo" => "bar" })
9
- end
10
- end
11
-
12
- describe "redis connection" do
13
- it "returns error without creating a connection if block is not given" do
14
- assert_raises(ArgumentError) do
15
- Sidekiq.redis
16
- end
17
- end
18
- end
19
-
20
- describe "❨╯°□°❩╯︵┻━┻" do
21
- before { $stdout = StringIO.new }
22
- after { $stdout = STDOUT }
23
-
24
- it "allows angry developers to express their emotional constitution and remedies it" do
25
- Sidekiq.❨╯°□°❩╯︵┻━┻
26
- assert_equal "Calm down, yo.\n", $stdout.string
27
- end
28
- end
29
-
30
- describe 'lifecycle events' do
31
- it 'handles invalid input' do
32
- Sidekiq.options[:lifecycle_events][:startup].clear
33
-
34
- e = assert_raises ArgumentError do
35
- Sidekiq.on(:startp)
36
- end
37
- assert_match(/Invalid event name/, e.message)
38
- e = assert_raises ArgumentError do
39
- Sidekiq.on('startup')
40
- end
41
- assert_match(/Symbols only/, e.message)
42
- Sidekiq.on(:startup) do
43
- 1 + 1
44
- end
45
-
46
- assert_equal 2, Sidekiq.options[:lifecycle_events][:startup].first.call
47
- end
48
- end
49
-
50
- describe 'default_worker_options' do
51
- it 'stringifies keys' do
52
- @old_options = Sidekiq.default_worker_options
53
- begin
54
- Sidekiq.default_worker_options = { queue: 'cat'}
55
- assert_equal 'cat', Sidekiq.default_worker_options['queue']
56
- ensure
57
- Sidekiq.default_worker_options = @old_options
58
- end
59
- end
60
- end
61
-
62
- describe 'error handling' do
63
- it 'deals with user-specified error handlers which raise errors' do
64
- output = capture_logging do
65
- begin
66
- Sidekiq.error_handlers << proc {|x, hash|
67
- raise 'boom'
68
- }
69
- cli = Sidekiq::CLI.new
70
- cli.handle_exception(RuntimeError.new("hello"))
71
- ensure
72
- Sidekiq.error_handlers.pop
73
- end
74
- end
75
- assert_includes output, "boom"
76
- assert_includes output, "ERROR"
77
- end
78
- end
79
-
80
- describe 'redis connection' do
81
- it 'does not continually retry' do
82
- assert_raises Redis::CommandError do
83
- Sidekiq.redis do |c|
84
- raise Redis::CommandError, "READONLY You can't write against a read only slave."
85
- end
86
- end
87
- end
88
-
89
- it 'reconnects if connection is flagged as readonly' do
90
- counts = []
91
- Sidekiq.redis do |c|
92
- counts << c.info['total_connections_received'].to_i
93
- raise Redis::CommandError, "READONLY You can't write against a read only slave." if counts.size == 1
94
- end
95
- assert_equal 2, counts.size
96
- assert_equal counts[0] + 1, counts[1]
97
- end
98
- end
99
- end
@@ -1,142 +0,0 @@
1
- require_relative 'helper'
2
-
3
- require 'active_record'
4
- require 'action_mailer'
5
- require 'sidekiq/rails'
6
- require 'sidekiq/extensions/action_mailer'
7
- require 'sidekiq/extensions/active_record'
8
-
9
- Sidekiq.hook_rails!
10
-
11
- class TestTesting < Sidekiq::Test
12
- describe 'sidekiq testing' do
13
- describe 'require/load sidekiq/testing.rb' do
14
- before do
15
- require 'sidekiq/testing'
16
- end
17
-
18
- after do
19
- Sidekiq::Testing.disable!
20
- end
21
-
22
- it 'enables fake testing' do
23
- Sidekiq::Testing.fake!
24
- assert Sidekiq::Testing.enabled?
25
- assert Sidekiq::Testing.fake?
26
- refute Sidekiq::Testing.inline?
27
- end
28
-
29
- it 'enables fake testing in a block' do
30
- Sidekiq::Testing.disable!
31
- assert Sidekiq::Testing.disabled?
32
- refute Sidekiq::Testing.fake?
33
-
34
- Sidekiq::Testing.fake! do
35
- assert Sidekiq::Testing.enabled?
36
- assert Sidekiq::Testing.fake?
37
- refute Sidekiq::Testing.inline?
38
- end
39
-
40
- refute Sidekiq::Testing.enabled?
41
- refute Sidekiq::Testing.fake?
42
- end
43
-
44
- it 'disables testing in a block' do
45
- Sidekiq::Testing.fake!
46
- assert Sidekiq::Testing.fake?
47
-
48
- Sidekiq::Testing.disable! do
49
- refute Sidekiq::Testing.fake?
50
- assert Sidekiq::Testing.disabled?
51
- end
52
-
53
- assert Sidekiq::Testing.fake?
54
- assert Sidekiq::Testing.enabled?
55
- end
56
- end
57
-
58
- describe 'require/load sidekiq/testing/inline.rb' do
59
- before do
60
- require 'sidekiq/testing/inline'
61
- end
62
-
63
- after do
64
- Sidekiq::Testing.disable!
65
- end
66
-
67
- it 'enables inline testing' do
68
- Sidekiq::Testing.inline!
69
- assert Sidekiq::Testing.enabled?
70
- assert Sidekiq::Testing.inline?
71
- refute Sidekiq::Testing.fake?
72
- end
73
-
74
- it 'enables inline testing in a block' do
75
- Sidekiq::Testing.disable!
76
- assert Sidekiq::Testing.disabled?
77
- refute Sidekiq::Testing.fake?
78
-
79
- Sidekiq::Testing.inline! do
80
- assert Sidekiq::Testing.enabled?
81
- assert Sidekiq::Testing.inline?
82
- end
83
-
84
- refute Sidekiq::Testing.enabled?
85
- refute Sidekiq::Testing.inline?
86
- refute Sidekiq::Testing.fake?
87
- end
88
- end
89
- end
90
-
91
- describe 'with middleware' do
92
- before do
93
- require 'sidekiq/testing'
94
- end
95
-
96
- after do
97
- Sidekiq::Testing.disable!
98
- end
99
-
100
- class AttributeWorker
101
- include Sidekiq::Worker
102
- class_attribute :count
103
- self.count = 0
104
- attr_accessor :foo
105
-
106
- def perform
107
- self.class.count += 1 if foo == :bar
108
- end
109
- end
110
-
111
- class AttributeMiddleware
112
- def call(worker, msg, queue)
113
- worker.foo = :bar if worker.respond_to?(:foo=)
114
- yield
115
- end
116
- end
117
-
118
- it 'wraps the inlined worker with middleware' do
119
- Sidekiq::Testing.server_middleware do |chain|
120
- chain.add AttributeMiddleware
121
- end
122
-
123
- begin
124
- Sidekiq::Testing.fake! do
125
- AttributeWorker.perform_async
126
- assert_equal 0, AttributeWorker.count
127
- end
128
-
129
- AttributeWorker.perform_one
130
- assert_equal 1, AttributeWorker.count
131
-
132
- Sidekiq::Testing.inline! do
133
- AttributeWorker.perform_async
134
- assert_equal 2, AttributeWorker.count
135
- end
136
- ensure
137
- Sidekiq::Testing.server_middleware.clear
138
- end
139
- end
140
- end
141
-
142
- end
@@ -1,331 +0,0 @@
1
- require_relative 'helper'
2
-
3
- require 'active_record'
4
- require 'action_mailer'
5
- require 'sidekiq/rails'
6
- require 'sidekiq/extensions/action_mailer'
7
- require 'sidekiq/extensions/active_record'
8
-
9
- Sidekiq.hook_rails!
10
-
11
- class TestTesting < Sidekiq::Test
12
- describe 'sidekiq testing' do
13
- class PerformError < RuntimeError; end
14
-
15
- class DirectWorker
16
- include Sidekiq::Worker
17
- def perform(a, b)
18
- a + b
19
- end
20
- end
21
-
22
- class EnqueuedWorker
23
- include Sidekiq::Worker
24
- def perform(a, b)
25
- a + b
26
- end
27
- end
28
-
29
- class StoredWorker
30
- include Sidekiq::Worker
31
- def perform(error)
32
- raise PerformError if error
33
- end
34
- end
35
-
36
- class FooMailer < ActionMailer::Base
37
- def bar(str)
38
- str
39
- end
40
- end
41
-
42
- class FooModel < ActiveRecord::Base
43
- def bar(str)
44
- str
45
- end
46
- end
47
-
48
- before do
49
- require 'sidekiq/testing'
50
- Sidekiq::Testing.fake!
51
- EnqueuedWorker.jobs.clear
52
- DirectWorker.jobs.clear
53
- end
54
-
55
- after do
56
- Sidekiq::Testing.disable!
57
- Sidekiq::Queues.clear_all
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, Sidekiq::Queues['someq'].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
- end
110
-
111
- class SpecificJidWorker
112
- include Sidekiq::Worker
113
- class_attribute :count
114
- self.count = 0
115
- def perform(worker_jid)
116
- return unless worker_jid == self.jid
117
- self.class.count += 1
118
- end
119
- end
120
-
121
- it 'execute only jobs with assigned JID' do
122
- 4.times do |i|
123
- jid = SpecificJidWorker.perform_async(nil)
124
- if i % 2 == 0
125
- SpecificJidWorker.jobs[-1]["args"] = ["wrong_jid"]
126
- else
127
- SpecificJidWorker.jobs[-1]["args"] = [jid]
128
- end
129
- end
130
-
131
- SpecificJidWorker.perform_one
132
- assert_equal 0, SpecificJidWorker.count
133
-
134
- SpecificJidWorker.perform_one
135
- assert_equal 1, SpecificJidWorker.count
136
-
137
- SpecificJidWorker.drain
138
- assert_equal 2, SpecificJidWorker.count
139
- end
140
-
141
- it 'round trip serializes the job arguments' do
142
- assert StoredWorker.perform_async(:mike)
143
- job = StoredWorker.jobs.first
144
- assert_equal "mike", job['args'].first
145
- StoredWorker.clear
146
- end
147
-
148
- it 'perform_one runs only one job' do
149
- DirectWorker.perform_async(1, 2)
150
- DirectWorker.perform_async(3, 4)
151
- assert_equal 2, DirectWorker.jobs.size
152
-
153
- DirectWorker.perform_one
154
- assert_equal 1, DirectWorker.jobs.size
155
-
156
- DirectWorker.clear
157
- end
158
-
159
- it 'perform_one raise error upon empty queue' do
160
- DirectWorker.clear
161
- assert_raises Sidekiq::EmptyQueueError do
162
- DirectWorker.perform_one
163
- end
164
- end
165
-
166
- class FirstWorker
167
- include Sidekiq::Worker
168
- class_attribute :count
169
- self.count = 0
170
- def perform
171
- self.class.count += 1
172
- end
173
- end
174
-
175
- class SecondWorker
176
- include Sidekiq::Worker
177
- class_attribute :count
178
- self.count = 0
179
- def perform
180
- self.class.count += 1
181
- end
182
- end
183
-
184
- class ThirdWorker
185
- include Sidekiq::Worker
186
- class_attribute :count
187
- def perform
188
- FirstWorker.perform_async
189
- SecondWorker.perform_async
190
- end
191
- end
192
-
193
- it 'clears jobs across all workers' do
194
- Sidekiq::Worker.jobs.clear
195
- FirstWorker.count = 0
196
- SecondWorker.count = 0
197
-
198
- assert_equal 0, FirstWorker.jobs.size
199
- assert_equal 0, SecondWorker.jobs.size
200
-
201
- FirstWorker.perform_async
202
- SecondWorker.perform_async
203
-
204
- assert_equal 1, FirstWorker.jobs.size
205
- assert_equal 1, SecondWorker.jobs.size
206
-
207
- Sidekiq::Worker.clear_all
208
-
209
- assert_equal 0, FirstWorker.jobs.size
210
- assert_equal 0, SecondWorker.jobs.size
211
-
212
- assert_equal 0, FirstWorker.count
213
- assert_equal 0, SecondWorker.count
214
- end
215
-
216
- it 'drains jobs across all workers' do
217
- Sidekiq::Worker.jobs.clear
218
- FirstWorker.count = 0
219
- SecondWorker.count = 0
220
-
221
- assert_equal 0, FirstWorker.jobs.size
222
- assert_equal 0, SecondWorker.jobs.size
223
-
224
- assert_equal 0, FirstWorker.count
225
- assert_equal 0, SecondWorker.count
226
-
227
- FirstWorker.perform_async
228
- SecondWorker.perform_async
229
-
230
- assert_equal 1, FirstWorker.jobs.size
231
- assert_equal 1, SecondWorker.jobs.size
232
-
233
- Sidekiq::Worker.drain_all
234
-
235
- assert_equal 0, FirstWorker.jobs.size
236
- assert_equal 0, SecondWorker.jobs.size
237
-
238
- assert_equal 1, FirstWorker.count
239
- assert_equal 1, SecondWorker.count
240
- end
241
-
242
- it 'drains jobs across all workers even when workers create new jobs' do
243
- Sidekiq::Worker.jobs.clear
244
- FirstWorker.count = 0
245
- SecondWorker.count = 0
246
-
247
- assert_equal 0, ThirdWorker.jobs.size
248
-
249
- assert_equal 0, FirstWorker.count
250
- assert_equal 0, SecondWorker.count
251
-
252
- ThirdWorker.perform_async
253
-
254
- assert_equal 1, ThirdWorker.jobs.size
255
-
256
- Sidekiq::Worker.drain_all
257
-
258
- assert_equal 0, ThirdWorker.jobs.size
259
-
260
- assert_equal 1, FirstWorker.count
261
- assert_equal 1, SecondWorker.count
262
- end
263
-
264
- it 'can execute a job' do
265
- DirectWorker.execute_job(DirectWorker.new, [2, 3])
266
- end
267
- end
268
-
269
- describe 'queue testing' do
270
- before do
271
- require 'sidekiq/testing'
272
- Sidekiq::Testing.fake!
273
- end
274
-
275
- after do
276
- Sidekiq::Testing.disable!
277
- Sidekiq::Queues.clear_all
278
- end
279
-
280
- class QueueWorker
281
- include Sidekiq::Worker
282
- def perform(a, b)
283
- a + b
284
- end
285
- end
286
-
287
- class AltQueueWorker
288
- include Sidekiq::Worker
289
- sidekiq_options queue: :alt
290
- def perform(a, b)
291
- a + b
292
- end
293
- end
294
-
295
- it 'finds enqueued jobs' do
296
- assert_equal 0, Sidekiq::Queues["default"].size
297
-
298
- QueueWorker.perform_async(1, 2)
299
- QueueWorker.perform_async(1, 2)
300
- AltQueueWorker.perform_async(1, 2)
301
-
302
- assert_equal 2, Sidekiq::Queues["default"].size
303
- assert_equal [1, 2], Sidekiq::Queues["default"].first["args"]
304
-
305
- assert_equal 1, Sidekiq::Queues["alt"].size
306
- end
307
-
308
- it 'clears out all queues' do
309
- assert_equal 0, Sidekiq::Queues["default"].size
310
-
311
- QueueWorker.perform_async(1, 2)
312
- QueueWorker.perform_async(1, 2)
313
- AltQueueWorker.perform_async(1, 2)
314
-
315
- Sidekiq::Queues.clear_all
316
-
317
- assert_equal 0, Sidekiq::Queues["default"].size
318
- assert_equal 0, Sidekiq::Queues["alt"].size
319
- end
320
-
321
- it 'finds jobs enqueued by client' do
322
- Sidekiq::Client.push(
323
- 'class' => 'NonExistentWorker',
324
- 'queue' => 'missing',
325
- 'args' => [1]
326
- )
327
-
328
- assert_equal 1, Sidekiq::Queues["missing"].size
329
- end
330
- end
331
- end