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,326 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/cli'
3
- require 'tempfile'
4
-
5
- cli = Sidekiq::CLI.instance
6
- def cli.die(code)
7
- @code = code
8
- end
9
-
10
- def cli.valid?
11
- !@code
12
- end
13
-
14
- class TestCli < Sidekiq::Test
15
- describe 'with cli' do
16
-
17
- before do
18
- @cli = Sidekiq::CLI.instance
19
- end
20
-
21
- it 'blows up with an invalid require' do
22
- assert_raises ArgumentError do
23
- @cli.parse(['sidekiq', '-r', 'foobar'])
24
- end
25
- end
26
-
27
- it 'requires the specified Ruby code' do
28
- @cli.parse(['sidekiq', '-r', './test/fake_env.rb'])
29
- assert($LOADED_FEATURES.any? { |x| x =~ /fake_env/ })
30
- assert @cli.valid?
31
- end
32
-
33
- it 'changes concurrency' do
34
- @cli.parse(['sidekiq', '-c', '60', '-r', './test/fake_env.rb'])
35
- assert_equal 60, Sidekiq.options[:concurrency]
36
- end
37
-
38
- it 'changes queues' do
39
- @cli.parse(['sidekiq', '-q', 'foo', '-r', './test/fake_env.rb'])
40
- assert_equal ['foo'], Sidekiq.options[:queues]
41
- end
42
-
43
- it 'accepts a process index' do
44
- @cli.parse(['sidekiq', '-i', '7', '-r', './test/fake_env.rb'])
45
- assert_equal 7, Sidekiq.options[:index]
46
- end
47
-
48
- it 'accepts a stringy process index' do
49
- @cli.parse(['sidekiq', '-i', 'worker.7', '-r', './test/fake_env.rb'])
50
- assert_equal 7, Sidekiq.options[:index]
51
- end
52
-
53
- it 'sets strictly ordered queues if weights are not present' do
54
- @cli.parse(['sidekiq', '-q', 'foo,bar', '-r', './test/fake_env.rb'])
55
- assert_equal true, !!Sidekiq.options[:strict]
56
- end
57
-
58
- it 'does not set strictly ordered queues if weights are present' do
59
- @cli.parse(['sidekiq', '-q', 'foo,3', '-r', './test/fake_env.rb'])
60
- assert_equal false, !!Sidekiq.options[:strict]
61
- end
62
-
63
- it 'changes timeout' do
64
- @cli.parse(['sidekiq', '-t', '30', '-r', './test/fake_env.rb'])
65
- assert_equal 30, Sidekiq.options[:timeout]
66
- end
67
-
68
- it 'handles multiple queues with weights with multiple switches' do
69
- @cli.parse(['sidekiq', '-q', 'foo,3', '-q', 'bar', '-r', './test/fake_env.rb'])
70
- assert_equal %w(foo foo foo bar), Sidekiq.options[:queues]
71
- end
72
-
73
- it 'handles multiple queues with weights with a single switch' do
74
- @cli.parse(['sidekiq', '-q', 'bar,foo,3', '-r', './test/fake_env.rb'])
75
- assert_equal %w(bar foo foo foo), Sidekiq.options[:queues]
76
- end
77
-
78
- it 'handles queues with multi-word names' do
79
- @cli.parse(['sidekiq', '-q', 'queue_one,queue-two', '-r', './test/fake_env.rb'])
80
- assert_equal %w(queue_one queue-two), Sidekiq.options[:queues]
81
- end
82
-
83
- it 'handles queues with dots in the name' do
84
- @cli.parse(['sidekiq', '-q', 'foo.bar', '-r', './test/fake_env.rb'])
85
- assert_equal ['foo.bar'], Sidekiq.options[:queues]
86
- end
87
-
88
- it 'sets verbose' do
89
- old = Sidekiq.logger.level
90
- @cli.parse(['sidekiq', '-v', '-r', './test/fake_env.rb'])
91
- assert_equal Logger::DEBUG, Sidekiq.logger.level
92
- # If we leave the logger at DEBUG it'll add a lot of noise to the test output
93
- Sidekiq.options.delete(:verbose)
94
- Sidekiq.logger.level = old
95
- end
96
-
97
- describe 'with logfile' do
98
- before do
99
- @old_logger = Sidekiq.logger
100
- @tmp_log_path = '/tmp/sidekiq.log'
101
- end
102
-
103
- after do
104
- Sidekiq.logger = @old_logger
105
- Sidekiq.options.delete(:logfile)
106
- File.unlink @tmp_log_path if File.exists?(@tmp_log_path)
107
- end
108
-
109
- it 'sets the logfile path' do
110
- @cli.parse(['sidekiq', '-L', @tmp_log_path, '-r', './test/fake_env.rb'])
111
-
112
- assert_equal @tmp_log_path, Sidekiq.options[:logfile]
113
- end
114
-
115
- it 'creates and writes to a logfile' do
116
- @cli.parse(['sidekiq', '-L', @tmp_log_path, '-r', './test/fake_env.rb'])
117
-
118
- Sidekiq.logger.info('test message')
119
-
120
- assert_match(/test message/, File.read(@tmp_log_path), "didn't include the log message")
121
- end
122
-
123
- it 'appends messages to a logfile' do
124
- File.open(@tmp_log_path, 'w') do |f|
125
- f.puts 'already existant log message'
126
- end
127
-
128
- @cli.parse(['sidekiq', '-L', @tmp_log_path, '-r', './test/fake_env.rb'])
129
-
130
- Sidekiq.logger.info('test message')
131
-
132
- log_file_content = File.read(@tmp_log_path)
133
- assert_match(/already existant/, log_file_content, "didn't include the old message")
134
- assert_match(/test message/, log_file_content, "didn't include the new message")
135
- end
136
- end
137
-
138
- describe 'with pidfile' do
139
- before do
140
- @tmp_file = Tempfile.new('sidekiq-test')
141
- @tmp_path = @tmp_file.path
142
- @tmp_file.close!
143
-
144
- @cli.parse(['sidekiq', '-P', @tmp_path, '-r', './test/fake_env.rb'])
145
- end
146
-
147
- after do
148
- File.unlink @tmp_path if File.exist? @tmp_path
149
- end
150
-
151
- it 'sets pidfile path' do
152
- assert_equal @tmp_path, Sidekiq.options[:pidfile]
153
- end
154
-
155
- it 'writes pidfile' do
156
- assert_equal File.read(@tmp_path).strip.to_i, Process.pid
157
- end
158
- end
159
-
160
- describe 'with config file' do
161
- before do
162
- @cli.parse(['sidekiq', '-C', './test/config.yml'])
163
- end
164
-
165
- it 'takes a path' do
166
- assert_equal './test/config.yml', Sidekiq.options[:config_file]
167
- end
168
-
169
- it 'sets verbose' do
170
- refute Sidekiq.options[:verbose]
171
- end
172
-
173
- it 'sets require file' do
174
- assert_equal './test/fake_env.rb', Sidekiq.options[:require]
175
- end
176
-
177
- it 'sets environment' do
178
- assert_equal 'xzibit', Sidekiq.options[:environment]
179
- end
180
-
181
- it 'sets concurrency' do
182
- assert_equal 50, Sidekiq.options[:concurrency]
183
- end
184
-
185
- it 'sets pid file' do
186
- assert_equal '/tmp/sidekiq-config-test.pid', Sidekiq.options[:pidfile]
187
- end
188
-
189
- it 'sets logfile' do
190
- assert_equal '/tmp/sidekiq.log', Sidekiq.options[:logfile]
191
- end
192
-
193
- it 'sets queues' do
194
- assert_equal 2, Sidekiq.options[:queues].count { |q| q == 'very_often' }
195
- assert_equal 1, Sidekiq.options[:queues].count { |q| q == 'seldom' }
196
- end
197
- end
198
-
199
- describe 'with env based config file' do
200
- before do
201
- @cli.parse(['sidekiq', '-e', 'staging', '-C', './test/env_based_config.yml'])
202
- end
203
-
204
- it 'takes a path' do
205
- assert_equal './test/env_based_config.yml', Sidekiq.options[:config_file]
206
- end
207
-
208
- it 'sets verbose' do
209
- refute Sidekiq.options[:verbose]
210
- end
211
-
212
- it 'sets require file' do
213
- assert_equal './test/fake_env.rb', Sidekiq.options[:require]
214
- end
215
-
216
- it 'sets environment' do
217
- assert_equal 'staging', Sidekiq.options[:environment]
218
- end
219
-
220
- it 'sets concurrency' do
221
- assert_equal 5, Sidekiq.options[:concurrency]
222
- end
223
-
224
- it 'sets pid file' do
225
- assert_equal '/tmp/sidekiq-config-test.pid', Sidekiq.options[:pidfile]
226
- end
227
-
228
- it 'sets logfile' do
229
- assert_equal '/tmp/sidekiq.log', Sidekiq.options[:logfile]
230
- end
231
-
232
- it 'sets queues' do
233
- assert_equal 2, Sidekiq.options[:queues].count { |q| q == 'very_often' }
234
- assert_equal 1, Sidekiq.options[:queues].count { |q| q == 'seldom' }
235
- end
236
- end
237
-
238
- describe 'with config file and flags' do
239
- before do
240
- # We need an actual file here.
241
- @tmp_lib_path = '/tmp/require-me.rb'
242
- File.open(@tmp_lib_path, 'w') do |f|
243
- f.puts "# do work"
244
- end
245
-
246
- @tmp_file = Tempfile.new('sidekiqr')
247
- @tmp_path = @tmp_file.path
248
- @tmp_file.close!
249
-
250
- @cli.parse(['sidekiq',
251
- '-C', './test/config.yml',
252
- '-e', 'snoop',
253
- '-c', '100',
254
- '-r', @tmp_lib_path,
255
- '-P', @tmp_path,
256
- '-q', 'often,7',
257
- '-q', 'seldom,3'])
258
- end
259
-
260
- after do
261
- File.unlink @tmp_lib_path if File.exist? @tmp_lib_path
262
- File.unlink @tmp_path if File.exist? @tmp_path
263
- end
264
-
265
- it 'uses concurrency flag' do
266
- assert_equal 100, Sidekiq.options[:concurrency]
267
- end
268
-
269
- it 'uses require file flag' do
270
- assert_equal @tmp_lib_path, Sidekiq.options[:require]
271
- end
272
-
273
- it 'uses environment flag' do
274
- assert_equal 'snoop', Sidekiq.options[:environment]
275
- end
276
-
277
- it 'uses pidfile flag' do
278
- assert_equal @tmp_path, Sidekiq.options[:pidfile]
279
- end
280
-
281
- it 'sets queues' do
282
- assert_equal 7, Sidekiq.options[:queues].count { |q| q == 'often' }
283
- assert_equal 3, Sidekiq.options[:queues].count { |q| q == 'seldom' }
284
- end
285
- end
286
-
287
- describe 'Sidekiq::CLI#parse_queues' do
288
- describe 'when weight is present' do
289
- it 'concatenates queues by factor of weight and sets strict to false' do
290
- opts = {}
291
- @cli.send :parse_queues, opts, [['often', 7]]
292
- assert_equal %w[often] * 7, opts[:queues]
293
- assert !opts[:strict]
294
- end
295
- end
296
-
297
- describe 'when weight is not present' do
298
- it 'returns queues and sets strict' do
299
- opts = {}
300
- @cli.send :parse_queues, opts, [['once']]
301
- assert_equal %w[once], opts[:queues]
302
- assert opts[:strict]
303
- end
304
- end
305
- end
306
-
307
- describe 'Sidekiq::CLI#parse_queue' do
308
- describe 'when weight is present' do
309
- it 'concatenates queue to opts[:queues] weight number of times' do
310
- opts = {}
311
- @cli.send :parse_queue, opts, 'often', 7
312
- assert_equal %w[often] * 7, opts[:queues]
313
- end
314
- end
315
-
316
- describe 'when weight is not present' do
317
- it 'concatenates queue to opts[:queues] once' do
318
- opts = {}
319
- @cli.send :parse_queue, opts, 'once', nil
320
- assert_equal %w[once], opts[:queues]
321
- end
322
- end
323
- end
324
- end
325
-
326
- end
@@ -1,211 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/client'
3
- require 'sidekiq/worker'
4
-
5
- class TestClient < Sidekiq::Test
6
- describe 'with mock redis' do
7
- before do
8
- @redis = Minitest::Mock.new
9
- def @redis.multi; [yield] * 2 if block_given?; end
10
- def @redis.set(*); true; end
11
- def @redis.sadd(*); true; end
12
- def @redis.srem(*); true; end
13
- def @redis.get(*); nil; end
14
- def @redis.del(*); nil; end
15
- def @redis.incrby(*); nil; end
16
- def @redis.setex(*); true; end
17
- def @redis.expire(*); true; end
18
- def @redis.watch(*); true; end
19
- def @redis.with_connection; yield self; end
20
- def @redis.with; yield self; end
21
- def @redis.exec; true; end
22
- Sidekiq.instance_variable_set(:@redis, @redis)
23
- end
24
-
25
- after do
26
- Sidekiq.instance_variable_set(:@redis, REDIS)
27
- end
28
-
29
- it 'raises ArgumentError with invalid params' do
30
- assert_raises ArgumentError do
31
- Sidekiq::Client.push('foo', 1)
32
- end
33
-
34
- assert_raises ArgumentError do
35
- Sidekiq::Client.push('foo', :class => 'Foo', :noargs => [1, 2])
36
- end
37
-
38
- assert_raises ArgumentError do
39
- Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'noargs' => [1, 2])
40
- end
41
-
42
- assert_raises ArgumentError do
43
- Sidekiq::Client.push('queue' => 'foo', 'class' => 42, 'args' => [1, 2])
44
- end
45
-
46
- assert_raises ArgumentError do
47
- Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'args' => 1)
48
- end
49
-
50
- end
51
-
52
- it 'pushes messages to redis' do
53
- @redis.expect :lpush, 1, ['queue:foo', Array]
54
- pushed = Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'args' => [1, 2])
55
- assert pushed
56
- assert_equal 24, pushed.size
57
- @redis.verify
58
- end
59
-
60
- it 'pushes messages to redis using a String class' do
61
- @redis.expect :lpush, 1, ['queue:foo', Array]
62
- pushed = Sidekiq::Client.push('queue' => 'foo', 'class' => 'MyWorker', 'args' => [1, 2])
63
- assert pushed
64
- assert_equal 24, pushed.size
65
- @redis.verify
66
- end
67
-
68
- class MyWorker
69
- include Sidekiq::Worker
70
- end
71
-
72
- it 'has default options' do
73
- assert_equal Sidekiq.default_worker_options, MyWorker.get_sidekiq_options
74
- end
75
-
76
- it 'handles perform_async' do
77
- @redis.expect :lpush, 1, ['queue:default', Array]
78
- pushed = MyWorker.perform_async(1, 2)
79
- assert pushed
80
- @redis.verify
81
- end
82
-
83
- it 'handles perform_async on failure' do
84
- @redis.expect :lpush, nil, ['queue:default', Array]
85
- pushed = MyWorker.perform_async(1, 2)
86
- refute pushed
87
- @redis.verify
88
- end
89
-
90
- it 'enqueues messages to redis' do
91
- @redis.expect :lpush, 1, ['queue:default', Array]
92
- pushed = Sidekiq::Client.enqueue(MyWorker, 1, 2)
93
- assert pushed
94
- @redis.verify
95
- end
96
-
97
- it 'enqueues messages to redis' do
98
- @redis.expect :lpush, 1, ['queue:custom_queue', Array]
99
- pushed = Sidekiq::Client.enqueue_to(:custom_queue, MyWorker, 1, 2)
100
- assert pushed
101
- @redis.verify
102
- end
103
-
104
- it 'enqueues messages to redis (delayed, custom queue)' do
105
- @redis.expect :zadd, 1, ['schedule', Array]
106
- pushed = Sidekiq::Client.enqueue_to_in(:custom_queue, 3.minutes, MyWorker, 1, 2)
107
- assert pushed
108
- @redis.verify
109
- end
110
-
111
- it 'enqueues messages to redis (delayed into past, custom queue)' do
112
- @redis.expect :lpush, 1, ['queue:custom_queue', Array]
113
- pushed = Sidekiq::Client.enqueue_to_in(:custom_queue, -3.minutes, MyWorker, 1, 2)
114
- assert pushed
115
- @redis.verify
116
- end
117
-
118
- it 'enqueues messages to redis (delayed)' do
119
- @redis.expect :zadd, 1, ['schedule', Array]
120
- pushed = Sidekiq::Client.enqueue_in(3.minutes, MyWorker, 1, 2)
121
- assert pushed
122
- @redis.verify
123
- end
124
-
125
- class QueuedWorker
126
- include Sidekiq::Worker
127
- sidekiq_options :queue => :flimflam
128
- end
129
-
130
- it 'enqueues to the named queue' do
131
- @redis.expect :lpush, 1, ['queue:flimflam', Array]
132
- pushed = QueuedWorker.perform_async(1, 2)
133
- assert pushed
134
- @redis.verify
135
- end
136
-
137
- it 'retrieves queues' do
138
- @redis.expect :smembers, ['bob'], ['queues']
139
- assert_equal ['bob'], Sidekiq::Client.registered_queues
140
- end
141
-
142
- it 'retrieves workers' do
143
- @redis.expect :smembers, ['bob'], ['workers']
144
- assert_equal ['bob'], Sidekiq::Client.registered_workers
145
- end
146
- end
147
-
148
- describe 'bulk' do
149
- after do
150
- Sidekiq::Queue.new.clear
151
- end
152
- it 'can push a large set of jobs at once' do
153
- count = Sidekiq::Client.push_bulk('class' => QueuedWorker, 'args' => (1..1_000).to_a.map { |x| Array(x) })
154
- assert_equal 1_000, count
155
- end
156
- it 'can push a large set of jobs at once using a String class' do
157
- count = Sidekiq::Client.push_bulk('class' => 'QueuedWorker', 'args' => (1..1_000).to_a.map { |x| Array(x) })
158
- assert_equal 1_000, count
159
- end
160
- end
161
-
162
- class BaseWorker
163
- include Sidekiq::Worker
164
- sidekiq_options 'retry' => 'base'
165
- end
166
- class AWorker < BaseWorker
167
- end
168
- class BWorker < BaseWorker
169
- sidekiq_options 'retry' => 'b'
170
- end
171
- class CWorker < BaseWorker
172
- sidekiq_options 'retry' => 2
173
- end
174
-
175
- describe 'client middleware' do
176
-
177
- class Stopper
178
- def call(worker_class, message, queue)
179
- yield if message['args'].first.odd?
180
- end
181
- end
182
-
183
- it 'can stop some of the jobs from pushing' do
184
- Sidekiq.client_middleware.add Stopper
185
- begin
186
- assert_equal nil, Sidekiq::Client.push('class' => MyWorker, 'args' => [0])
187
- assert_match /[0-9a-f]{12}/, Sidekiq::Client.push('class' => MyWorker, 'args' => [1])
188
- assert_equal 1, Sidekiq::Client.push_bulk('class' => MyWorker, 'args' => [[0], [1]])
189
- ensure
190
- Sidekiq.client_middleware.remove Stopper
191
- end
192
- end
193
- end
194
-
195
- describe 'inheritance' do
196
- it 'inherits sidekiq options' do
197
- assert_equal 'base', AWorker.get_sidekiq_options['retry']
198
- assert_equal 'b', BWorker.get_sidekiq_options['retry']
199
- end
200
- end
201
-
202
- describe 'item normalization' do
203
- it 'defaults retry to true' do
204
- assert_equal true, Sidekiq::Client.send(:normalize_item, 'class' => QueuedWorker, 'args' => [])['retry']
205
- end
206
-
207
- it "does not normalize numeric retry's" do
208
- assert_equal 2, Sidekiq::Client.send(:normalize_item, 'class' => CWorker, 'args' => [])['retry']
209
- end
210
- end
211
- end