boxci 0.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|