public
Description: Database based asynchronously priority queue system -- Extracted from Shopify
Homepage: http://www.shopify.com
Clone URL: git://github.com/tobi/delayed_job.git
delayed_job / spec / delayed_method_spec.rb
100644 79 lines (53 sloc) 2.189 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
require File.dirname(__FILE__) + '/database'
                     
 
class SimpleJob
  cattr_accessor :runs; self.runs = 0
  def perform; @@runs += 1; end
end
 
class RandomRubyObject
  def say_hello
    'hello'
  end
end
 
class StoryReader
  
  def read(story)
    "Epilog: #{story.tell}"
  end
  
end
 
 
describe 'random ruby objects' do
  
  before { reset_db }
 
  it "should respond_to :send_later method" do
                                           
    RandomRubyObject.new.respond_to?(:send_later)
    
  end
  
  it "should raise a ArgumentError if send_later is called but the target method doesn't exist" do
    lambda { RandomRubyObject.new.send_later(:method_that_deos_not_exist) }.should raise_error(NoMethodError)
  end
  
  it "should add a new entry to the job table when send_later is called on it" do
    Delayed::Job.count.should == 0
    
    RandomRubyObject.new.send_later(:to_s)
 
    Delayed::Job.count.should == 1
  end
  
  it "should run get the original method executed when the job is performed" do
    
    RandomRubyObject.new.send_later(:say_hello)
                               
    Delayed::Job.count.should == 1
  end
  
  it "should store the object as string if its an active record" do
    story = Story.create :text => 'Once upon...'
    story.send_later(:tell)
    
    job = Delayed::Job.find(:first)
    job.payload_object.class.should == Delayed::PerformableMethod
    job.payload_object.object.should == 'AR:Story:1'
    job.payload_object.method.should == :tell
    job.payload_object.args.should == []
    job.payload_object.perform.should == 'Once upon...'
  end
  
  it "should store arguments as string if they an active record" do
    
    story = Story.create :text => 'Once upon...'
    
    reader = StoryReader.new
    reader.send_later(:read, story)
    
    job = Delayed::Job.find(:first)
    job.payload_object.class.should == Delayed::PerformableMethod
    job.payload_object.method.should == :read
    job.payload_object.args.should == ['AR:Story:1']
    job.payload_object.perform.should == 'Epilog: Once upon...'
  end
  
end