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,92 +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 TestInline < Sidekiq::Test
13
- describe 'sidekiq inline testing' do
14
- class InlineError < RuntimeError; end
15
- class ParameterIsNotString < RuntimeError; end
16
-
17
- class InlineWorker
18
- include Sidekiq::Worker
19
- def perform(pass)
20
- raise InlineError unless pass
21
- end
22
- end
23
-
24
- class InlineWorkerWithTimeParam
25
- include Sidekiq::Worker
26
- def perform(time)
27
- raise ParameterIsNotString unless time.is_a?(String) || time.is_a?(Numeric)
28
- end
29
- end
30
-
31
- class InlineFooMailer < ActionMailer::Base
32
- def bar(str)
33
- raise InlineError
34
- end
35
- end
36
-
37
- class InlineFooModel < ActiveRecord::Base
38
- def self.bar(str)
39
- raise InlineError
40
- end
41
- end
42
-
43
- before do
44
- require 'sidekiq/testing/inline.rb'
45
- Sidekiq::Testing.inline!
46
- end
47
-
48
- after do
49
- Sidekiq::Testing.disable!
50
- end
51
-
52
- it 'stubs the async call when in testing mode' do
53
- assert InlineWorker.perform_async(true)
54
-
55
- assert_raises InlineError do
56
- InlineWorker.perform_async(false)
57
- end
58
- end
59
-
60
- it 'stubs the delay call on mailers' do
61
- assert_raises InlineError do
62
- InlineFooMailer.delay.bar('three')
63
- end
64
- end
65
-
66
- it 'stubs the delay call on models' do
67
- assert_raises InlineError do
68
- InlineFooModel.delay.bar('three')
69
- end
70
- end
71
-
72
- it 'stubs the enqueue call when in testing mode' do
73
- assert Sidekiq::Client.enqueue(InlineWorker, true)
74
-
75
- assert_raises InlineError do
76
- Sidekiq::Client.enqueue(InlineWorker, false)
77
- end
78
- end
79
-
80
- it 'stubs the push_bulk call when in testing mode' do
81
- assert Sidekiq::Client.push_bulk({'class' => InlineWorker, 'args' => [[true], [true]]})
82
-
83
- assert_raises InlineError do
84
- Sidekiq::Client.push_bulk({'class' => InlineWorker, 'args' => [[true], [false]]})
85
- end
86
- end
87
-
88
- it 'should relay parameters through json' do
89
- assert Sidekiq::Client.enqueue(InlineWorkerWithTimeParam, Time.now)
90
- end
91
- end
92
- end
@@ -1,18 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/util'
3
-
4
- class TestUtil < Sidekiq::Test
5
- describe 'util' do
6
- it 'generates the same process id when included in two or more classes' do
7
- class One
8
- include Sidekiq::Util
9
- end
10
-
11
- class Two
12
- include Sidekiq::Util
13
- end
14
-
15
- assert_equal One.new.process_id, Two.new.process_id
16
- end
17
- end
18
- end
@@ -1,372 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'sidekiq/web'
4
- require 'rack/test'
5
-
6
- class TestWeb < Sidekiq::Test
7
- describe 'sidekiq web' do
8
- include Rack::Test::Methods
9
-
10
- def app
11
- Sidekiq::Web
12
- end
13
-
14
- def job_params(job, score)
15
- "#{score}-#{job['jid']}"
16
- end
17
-
18
- before do
19
- Sidekiq.redis = REDIS
20
- Sidekiq.redis {|c| c.flushdb }
21
- end
22
-
23
- class WebWorker
24
- include Sidekiq::Worker
25
-
26
- def perform(a, b)
27
- a + b
28
- end
29
- end
30
-
31
- it 'can display workers' do
32
- Sidekiq.redis do |conn|
33
- identity = 'foo:1234-123abc:default'
34
- conn.sadd('workers', identity)
35
- conn.setex("worker:#{identity}:started", 10, Time.now.to_s)
36
- hash = {:queue => 'critical', :payload => { 'class' => WebWorker.name, 'args' => [1,'abc'] }, :run_at => Time.now.to_i }
37
- conn.setex("worker:#{identity}", 10, Sidekiq.dump_json(hash))
38
- end
39
-
40
- get '/workers'
41
- assert_equal 200, last_response.status
42
- assert_match /status-active/, last_response.body
43
- assert_match /critical/, last_response.body
44
- assert_match /WebWorker/, last_response.body
45
- end
46
-
47
- it 'can display queues' do
48
- assert Sidekiq::Client.push('queue' => :foo, 'class' => WebWorker, 'args' => [1, 3])
49
-
50
- get '/queues'
51
- assert_equal 200, last_response.status
52
- assert_match /foo/, last_response.body
53
- refute_match /HardWorker/, last_response.body
54
- end
55
-
56
- it 'handles queue view' do
57
- get '/queues/default'
58
- assert_equal 200, last_response.status
59
- end
60
-
61
- it 'can delete a queue' do
62
- Sidekiq.redis do |conn|
63
- conn.rpush('queue:foo', '{}')
64
- conn.sadd('queues', 'foo')
65
- end
66
-
67
- get '/queues/foo'
68
- assert_equal 200, last_response.status
69
-
70
- post '/queues/foo'
71
- assert_equal 302, last_response.status
72
-
73
- Sidekiq.redis do |conn|
74
- refute conn.smembers('queues').include?('foo')
75
- refute conn.exists('queues:foo')
76
- end
77
- end
78
-
79
- it 'can clear an empty worker list' do
80
- post '/reset'
81
- assert_equal 302, last_response.status
82
- end
83
-
84
- it 'can clear a non-empty worker list' do
85
- Sidekiq.redis do |conn|
86
- identity = 'foo'
87
- conn.sadd('workers', identity)
88
- end
89
-
90
- post '/reset'
91
-
92
- assert_equal 302, last_response.status
93
-
94
- Sidekiq.redis do |conn|
95
- refute conn.smembers('workers').any?
96
- end
97
- end
98
-
99
- it 'can delete a job' do
100
- Sidekiq.redis do |conn|
101
- conn.rpush('queue:foo', "{}")
102
- conn.rpush('queue:foo', "{\"foo\":\"bar\"}")
103
- conn.rpush('queue:foo', "{\"foo2\":\"bar2\"}")
104
- end
105
-
106
- get '/queues/foo'
107
- assert_equal 200, last_response.status
108
-
109
- post '/queues/foo/delete', key_val: "{\"foo\":\"bar\"}"
110
- assert_equal 302, last_response.status
111
-
112
- Sidekiq.redis do |conn|
113
- refute conn.lrange('queue:foo', 0, -1).include?("{\"foo\":\"bar\"}")
114
- end
115
- end
116
-
117
- it 'can display retries' do
118
- get '/retries'
119
- assert_equal 200, last_response.status
120
- assert_match /found/, last_response.body
121
- refute_match /HardWorker/, last_response.body
122
-
123
- add_retry
124
-
125
- get '/retries'
126
- assert_equal 200, last_response.status
127
- refute_match /found/, last_response.body
128
- assert_match /HardWorker/, last_response.body
129
- end
130
-
131
- it 'can display a single retry' do
132
- params = add_retry
133
- get '/retries/0-shouldntexist'
134
- assert_equal 302, last_response.status
135
- get "/retries/#{job_params(*params)}"
136
- assert_equal 200, last_response.status
137
- assert_match /HardWorker/, last_response.body
138
- end
139
-
140
- it 'handles missing retry' do
141
- get "/retries/0-shouldntexist"
142
- assert_equal 302, last_response.status
143
- end
144
-
145
- it 'can delete a single retry' do
146
- params = add_retry
147
- post "/retries/#{job_params(*params)}", 'delete' => 'Delete'
148
- assert_equal 302, last_response.status
149
- assert_equal 'http://example.org/retries', last_response.header['Location']
150
-
151
- get "/retries"
152
- assert_equal 200, last_response.status
153
- refute_match /#{params.first['args'][2]}/, last_response.body
154
- end
155
-
156
- it 'can delete all retries' do
157
- 3.times { add_retry }
158
-
159
- post "/retries/all/delete", 'delete' => 'Delete'
160
- assert_equal 0, Sidekiq::RetrySet.new.size
161
- assert_equal 302, last_response.status
162
- assert_equal 'http://example.org/retries', last_response.header['Location']
163
- end
164
-
165
- it 'can retry a single retry now' do
166
- params = add_retry
167
- post "/retries/#{job_params(*params)}", 'retry' => 'Retry'
168
- assert_equal 302, last_response.status
169
- assert_equal 'http://example.org/retries', last_response.header['Location']
170
-
171
- get '/queues/default'
172
- assert_equal 200, last_response.status
173
- assert_match /#{params.first['args'][2]}/, last_response.body
174
- end
175
-
176
- it 'can display scheduled' do
177
- get '/scheduled'
178
- assert_equal 200, last_response.status
179
- assert_match /found/, last_response.body
180
- refute_match /HardWorker/, last_response.body
181
-
182
- add_scheduled
183
-
184
- get '/scheduled'
185
- assert_equal 200, last_response.status
186
- refute_match /found/, last_response.body
187
- assert_match /HardWorker/, last_response.body
188
- end
189
-
190
- it 'can display a single scheduled job' do
191
- params = add_scheduled
192
- get '/scheduled/0-shouldntexist'
193
- assert_equal 302, last_response.status
194
- get "/scheduled/#{job_params(*params)}"
195
- assert_equal 200, last_response.status
196
- assert_match /HardWorker/, last_response.body
197
- end
198
-
199
- it 'handles missing scheduled job' do
200
- get "/scheduled/0-shouldntexist"
201
- assert_equal 302, last_response.status
202
- end
203
-
204
- it 'can add to queue a single scheduled job' do
205
- params = add_scheduled
206
- post "/scheduled/#{job_params(*params)}", 'add_to_queue' => true
207
- assert_equal 302, last_response.status
208
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
209
-
210
- get '/queues/default'
211
- assert_equal 200, last_response.status
212
- assert_match /#{params.first['args'][2]}/, last_response.body
213
- end
214
-
215
- it 'can delete a single scheduled job' do
216
- params = add_scheduled
217
- post "/scheduled/#{job_params(*params)}", 'delete' => 'Delete'
218
- assert_equal 302, last_response.status
219
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
220
-
221
- get "/scheduled"
222
- assert_equal 200, last_response.status
223
- refute_match /#{params.first['args'][2]}/, last_response.body
224
- end
225
-
226
- it 'can delete scheduled' do
227
- params = add_scheduled
228
- Sidekiq.redis do |conn|
229
- assert_equal 1, conn.zcard('schedule')
230
- post '/scheduled', 'key' => [job_params(*params)], 'delete' => 'Delete'
231
- assert_equal 302, last_response.status
232
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
233
- assert_equal 0, conn.zcard('schedule')
234
- end
235
- end
236
-
237
- it "can move scheduled to default queue" do
238
- q = Sidekiq::Queue.new
239
- params = add_scheduled
240
- Sidekiq.redis do |conn|
241
- assert_equal 1, conn.zcard('schedule')
242
- assert_equal 0, q.size
243
- post '/scheduled', 'key' => [job_params(*params)], 'add_to_queue' => 'AddToQueue'
244
- assert_equal 302, last_response.status
245
- assert_equal 'http://example.org/scheduled', last_response.header['Location']
246
- assert_equal 0, conn.zcard('schedule')
247
- assert_equal 1, q.size
248
- get '/queues/default'
249
- assert_equal 200, last_response.status
250
- assert_match /#{params[0]['args'][2]}/, last_response.body
251
- end
252
- end
253
-
254
- it 'can retry all retries' do
255
- msg, score = add_retry
256
- add_retry
257
-
258
- post "/retries/all/retry", 'retry' => 'Retry'
259
- assert_equal 302, last_response.status
260
- assert_equal 'http://example.org/retries', last_response.header['Location']
261
- assert_equal 2, Sidekiq::Queue.new("default").size
262
-
263
- get '/queues/default'
264
- assert_equal 200, last_response.status
265
- assert_match /#{msg['args'][2]}/, last_response.body
266
- end
267
-
268
- it 'can show user defined tab' do
269
- begin
270
- Sidekiq::Web.tabs['Custom Tab'] = '/custom'
271
-
272
- get '/'
273
- assert_match 'Custom Tab', last_response.body
274
-
275
- ensure
276
- Sidekiq::Web.tabs.delete 'Custom Tab'
277
- end
278
- end
279
-
280
- it 'can display home' do
281
- get '/'
282
- assert_equal 200, last_response.status
283
- end
284
-
285
- describe 'stats' do
286
- before do
287
- Sidekiq.redis do |conn|
288
- conn.set("stat:processed", 5)
289
- conn.set("stat:failed", 2)
290
- end
291
- 2.times { add_retry }
292
- 3.times { add_scheduled }
293
- 4.times { add_worker }
294
-
295
- get '/dashboard/stats'
296
- @response = Sidekiq.load_json(last_response.body)
297
- end
298
-
299
- it 'can refresh dashboard stats' do
300
- assert_equal 200, last_response.status
301
- end
302
-
303
- describe "for sidekiq" do
304
- it 'are namespaced' do
305
- assert_includes @response.keys, "sidekiq"
306
- end
307
-
308
- it 'reports processed' do
309
- assert_equal 5, @response["sidekiq"]["processed"]
310
- end
311
-
312
- it 'reports failed' do
313
- assert_equal 2, @response["sidekiq"]["failed"]
314
- end
315
-
316
- it 'reports busy' do
317
- assert_equal 4, @response["sidekiq"]["busy"]
318
- end
319
-
320
- it 'reports retries' do
321
- assert_equal 2, @response["sidekiq"]["retries"]
322
- end
323
-
324
- it 'reports scheduled' do
325
- assert_equal 3, @response["sidekiq"]["scheduled"]
326
- end
327
- end
328
-
329
- describe "for redis" do
330
- it 'are namespaced' do
331
- assert_includes @response.keys, "redis"
332
- end
333
- end
334
- end
335
-
336
- def add_scheduled
337
- score = Time.now.to_f
338
- msg = { 'class' => 'HardWorker',
339
- 'args' => ['bob', 1, Time.now.to_f],
340
- 'jid' => 'f39af2a05e8f4b24dbc0f1e4' }
341
- Sidekiq.redis do |conn|
342
- conn.zadd('schedule', score, Sidekiq.dump_json(msg))
343
- end
344
- [msg, score]
345
- end
346
-
347
- def add_retry
348
- msg = { 'class' => 'HardWorker',
349
- 'args' => ['bob', 1, Time.now.to_f],
350
- 'queue' => 'default',
351
- 'error_message' => 'Some fake message',
352
- 'error_class' => 'RuntimeError',
353
- 'retry_count' => 0,
354
- 'failed_at' => Time.now.utc,
355
- 'jid' => 'f39af2a05e8f4b24dbc0f1e4'}
356
- score = Time.now.to_f
357
- Sidekiq.redis do |conn|
358
- conn.zadd('retry', score, Sidekiq.dump_json(msg))
359
- end
360
- [msg, score]
361
- end
362
-
363
- def add_worker
364
- process_id = rand(1000)
365
- msg = "{\"queue\":\"default\",\"payload\":{\"retry\":true,\"queue\":\"default\",\"timeout\":20,\"backtrace\":5,\"class\":\"HardWorker\",\"args\":[\"bob\",10,5],\"jid\":\"2b5ad2b016f5e063a1c62872\"},\"run_at\":1361208995}"
366
- Sidekiq.redis do |conn|
367
- conn.sadd("workers", "mercury.home:#{process_id}-70215157189060:started")
368
- conn.set("worker:mercury.home:#{process_id}-70215157189060:started", msg)
369
- end
370
- end
371
- end
372
- end