resque_unit 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +74 -0
- data/lib/resque_unit.rb +9 -0
- data/lib/resque_unit/assertions.rb +35 -0
- data/lib/resque_unit/resque.rb +40 -0
- data/test/resque_unit_test.rb +91 -0
- data/test/sample_jobs.rb +24 -0
- data/test/test_helper.rb +6 -0
- metadata +70 -0
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
ResqueUnit
|
2
|
+
==========
|
3
|
+
|
4
|
+
ResqueUnit provides some extra assertions and a mock Resque for
|
5
|
+
testing Rails code that depends on Resque. You can install it as
|
6
|
+
either a gem or a plugin:
|
7
|
+
|
8
|
+
gem install resque_unit
|
9
|
+
|
10
|
+
and in your test.rb:
|
11
|
+
|
12
|
+
config.gem 'resque_unit'
|
13
|
+
|
14
|
+
If you'd rather install it as a plugin, you should be able to run
|
15
|
+
|
16
|
+
script/plugin install git://github.com/justinweiss/resque_unit.git
|
17
|
+
|
18
|
+
inside your Rails projects.
|
19
|
+
|
20
|
+
Examples
|
21
|
+
========
|
22
|
+
|
23
|
+
ResqueUnit provides some extra assertions for your unit tests. For
|
24
|
+
example, if you have code that queues a resque job:
|
25
|
+
|
26
|
+
class MyJob
|
27
|
+
@queue = :low
|
28
|
+
|
29
|
+
def self.perform(x)
|
30
|
+
// do stuff
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def queue_job
|
35
|
+
Resque.enqueue(MyJob, 1)
|
36
|
+
end
|
37
|
+
|
38
|
+
You can write a unit test for code that queues this job:
|
39
|
+
|
40
|
+
def test_job_queued
|
41
|
+
queue_job
|
42
|
+
assert_queued(MyJob) # assert that MyJob was queued in the :low queue
|
43
|
+
end
|
44
|
+
|
45
|
+
You can also verify that a job was queued with arguments:
|
46
|
+
|
47
|
+
def test_job_queued_with_arguments
|
48
|
+
queue_job
|
49
|
+
assert_queued(MyJob, [1])
|
50
|
+
end
|
51
|
+
|
52
|
+
And you can run all the jobs in the queue, so you can verify that they
|
53
|
+
run correctly:
|
54
|
+
|
55
|
+
def test_job_runs
|
56
|
+
queue_job
|
57
|
+
Resque.run!
|
58
|
+
assert stuff_was_done, "Job didn't run"
|
59
|
+
end
|
60
|
+
|
61
|
+
You can also access the queues directly:
|
62
|
+
|
63
|
+
def test_jobs_in_queue
|
64
|
+
queue_job
|
65
|
+
assert_equal 1, Resque.queue(:low).length
|
66
|
+
end
|
67
|
+
|
68
|
+
Caveats
|
69
|
+
=======
|
70
|
+
|
71
|
+
* You should make sure that you call `Resque.reset!` in your test's
|
72
|
+
setup method to clear all of the test queues.
|
73
|
+
|
74
|
+
Copyright (c) 2010 Justin Weiss, released under the MIT license
|
data/lib/resque_unit.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# These are a group of assertions you can use in your unit tests to
|
2
|
+
# verify that your code is using Resque correctly.
|
3
|
+
module ResqueUnit::Assertions
|
4
|
+
|
5
|
+
# Asserts that +klass+ has been queued into its appropriate queue at
|
6
|
+
# least once. If +args+ is nil, it only asserts that the klass has
|
7
|
+
# been queued. Otherwise, it asserts that the klass has been queued
|
8
|
+
# with the correct arguments. Pass an empty array for +args+ if you
|
9
|
+
# want to assert that klass has been queued without arguments.
|
10
|
+
def assert_queued(klass, args = nil, message = nil)
|
11
|
+
queue = Resque.queue_for(klass)
|
12
|
+
assert_block (message || "#{klass} should have been queued in #{queue}: #{Resque.queue(queue).inspect}.") do
|
13
|
+
in_queue?(queue, klass, args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# The opposite of +assert_queued+.
|
18
|
+
def assert_not_queued(klass, args = nil, message = nil)
|
19
|
+
queue = Resque.queue_for(klass)
|
20
|
+
assert_block (message || "#{klass} should have been queued in #{queue}.") do
|
21
|
+
!in_queue?(queue, klass, args)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def in_queue?(queue, klass, args = nil)
|
28
|
+
if args # verify the klass and args match some element in the queue
|
29
|
+
!Resque.queue(queue).select {|e| e[:klass] == klass && e[:args] == args}.empty?
|
30
|
+
else # if no args were passed, just verify the job is in the queue
|
31
|
+
!Resque.queue(queue).select {|e| e[:klass] == klass}.empty?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# The fake Resque class. This needs to be loaded after the real Resque
|
2
|
+
# for the assertions in +ResqueUnit::Assertions+ to work.
|
3
|
+
module Resque
|
4
|
+
|
5
|
+
# Resets all the queues to the empty state. This should be called in
|
6
|
+
# your test's +setup+ method until I can figure out a way for it to
|
7
|
+
# automatically be called.
|
8
|
+
def self.reset!
|
9
|
+
@queue = Hash.new { |h, k| h[k] = [] }
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns an array of all the jobs that have been queued. Each
|
13
|
+
# element is of the form +{:klass => klass, :args => args}+ where
|
14
|
+
# +klass+ is the job's class and +args+ is an array of the arguments
|
15
|
+
# passed to the job.
|
16
|
+
def self.queue(queue)
|
17
|
+
self.reset unless @queue
|
18
|
+
@queue[queue]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Executes all jobs in all queues in an undefined order.
|
22
|
+
def self.run!
|
23
|
+
@queue.each do |k, v|
|
24
|
+
while job = v.shift
|
25
|
+
job[:klass].perform(*job[:args])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# :nodoc:
|
31
|
+
def self.enqueue(klass, *args)
|
32
|
+
queue(queue_for(klass)) << {:klass => klass, :args => args}
|
33
|
+
end
|
34
|
+
|
35
|
+
# :nodoc:
|
36
|
+
def self.queue_for(klass)
|
37
|
+
klass.instance_variable_get(:@queue)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ResqueUnitTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
setup do
|
6
|
+
# should probably happen automatically, but I haven't thought of a
|
7
|
+
# good way to hook setup() yet.
|
8
|
+
Resque.reset!
|
9
|
+
end
|
10
|
+
|
11
|
+
context "A task that schedules a resque job" do
|
12
|
+
setup do
|
13
|
+
Resque.enqueue(LowPriorityJob)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "pass the assert_queued(job) assertion" do
|
17
|
+
assert_queued(LowPriorityJob)
|
18
|
+
end
|
19
|
+
|
20
|
+
should "fail the assert_not_queued(job) assertion" do
|
21
|
+
assert_raise Test::Unit::AssertionFailedError do
|
22
|
+
assert_not_queued(LowPriorityJob)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context ", when Resque.run! is called," do
|
27
|
+
setup do
|
28
|
+
assert !LowPriorityJob.run?, "The job should not have been run yet"
|
29
|
+
Resque.run!
|
30
|
+
end
|
31
|
+
|
32
|
+
teardown do
|
33
|
+
LowPriorityJob.run = false
|
34
|
+
end
|
35
|
+
|
36
|
+
should "run the job" do
|
37
|
+
assert LowPriorityJob.run?, "The job should have run"
|
38
|
+
end
|
39
|
+
|
40
|
+
should "clear the job from the queue" do
|
41
|
+
assert_not_queued(LowPriorityJob)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# assert number of jobs?
|
46
|
+
end
|
47
|
+
|
48
|
+
context "An empty queue" do
|
49
|
+
should "pass the assert_not_queued(job) assertion" do
|
50
|
+
assert_not_queued(LowPriorityJob)
|
51
|
+
end
|
52
|
+
|
53
|
+
should "fail the assert_queued(job) assertion" do
|
54
|
+
assert_raise Test::Unit::AssertionFailedError do
|
55
|
+
assert_queued(LowPriorityJob)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "A task that schedules a resque job with arguments" do
|
61
|
+
setup do
|
62
|
+
Resque.enqueue(JobWithArguments, 1, "test")
|
63
|
+
end
|
64
|
+
|
65
|
+
should "pass the assert_queued(job, *args) assertion if the args match" do
|
66
|
+
assert_queued(JobWithArguments, [1, "test"])
|
67
|
+
end
|
68
|
+
|
69
|
+
should "pass the assert_queued(job) assertion with no args passed" do
|
70
|
+
assert_queued(JobWithArguments)
|
71
|
+
end
|
72
|
+
|
73
|
+
should "fail the assert_queued(job) assertion if the args don't match" do
|
74
|
+
assert_raise Test::Unit::AssertionFailedError do
|
75
|
+
assert_queued(JobWithArguments, [2, "test"])
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
should "pass the assert_not_queued(job) assertion if the args don't match" do
|
80
|
+
assert_not_queued(JobWithArguments, [2, "test"])
|
81
|
+
end
|
82
|
+
|
83
|
+
should "fail the assert_not_queued(job) assertion if the args match" do
|
84
|
+
assert_raise Test::Unit::AssertionFailedError do
|
85
|
+
assert_not_queued(JobWithArguments, [1, "test"])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
data/test/sample_jobs.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class LowPriorityJob
|
2
|
+
@queue = :low
|
3
|
+
@run = false
|
4
|
+
def self.perform
|
5
|
+
self.run = true
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.run?
|
9
|
+
@run
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.run=(value)
|
13
|
+
@run = value
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class JobWithArguments
|
19
|
+
@queue = :medium
|
20
|
+
|
21
|
+
def self.perform(num, text)
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: resque_unit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Justin Weiss
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-05-04 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: shoulda
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: justin@uberweiss.org
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.md
|
33
|
+
files:
|
34
|
+
- lib/resque_unit/assertions.rb
|
35
|
+
- lib/resque_unit/resque.rb
|
36
|
+
- lib/resque_unit.rb
|
37
|
+
- test/resque_unit_test.rb
|
38
|
+
- test/sample_jobs.rb
|
39
|
+
- test/test_helper.rb
|
40
|
+
- README.md
|
41
|
+
has_rdoc: true
|
42
|
+
homepage: http://github.com/justinweiss/resque_unit
|
43
|
+
licenses: []
|
44
|
+
|
45
|
+
post_install_message:
|
46
|
+
rdoc_options: []
|
47
|
+
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.3.5
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Test::Unit support for resque job queueing
|
69
|
+
test_files:
|
70
|
+
- test/resque_unit_test.rb
|