duke 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +38 -0
- data/LICENSE +20 -0
- data/README.rdoc +83 -0
- data/Rakefile +47 -0
- data/VERSION +1 -0
- data/bin/duke +25 -0
- data/duke.gemspec +83 -0
- data/lib/duke/app.rb +37 -0
- data/lib/duke/cli.rb +58 -0
- data/lib/duke/controller.rb +58 -0
- data/lib/duke/project.rb +121 -0
- data/lib/duke.rb +31 -0
- data/lib/ext/string.rb +10 -0
- data/spec/duke/cli_spec.rb +155 -0
- data/spec/duke/controller_spec.rb +111 -0
- data/spec/duke/project_spec.rb +272 -0
- data/spec/spec_helper.rb +18 -0
- data/templates/config.ru +9 -0
- data/templates/public/help.html +0 -0
- data/templates/public/stylesheets/base.css +150 -0
- data/templates/public/stylesheets/button.css +74 -0
- data/templates/public/stylesheets/custom.css +105 -0
- data/templates/public/stylesheets/reset.css +92 -0
- data/templates/views/index.rhtml +46 -0
- metadata +146 -0
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cli do
|
4
|
+
before do
|
5
|
+
@cli = Cli.new
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "#new" do
|
9
|
+
before do
|
10
|
+
Duke::Config.stub(:log_dir).and_return("log_dir")
|
11
|
+
Duke::Config.stub(:pid_dir).and_return("pid_dir")
|
12
|
+
FileUtils.stub(:mkdir_p)
|
13
|
+
FileUtils.stub(:mkdir_p)
|
14
|
+
@cli.stub(:directory)
|
15
|
+
end
|
16
|
+
|
17
|
+
context "with no argument" do
|
18
|
+
it "creates the config'd pid directory in the current directory" do
|
19
|
+
FileUtils.should_receive(:mkdir_p).with("./pid_dir")
|
20
|
+
@cli.new
|
21
|
+
end
|
22
|
+
|
23
|
+
it "creates the config'd log directory in the current directory" do
|
24
|
+
FileUtils.should_receive(:mkdir_p).with("./log_dir")
|
25
|
+
@cli.new
|
26
|
+
end
|
27
|
+
|
28
|
+
it "copies templates into the current directory" do
|
29
|
+
@cli.should_receive(:directory).with('templates', '.')
|
30
|
+
@cli.new
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with a path argument" do
|
35
|
+
it "creates the config'd pid directory in the path" do
|
36
|
+
FileUtils.should_receive(:mkdir_p).with("/path/pid_dir")
|
37
|
+
@cli.new('/path')
|
38
|
+
end
|
39
|
+
|
40
|
+
it "creates the config'd log directory in the path" do
|
41
|
+
FileUtils.should_receive(:mkdir_p).with("/path/log_dir")
|
42
|
+
@cli.new('/path')
|
43
|
+
end
|
44
|
+
|
45
|
+
it "copies templates into the path" do
|
46
|
+
@cli.should_receive(:directory).with('templates', '/path')
|
47
|
+
@cli.new('/path')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#add(repo_url)" do
|
53
|
+
it "creates a Project with repo_url" do
|
54
|
+
project = double("project", :repo_dir => 'repo_dir')
|
55
|
+
Project.should_receive(:create).with(:repo_url => "repo_url").and_return(project)
|
56
|
+
@cli.stub(:puts)
|
57
|
+
@cli.add("repo_url")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#start(repo_dir, port)" do
|
62
|
+
before do
|
63
|
+
@project = double("project")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "instantiates the Project with repo_dir" do
|
67
|
+
@project.stub(:start)
|
68
|
+
Project.should_receive(:find).with(:repo_dir => 'repo_dir').and_return(@project)
|
69
|
+
@cli.start('repo_dir', 4567)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "starts the Project on the specified port" do
|
73
|
+
@project.should_receive(:start).with(4567)
|
74
|
+
Project.stub(:find).and_return(@project)
|
75
|
+
@cli.start('repo_dir', 4567)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#stop(repo_dir)" do
|
80
|
+
before do
|
81
|
+
@project = double("project")
|
82
|
+
end
|
83
|
+
|
84
|
+
it "instantiates the Project with repo_dir" do
|
85
|
+
@project.stub(:stop)
|
86
|
+
Project.should_receive(:find).with(:repo_dir => 'repo_dir').and_return(@project)
|
87
|
+
@cli.stop('repo_dir')
|
88
|
+
end
|
89
|
+
|
90
|
+
it "stops the Project in repo_dir" do
|
91
|
+
@project.should_receive(:stop)
|
92
|
+
Project.stub(:find).and_return(@project)
|
93
|
+
@cli.stop('repo_dir')
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "#list" do
|
98
|
+
it "calls print_status_msg on each Project" do
|
99
|
+
project = double("project")
|
100
|
+
project.should_receive(:print_status_msg)
|
101
|
+
Project.stub(:all).and_return([project])
|
102
|
+
@cli.list
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "#cijoed(repo_dir, port, log_file, pid_file)" do
|
107
|
+
it "wraps the command in rvm exec" do
|
108
|
+
@cli.should_receive(:rvm_exec).with("repo_dir", "nohup cijoe -p 4567 repo_dir 1>log_file 2>&1 & echo $! > pid_file")
|
109
|
+
@cli.stub(:exec)
|
110
|
+
@cli.cijoed('repo_dir', 4567, 'log_file', 'pid_file')
|
111
|
+
end
|
112
|
+
|
113
|
+
it "execs the wrapped command" do
|
114
|
+
@cli.stub(:rvm_exec).and_return("rvm_exec")
|
115
|
+
@cli.should_receive(:exec).with("rvm_exec")
|
116
|
+
@cli.cijoed('repo_dir', 4567, 'log_file', 'pid_file')
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#build(repo_dir)" do
|
121
|
+
before do
|
122
|
+
@project = double("project")
|
123
|
+
end
|
124
|
+
|
125
|
+
it "instantiates the Project with repo_dir" do
|
126
|
+
@project.stub(:build)
|
127
|
+
Project.should_receive(:find).with(:repo_dir => 'repo_dir').and_return(@project)
|
128
|
+
@cli.build('repo_dir')
|
129
|
+
end
|
130
|
+
|
131
|
+
it "builds the Project in repo_dir" do
|
132
|
+
@project.should_receive(:build)
|
133
|
+
Project.stub(:find).and_return(@project)
|
134
|
+
@cli.build('repo_dir')
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe "#runner(repo_dir, cmd)" do
|
139
|
+
before do
|
140
|
+
@project = double("project")
|
141
|
+
end
|
142
|
+
|
143
|
+
it "finds the Project with repo_dir" do
|
144
|
+
@project.stub(:set_runner)
|
145
|
+
Project.should_receive(:find).with(:repo_dir => 'repo_dir').and_return(@project)
|
146
|
+
@cli.runner('repo_dir', 'cmd')
|
147
|
+
end
|
148
|
+
|
149
|
+
it "sets the Project runner to cmd" do
|
150
|
+
@project.should_receive(:set_runner).with('cmd')
|
151
|
+
Project.stub(:find).and_return(@project)
|
152
|
+
@cli.runner('repo_dir', 'cmd')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Controller do
|
4
|
+
before do
|
5
|
+
Duke::Config.stub(:log_dir).and_return("log_dir")
|
6
|
+
Duke::Config.stub(:pid_dir).and_return("pid_dir")
|
7
|
+
@controller = Controller.new('repo_dir', 4567)
|
8
|
+
@dir = Dir.pwd
|
9
|
+
end
|
10
|
+
|
11
|
+
describe ".pid_files" do
|
12
|
+
it "finds a list of all the pid files in the pid dir" do
|
13
|
+
Dir.should_receive(:[]).with("pid_dir/*.pid").and_return(['pid_file'])
|
14
|
+
Controller.pid_files.should == ['pid_file']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#initialize(repo_dir, port)" do
|
19
|
+
context "with a repo_dir and a port" do
|
20
|
+
it "has a dir that matches cwd" do
|
21
|
+
@controller.dir.should == @dir
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a repo_dir" do
|
25
|
+
@controller.repo_dir.should == 'repo_dir'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has a timeout of 7 seconds" do
|
29
|
+
@controller.timeout.should == 7
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#port" do
|
35
|
+
context "when a port is provided during initialization" do
|
36
|
+
it "is the provided port" do
|
37
|
+
@controller.port.should == 4567
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "when a port is not provided during initialization" do
|
42
|
+
it "is the current_port" do
|
43
|
+
@controller = Controller.new('repo_dir')
|
44
|
+
@controller.stub(:current_port).and_return(1234)
|
45
|
+
@controller.port.should == 1234
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#current_port" do
|
51
|
+
context "when a cijoe is running for repo_dir" do
|
52
|
+
it "determines what port cijoe is running on" do
|
53
|
+
Controller.stub(:pid_files).and_return(['repo_dir.1234.pid'])
|
54
|
+
@controller.current_port.should == 1234
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when a cijoe is not running for repo_dir" do
|
59
|
+
it "returns nil" do
|
60
|
+
Controller.stub(:pid_files).and_return(['weird_dir.1234.pid'])
|
61
|
+
@controller.current_port.should == nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#identifier" do
|
67
|
+
it "identifies the controller via repo_dir and port" do
|
68
|
+
@controller.identifier.should == "repo_dir.4567"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe "#pid_file" do
|
73
|
+
it "is the path to the pid file" do
|
74
|
+
@controller.pid_file.should == "#{@dir}/pid_dir/repo_dir.4567.pid"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#log_file" do
|
79
|
+
it "is the path to the log file" do
|
80
|
+
@controller.log_file.should == "#{@dir}/log_dir/repo_dir.4567.log"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#ping_command" do
|
85
|
+
it "verifies that cijoe is running" do
|
86
|
+
Duke::Config.stub(:host).and_return("localhost")
|
87
|
+
TCPSocket.should_receive(:new).with('localhost', 4567).and_return('sockette!')
|
88
|
+
@controller.ping_command.call.should == 'sockette!'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "#controller" do
|
93
|
+
it "instantiates a DaemonController" do
|
94
|
+
@controller.stub(:identifier).and_return("identifier")
|
95
|
+
@controller.stub(:ping_command).and_return("ping_command")
|
96
|
+
@controller.stub(:pid_file).and_return("pid_file")
|
97
|
+
@controller.stub(:log_file).and_return("log_file")
|
98
|
+
args = {
|
99
|
+
:identifier => "identifier",
|
100
|
+
:start_command => "duke cijoed repo_dir 4567 log_file pid_file",
|
101
|
+
:ping_command => "ping_command",
|
102
|
+
:pid_file => "pid_file",
|
103
|
+
:log_file => "log_file",
|
104
|
+
:log_file_activity_timeout => 7,
|
105
|
+
:start_timeout => 7
|
106
|
+
}
|
107
|
+
DaemonController.should_receive(:new).with(args).and_return("controller")
|
108
|
+
@controller.controller.should == "controller"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,272 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Project do
|
4
|
+
before do
|
5
|
+
@project = Project.new(:repo_dir => 'repo_dir')
|
6
|
+
end
|
7
|
+
|
8
|
+
describe ".all" do
|
9
|
+
context "without a repo_dir in the current directory" do
|
10
|
+
it "does not contain a Project instance" do
|
11
|
+
Dir.stub(:[]).with('*').and_return(['non_repo'])
|
12
|
+
project = double("project", :repo_dir? => false)
|
13
|
+
Project.stub(:new).with(:repo_dir => 'non_repo').and_return(project)
|
14
|
+
Project.all.should be_empty
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "with a repo_dir in the current directory" do
|
19
|
+
it "contains the Project instance for repo_dir" do
|
20
|
+
Dir.stub(:[]).with('*').and_return(['repo_dir'])
|
21
|
+
project = double("project", :repo_dir? => true)
|
22
|
+
Project.stub(:new).with(:repo_dir => 'repo_dir').and_return(project)
|
23
|
+
Project.all.should == [project]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe ".create" do
|
29
|
+
before do
|
30
|
+
@project = double("project", :clone => nil, :set_runner => nil, :set_campfire => nil)
|
31
|
+
Project.stub(:new).with(:repo_url => 'repo_url').and_return(@project)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "instantiates a Project with repo_url" do
|
35
|
+
Project.create(:repo_url => 'repo_url').should == @project
|
36
|
+
end
|
37
|
+
|
38
|
+
it "clones the Project instance" do
|
39
|
+
@project.should_receive(:clone)
|
40
|
+
Project.create(:repo_url => 'repo_url')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "sets the Project instance runner command from config" do
|
44
|
+
Duke::Config.stub(:runner).and_return('runner')
|
45
|
+
@project.should_receive(:set_runner).with('runner')
|
46
|
+
Project.create(:repo_url => 'repo_url')
|
47
|
+
end
|
48
|
+
|
49
|
+
it "sets the Project instance campfire from config" do
|
50
|
+
Duke::Config.stub(:campfire).and_return('campfire')
|
51
|
+
@project.should_receive(:set_campfire).with('campfire')
|
52
|
+
Project.create(:repo_url => 'repo_url')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#initialize(opts)" do
|
57
|
+
context "when opts contains a repo_url" do
|
58
|
+
before do
|
59
|
+
repo_url = 'repo_url'
|
60
|
+
repo_url.stub(:repo_dir).and_return('repo_dir')
|
61
|
+
@project = Project.new(:repo_url => repo_url)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "has a repo_url" do
|
65
|
+
@project.repo_url.should == 'repo_url'
|
66
|
+
end
|
67
|
+
|
68
|
+
it "has a repo_dir" do
|
69
|
+
@project.repo_dir.should == 'repo_dir'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "when opts contains a repo_dir" do
|
74
|
+
it "does not have a repo_url" do
|
75
|
+
@project.repo_url.should be_nil
|
76
|
+
end
|
77
|
+
|
78
|
+
it "has a repo_dir" do
|
79
|
+
@project.repo_dir.should == 'repo_dir'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#controller" do
|
85
|
+
it "instantiates a Controller with repo_dir" do
|
86
|
+
Controller.stub(:new).with('repo_dir').and_return('controller')
|
87
|
+
@project.controller.should == 'controller'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#start(port)" do
|
92
|
+
before do
|
93
|
+
@controller = double("controller")
|
94
|
+
end
|
95
|
+
|
96
|
+
it "instantiates a Controller with repo_dir and port" do
|
97
|
+
@controller.stub(:start)
|
98
|
+
Controller.should_receive(:new).with('repo_dir', 4567).and_return(@controller)
|
99
|
+
@project.start(4567)
|
100
|
+
@project.controller.should == @controller
|
101
|
+
end
|
102
|
+
|
103
|
+
it "starts the new controller" do
|
104
|
+
@controller.should_receive(:start)
|
105
|
+
Controller.stub(:new).and_return(@controller)
|
106
|
+
@project.start(4567)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#git_dir" do
|
111
|
+
it "is the path to the git config dir" do
|
112
|
+
@project.git_dir.should == "repo_dir/.git"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#repo_dir?" do
|
117
|
+
it "determines if repo_dir is an actual git repo" do
|
118
|
+
@project.stub(:git_dir).and_return('git_dir')
|
119
|
+
File.should_receive(:exist?).with('git_dir').and_return(true)
|
120
|
+
@project.repo_dir?.should == true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
describe "#clone" do
|
125
|
+
it "clones the repo_url" do
|
126
|
+
project = Project.new(:repo_url => 'repo_url')
|
127
|
+
project.should_receive(:run).with("git clone repo_url")
|
128
|
+
project.clone
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#set_config(key, value)" do
|
133
|
+
it "adds a key value pair to the git config" do
|
134
|
+
@project.stub(:inside).with('repo_dir').and_yield
|
135
|
+
@project.should_receive(:run).with("git config --unset-all \"key\"")
|
136
|
+
@project.should_receive(:run).with("git config \"key\" \"value\"")
|
137
|
+
@project.set_config('key', 'value')
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "#set_runner" do
|
142
|
+
it "sets the runner git config entry" do
|
143
|
+
@project.should_receive(:set_config).with("cijoe.runner", 'runner')
|
144
|
+
@project.set_runner('runner')
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "#set_campfire" do
|
149
|
+
it "sets campfire values in the git config" do
|
150
|
+
@project.should_receive(:set_config).with("campfire.camp", 'fire')
|
151
|
+
@project.should_receive(:set_config).with("campfire.fire", 'camp')
|
152
|
+
@project.set_campfire({:camp => 'fire', :fire => 'camp'})
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "#print_status_msg" do
|
157
|
+
context "when cijoe is not running" do
|
158
|
+
it "puts the repo_dir and indicates cijoe is stopped" do
|
159
|
+
@project.stub(:running?).and_return(false)
|
160
|
+
@project.should_receive(:puts).with("repo_dir, stopped")
|
161
|
+
@project.print_status_msg
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context "when cijoe is running" do
|
166
|
+
before do
|
167
|
+
@project.stub(:running?).and_return(true)
|
168
|
+
@project.stub(:port).and_return(4567)
|
169
|
+
@project.stub(:pid).and_return(666)
|
170
|
+
end
|
171
|
+
|
172
|
+
context "and has yet to be built" do
|
173
|
+
it "puts the repo_dir, port and pid of cijoe" do
|
174
|
+
@project.stub(:building?).and_return(false)
|
175
|
+
@project.stub(:built?).and_return(false)
|
176
|
+
@project.should_receive(:puts).with("repo_dir, port 4567, pid 666")
|
177
|
+
@project.print_status_msg
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context "and is building" do
|
182
|
+
it "puts the repo_dir, port, pid and a building status" do
|
183
|
+
@project.stub(:building?).and_return(true)
|
184
|
+
@project.should_receive(:puts).with("repo_dir, port 4567, pid 666, building...")
|
185
|
+
@project.print_status_msg
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe "#build" do
|
192
|
+
it "sends a POST to cijoe in order to start a build" do
|
193
|
+
Duke::Config.stub(:host).and_return('localhost')
|
194
|
+
URI.stub(:parse).with("http://localhost:4567/").and_return('uri')
|
195
|
+
Net::HTTP.should_receive(:post_form).with('uri', {})
|
196
|
+
@project.stub(:port).and_return(4567)
|
197
|
+
@project.build
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
describe "#find" do
|
202
|
+
context "searching for a project that exists" do
|
203
|
+
it "instantiates a Project for the given repo_dir" do
|
204
|
+
project = double("project", :repo_dir? => true)
|
205
|
+
Project.should_receive(:new).with(:repo_dir => 'repo_dir').and_return(project)
|
206
|
+
Project.find(:repo_dir => 'repo_dir').should == project
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "#cijoe" do
|
212
|
+
context "when project has a repo_dir?" do
|
213
|
+
it "instantiates a CIJoe with repo_dir" do
|
214
|
+
@project.stub(:repo_dir?).and_return(true)
|
215
|
+
cijoe = double("cijoe", :restore => nil)
|
216
|
+
CIJoe.should_receive(:new).with('repo_dir').and_return(cijoe)
|
217
|
+
@project.cijoe.should == cijoe
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
context "when project does not have a repo_dir?" do
|
222
|
+
it "returns nil" do
|
223
|
+
@project.stub(:repo_dir?).and_return(false)
|
224
|
+
@project.cijoe.should be_nil
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
describe "#built?" do
|
230
|
+
context "when cijoe.last_build is nil" do
|
231
|
+
it "is false" do
|
232
|
+
@project.stub(:cijoe).and_return(double("cijoe", :last_build => nil))
|
233
|
+
@project.built?.should be_false
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
context "when cijoe.last_build is not nil" do
|
238
|
+
it "is true" do
|
239
|
+
@project.stub(:cijoe).and_return(double("cijoe", :last_build => true))
|
240
|
+
@project.built?.should be_true
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
describe "#passing?" do
|
246
|
+
context "when cijoe.last_build.failed? is true" do
|
247
|
+
it "is false" do
|
248
|
+
last_build = double("last_build", :failed? => true)
|
249
|
+
cijoe = double("cijoe", :last_build => last_build)
|
250
|
+
@project.stub(:cijoe).and_return(cijoe)
|
251
|
+
@project.passing?.should be_false
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
context "when cijoe.last_build.failed? is false" do
|
256
|
+
it "is true" do
|
257
|
+
last_build = double("last_build", :failed? => false)
|
258
|
+
cijoe = double("cijoe", :last_build => last_build)
|
259
|
+
@project.stub(:cijoe).and_return(cijoe)
|
260
|
+
@project.passing?.should be_true
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
describe "#url" do
|
266
|
+
it "contains the configured host along with the cijoe port" do
|
267
|
+
@project.stub(:port).and_return(4567)
|
268
|
+
Duke::Config.stub(:host).and_return('localhost')
|
269
|
+
@project.url.should == 'http://localhost:4567'
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
|
6
|
+
unless ENV['SIMPLECOV'].nil?
|
7
|
+
require 'simplecov'
|
8
|
+
SimpleCov.start do
|
9
|
+
add_filter '/spec/'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'duke'
|
14
|
+
include Duke
|
15
|
+
|
16
|
+
Rspec.configure do |c|
|
17
|
+
c.mock_with :rspec
|
18
|
+
end
|
data/templates/config.ru
ADDED
File without changes
|