boxci 0.0.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +146 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +118 -0
- data/Rakefile +13 -0
- data/bin/boxci +6 -0
- data/boxci.gemspec +28 -0
- data/lib/boxci/builder.rb +29 -0
- data/lib/boxci/cli.rb +70 -0
- data/lib/boxci/config_permutation.rb +15 -0
- data/lib/boxci/config_permutation_component.rb +11 -0
- data/lib/boxci/config_permutation_component_factory.rb +7 -0
- data/lib/boxci/config_permutation_components/rbenv.rb +13 -0
- data/lib/boxci/dependency_checker.rb +55 -0
- data/lib/boxci/global_config.rb +26 -0
- data/lib/boxci/initializer.rb +41 -0
- data/lib/boxci/language.rb +35 -0
- data/lib/boxci/language_factory.rb +7 -0
- data/lib/boxci/languages/ruby.rb +31 -0
- data/lib/boxci/project_config.rb +96 -0
- data/lib/boxci/provider.rb +35 -0
- data/lib/boxci/provider_config.rb +23 -0
- data/lib/boxci/provider_factory.rb +7 -0
- data/lib/boxci/providers/aws.rb +27 -0
- data/lib/boxci/providers/openstack.rb +27 -0
- data/lib/boxci/providers/virtualbox.rb +24 -0
- data/lib/boxci/templates/Vagrantfile +41 -0
- data/lib/boxci/templates/boxci/global_config.yml.tt +1 -0
- data/lib/boxci/templates/dot_boxci.yml.tt +11 -0
- data/lib/boxci/templates/languages/ruby/main.pp +27 -0
- data/lib/boxci/templates/providers/aws/Vagrantfile.erb +45 -0
- data/lib/boxci/templates/providers/aws.yml.tt +5 -0
- data/lib/boxci/templates/providers/openstack/Vagrantfile.erb +37 -0
- data/lib/boxci/templates/providers/openstack.yml.tt +16 -0
- data/lib/boxci/templates/providers/virtualbox/Vagrantfile.erb +47 -0
- data/lib/boxci/templates/providers/virtualbox.yml.tt +2 -0
- data/lib/boxci/templates/puppet/manifests/.empty_directory +0 -0
- data/lib/boxci/templates/puppet/modules/.empty_directory +0 -0
- data/lib/boxci/test_runner.rb +134 -0
- data/lib/boxci/tester.rb +287 -0
- data/lib/boxci/version.rb +3 -0
- data/lib/boxci.rb +71 -0
- data/spec/lib/boxci/builder_spec.rb +86 -0
- data/spec/lib/boxci/config_permutation_component_factory_spec.rb +17 -0
- data/spec/lib/boxci/config_permutation_component_spec.rb +19 -0
- data/spec/lib/boxci/config_permutation_components/rbenv_spec.rb +12 -0
- data/spec/lib/boxci/config_permutation_spec.rb +27 -0
- data/spec/lib/boxci/dependency_checker_spec.rb +215 -0
- data/spec/lib/boxci/global_config_spec.rb +34 -0
- data/spec/lib/boxci/initializer_spec.rb +117 -0
- data/spec/lib/boxci/language_factory_spec.rb +17 -0
- data/spec/lib/boxci/language_spec.rb +31 -0
- data/spec/lib/boxci/project_config_spec.rb +218 -0
- data/spec/lib/boxci/provider_config_spec.rb +39 -0
- data/spec/lib/boxci/provider_factory_spec.rb +17 -0
- data/spec/lib/boxci/provider_spec.rb +30 -0
- data/spec/lib/boxci/tester_spec.rb +15 -0
- data/spec/lib/boxci_spec.rb +176 -0
- data/spec/spec_helper.rb +11 -0
- metadata +213 -0
@@ -0,0 +1,215 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Boxci::DependencyChecker do
|
4
|
+
describe "#verify_all" do
|
5
|
+
before do
|
6
|
+
allow(subject).to receive(:verify_vagrant)
|
7
|
+
allow(subject).to receive(:verify_cloud_provider_config)
|
8
|
+
allow(subject).to receive(:verify_repo_puppet_directory)
|
9
|
+
allow(subject).to receive(:verify_vagrantfile)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "checks if vagrant is installed" do
|
13
|
+
expect(subject).to receive(:verify_vagrant)
|
14
|
+
subject.verify_all
|
15
|
+
end
|
16
|
+
|
17
|
+
it "checks if the cloud_provider_config exists" do
|
18
|
+
expect(subject).to receive(:verify_cloud_provider_config)
|
19
|
+
subject.verify_all
|
20
|
+
end
|
21
|
+
|
22
|
+
it "verifies the repository has the required puppet directory structure" do
|
23
|
+
expect(subject).to receive(:verify_repo_puppet_directory)
|
24
|
+
subject.verify_all
|
25
|
+
end
|
26
|
+
|
27
|
+
it "verifies the vagrantfile exists" do
|
28
|
+
expect(subject).to receive(:verify_vagrantfile)
|
29
|
+
subject.verify_all
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when a dependency fails" do
|
33
|
+
before do
|
34
|
+
allow(subject).to receive(:verify_vagrant).and_raise(Boxci::MissingDependency, "Error message 123")
|
35
|
+
allow(subject).to receive(:exit)
|
36
|
+
allow(subject).to receive(:puts)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "rescues the exception" do
|
40
|
+
expect { subject.verify_all }.to_not raise_error
|
41
|
+
end
|
42
|
+
|
43
|
+
it "outputs the error message" do
|
44
|
+
expect(subject).to receive(:puts).with("Error message 123")
|
45
|
+
subject.verify_all
|
46
|
+
end
|
47
|
+
|
48
|
+
it "exits" do
|
49
|
+
expect(subject).to receive(:exit)
|
50
|
+
subject.verify_all
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "when no dependencies fail" do
|
55
|
+
before do
|
56
|
+
allow(Boxci::DependencyChecker).to receive(:verify_all).and_return(true)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "does not output anything" do
|
60
|
+
expect(subject).to_not receive(:puts)
|
61
|
+
subject.verify_all
|
62
|
+
end
|
63
|
+
|
64
|
+
it "does not exit" do
|
65
|
+
expect(subject).to_not receive(:exit)
|
66
|
+
subject.verify_all
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "#verify_vagrant" do
|
72
|
+
it "checks if the system path includes 'vagrant'" do
|
73
|
+
expect(subject).to receive(:system).with("which vagrant > /dev/null").and_return(true)
|
74
|
+
subject.verify_vagrant
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when vagrant is verified" do
|
78
|
+
before do
|
79
|
+
allow(subject).to receive(:system).and_return(true)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "does not raise an error" do
|
83
|
+
expect { subject.verify_vagrant }.to_not raise_error
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "when vagrant is not verified" do
|
88
|
+
before do
|
89
|
+
allow(subject).to receive(:system).and_return(false)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "raises an error" do
|
93
|
+
expect { subject.verify_vagrant }.to raise_error(Boxci::MissingDependency)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#verify_cloud_provider_config" do
|
99
|
+
it "checks if the the '.cloud_provider_config' exists in the user's home dir" do
|
100
|
+
cloud_provider_file = File.join(File.expand_path(ENV["HOME"]), ".boxci", "cloud_provider_config.yml")
|
101
|
+
expect(File).to receive(:exists?).with(cloud_provider_file).and_return(true)
|
102
|
+
subject.verify_cloud_provider_config
|
103
|
+
end
|
104
|
+
|
105
|
+
context "when the config is verified" do
|
106
|
+
before do
|
107
|
+
expect(File).to receive(:exists?).and_return(true)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "does not raise an error" do
|
111
|
+
expect { subject.verify_cloud_provider_config }.to_not raise_error
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context "when the config is not verified" do
|
116
|
+
before do
|
117
|
+
expect(File).to receive(:exists?).and_return(false)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "raises an error" do
|
121
|
+
expect { subject.verify_cloud_provider_config }.to raise_error(Boxci::MissingDependency)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "#verify_repo_puppet_directory" do
|
127
|
+
let(:project_path) { "/some/path" }
|
128
|
+
|
129
|
+
before do
|
130
|
+
allow(Boxci).to receive(:project_path).and_return(project_path)
|
131
|
+
allow(File).to receive(:directory?).and_return(true)
|
132
|
+
end
|
133
|
+
|
134
|
+
it "checks for the puppet directory in the repo root" do
|
135
|
+
expect(File).to receive(:directory?).with(File.join(project_path, "puppet")).and_return(true)
|
136
|
+
subject.verify_repo_puppet_directory
|
137
|
+
end
|
138
|
+
|
139
|
+
context "when the directory is present" do
|
140
|
+
it "does not raise an error" do
|
141
|
+
expect { subject.verify_repo_puppet_directory }.to_not raise_error
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "when the directory is not present" do
|
146
|
+
before do
|
147
|
+
allow(File).to receive(:directory?).and_return(false)
|
148
|
+
end
|
149
|
+
|
150
|
+
it "raises an error" do
|
151
|
+
expect { subject.verify_repo_puppet_directory }.to raise_error(Boxci::MissingDependency)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "#verify_vagrantfile" do
|
157
|
+
let(:project_path) { "/some/path" }
|
158
|
+
|
159
|
+
before do
|
160
|
+
allow(Boxci).to receive(:project_path).and_return(project_path)
|
161
|
+
allow(File).to receive(:exists?).and_return(true)
|
162
|
+
end
|
163
|
+
|
164
|
+
it "checks for the Vagrantfile in the repo root" do
|
165
|
+
expect(File).to receive(:exists?).with(File.join(project_path, "Vagrantfile")).and_return(true)
|
166
|
+
subject.verify_vagrantfile
|
167
|
+
end
|
168
|
+
|
169
|
+
context "when the vagrantfile is verified" do
|
170
|
+
it "does not raise an error" do
|
171
|
+
expect { subject.verify_vagrantfile }.to_not raise_error
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
context "when the vagrantfile is not verified" do
|
176
|
+
before do
|
177
|
+
allow(File).to receive(:exists?).and_return(false)
|
178
|
+
end
|
179
|
+
|
180
|
+
it "raises an error" do
|
181
|
+
expect { subject.verify_vagrantfile }.to raise_error(Boxci::MissingDependency)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "#verify_boxci_config" do
|
187
|
+
let(:project_path) { "/some/path" }
|
188
|
+
|
189
|
+
before do
|
190
|
+
allow(Boxci).to receive(:project_path).and_return(project_path)
|
191
|
+
allow(File).to receive(:exists?).and_return(true)
|
192
|
+
end
|
193
|
+
|
194
|
+
it "checks for the Boxci config file in the repo root" do
|
195
|
+
expect(File).to receive(:exists?).with(File.join(project_path, ".boxci.yml")).and_return(true)
|
196
|
+
subject.verify_boxci_config
|
197
|
+
end
|
198
|
+
|
199
|
+
context "when the config file is verified" do
|
200
|
+
it "does not raise an error" do
|
201
|
+
expect { subject.verify_boxci_config }.to_not raise_error
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
context "when the config file is not verified" do
|
206
|
+
before do
|
207
|
+
allow(File).to receive(:exists?).and_return(false)
|
208
|
+
end
|
209
|
+
|
210
|
+
it "raises an error" do
|
211
|
+
expect { subject.verify_boxci_config }.to raise_error(Boxci::MissingDependency)
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Boxci::GlobalConfig do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "sets the config to sane values" do
|
6
|
+
subject
|
7
|
+
expect(subject.instance_variable_get(:@global_config)).not_to be_nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#load" do
|
12
|
+
it "reads the global config hash" do
|
13
|
+
expect(subject).to receive(:read_global_config_hash).and_return({})
|
14
|
+
subject.load
|
15
|
+
end
|
16
|
+
|
17
|
+
it "merges the read project config hash with the defaults" do
|
18
|
+
default_hash = double
|
19
|
+
subject.instance_variable_set(:@global_config, default_hash)
|
20
|
+
read_hash = double
|
21
|
+
allow(subject).to receive(:read_global_config_hash).and_return(read_hash)
|
22
|
+
expect(default_hash).to receive(:merge!).with(read_hash)
|
23
|
+
subject.load
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#default_provider" do
|
28
|
+
it "returns the default_provider from the config hash" do
|
29
|
+
allow(subject).to receive(:read_global_config_hash).and_return({'default_provider' => 'hoopty'})
|
30
|
+
subject.load
|
31
|
+
expect(subject.default_provider).to eq('hoopty')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Boxci::Initializer do
|
4
|
+
describe "#init" do
|
5
|
+
before do
|
6
|
+
allow(subject).to receive(:create_provider_config)
|
7
|
+
allow(subject).to receive(:set_default_provider)
|
8
|
+
allow(subject).to receive(:create_project_config)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "creates provider specific config" do
|
12
|
+
provider_double = double
|
13
|
+
expect(subject).to receive(:create_provider_config).with(provider_double)
|
14
|
+
subject.init(double, provider_double)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "sets the default provider" do
|
18
|
+
provider_double = double
|
19
|
+
expect(subject).to receive(:set_default_provider).with(provider_double)
|
20
|
+
subject.init(double, provider_double)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "creates the project config" do
|
24
|
+
language_double = double
|
25
|
+
expect(subject).to receive(:create_project_config).with(language_double)
|
26
|
+
subject.init(language_double, double)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#create_provider_config" do
|
31
|
+
it "renders the provider specific config" do
|
32
|
+
expect(subject).to receive(:template).with("templates/providers/foo.yml.tt", "~/.boxci/providers/foo.yml")
|
33
|
+
subject.create_provider_config('foo')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#set_default_provider" do
|
38
|
+
it "assigns the provider to an instance variable" do
|
39
|
+
allow(subject).to receive(:template)
|
40
|
+
subject.set_default_provider('aws')
|
41
|
+
expect(subject.instance_variable_get(:@provider)).to eq('aws')
|
42
|
+
end
|
43
|
+
|
44
|
+
it "creates the global_config.yml setting the default provider" do
|
45
|
+
expect(subject).to receive(:template).with("templates/boxci/global_config.yml.tt", "~/.boxci/global_config.yml")
|
46
|
+
subject.set_default_provider('aws')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#create_project_config" do
|
51
|
+
let(:local_repository_path) { "/somewhere" }
|
52
|
+
|
53
|
+
before do
|
54
|
+
allow(subject).to receive(:local_repository_path).and_return(local_repository_path)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "assigns the given language to @language" do
|
58
|
+
allow(subject).to receive(:template)
|
59
|
+
language = double
|
60
|
+
subject.create_project_config(language)
|
61
|
+
expect(subject.instance_variable_get(:@language)).to eq(language)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "assigns the current ruby version found in .ruby-version to @current_ruby_version" do
|
65
|
+
allow(subject).to receive(:template)
|
66
|
+
ruby_version = double
|
67
|
+
allow(subject).to receive(:dot_ruby_version).and_return(ruby_version)
|
68
|
+
subject.create_project_config('ruby')
|
69
|
+
expect(subject.instance_variable_get(:@current_ruby_version)).to eq(ruby_version)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "renders the dot_boxci.yml.tt from the templates to the project root .boxci.yml" do
|
73
|
+
expect(subject).to receive(:template).with("templates/dot_boxci.yml.tt", File.join(Boxci.project_path, ".boxci.yml"))
|
74
|
+
subject.create_project_config('ruby')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#dot_ruby_version" do
|
79
|
+
context "when the .ruby-version file exists" do
|
80
|
+
before do
|
81
|
+
allow(File).to receive(:exist?).and_return(true)
|
82
|
+
end
|
83
|
+
|
84
|
+
context "when format is ruby-1.9.3-p327@fooo" do
|
85
|
+
it "returns '1.9.3-p327'" do
|
86
|
+
allow(File).to receive(:read).and_return('ruby-1.9.3-p327@fooo')
|
87
|
+
expect(subject.dot_ruby_version).to eq('1.9.3-p327')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "when format is ruby-2.1.0" do
|
92
|
+
it "returns '2.1.0'" do
|
93
|
+
allow(File).to receive(:read).and_return('ruby-2.1.0')
|
94
|
+
expect(subject.dot_ruby_version).to eq('2.1.0')
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when format is 2.1.0" do
|
99
|
+
it "returns '2.1.0'" do
|
100
|
+
allow(File).to receive(:read).and_return('2.1.0')
|
101
|
+
expect(subject.dot_ruby_version).to eq('2.1.0')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "when the .ruby-version does NOT exist" do
|
107
|
+
before do
|
108
|
+
allow(File).to receive(:exist?).and_return(false)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns nil" do
|
112
|
+
allow(File).to receive(:exist?).and_return(false)
|
113
|
+
expect(subject.dot_ruby_version).to be_nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Boxci::LanguageFactory do
|
4
|
+
describe ".build" do
|
5
|
+
it "gets the constant for the language class" do
|
6
|
+
expect(Boxci::Languages).to receive(:const_get).with('Ruby').and_return(double.as_null_object)
|
7
|
+
subject.build('ruby')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "constructs a new instance of the language const it previously grabbed" do
|
11
|
+
lang = double
|
12
|
+
allow(Boxci::Languages).to receive(:const_get).with('Ruby').and_return(lang)
|
13
|
+
expect(lang).to receive(:new)
|
14
|
+
subject.build('ruby')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Boxci::Language do
|
4
|
+
describe "#before_permutation_switch" do
|
5
|
+
it "returns empty string" do
|
6
|
+
expect(subject.before_permutation_switch).to eq("")
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#after_permutation_switch" do
|
11
|
+
it "returns empty string" do
|
12
|
+
expect(subject.after_permutation_switch).to eq("")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#default_script" do
|
17
|
+
it "raises an exception when not implemented by subclass" do
|
18
|
+
class Boxci::Provider::TestPureVirtualLanguagePuppetManifestOne < ::Boxci::Language
|
19
|
+
end
|
20
|
+
expect { Boxci::Provider::TestPureVirtualLanguagePuppetManifestOne.new.default_script }.to raise_error(Boxci::PureVirtualMethod)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#generate_starter_puppet_manifest" do
|
25
|
+
it "raises an exception when not implemented by subclass" do
|
26
|
+
class Boxci::Provider::TestPureVirtualLanguagePuppetManifestTwo < ::Boxci::Language
|
27
|
+
end
|
28
|
+
expect { Boxci::Provider::TestPureVirtualLanguagePuppetManifestTwo.new.generate_starter_puppet_manifest }.to raise_error(Boxci::PureVirtualMethod)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,218 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Boxci::ProjectConfig do
|
4
|
+
describe "#initialize" do
|
5
|
+
it "sets the config has to sane values" do
|
6
|
+
subject
|
7
|
+
expect(subject.instance_variable_get(:@project_config)).not_to be_nil
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#load" do
|
12
|
+
it "reads the project config hash" do
|
13
|
+
expect(subject).to receive(:read_project_config_hash).and_return({})
|
14
|
+
subject.load
|
15
|
+
end
|
16
|
+
|
17
|
+
it "merges the read project config hash with the defaults" do
|
18
|
+
default_hash = double
|
19
|
+
subject.instance_variable_set(:@project_config, default_hash)
|
20
|
+
read_hash = double
|
21
|
+
allow(subject).to receive(:read_project_config_hash).and_return(read_hash)
|
22
|
+
expect(default_hash).to receive(:merge!).with(read_hash)
|
23
|
+
subject.load
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#language" do
|
28
|
+
it "returns the language from the config hash" do
|
29
|
+
allow(subject).to receive(:read_project_config_hash).and_return({'language' => 'java'})
|
30
|
+
subject.load
|
31
|
+
expect(subject.language).to eq('java')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#puppet_facts" do
|
36
|
+
context "when puppet facts are provided in the project config" do
|
37
|
+
it "returns the puppet facts from the config hash" do
|
38
|
+
facters = {"test_key" => "test_value"}
|
39
|
+
subject.instance_variable_set(:@project_config, {"puppet_facts" => facters})
|
40
|
+
expect(subject.puppet_facts).to eq(facters)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when puppet facts are NOT provided in the project config" do
|
45
|
+
it "returns an empty array" do
|
46
|
+
subject.instance_variable_set(:@project_config, {})
|
47
|
+
expect(subject.puppet_facts).to eq([])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#box_size" do
|
53
|
+
context "when the config has a box size specified" do
|
54
|
+
it "returns the users specified box size" do
|
55
|
+
box_size_double = double('box size double')
|
56
|
+
subject.instance_variable_set(:@project_config, {"box_size" => box_size_double })
|
57
|
+
expect(subject.box_size).to eq(box_size_double)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when the config does NOT have a box size specified" do
|
62
|
+
it "returns the default box size" do
|
63
|
+
expect(subject.box_size).to eq('small')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "#artifact_path" do
|
69
|
+
context "when the config has an artifact path specified" do
|
70
|
+
it "returns the artifact path specified in the config" do
|
71
|
+
artifact_path_double = double('artifact path double')
|
72
|
+
subject.instance_variable_set(:@project_config, { "artifact_path" => artifact_path_double })
|
73
|
+
expect(subject.artifact_path).to eq(artifact_path_double)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when the config does NOT have an artifact path specified" do
|
78
|
+
it "returns the default artifact path" do
|
79
|
+
expect(subject.artifact_path).to eq('/tmp/boxci/artifacts')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "#before_install" do
|
85
|
+
context "when before_install is provided in the project config" do
|
86
|
+
it "grabs the named hook as an array" do
|
87
|
+
subject.instance_variable_set(:@project_config, { 'before_install' => double })
|
88
|
+
expect(subject).to receive(:option_as_array).with('before_install')
|
89
|
+
subject.before_install
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "when before_install is NOT provided in the project config" do
|
94
|
+
it "returns an empty array" do
|
95
|
+
subject.instance_variable_set(:@project_config, {})
|
96
|
+
expect(subject.before_install).to eq([])
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "#install" do
|
102
|
+
context "when install is provided in the project config" do
|
103
|
+
it "grabs the named hook as an array" do
|
104
|
+
subject.instance_variable_set(:@project_config, { 'install' => double })
|
105
|
+
expect(subject).to receive(:option_as_array).with('install')
|
106
|
+
subject.install
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when install is NOT provided in the project config" do
|
111
|
+
it "returns an empty array" do
|
112
|
+
subject.instance_variable_set(:@project_config, {})
|
113
|
+
expect(subject.install).to eq([])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#before_script" do
|
119
|
+
context "when before_script is provided in the project config" do
|
120
|
+
it "grabs the named hook as an array" do
|
121
|
+
subject.instance_variable_set(:@project_config, { 'before_script' => double })
|
122
|
+
expect(subject).to receive(:option_as_array).with('before_script')
|
123
|
+
subject.before_script
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "when before_script is NOT provided in the project config" do
|
128
|
+
it "returns an empty array" do
|
129
|
+
subject.instance_variable_set(:@project_config, {})
|
130
|
+
expect(subject.before_script).to eq([])
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "#script" do
|
136
|
+
context "when script is provided in the project config" do
|
137
|
+
it "grabs the named hook as an array" do
|
138
|
+
subject.instance_variable_set(:@project_config, { 'script' => double })
|
139
|
+
expect(subject).to receive(:option_as_array).with('script')
|
140
|
+
subject.script
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context "when script is NOT provided in the project config" do
|
145
|
+
it "returns an empty array" do
|
146
|
+
subject.instance_variable_set(:@project_config, {})
|
147
|
+
expect(subject.script).to eq([])
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "#after_failure" do
|
153
|
+
context "when after_failure is provided in the project config" do
|
154
|
+
it "grabs the named hook as an array" do
|
155
|
+
subject.instance_variable_set(:@project_config, { 'after_failure' => double })
|
156
|
+
expect(subject).to receive(:option_as_array).with('after_failure')
|
157
|
+
subject.after_failure
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "when after_failure is NOT provided in the project config" do
|
162
|
+
it "returns an empty array" do
|
163
|
+
subject.instance_variable_set(:@project_config, {})
|
164
|
+
expect(subject.after_failure).to eq([])
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "#after_success" do
|
170
|
+
context "when after_success is provided in the project config" do
|
171
|
+
it "grabs the named hook as an array" do
|
172
|
+
subject.instance_variable_set(:@project_config, { 'after_success' => double })
|
173
|
+
expect(subject).to receive(:option_as_array).with('after_success')
|
174
|
+
subject.after_success
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context "when after_success is NOT provided in the project config" do
|
179
|
+
it "returns an empty array" do
|
180
|
+
subject.instance_variable_set(:@project_config, {})
|
181
|
+
expect(subject.after_success).to eq([])
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
describe "#after_script" do
|
187
|
+
context "when after_script is provided in the project config" do
|
188
|
+
it "grabs the named hook as an array" do
|
189
|
+
subject.instance_variable_set(:@project_config, { 'after_script' => double })
|
190
|
+
expect(subject).to receive(:option_as_array).with('after_script')
|
191
|
+
subject.after_script
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
context "when after_script is NOT provided in the project config" do
|
196
|
+
it "returns an empty array" do
|
197
|
+
subject.instance_variable_set(:@project_config, {})
|
198
|
+
expect(subject.after_script).to eq([])
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "#option_as_array" do
|
204
|
+
context "when the value is an array" do
|
205
|
+
it "returns the value" do
|
206
|
+
subject.instance_variable_set(:@project_config, { 'foo' => [1, 2, 3] })
|
207
|
+
expect(subject.send(:option_as_array, 'foo')).to eq([1, 2, 3])
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context "when not the value is not an array" do
|
212
|
+
it "returns the value as the only item in an array" do
|
213
|
+
subject.instance_variable_set(:@project_config, { 'foo' => 1 })
|
214
|
+
expect(subject.send(:option_as_array, 'foo')).to eq([1])
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Boxci::ProviderConfig do
|
4
|
+
subject { Boxci::ProviderConfig.new("aws") }
|
5
|
+
|
6
|
+
describe "#initialize" do
|
7
|
+
it "sets the config to sane values" do
|
8
|
+
expect(subject.instance_variable_get(:@provider_config)).not_to be_nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it "sets the provider instance variable to the given provider" do
|
12
|
+
expect(subject.instance_variable_get(:@provider)).to eq('aws')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#load" do
|
17
|
+
it "reads the provider config hash" do
|
18
|
+
expect(subject).to receive(:read_provider_config_hash).and_return({})
|
19
|
+
subject.load
|
20
|
+
end
|
21
|
+
|
22
|
+
it "merges the read project config hash with the defaults" do
|
23
|
+
default_hash = double
|
24
|
+
subject.instance_variable_set(:@provider_config, default_hash)
|
25
|
+
read_hash = double
|
26
|
+
allow(subject).to receive(:read_provider_config_hash).and_return(read_hash)
|
27
|
+
expect(default_hash).to receive(:merge!).with(read_hash)
|
28
|
+
subject.load
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#fetch" do
|
33
|
+
it "returns the value from the config hash matching the passed key" do
|
34
|
+
configs = {"key1" => "value1", "key2" => "value2"}
|
35
|
+
subject.instance_variable_set(:@provider_config, configs)
|
36
|
+
expect(subject.fetch("key1")).to eq("value1")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Boxci::ProviderFactory do
|
4
|
+
describe ".build" do
|
5
|
+
it "gets the constant for the provider class" do
|
6
|
+
expect(Boxci::Providers).to receive(:const_get).with('Aws').and_return(double.as_null_object)
|
7
|
+
subject.build('aws')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "constructs a new instance of the provider const it previously grabbed" do
|
11
|
+
lang = double
|
12
|
+
allow(Boxci::Providers).to receive(:const_get).with('Aws').and_return(lang)
|
13
|
+
expect(lang).to receive(:new)
|
14
|
+
subject.build('aws')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|