Skip to content

Commit

Permalink
Add support for ResqueScheduler
Browse files Browse the repository at this point in the history
  • Loading branch information
leshill committed Jun 24, 2010
1 parent 65d79b5 commit 2611f7e
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 1 deletion.
62 changes: 62 additions & 0 deletions lib/resque_scheduler_spec.rb
@@ -0,0 +1,62 @@
require 'resque_spec'

module ResqueSpec

def scheduled?(klass, time, *args)
schedule_for(klass).any? {|entry| entry[:klass] == klass && entry[:time] == time && entry[:args] == args}
end

def scheduled_anytime?(klass, *args)
schedule_for(klass).any? {|entry| entry[:klass] == klass && entry[:args] == args}
end

def schedule_for(klass)
name = queue_name(klass).to_s << "_scheduled"
queues[name]
end

module ResqueScheduler
def enqueue_at(time, klass, *args)
ResqueSpec.schedule_for(klass) << {:klass => klass, :time => time, :args => args}
end
end
end

Resque.extend(ResqueSpec::ResqueScheduler)

Spec::Matchers.define :have_scheduled do |*expected_args|
match do |actual|
ResqueSpec.scheduled_anytime?(actual, *expected_args)
end

failure_message_for_should do |actual|
"expected that #{actual} would have [#{expected_args.join(', ')}] queued"
end

failure_message_for_should_not do |actual|
"expected that #{actual} would not have [#{expected_args.join(', ')}] queued"
end

description do
"have scheduled arguments"
end
end

Spec::Matchers.define :have_scheduled_at do |*expected_args|
match do |actual|
ResqueSpec.scheduled?(actual, *expected_args)
end

failure_message_for_should do |actual|
"expected that #{actual} would have [#{expected_args.join(', ')}] queued"
end

failure_message_for_should_not do |actual|
"expected that #{actual} would not have [#{expected_args.join(', ')}] queued"
end

description do
"have scheduled at the given time the arguments"
end
end

5 changes: 4 additions & 1 deletion lib/resque_spec.rb
Expand Up @@ -8,9 +8,12 @@ def in_queue?(klass, *args)
end

def queue_for(klass)
queues[queue_name(klass)]
end

def queue_name(klass)
queue_name = klass.instance_variable_get(:@queue) || klass.respond_to?(:queue) && klass.queue
raise ::Resque::NoQueueError.new("Jobs must be placed onto a queue.") unless queue_name
queues[queue_name]
end

def queues
Expand Down
114 changes: 114 additions & 0 deletions spec/resque_scheduler_spec_spec.rb
@@ -0,0 +1,114 @@
require 'spec_helper'

describe "ResqueSchedulerSpec" do
before do
ResqueSpec.reset!
end

let(:first_name) { 'Les' }
let(:last_name) { 'Hill' }
let(:scheduled_at) { Time.now + 5 * 60 }

describe "scheduled?" do
it "returns true if the arguments were queued" do
Resque.enqueue_at(scheduled_at, Person, first_name, last_name)
ResqueSpec.scheduled?(Person, scheduled_at, first_name, last_name).should be
end

it "returns false if the arguments were not queued" do
ResqueSpec.scheduled?(Person, scheduled_at, first_name, last_name).should_not be
end
end

describe "scheduled_anytime?" do
it "returns true if the arguments were queued" do
Resque.enqueue_at(scheduled_at, Person, first_name, last_name)
ResqueSpec.scheduled_anytime?(Person, first_name, last_name).should be
end

it "returns false if the arguments were not queued" do
ResqueSpec.scheduled_anytime?(Person, first_name, last_name).should_not be
end
end

describe "#schedule_for" do
it "raises if there is no schedule queue defined for a class" do
expect do
ResqueSpec.schedule_for(Address)
end.should raise_exception(::Resque::NoQueueError)
end

it "recognizes a queue defined as a class instance variable" do
expect do
ResqueSpec.schedule_for(Person)
end.should_not raise_exception(::Resque::NoQueueError)
end

it "recognizes a queue defined as a class method" do
expect do
ResqueSpec.schedule_for(Account)
end.should_not raise_exception(::Resque::NoQueueError)
end

it "has an empty array if nothing queued for a class" do
ResqueSpec.schedule_for(Person).should == []
end

it "allows additions" do
ResqueSpec.schedule_for(Person) << 'queued'
ResqueSpec.schedule_for(Person).should_not be_empty
end
end

describe "Resque" do
describe "#enqueue_at" do

before do
Resque.enqueue_at(scheduled_at, Person, first_name, last_name)
end

it "adds to the scheduled queue hash" do
ResqueSpec.schedule_for(Person).should_not be_empty
end

it "sets the klass on the queue" do
ResqueSpec.schedule_for(Person).first.should include(:klass => Person)
end

it "sets the arguments on the queue" do
ResqueSpec.schedule_for(Person).first.should include(:args => [first_name, last_name])
end

it "sets the time on the scheduled queue" do
ResqueSpec.schedule_for(Person).first.should include(:time => scheduled_at)
end

end
end

context "Matchers" do
before do
Resque.enqueue_at(scheduled_at, Person, first_name, last_name)
end

describe "#have_scheduled_at" do
it "returns true if the arguments are found in the queue" do
Person.should have_scheduled_at(scheduled_at, first_name, last_name)
end

it "returns false if the arguments are not found in the queue" do
Person.should_not have_scheduled_at(scheduled_at, last_name, first_name)
end
end

describe "#have_scheduled" do
it "returns true if the arguments are found in the queue" do
Person.should have_scheduled(first_name, last_name)
end

it "returns false if the arguments are not found in the queue" do
Person.should_not have_scheduled(last_name, first_name)
end
end
end
end
1 change: 1 addition & 0 deletions spec/spec_helper.rb
@@ -1,6 +1,7 @@
$LOAD_PATH.unshift(File.dirname(__FILE__))
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
require 'resque_spec'
require 'resque_scheduler_spec'
require 'spec'
require 'spec/autorun'

Expand Down

0 comments on commit 2611f7e

Please sign in to comment.