resque-loner 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rubocop.yml +92 -0
- data/.simplecov +1 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.markdown +11 -0
- data/Gemfile +4 -5
- data/README.markdown +4 -1
- data/Rakefile +13 -41
- data/lib/resque-ext/job.rb +9 -9
- data/lib/resque-ext/resque.rb +4 -9
- data/lib/resque-loner.rb +2 -1
- data/lib/resque-loner/helpers.rb +22 -9
- data/lib/resque-loner/legacy_helpers.rb +91 -0
- data/lib/resque-loner/unique_job.rb +23 -14
- data/lib/resque-loner/version.rb +1 -1
- data/resque-loner.gemspec +41 -32
- data/spec/loner_spec.rb +73 -51
- data/spec/spec_helper.rb +19 -3
- data/spec/support/redis_instance.rb +133 -0
- data/test/airbrake_test.rb +27 -0
- data/test/dump.rdb +0 -0
- data/test/job_hooks_test.rb +191 -52
- data/test/job_plugins_test.rb +33 -31
- data/test/plugin_test.rb +38 -26
- data/{spec/redis-test.conf → test/redis-test-cluster.conf} +4 -4
- data/test/resque-web_test.rb +23 -17
- data/test/resque_failure_redis_test.rb +23 -0
- data/test/resque_test.rb +56 -37
- data/test/test_helper.rb +58 -29
- data/test/worker_test.rb +311 -55
- metadata +157 -58
- data/init.rb +0 -1
- data/rails/init.rb +0 -1
- data/test/hoptoad_test.rb +0 -25
data/test/job_plugins_test.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
context
|
3
|
+
context 'Multiple plugins with multiple hooks' do
|
4
4
|
include PerformJob
|
5
5
|
|
6
6
|
module Plugin1
|
7
7
|
def before_perform_record_history1(history)
|
8
8
|
history << :before1
|
9
9
|
end
|
10
|
+
|
10
11
|
def after_perform_record_history1(history)
|
11
12
|
history << :after1
|
12
13
|
end
|
@@ -16,6 +17,7 @@ context "Multiple plugins with multiple hooks" do
|
|
16
17
|
def before_perform_record_history2(history)
|
17
18
|
history << :before2
|
18
19
|
end
|
20
|
+
|
19
21
|
def after_perform_record_history2(history)
|
20
22
|
history << :after2
|
21
23
|
end
|
@@ -29,14 +31,14 @@ context "Multiple plugins with multiple hooks" do
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
test
|
33
|
-
result = perform_job(ManyBeforesJob, history=[])
|
34
|
-
assert_equal true, result,
|
34
|
+
test 'hooks of each type are executed in alphabetical order' do
|
35
|
+
result = perform_job(ManyBeforesJob, history = [])
|
36
|
+
assert_equal true, result, 'perform returned true'
|
35
37
|
assert_equal [:before1, :before2, :perform, :after1, :after2], history
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
|
-
context
|
41
|
+
context 'Resque::Plugin ordering before_perform' do
|
40
42
|
include PerformJob
|
41
43
|
|
42
44
|
module BeforePerformPlugin
|
@@ -55,14 +57,14 @@ context "Resque::Plugin ordering before_perform" do
|
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
|
-
test
|
59
|
-
result = perform_job(JobPluginsTestBeforePerformJob, history=[])
|
60
|
-
assert_equal true, result,
|
60
|
+
test 'before_perform hooks are executed in order' do
|
61
|
+
result = perform_job(JobPluginsTestBeforePerformJob, history = [])
|
62
|
+
assert_equal true, result, 'perform returned true'
|
61
63
|
assert_equal [:before_perform, :before_perform1, :perform], history
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
65
|
-
context
|
67
|
+
context 'Resque::Plugin ordering after_perform' do
|
66
68
|
include PerformJob
|
67
69
|
|
68
70
|
module AfterPerformPlugin
|
@@ -81,14 +83,14 @@ context "Resque::Plugin ordering after_perform" do
|
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
84
|
-
test
|
85
|
-
result = perform_job(JobPluginsTestAfterPerformJob, history=[])
|
86
|
-
assert_equal true, result,
|
86
|
+
test 'after_perform hooks are executed in order' do
|
87
|
+
result = perform_job(JobPluginsTestAfterPerformJob, history = [])
|
88
|
+
assert_equal true, result, 'perform returned true'
|
87
89
|
assert_equal [:perform, :after_perform, :after_perform1], history
|
88
90
|
end
|
89
91
|
end
|
90
92
|
|
91
|
-
context
|
93
|
+
context 'Resque::Plugin ordering around_perform' do
|
92
94
|
include PerformJob
|
93
95
|
|
94
96
|
module AroundPerformPlugin1
|
@@ -105,9 +107,9 @@ context "Resque::Plugin ordering around_perform" do
|
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
|
-
test
|
109
|
-
result = perform_job(AroundPerformJustPerformsJob, history=[])
|
110
|
-
assert_equal true, result,
|
110
|
+
test 'around_perform hooks are executed before the job' do
|
111
|
+
result = perform_job(AroundPerformJustPerformsJob, history = [])
|
112
|
+
assert_equal true, result, 'perform returned true'
|
111
113
|
assert_equal [:around_perform_plugin1, :perform], history
|
112
114
|
end
|
113
115
|
|
@@ -122,9 +124,9 @@ context "Resque::Plugin ordering around_perform" do
|
|
122
124
|
end
|
123
125
|
end
|
124
126
|
|
125
|
-
test
|
126
|
-
result = perform_job(JobPluginsTestAroundPerformJob, history=[])
|
127
|
-
assert_equal true, result,
|
127
|
+
test 'around_perform hooks are executed in order' do
|
128
|
+
result = perform_job(JobPluginsTestAroundPerformJob, history = [])
|
129
|
+
assert_equal true, result, 'perform returned true'
|
128
130
|
assert_equal [:around_perform, :around_perform_plugin1, :perform], history
|
129
131
|
end
|
130
132
|
|
@@ -147,9 +149,9 @@ context "Resque::Plugin ordering around_perform" do
|
|
147
149
|
end
|
148
150
|
end
|
149
151
|
|
150
|
-
test
|
151
|
-
result = perform_job(AroundPerformJob2, history=[])
|
152
|
-
assert_equal true, result,
|
152
|
+
test 'many around_perform are executed in order' do
|
153
|
+
result = perform_job(AroundPerformJob2, history = [])
|
154
|
+
assert_equal true, result, 'perform returned true'
|
153
155
|
assert_equal [:around_perform, :around_perform_plugin1, :around_perform_plugin2, :perform], history
|
154
156
|
end
|
155
157
|
|
@@ -172,9 +174,9 @@ context "Resque::Plugin ordering around_perform" do
|
|
172
174
|
end
|
173
175
|
end
|
174
176
|
|
175
|
-
test
|
176
|
-
result = perform_job(AroundPerformJob3, history=[])
|
177
|
-
assert_equal false, result,
|
177
|
+
test 'the job is aborted if an around_perform hook does not yield' do
|
178
|
+
result = perform_job(AroundPerformJob3, history = [])
|
179
|
+
assert_equal false, result, 'perform returned false'
|
178
180
|
assert_equal [:around_perform, :around_perform0], history
|
179
181
|
end
|
180
182
|
|
@@ -193,14 +195,14 @@ context "Resque::Plugin ordering around_perform" do
|
|
193
195
|
extend AroundPerformGetsJobResult
|
194
196
|
end
|
195
197
|
|
196
|
-
test
|
198
|
+
test 'the job is aborted if an around_perform hook does not yield' do
|
197
199
|
result = perform_job(AroundPerformJobWithReturnValue, 'Bob')
|
198
|
-
assert_equal true, result,
|
200
|
+
assert_equal true, result, 'perform returned true'
|
199
201
|
assert_equal 'Good job, Bob', AroundPerformJobWithReturnValue.last_job_result
|
200
202
|
end
|
201
203
|
end
|
202
204
|
|
203
|
-
context
|
205
|
+
context 'Resque::Plugin ordering on_failure' do
|
204
206
|
include PerformJob
|
205
207
|
|
206
208
|
module OnFailurePlugin
|
@@ -213,18 +215,18 @@ context "Resque::Plugin ordering on_failure" do
|
|
213
215
|
extend OnFailurePlugin
|
214
216
|
def self.perform(history)
|
215
217
|
history << :perform
|
216
|
-
|
218
|
+
fail StandardError, 'oh no'
|
217
219
|
end
|
218
220
|
def self.on_failure(exception, history)
|
219
221
|
history << exception.message
|
220
222
|
end
|
221
223
|
end
|
222
224
|
|
223
|
-
test
|
225
|
+
test 'on_failure hooks are executed in order' do
|
224
226
|
history = []
|
225
227
|
assert_raises StandardError do
|
226
228
|
perform_job(FailureJob, history)
|
227
229
|
end
|
228
|
-
assert_equal [:perform,
|
230
|
+
assert_equal [:perform, 'oh no', 'oh no plugin'], history
|
229
231
|
end
|
230
232
|
end
|
data/test/plugin_test.rb
CHANGED
@@ -1,41 +1,53 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
context
|
3
|
+
context 'Resque::Plugin finding hooks' do
|
4
4
|
module SimplePlugin
|
5
5
|
extend self
|
6
6
|
def before_perform1; end
|
7
|
+
|
7
8
|
def before_perform; end
|
9
|
+
|
8
10
|
def before_perform2; end
|
11
|
+
|
9
12
|
def after_perform1; end
|
13
|
+
|
10
14
|
def after_perform; end
|
15
|
+
|
11
16
|
def after_perform2; end
|
17
|
+
|
12
18
|
def perform; end
|
19
|
+
|
13
20
|
def around_perform1; end
|
21
|
+
|
14
22
|
def around_perform; end
|
23
|
+
|
15
24
|
def around_perform2; end
|
25
|
+
|
16
26
|
def on_failure1; end
|
27
|
+
|
17
28
|
def on_failure; end
|
29
|
+
|
18
30
|
def on_failure2; end
|
19
31
|
end
|
20
32
|
|
21
|
-
test
|
22
|
-
assert_equal
|
33
|
+
test 'before_perform hooks are found and sorted' do
|
34
|
+
assert_equal %w(before_perform before_perform1 before_perform2), Resque::Plugin.before_hooks(SimplePlugin).map { |m| m.to_s }
|
23
35
|
end
|
24
36
|
|
25
|
-
test
|
26
|
-
assert_equal
|
37
|
+
test 'after_perform hooks are found and sorted' do
|
38
|
+
assert_equal %w(after_perform after_perform1 after_perform2), Resque::Plugin.after_hooks(SimplePlugin).map { |m| m.to_s }
|
27
39
|
end
|
28
40
|
|
29
|
-
test
|
30
|
-
assert_equal
|
41
|
+
test 'around_perform hooks are found and sorted' do
|
42
|
+
assert_equal %w(around_perform around_perform1 around_perform2), Resque::Plugin.around_hooks(SimplePlugin).map { |m| m.to_s }
|
31
43
|
end
|
32
44
|
|
33
|
-
test
|
34
|
-
assert_equal
|
45
|
+
test 'on_failure hooks are found and sorted' do
|
46
|
+
assert_equal %w(on_failure on_failure1 on_failure2), Resque::Plugin.failure_hooks(SimplePlugin).map { |m| m.to_s }
|
35
47
|
end
|
36
48
|
end
|
37
49
|
|
38
|
-
context
|
50
|
+
context 'Resque::Plugin linting' do
|
39
51
|
module ::BadBefore
|
40
52
|
def self.before_perform; end
|
41
53
|
end
|
@@ -49,39 +61,39 @@ context "Resque::Plugin linting" do
|
|
49
61
|
def self.on_failure; end
|
50
62
|
end
|
51
63
|
|
52
|
-
test
|
64
|
+
test 'before_perform must be namespaced' do
|
53
65
|
begin
|
54
66
|
Resque::Plugin.lint(BadBefore)
|
55
|
-
assert false,
|
67
|
+
assert false, 'should have failed'
|
56
68
|
rescue Resque::Plugin::LintError => e
|
57
|
-
assert_equal
|
69
|
+
assert_equal 'BadBefore.before_perform is not namespaced', e.message
|
58
70
|
end
|
59
71
|
end
|
60
72
|
|
61
|
-
test
|
73
|
+
test 'after_perform must be namespaced' do
|
62
74
|
begin
|
63
75
|
Resque::Plugin.lint(BadAfter)
|
64
|
-
assert false,
|
76
|
+
assert false, 'should have failed'
|
65
77
|
rescue Resque::Plugin::LintError => e
|
66
|
-
assert_equal
|
78
|
+
assert_equal 'BadAfter.after_perform is not namespaced', e.message
|
67
79
|
end
|
68
80
|
end
|
69
81
|
|
70
|
-
test
|
82
|
+
test 'around_perform must be namespaced' do
|
71
83
|
begin
|
72
84
|
Resque::Plugin.lint(BadAround)
|
73
|
-
assert false,
|
85
|
+
assert false, 'should have failed'
|
74
86
|
rescue Resque::Plugin::LintError => e
|
75
|
-
assert_equal
|
87
|
+
assert_equal 'BadAround.around_perform is not namespaced', e.message
|
76
88
|
end
|
77
89
|
end
|
78
90
|
|
79
|
-
test
|
91
|
+
test 'on_failure must be namespaced' do
|
80
92
|
begin
|
81
93
|
Resque::Plugin.lint(BadFailure)
|
82
|
-
assert false,
|
94
|
+
assert false, 'should have failed'
|
83
95
|
rescue Resque::Plugin::LintError => e
|
84
|
-
assert_equal
|
96
|
+
assert_equal 'BadFailure.on_failure is not namespaced', e.message
|
85
97
|
end
|
86
98
|
end
|
87
99
|
|
@@ -98,19 +110,19 @@ context "Resque::Plugin linting" do
|
|
98
110
|
def self.on_failure1; end
|
99
111
|
end
|
100
112
|
|
101
|
-
test
|
113
|
+
test 'before_perform1 is an ok name' do
|
102
114
|
Resque::Plugin.lint(GoodBefore)
|
103
115
|
end
|
104
116
|
|
105
|
-
test
|
117
|
+
test 'after_perform1 is an ok name' do
|
106
118
|
Resque::Plugin.lint(GoodAfter)
|
107
119
|
end
|
108
120
|
|
109
|
-
test
|
121
|
+
test 'around_perform1 is an ok name' do
|
110
122
|
Resque::Plugin.lint(GoodAround)
|
111
123
|
end
|
112
124
|
|
113
|
-
test
|
125
|
+
test 'on_failure1 is an ok name' do
|
114
126
|
Resque::Plugin.lint(GoodFailure)
|
115
127
|
end
|
116
128
|
end
|
@@ -6,10 +6,10 @@ daemonize yes
|
|
6
6
|
|
7
7
|
# When run as a daemon, Redis write a pid file in /var/run/redis.pid by default.
|
8
8
|
# You can specify a custom pid file location here.
|
9
|
-
pidfile ./
|
9
|
+
pidfile ./test/redis-test-cluster.pid
|
10
10
|
|
11
11
|
# Accept connections on the specified port, default is 6379
|
12
|
-
port
|
12
|
+
port 9737
|
13
13
|
|
14
14
|
# If you want you can bind a single interface, if the bind option is not
|
15
15
|
# specified all the interfaces will listen for connections.
|
@@ -35,11 +35,11 @@ save 300 10
|
|
35
35
|
save 60 10000
|
36
36
|
|
37
37
|
# The filename where to dump the DB
|
38
|
-
dbfilename dump.rdb
|
38
|
+
dbfilename dump-cluster.rdb
|
39
39
|
|
40
40
|
# For default save/load DB in/from the working directory
|
41
41
|
# Note that you must specify a directory not a file name.
|
42
|
-
dir ./
|
42
|
+
dir ./test/
|
43
43
|
|
44
44
|
# Set server verbosity to 'debug'
|
45
45
|
# it can be one of:
|
data/test/resque-web_test.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'resque/server/test_helper'
|
3
|
-
|
3
|
+
|
4
4
|
# Root path test
|
5
|
-
context
|
6
|
-
setup { get
|
5
|
+
context 'on GET to /' do
|
6
|
+
setup { get '/' }
|
7
7
|
|
8
|
-
test
|
8
|
+
test 'redirect to overview' do
|
9
9
|
follow_redirect!
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
# Global overview
|
14
|
-
context
|
15
|
-
setup { get
|
14
|
+
context 'on GET to /overview' do
|
15
|
+
setup { get '/overview' }
|
16
16
|
|
17
17
|
test "should at least display 'queues'" do
|
18
18
|
assert last_response.body.include?('Queues')
|
@@ -20,34 +20,40 @@ context "on GET to /overview" do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
# Working jobs
|
23
|
-
context
|
24
|
-
setup { get
|
23
|
+
context 'on GET to /working' do
|
24
|
+
setup { get '/working' }
|
25
25
|
|
26
26
|
should_respond_with_success
|
27
27
|
end
|
28
28
|
|
29
29
|
# Failed
|
30
|
-
context
|
31
|
-
setup { get
|
30
|
+
context 'on GET to /failed' do
|
31
|
+
setup { get '/failed' }
|
32
|
+
|
33
|
+
should_respond_with_success
|
34
|
+
end
|
35
|
+
|
36
|
+
# Stats
|
37
|
+
context 'on GET to /stats/resque' do
|
38
|
+
setup { get '/stats/resque' }
|
32
39
|
|
33
40
|
should_respond_with_success
|
34
41
|
end
|
35
42
|
|
36
|
-
|
37
|
-
|
38
|
-
setup { get "/stats/resque" }
|
43
|
+
context 'on GET to /stats/redis' do
|
44
|
+
setup { get '/stats/redis' }
|
39
45
|
|
40
46
|
should_respond_with_success
|
41
47
|
end
|
42
48
|
|
43
|
-
context
|
44
|
-
setup { get
|
49
|
+
context 'on GET to /stats/resque' do
|
50
|
+
setup { get '/stats/keys' }
|
45
51
|
|
46
52
|
should_respond_with_success
|
47
53
|
end
|
48
54
|
|
49
|
-
context
|
50
|
-
setup { get
|
55
|
+
context 'also works with slash at the end' do
|
56
|
+
setup { get '/working/' }
|
51
57
|
|
52
58
|
should_respond_with_success
|
53
59
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'resque/failure/redis'
|
3
|
+
|
4
|
+
context 'Resque::Failure::Redis' do
|
5
|
+
setup do
|
6
|
+
@bad_string = [39, 250, 141, 168, 138, 191, 52, 211, 159, 86, 93, 95, 39].map { |c| c.chr }.join
|
7
|
+
exception = StandardError.exception(@bad_string)
|
8
|
+
worker = Resque::Worker.new(:test)
|
9
|
+
queue = 'queue'
|
10
|
+
payload = { 'class' => Object, 'args' => 3 }
|
11
|
+
@redis_backend = Resque::Failure::Redis.new(exception, worker, queue, payload)
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'cleans up bad strings before saving the failure, in order to prevent errors on the resque UI' do
|
15
|
+
# test assumption: the bad string should not be able to round trip though JSON
|
16
|
+
assert_raises(MultiJson::DecodeError) do
|
17
|
+
MultiJson.decode(MultiJson.encode(@bad_string))
|
18
|
+
end
|
19
|
+
|
20
|
+
@redis_backend.save
|
21
|
+
Resque::Failure::Redis.all # should not raise an error
|
22
|
+
end
|
23
|
+
end
|
data/test/resque_test.rb
CHANGED
@@ -1,36 +1,41 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
context
|
3
|
+
context 'Resque' do
|
4
4
|
setup do
|
5
5
|
Resque.redis.flushall
|
6
6
|
|
7
|
-
Resque.push(:people,
|
8
|
-
Resque.push(:people,
|
9
|
-
Resque.push(:people,
|
7
|
+
Resque.push(:people, 'name' => 'chris')
|
8
|
+
Resque.push(:people, 'name' => 'bob')
|
9
|
+
Resque.push(:people, 'name' => 'mark')
|
10
|
+
@original_redis = Resque.redis
|
10
11
|
end
|
11
12
|
|
12
|
-
|
13
|
+
teardown do
|
14
|
+
Resque.redis = @original_redis
|
15
|
+
end
|
16
|
+
|
17
|
+
test 'can set a namespace through a url-like string' do
|
13
18
|
assert Resque.redis
|
14
19
|
assert_equal :resque, Resque.redis.namespace
|
15
20
|
Resque.redis = 'localhost:9736/namespace'
|
16
21
|
assert_equal 'namespace', Resque.redis.namespace
|
17
22
|
end
|
18
23
|
|
19
|
-
test
|
20
|
-
new_redis = Redis.new(:
|
21
|
-
new_namespace = Redis::Namespace.new(
|
24
|
+
test 'redis= works correctly with a Redis::Namespace param' do
|
25
|
+
new_redis = Redis.new(host: 'localhost', port: 9736)
|
26
|
+
new_namespace = Redis::Namespace.new('namespace', redis: new_redis)
|
22
27
|
Resque.redis = new_namespace
|
23
28
|
assert_equal new_namespace, Resque.redis
|
24
29
|
|
25
30
|
Resque.redis = 'localhost:9736/namespace'
|
26
31
|
end
|
27
32
|
|
28
|
-
test
|
33
|
+
test 'can put jobs on a queue' do
|
29
34
|
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
|
30
35
|
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
|
31
36
|
end
|
32
37
|
|
33
|
-
test
|
38
|
+
test 'can grab jobs off a queue' do
|
34
39
|
Resque::Job.create(:jobs, 'some-job', 20, '/tmp')
|
35
40
|
|
36
41
|
job = Resque.reserve(:jobs)
|
@@ -41,7 +46,7 @@ context "Resque" do
|
|
41
46
|
assert_equal '/tmp', job.args[1]
|
42
47
|
end
|
43
48
|
|
44
|
-
test
|
49
|
+
test 'can re-queue jobs' do
|
45
50
|
Resque::Job.create(:jobs, 'some-job', 20, '/tmp')
|
46
51
|
|
47
52
|
job = Resque.reserve(:jobs)
|
@@ -50,7 +55,7 @@ context "Resque" do
|
|
50
55
|
assert_equal job, Resque.reserve(:jobs)
|
51
56
|
end
|
52
57
|
|
53
|
-
test
|
58
|
+
test 'can put jobs on a queue by way of an ivar' do
|
54
59
|
assert_equal 0, Resque.size(:ivar)
|
55
60
|
assert Resque.enqueue(SomeIvarJob, 20, '/tmp')
|
56
61
|
assert Resque.enqueue(SomeIvarJob, 20, '/tmp')
|
@@ -66,7 +71,7 @@ context "Resque" do
|
|
66
71
|
assert_equal nil, Resque.reserve(:ivar)
|
67
72
|
end
|
68
73
|
|
69
|
-
test
|
74
|
+
test 'can remove jobs from a queue by way of an ivar' do
|
70
75
|
assert_equal 0, Resque.size(:ivar)
|
71
76
|
assert Resque.enqueue(SomeIvarJob, 20, '/tmp')
|
72
77
|
assert Resque.enqueue(SomeIvarJob, 30, '/tmp')
|
@@ -81,13 +86,13 @@ context "Resque" do
|
|
81
86
|
assert_equal 1, Resque.size(:ivar)
|
82
87
|
end
|
83
88
|
|
84
|
-
test
|
89
|
+
test 'jobs have a nice #inspect' do
|
85
90
|
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
|
86
91
|
job = Resque.reserve(:jobs)
|
87
92
|
assert_equal '(Job{jobs} | SomeJob | [20, "/tmp"])', job.inspect
|
88
93
|
end
|
89
94
|
|
90
|
-
test
|
95
|
+
test 'jobs can be destroyed' do
|
91
96
|
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
|
92
97
|
assert Resque::Job.create(:jobs, 'BadJob', 20, '/tmp')
|
93
98
|
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
|
@@ -101,7 +106,7 @@ context "Resque" do
|
|
101
106
|
assert_equal 2, Resque.size(:jobs)
|
102
107
|
end
|
103
108
|
|
104
|
-
test
|
109
|
+
test 'jobs can test for equality' do
|
105
110
|
assert Resque::Job.create(:jobs, 'SomeJob', 20, '/tmp')
|
106
111
|
assert Resque::Job.create(:jobs, 'some-job', 20, '/tmp')
|
107
112
|
assert_equal Resque.reserve(:jobs), Resque.reserve(:jobs)
|
@@ -115,7 +120,7 @@ context "Resque" do
|
|
115
120
|
assert_not_equal Resque.reserve(:jobs), Resque.reserve(:jobs)
|
116
121
|
end
|
117
122
|
|
118
|
-
test
|
123
|
+
test 'can put jobs on a queue by way of a method' do
|
119
124
|
assert_equal 0, Resque.size(:method)
|
120
125
|
assert Resque.enqueue(SomeMethodJob, 20, '/tmp')
|
121
126
|
assert Resque.enqueue(SomeMethodJob, 20, '/tmp')
|
@@ -131,30 +136,40 @@ context "Resque" do
|
|
131
136
|
assert_equal nil, Resque.reserve(:method)
|
132
137
|
end
|
133
138
|
|
134
|
-
test
|
139
|
+
test 'can define a queue for jobs by way of a method' do
|
140
|
+
assert_equal 0, Resque.size(:method)
|
141
|
+
assert Resque.enqueue_to(:new_queue, SomeMethodJob, 20, '/tmp')
|
142
|
+
|
143
|
+
job = Resque.reserve(:new_queue)
|
144
|
+
assert_equal SomeMethodJob, job.payload_class
|
145
|
+
assert_equal 20, job.args[0]
|
146
|
+
assert_equal '/tmp', job.args[1]
|
147
|
+
end
|
148
|
+
|
149
|
+
test 'needs to infer a queue with enqueue' do
|
135
150
|
assert_raises Resque::NoQueueError do
|
136
151
|
Resque.enqueue(SomeJob, 20, '/tmp')
|
137
152
|
end
|
138
153
|
end
|
139
154
|
|
140
|
-
test
|
155
|
+
test 'validates job for queue presence' do
|
141
156
|
assert_raises Resque::NoQueueError do
|
142
157
|
Resque.validate(SomeJob)
|
143
158
|
end
|
144
159
|
end
|
145
160
|
|
146
|
-
test
|
147
|
-
assert Resque.push(:people,
|
161
|
+
test 'can put items on a queue' do
|
162
|
+
assert Resque.push(:people, 'name' => 'jon')
|
148
163
|
end
|
149
164
|
|
150
|
-
test
|
165
|
+
test 'can pull items off a queue' do
|
151
166
|
assert_equal({ 'name' => 'chris' }, Resque.pop(:people))
|
152
167
|
assert_equal({ 'name' => 'bob' }, Resque.pop(:people))
|
153
168
|
assert_equal({ 'name' => 'mark' }, Resque.pop(:people))
|
154
169
|
assert_equal nil, Resque.pop(:people)
|
155
170
|
end
|
156
171
|
|
157
|
-
test
|
172
|
+
test 'knows how big a queue is' do
|
158
173
|
assert_equal 3, Resque.size(:people)
|
159
174
|
|
160
175
|
assert_equal({ 'name' => 'chris' }, Resque.pop(:people))
|
@@ -165,12 +180,12 @@ context "Resque" do
|
|
165
180
|
assert_equal 0, Resque.size(:people)
|
166
181
|
end
|
167
182
|
|
168
|
-
test
|
183
|
+
test 'can peek at a queue' do
|
169
184
|
assert_equal({ 'name' => 'chris' }, Resque.peek(:people))
|
170
185
|
assert_equal 3, Resque.size(:people)
|
171
186
|
end
|
172
187
|
|
173
|
-
test
|
188
|
+
test 'can peek multiple items on a queue' do
|
174
189
|
assert_equal({ 'name' => 'bob' }, Resque.peek(:people, 1, 1))
|
175
190
|
|
176
191
|
assert_equal([{ 'name' => 'bob' }, { 'name' => 'mark' }], Resque.peek(:people, 1, 2))
|
@@ -181,36 +196,36 @@ context "Resque" do
|
|
181
196
|
assert_equal [], Resque.peek(:people, 3, 2)
|
182
197
|
end
|
183
198
|
|
184
|
-
test
|
199
|
+
test 'knows what queues it is managing' do
|
185
200
|
assert_equal %w( people ), Resque.queues
|
186
|
-
Resque.push(:cars,
|
201
|
+
Resque.push(:cars, 'make' => 'bmw')
|
187
202
|
assert_equal %w( cars people ), Resque.queues
|
188
203
|
end
|
189
204
|
|
190
|
-
test
|
205
|
+
test 'queues are always a list' do
|
191
206
|
Resque.redis.flushall
|
192
207
|
assert_equal [], Resque.queues
|
193
208
|
end
|
194
209
|
|
195
|
-
test
|
196
|
-
Resque.push(:cars,
|
210
|
+
test 'can delete a queue' do
|
211
|
+
Resque.push(:cars, 'make' => 'bmw')
|
197
212
|
assert_equal %w( cars people ), Resque.queues
|
198
213
|
Resque.remove_queue(:people)
|
199
214
|
assert_equal %w( cars ), Resque.queues
|
200
215
|
assert_equal nil, Resque.pop(:people)
|
201
216
|
end
|
202
217
|
|
203
|
-
test
|
204
|
-
assert_equal [
|
218
|
+
test 'keeps track of resque keys' do
|
219
|
+
assert_equal ['queue:people', 'queues'].sort, Resque.keys.sort
|
205
220
|
end
|
206
221
|
|
207
|
-
test
|
222
|
+
test 'badly wants a class name, too' do
|
208
223
|
assert_raises Resque::NoClassError do
|
209
224
|
Resque::Job.create(:jobs, nil)
|
210
225
|
end
|
211
226
|
end
|
212
227
|
|
213
|
-
test
|
228
|
+
test 'keeps stats' do
|
214
229
|
Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
|
215
230
|
Resque::Job.create(:jobs, BadJob)
|
216
231
|
Resque::Job.create(:jobs, GoodJob)
|
@@ -238,16 +253,20 @@ context "Resque" do
|
|
238
253
|
assert_equal 3, stats[:queues]
|
239
254
|
assert_equal 3, stats[:processed]
|
240
255
|
assert_equal 1, stats[:failed]
|
241
|
-
|
256
|
+
if ENV.key? 'RESQUE_DISTRIBUTED'
|
257
|
+
assert_equal [Resque.redis.respond_to?(:server) ? 'localhost:9736, localhost:9737' : 'redis://localhost:9736/0, redis://localhost:9737/0'], stats[:servers]
|
258
|
+
else
|
259
|
+
assert_equal [Resque.redis.respond_to?(:server) ? 'localhost:9736' : 'redis://localhost:9736/0'], stats[:servers]
|
260
|
+
end
|
242
261
|
end
|
243
262
|
|
244
|
-
test
|
263
|
+
test 'decode bad json' do
|
245
264
|
assert_raises Resque::Helpers::DecodeException do
|
246
265
|
Resque.decode("{\"error\":\"Module not found \\u002\"}")
|
247
266
|
end
|
248
267
|
end
|
249
268
|
|
250
|
-
test
|
269
|
+
test 'inlining jobs' do
|
251
270
|
begin
|
252
271
|
Resque.inline = true
|
253
272
|
Resque.enqueue(SomeIvarJob, 20, '/tmp')
|