Skip to content

Commit

Permalink
Update Delayed::Job.enqueue to take a hash
Browse files Browse the repository at this point in the history
  • Loading branch information
bkeepers committed Sep 9, 2010
1 parent 0278846 commit 2cc1573
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 28 deletions.
19 changes: 14 additions & 5 deletions lib/delayed/backend/base.rb
Expand Up @@ -11,14 +11,23 @@ def self.included(base)
module ClassMethods
# Add a job to the queue
def enqueue(*args)
object = args.shift
unless object.respond_to?(:perform)
options = {
:priority => Delayed::Worker.default_priority
}

if args.size == 1 && args.first.is_a?(Hash)
options.merge!(args.first)
else
options[:payload_object] = args.shift
options[:priority] = args.first || options[:priority]
options[:run_at] = args[1]
end

unless options[:payload_object].respond_to?(:perform)
raise ArgumentError, 'Cannot enqueue items which do not respond to perform'
end

priority = args.first || Delayed::Worker.default_priority
run_at = args[1]
self.create(:payload_object => object, :priority => priority.to_i, :run_at => run_at).tap do |job|
self.create(options).tap do |job|
job.hook(:enqueue)
end
end
Expand Down
70 changes: 47 additions & 23 deletions lib/delayed/backend/shared_spec.rb
Expand Up @@ -23,35 +23,59 @@ def create_job(opts = {})
end

describe "enqueue" do
it "should raise ArgumentError when handler doesn't respond_to :perform" do
lambda { described_class.enqueue(Object.new) }.should raise_error(ArgumentError)
end
context "with a hash" do
it "should raise ArgumentError when handler doesn't respond_to :perform" do
lambda { described_class.enqueue(:payload_object => Object.new) }.should raise_error(ArgumentError)
end

it "should increase count after enqueuing items" do
described_class.enqueue SimpleJob.new
described_class.count.should == 1
end
it "should be able to set priority" do
job = described_class.enqueue :payload_object => SimpleJob.new, :priority => 5
job.priority.should == 5
end

it "should be able to set priority" do
@job = described_class.enqueue SimpleJob.new, 5
@job.priority.should == 5
end
it "should use default priority" do
job = described_class.enqueue :payload_object => SimpleJob.new
job.priority.should == 99
end

it "should use default priority when it is not set" do
@job = described_class.enqueue SimpleJob.new
@job.priority.should == 99
it "should be able to set run_at" do
later = described_class.db_time_now + 5.minutes
job = described_class.enqueue :payload_object => SimpleJob.new, :run_at => later
job.run_at.should be_close(later, 1)
end
end

it "should be able to set run_at" do
later = described_class.db_time_now + 5.minutes
@job = described_class.enqueue SimpleJob.new, 5, later
@job.run_at.should be_close(later, 1)
end
context "with multiple arguments" do
it "should raise ArgumentError when handler doesn't respond_to :perform" do
lambda { described_class.enqueue(Object.new) }.should raise_error(ArgumentError)
end

it "should work with jobs in modules" do
M::ModuleJob.runs = 0
job = described_class.enqueue M::ModuleJob.new
lambda { job.invoke_job }.should change { M::ModuleJob.runs }.from(0).to(1)
it "should increase count after enqueuing items" do
described_class.enqueue SimpleJob.new
described_class.count.should == 1
end

it "should be able to set priority" do
@job = described_class.enqueue SimpleJob.new, 5
@job.priority.should == 5
end

it "should use default priority when it is not set" do
@job = described_class.enqueue SimpleJob.new
@job.priority.should == 99
end

it "should be able to set run_at" do
later = described_class.db_time_now + 5.minutes
@job = described_class.enqueue SimpleJob.new, 5, later
@job.run_at.should be_close(later, 1)
end

it "should work with jobs in modules" do
M::ModuleJob.runs = 0
job = described_class.enqueue M::ModuleJob.new
lambda { job.invoke_job }.should change { M::ModuleJob.runs }.from(0).to(1)
end
end
end

Expand Down

0 comments on commit 2cc1573

Please sign in to comment.