octopusci 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +132 -0
- data/bin/octopusci-reset-redis +26 -0
- data/bin/octopusci-skel +2 -7
- data/bin/octopusci-tentacles +2 -2
- data/config.ru +1 -1
- data/lib/octopusci.rb +3 -7
- data/lib/octopusci/config.rb +63 -49
- data/lib/octopusci/errors.rb +2 -0
- data/lib/octopusci/helpers.rb +16 -15
- data/lib/octopusci/io.rb +70 -0
- data/lib/octopusci/job.rb +145 -34
- data/lib/octopusci/job_store.rb +67 -0
- data/lib/octopusci/notifier.rb +7 -17
- data/lib/octopusci/notifier/job_complete.html.erb +76 -3
- data/lib/octopusci/queue.rb +14 -10
- data/lib/octopusci/server.rb +17 -20
- data/lib/octopusci/server/views/index.erb +3 -4
- data/lib/octopusci/server/views/job.erb +3 -3
- data/lib/octopusci/server/views/job_summary.erb +18 -18
- data/lib/octopusci/server/views/layout.erb +6 -5
- data/lib/octopusci/stage_locker.rb +11 -7
- data/lib/octopusci/version.rb +1 -1
- data/lib/octopusci/worker_launcher.rb +1 -1
- data/spec/lib/octopusci/config_spec.rb +195 -0
- data/spec/lib/octopusci/io_spec.rb +64 -0
- data/spec/lib/octopusci/job_spec.rb +122 -0
- data/spec/lib/octopusci/job_store_spec.rb +155 -0
- data/spec/lib/octopusci/notifier_spec.rb +0 -15
- data/spec/lib/octopusci/queue_spec.rb +122 -0
- data/spec/lib/octopusci/server_spec.rb +92 -1
- data/spec/lib/octopusci/stage_locker_spec.rb +94 -0
- data/spec/spec_helper.rb +8 -0
- metadata +39 -58
- data/README +0 -63
- data/bin/octopusci-db-migrate +0 -10
- data/db/migrate/0001_init.rb +0 -29
- data/db/migrate/0002_add_status_job.rb +0 -19
- data/lib/octopusci/notifier/job_complete.text.erb +0 -5
- data/lib/octopusci/schema.rb +0 -140
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Octopusci::Job do
|
4
|
+
|
5
|
+
describe "self.run" do
|
6
|
+
it "when not overridden should raise Ocotpusci::PureVirtualMethod" do
|
7
|
+
class SomeJob < Octopusci::Job; end
|
8
|
+
expect { SomeJob.run(nil) }.to raise_error(Octopusci::PureVirtualMethod)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "self.failed!" do
|
13
|
+
it "should create an instance of Octopusci::JobRunFailed with the given message" do
|
14
|
+
excep_bef_mock = Octopusci::JobRunFailed.new("foo bar")
|
15
|
+
Octopusci::JobRunFailed.should_receive(:new).with("a test failure message").and_return(excep_bef_mock)
|
16
|
+
class SomeJob < Octopusci::Job; end
|
17
|
+
begin
|
18
|
+
SomeJob.failed!("a test failure message")
|
19
|
+
rescue Octopusci::JobRunFailed
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should raise Octopusci::JobRunFailed" do
|
24
|
+
class SomeJob < Octopusci::Job; end
|
25
|
+
expect { SomeJob.failed!("a test failure message") }.to raise_error(Octopusci::JobRunFailed)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "self.context" do
|
30
|
+
it "should push context string onto the context stack" do
|
31
|
+
class SomeJob < Octopusci::Job; end
|
32
|
+
SomeJob.stub(:output)
|
33
|
+
SomeJob.stub(:get_recip_email)
|
34
|
+
Octopusci::Notifier.stub_chain(:job_complete, :deliver)
|
35
|
+
SomeJob.context_stack.should_receive(:push).with("commit")
|
36
|
+
SomeJob.context("commit") {}
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should execute the given block" do
|
40
|
+
class SomeJob < Octopusci::Job; end
|
41
|
+
SomeJob.stub(:output)
|
42
|
+
SomeJob.stub(:get_recip_email)
|
43
|
+
Octopusci::Notifier.stub_chain(:job_complete, :deliver)
|
44
|
+
@a = mock('some_inst_var_in_block')
|
45
|
+
@a.should_receive(:foo)
|
46
|
+
SomeJob.context("commit") { @a.foo }
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should pop context string off the context stack" do
|
50
|
+
class SomeJob < Octopusci::Job; end
|
51
|
+
SomeJob.stub(:output)
|
52
|
+
SomeJob.stub(:get_recip_email)
|
53
|
+
Octopusci::Notifier.stub_chain(:job_complete, :deliver)
|
54
|
+
SomeJob.context_stack.should_receive(:pop)
|
55
|
+
SomeJob.context("commit") {}
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should pop context even if an exception is thrown inside the context" do
|
59
|
+
class SomeJob < Octopusci::Job; end
|
60
|
+
class FooExcep < RuntimeError; end
|
61
|
+
SomeJob.stub(:output)
|
62
|
+
SomeJob.stub(:get_recip_email)
|
63
|
+
Octopusci::Notifier.stub_chain(:job_complete, :deliver)
|
64
|
+
SomeJob.context_stack.should_receive(:pop)
|
65
|
+
begin
|
66
|
+
SomeJob.context("commit") { raise FooExcep.new('aoeuaoee') }
|
67
|
+
rescue FooExcep
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should raise a Octopusci::JobHalted exception if the failed! method is called inside the context" do
|
72
|
+
job_rec = stub('job_record')
|
73
|
+
class SomeJob < Octopusci::Job
|
74
|
+
def self.run(job_rec)
|
75
|
+
context("commit") do
|
76
|
+
failed!("some reason")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
SomeJob.stub(:write_exception)
|
81
|
+
SomeJob.stub(:output)
|
82
|
+
SomeJob.stub(:get_recip_email)
|
83
|
+
Octopusci::Notifier.stub_chain(:job_complete, :deliver)
|
84
|
+
expect { SomeJob.run(job_rec) }.to raise_error(Octopusci::JobHalted)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should stop execution from continuing after the failed!" do
|
88
|
+
job_rec = mock('job_record')
|
89
|
+
job_rec.should_receive(:foo)
|
90
|
+
job_rec.should_not_receive(:bar)
|
91
|
+
class SomeJob < Octopusci::Job
|
92
|
+
def self.run(job_rec)
|
93
|
+
context("commit") do
|
94
|
+
job_rec.foo
|
95
|
+
failed!("some failure")
|
96
|
+
job_rec.bar
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
SomeJob.stub(:write_exception)
|
101
|
+
SomeJob.stub(:output)
|
102
|
+
SomeJob.stub(:get_recip_email)
|
103
|
+
Octopusci::Notifier.stub_chain(:job_complete, :deliver)
|
104
|
+
begin
|
105
|
+
SomeJob.run(job_rec)
|
106
|
+
rescue Octopusci::JobHalted
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "self.run_shell_cmd" do
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "self.log" do
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "self.perform" do
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Octopusci::JobStore do
|
4
|
+
|
5
|
+
describe "#prepend" do
|
6
|
+
it "should increment the job count" do
|
7
|
+
r = mock('redis').as_null_object
|
8
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
9
|
+
r.should_receive(:incr).with('octopusci:job_count')
|
10
|
+
Octopusci::JobStore.prepend({ "stub_job" => "foo", 'ref' => 'refs/heads/master' })
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should store the job record" do
|
14
|
+
r = mock('redis').as_null_object
|
15
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
16
|
+
r.stub(:incr).and_return(1)
|
17
|
+
Octopusci::JobStore.should_receive(:set).with(1, { "stub_job" => "foo", 'ref' => 'refs/heads/master', 'id' => 1 })
|
18
|
+
Octopusci::JobStore.prepend({ "stub_job" => "foo", 'ref' => 'refs/heads/master' })
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should prepend the job id to the job ids list" do
|
22
|
+
r = mock('redis').as_null_object
|
23
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
24
|
+
r.stub(:incr).and_return(10)
|
25
|
+
r.should_receive(:lpush).with("octopusci:jobs", 10)
|
26
|
+
Octopusci::JobStore.prepend({ "stub_job" => "foo", 'ref' => 'refs/heads/master' })
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should prepend the job id to the project, branch, job ids list" do
|
30
|
+
r = mock('redis').as_null_object
|
31
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
32
|
+
r.stub(:incr).and_return(10)
|
33
|
+
r.should_receive(:lpush).with("octopusci:foo:bar:jobs", 10)
|
34
|
+
Octopusci::JobStore.prepend({ 'repo_name' => 'foo', 'ref' => 'refs/heads/bar' })
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return the prepended jobs id" do
|
38
|
+
r = mock('redis').as_null_object
|
39
|
+
r.stub(:incr).and_return(1)
|
40
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
41
|
+
Octopusci::JobStore.prepend({ "stub_job" => "foo", 'ref' => 'refs/heads/foo' }).should == 1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "#set" do
|
46
|
+
it "should store the passed job record serialized at the proper key" do
|
47
|
+
r = mock('redis')
|
48
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
49
|
+
r.should_receive(:set).with("octopusci:jobs:1", YAML.dump({ "stub_job" => "foo"}))
|
50
|
+
Octopusci::JobStore.set(1, { "stub_job" => "foo"})
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "#get" do
|
55
|
+
it "should get the job record using the proper key" do
|
56
|
+
r = mock('redis')
|
57
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
58
|
+
r.should_receive(:get).with("octopusci:jobs:1")
|
59
|
+
Octopusci::JobStore.get(1)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#size" do
|
64
|
+
it "should get the number of jobs in the jobs list" do
|
65
|
+
r = mock('redis')
|
66
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
67
|
+
r.should_receive(:llen).with("octopusci:jobs").and_return(8)
|
68
|
+
Octopusci::JobStore.size
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should return the number of jobs in the jobs list" do
|
72
|
+
r = mock('redis')
|
73
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
74
|
+
r.stub(:llen).and_return(8)
|
75
|
+
Octopusci::JobStore.size.should == 8
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#repo_branch_size" do
|
80
|
+
it "should get the number of jobs in the list for the branch name of the given repository" do
|
81
|
+
r = mock('redis')
|
82
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
83
|
+
r.should_receive(:llen).with("octopusci:foo:bar:jobs").and_return(8)
|
84
|
+
Octopusci::JobStore.repo_branch_size("foo", "bar")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should return the number of jbos in the list for the branch name of the given repository" do
|
88
|
+
r = mock('redis')
|
89
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
90
|
+
r.should_receive(:llen).with("octopusci:foo:bar:jobs").and_return(8)
|
91
|
+
Octopusci::JobStore.repo_branch_size("foo", "bar").should == 8
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#list_job_ids" do
|
96
|
+
it "should return a list of count job ids from the first index given" do
|
97
|
+
r = mock('redis')
|
98
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
99
|
+
Octopusci::JobStore.stub(:size).and_return(2)
|
100
|
+
r.should_receive(:lrange).with("octopusci:jobs", 0, 1)
|
101
|
+
Octopusci::JobStore.list_job_ids(0, 2)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should return a list of all job ids from the first index given if count is larger than the start index to the end of the list" do
|
105
|
+
r = mock('redis')
|
106
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
107
|
+
Octopusci::JobStore.stub(:size).and_return(2)
|
108
|
+
r.should_receive(:lrange).with("octopusci:jobs", 0, 1)
|
109
|
+
Octopusci::JobStore.list_job_ids(0, 3423)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "#list_repo_branch_job_ids" do
|
114
|
+
it "should return a list of count job ids from the first index given for the provided repo and branch" do
|
115
|
+
r = mock('redis')
|
116
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
117
|
+
Octopusci::JobStore.stub(:repo_branch_size).and_return(2)
|
118
|
+
r.should_receive(:lrange).with("octopusci:foo:bar:jobs", 0, 1)
|
119
|
+
Octopusci::JobStore.list_repo_branch_job_ids('foo', 'bar', 0, 2)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should return a list of all job ids from the first index given if count is larger than the start index to the end of the repositories branch job list" do
|
123
|
+
r = mock('redis')
|
124
|
+
Octopusci::JobStore.stub(:redis).and_return(r)
|
125
|
+
Octopusci::JobStore.stub(:repo_branch_size).and_return(2)
|
126
|
+
r.should_receive(:lrange).with("octopusci:foo:bar:jobs", 0, 1)
|
127
|
+
Octopusci::JobStore.list_repo_branch_job_ids('foo', 'bar', 0, 4232)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "#list" do
|
132
|
+
it "should get a list of all the job ids given starting index and a count" do
|
133
|
+
Octopusci::JobStore.stub(:list_job_ids).and_return([1, 2, 3, 4, 5])
|
134
|
+
Octopusci::JobStore.stub(:get).with(1).and_return("foo1")
|
135
|
+
Octopusci::JobStore.stub(:get).with(2).and_return("foo2")
|
136
|
+
Octopusci::JobStore.stub(:get).with(3).and_return("foo3")
|
137
|
+
Octopusci::JobStore.stub(:get).with(4).and_return("foo4")
|
138
|
+
Octopusci::JobStore.stub(:get).with(5).and_return("foo5")
|
139
|
+
Octopusci::JobStore.list(0, 5).should == ["foo1", "foo2", "foo3", "foo4", "foo5"]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe "#list_repo_branch" do
|
144
|
+
it "should get a list of all the job ids given starting index and a count" do
|
145
|
+
Octopusci::JobStore.stub(:list_repo_branch_job_ids).and_return([1, 2, 3, 4, 5])
|
146
|
+
Octopusci::JobStore.stub(:get).with(1).and_return("foo1")
|
147
|
+
Octopusci::JobStore.stub(:get).with(2).and_return("foo2")
|
148
|
+
Octopusci::JobStore.stub(:get).with(3).and_return("foo3")
|
149
|
+
Octopusci::JobStore.stub(:get).with(4).and_return("foo4")
|
150
|
+
Octopusci::JobStore.stub(:get).with(5).and_return("foo5")
|
151
|
+
Octopusci::JobStore.list_repo_branch("foo", "bar", 0, 5).should == ["foo1", "foo2", "foo3", "foo4", "foo5"]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
@@ -8,20 +8,5 @@ describe Octopusci::Notifier do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe "#job_complete" do
|
11
|
-
it "should send a multi-part email with the text version containing job status" do
|
12
|
-
pending
|
13
|
-
mail = Octopusci::Notifier.job_complete('joe@example.com', 'my output', 'my status').deliver()
|
14
|
-
|
15
|
-
Octopusci::Notifier.deliveries.size.should == 1
|
16
|
-
mail.parts[0].body.should =~ /my output/
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should send a multi-part email with the html version containing job status" do
|
20
|
-
pending
|
21
|
-
mail = Octopusci::Notifier.job_complete('joe@example.com', 'my output', 'my status').deliver()
|
22
|
-
|
23
|
-
Octopusci::Notifier.deliveries.size.should == 1
|
24
|
-
mail.parts[1].body.should =~ /my output/
|
25
|
-
end
|
26
11
|
end
|
27
12
|
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Octopusci::Queueu" do
|
4
|
+
describe "#enqueue" do
|
5
|
+
it "should prepend the job to the job store if a matching job doesn't already exist" do
|
6
|
+
proj_info = { :some => 'proj_info' }
|
7
|
+
github_payload = { :some => 'github_payload' }
|
8
|
+
@mock_redis.stub(:set)
|
9
|
+
Resque.stub(:push)
|
10
|
+
Octopusci::Helpers.stub(:gh_payload_to_job_attrs).and_return({})
|
11
|
+
Octopusci::Queue.stub(:lismember).and_return(false)
|
12
|
+
Octopusci::JobStore.should_receive(:prepend)
|
13
|
+
Octopusci::Queue.enqueue('SomeTestJobKlass', 'repo-name', 'branch-name', github_payload, proj_info)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should store the github payload for the job if a matching job doesn't already exist" do
|
17
|
+
r = mock('redis')
|
18
|
+
proj_info = { :some => 'proj_info' }
|
19
|
+
github_payload = { :some => 'github_payload' }
|
20
|
+
Resque.stub(:push)
|
21
|
+
Octopusci::JobStore.stub(:prepend)
|
22
|
+
Octopusci::Queue.stub(:redis).and_return(r)
|
23
|
+
Octopusci::Helpers.stub(:gh_payload_to_job_attrs).and_return({})
|
24
|
+
Octopusci::Queue.stub(:lismember).and_return(false)
|
25
|
+
r.should_receive(:set)
|
26
|
+
Octopusci::Queue.enqueue('SomeTestJobKlass', 'repo-name', 'branch-name', github_payload, proj_info)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should enque the job in the octopusci Resque queue if a matching job doesn't already exist" do
|
30
|
+
proj_info = { :some => 'proj_info' }
|
31
|
+
github_payload = { :some => 'github_payload' }
|
32
|
+
Octopusci::JobStore.stub(:prepend)
|
33
|
+
@mock_redis.stub(:set)
|
34
|
+
Octopusci::Helpers.stub(:gh_payload_to_job_attrs).and_return({})
|
35
|
+
Octopusci::Queue.stub(:lismember).and_return(false)
|
36
|
+
Resque.should_receive(:push)
|
37
|
+
Octopusci::Queue.enqueue('SomeTestJobKlass', 'repo-name', 'branch-name', github_payload, proj_info)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should store the github payload if a matching job already exists" do
|
41
|
+
proj_info = { :some => 'proj_info' }
|
42
|
+
github_payload = { :some => 'github_payload' }
|
43
|
+
r = mock('redis')
|
44
|
+
Octopusci::JobStore.stub(:list_repo_branch).and_return([])
|
45
|
+
Octopusci::Queue.stub(:lismember).and_return(true)
|
46
|
+
Octopusci::Queue.stub(:redis).and_return(r)
|
47
|
+
r.should_receive(:set).with(Octopusci::Queue.github_payload_key('repo-name', 'branch-name'), Resque::encode(github_payload))
|
48
|
+
Octopusci::Queue.enqueue('SomeTestJobKlass', 'repo-name', 'branch-name', github_payload, proj_info)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should get the most recent job for the provided repo and branch combo if a matching job already exists" do
|
52
|
+
proj_info = { :some => 'proj_info' }
|
53
|
+
github_payload = { :some => 'github_payload' }
|
54
|
+
@mock_redis.stub(:set)
|
55
|
+
Octopusci::Queue.stub(:lismember).and_return(true)
|
56
|
+
Octopusci::JobStore.should_receive(:list_repo_branch).with('repo-name', 'branch-name', 0, 1).and_return([])
|
57
|
+
Octopusci::Queue.enqueue('SomeTestJobKlass', 'repo-name', 'branch-name', github_payload, proj_info)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should update the job record with the new data from the github payload if a matching job already exists" do
|
61
|
+
proj_info = { :some => 'proj_info' }
|
62
|
+
github_payload = { :some => 'github_payload' }
|
63
|
+
@mock_redis.stub(:set)
|
64
|
+
Octopusci::Queue.stub(:lismember).and_return(true)
|
65
|
+
Octopusci::Helpers.stub(:gh_payload_to_job_attrs).and_return(github_payload)
|
66
|
+
Octopusci::JobStore.stub(:list_repo_branch).and_return([ { 'id' => 23 }.merge(github_payload) ])
|
67
|
+
Octopusci::JobStore.should_receive(:set).with(23, { 'id' => 23 }.merge(github_payload))
|
68
|
+
Octopusci::Queue.enqueue('SomeTestJobKlass', 'repo-name', 'branch-name', github_payload, proj_info)
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#lismember" do
|
74
|
+
it "should get the size of the provided queue" do
|
75
|
+
@mock_redis.stub(:lrange)
|
76
|
+
Resque.should_receive(:size).with("test:queue").and_return(0)
|
77
|
+
Octopusci::Queue.lismember("test:queue", { :test => 'foo' })
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should get the entire list of queued jobs" do
|
81
|
+
Resque.stub(:size).and_return(2)
|
82
|
+
Resque.should_receive(:peek).with("test:queue", 0, 2)
|
83
|
+
Octopusci::Queue.lismember("test:queue", { :test => 'foo' })
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should return true if the provided item exists in the queue identified by the provided queue name" do
|
87
|
+
Resque.stub(:size).and_return(2)
|
88
|
+
Resque.stub(:peek).and_return([ { :test => 'foo' }, { :hoopty => 'bar' } ])
|
89
|
+
Octopusci::Queue.lismember("test:queue", { :hoopty => 'bar' }).should == true
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return false if the provided item does NOT exist in the queue identified by the given queue name" do
|
93
|
+
Resque.stub(:size).and_return(2)
|
94
|
+
Resque.stub(:peek).and_return([ { :test => 'foo' }, { :hoopty => 'bar' } ])
|
95
|
+
Octopusci::Queue.lismember("test:queue", { :jack => 'crack' }).should == false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#github_payload" do
|
100
|
+
it "should get the currently stored github_payload for a given repository and branch" do
|
101
|
+
r = mock('redis')
|
102
|
+
r.should_receive(:get).with(Octopusci::Queue.github_payload_key('my-repo', 'my-branch')).and_return({ :my => 'git', :hub => 'payload' })
|
103
|
+
Resque.should_receive(:decode).with({ :my => 'git', :hub => 'payload' })
|
104
|
+
Octopusci::Queue.stub(:redis).and_return(r)
|
105
|
+
Octopusci::Queue.github_payload('my-repo', 'my-branch')
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should return nil if there is no github_payload for a given repository and branch" do
|
109
|
+
r = mock('redis')
|
110
|
+
r.should_receive(:get).with(Octopusci::Queue.github_payload_key('my-repo', 'my-branch')).and_return(nil)
|
111
|
+
Octopusci::Queue.stub(:redis).and_return(r)
|
112
|
+
Octopusci::Queue.github_payload('my-repo', 'my-branch').should be_nil
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#github_payload_key" do
|
117
|
+
it "should return the key of where the github payload would be stored for a given repository and branch" do
|
118
|
+
Octopusci::Queue.github_payload_key("jackie-repo", "brown-branch").should == "octopusci:github_payload:jackie-repo:brown-branch"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -10,6 +10,7 @@ describe "Octopusci::Server" do
|
|
10
10
|
it "should parse the github payload using JSON" do
|
11
11
|
parsed_github_payload = Octopusci::Helpers.decode(@github_test_payload)
|
12
12
|
Octopusci::Helpers.should_receive(:decode).with(@github_test_payload).and_return(parsed_github_payload)
|
13
|
+
Octopusci::Queue.stub(:enqueue) # stub this out so test doesn't actually enqueue a job
|
13
14
|
post '/github-build', :payload => @github_test_payload
|
14
15
|
end
|
15
16
|
|
@@ -22,9 +23,99 @@ describe "Octopusci::Server" do
|
|
22
23
|
it "should enqueue a job if the request is for a managed project" do
|
23
24
|
test_proj_info = { 'name' => 'temp_pusc_test', 'owner' => 'cyphactor', 'job_klass' => 'MyTestJob' }
|
24
25
|
Octopusci::Helpers.stub(:get_project_info).and_return(test_proj_info)
|
25
|
-
Octopusci::Queue.should_receive(:enqueue).with(test_proj_info['job_klass'], "temp_pusci_test", "master", Octopusci::Helpers.decode(@github_test_payload))
|
26
|
+
Octopusci::Queue.should_receive(:enqueue).with(test_proj_info['job_klass'], "temp_pusci_test", "master", Octopusci::Helpers.decode(@github_test_payload), test_proj_info)
|
26
27
|
post '/github-build', :payload => @github_test_payload
|
27
28
|
last_response.status.should == 200
|
28
29
|
end
|
29
30
|
end
|
31
|
+
|
32
|
+
describe "GET /" do
|
33
|
+
it "should get the 20 most recently queued jobs" do
|
34
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
35
|
+
Octopusci::JobStore.should_receive(:list).with(0, 20).and_return([])
|
36
|
+
get '/'
|
37
|
+
last_response.status.should == 200
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "GET /:repo_name/:branch_name/jobs" do
|
42
|
+
it "should get the 20 most recently queue jobs for the provided repo_name, branch_name combo" do
|
43
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
44
|
+
Octopusci::JobStore.should_receive(:list_repo_branch).with('foo-repo', 'bar-branch', 0, 20).and_return([])
|
45
|
+
get '/foo-repo/bar-branch/jobs'
|
46
|
+
last_response.status.should == 200
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "job specific" do
|
51
|
+
|
52
|
+
before(:each) do
|
53
|
+
@job_id = "234"
|
54
|
+
@job = { 'id' => @job_id, 'status' => 'pending',
|
55
|
+
'payload' => { 'repository' => { 'url' => 'http://somewhere.com' }, 'pusher' => { 'email' => 'bob@example.com' } },
|
56
|
+
'repo_name' => 'bar', 'branch_name' => 'foo', 'created_at' => Time.now, 'started_at' => Time.now,
|
57
|
+
'ended_at' => Time.now + 1000, 'compare' => 'http://compareurl.com', 'stage' => 'test_a', 'ref' => 'refs/heads/foo' }
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "GET /jobs/:job_id" do
|
61
|
+
it "should get the job specified by :job_id" do
|
62
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
63
|
+
Octopusci::JobStore.should_receive(:get).with(@job_id).and_return(@job)
|
64
|
+
get "/jobs/#{@job_id}"
|
65
|
+
last_response.status.should == 200
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "GET /jobs/:job_id/output" do
|
70
|
+
it "should get the job specified by :job_id" do
|
71
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
72
|
+
Octopusci::JobStore.should_receive(:get).with(@job_id).and_return(@job)
|
73
|
+
get "/jobs/#{@job_id}/output"
|
74
|
+
last_response.status.should == 200
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "GET /jobs/:job_id/silent_output" do
|
79
|
+
it "should get the job specified by :job_id" do
|
80
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
81
|
+
Octopusci::JobStore.should_receive(:get).with(@job_id).and_return(@job)
|
82
|
+
get "/jobs/#{@job_id}/silent_output"
|
83
|
+
last_response.status.should == 200
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should return the log output for the job identified by :job_id" do
|
87
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
88
|
+
Octopusci::JobStore.stub(:get).with(@job_id).and_return(@job)
|
89
|
+
Octopusci::IO.any_instance.stub(:read_all_log).and_return("log output")
|
90
|
+
get "/jobs/#{@job_id}/silent_output"
|
91
|
+
last_response.body.should == "log output"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "GET /jobs/:job_id/status" do
|
96
|
+
it "should get the job specified by :job_id" do
|
97
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
98
|
+
Octopusci::JobStore.should_receive(:get).with(@job_id).and_return(@job)
|
99
|
+
get "/jobs/#{@job_id}/status"
|
100
|
+
last_response.status.should == 200
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should return the status of the current status of the job identified by :job_id" do
|
104
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
105
|
+
Octopusci::JobStore.stub(:get).with(@job_id).and_return(@job)
|
106
|
+
get "/jobs/#{@job_id}/status"
|
107
|
+
last_response.body.should == "pending"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "GET /jobs/:job_id/ajax_summary" do
|
112
|
+
it "should get the job specified by :job_id" do
|
113
|
+
Octopusci::Server.any_instance.stub(:authorized?).and_return(true)
|
114
|
+
Octopusci::JobStore.should_receive(:get).with(@job_id).and_return(@job)
|
115
|
+
get "/jobs/#{@job_id}/ajax_summary"
|
116
|
+
last_response.status.should == 200
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
30
121
|
end
|