/
job_spec.rb
107 lines (89 loc) · 2.95 KB
/
job_spec.rb
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
require 'spec_helper'
require 'qless/job'
module Qless
describe Job do
class JobClass
class Nested
end
end
let(:client) { stub.as_null_object }
describe ".build" do
it 'creates a job instance' do
Job.build(client, JobClass).should be_a(Job)
end
it 'honors attributes passed as a symbol' do
job = Job.build(client, JobClass, data: { "a" => 5 })
job.data.should eq("a" => 5)
end
it 'round-trips the data through JSON to simulate what happens with real jobs' do
time = Time.new(2012, 5, 3, 12, 30)
job = Job.build(client, JobClass, data: { :a => 5, :timestamp => time })
job.data.keys.should =~ %w[ a timestamp ]
job.data["timestamp"].should be_a(String)
job.data["timestamp"].should include("2012-05-03")
end
end
describe "#klass" do
it 'returns the class constant' do
job = Job.build(client, JobClass, data: {})
expect(job.klass).to be(JobClass)
end
it 'raises a useful error when the class constant is not loaded' do
stub_const("MyJobClass", Class.new)
job = Job.build(client, ::MyJobClass, data: {})
hide_const("MyJobClass")
expect { job.klass }.to raise_error(NameError, /constant MyJobClass/)
end
end
describe "#perform" do
it 'calls the #perform method on the job class with the job as an argument' do
job = Job.build(client, JobClass)
JobClass.should_receive(:perform).with(job).once
job.perform
end
it 'properly finds nested classes' do
job = Job.build(client, JobClass::Nested)
JobClass::Nested.should_receive(:perform).with(job).once
job.perform
end
end
[
[:fail, 'group', 'message'],
[:complete],
[:cancel],
[:move, 'queue'],
[:retry],
[:retry, 55]
].each do |meth, *args|
describe "##{meth}" do
let(:job) { Job.build(client, JobClass) }
it 'updates #state_changed? from false to true' do
expect {
job.send(meth, *args)
}.to change(job, :state_changed?).from(false).to(true)
end
class MyCustomError < StandardError; end
it 'does not update #state_changed? if there is a redis connection error' do
client.stub(:"_#{meth}") { raise MyCustomError, "boom" }
client.stub(:"_put") { raise MyCustomError, "boom" } # for #move
expect {
job.send(meth, *args)
}.to raise_error(MyCustomError)
job.state_changed?.should be_false
end
end
end
describe "#inspect" do
let(:job) { Job.build(client, JobClass) }
it "includes the jid" do
job.inspect.should include(job.jid)
end
it "includes the job class" do
job.inspect.should include(job.klass_name)
end
it "includes the job queue" do
job.inspect.should include(job.queue_name)
end
end
end
end