chef-dk 0.3.5 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +4 -4
- data/README.md +4 -4
- data/lib/chef-dk/builtin_commands.rb +4 -0
- data/lib/chef-dk/chef_runner.rb +7 -1
- data/lib/chef-dk/command/exec.rb +9 -0
- data/lib/chef-dk/command/export.rb +132 -0
- data/lib/chef-dk/command/generator_commands.rb +1 -1
- data/lib/chef-dk/command/generator_commands/app.rb +8 -0
- data/lib/chef-dk/command/generator_commands/base.rb +46 -4
- data/lib/chef-dk/command/generator_commands/cookbook.rb +8 -0
- data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +1 -0
- data/lib/chef-dk/command/push.rb +3 -6
- data/lib/chef-dk/command/shell_init.rb +28 -5
- data/lib/chef-dk/command/update.rb +106 -0
- data/lib/chef-dk/command/verify.rb +72 -0
- data/lib/chef-dk/component_test.rb +12 -1
- data/lib/chef-dk/configurable.rb +52 -0
- data/lib/chef-dk/cookbook_metadata.rb +10 -1
- data/lib/chef-dk/cookbook_profiler/git.rb +1 -1
- data/lib/chef-dk/exceptions.rb +17 -2
- data/lib/chef-dk/helpers.rb +2 -2
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +1 -1
- data/lib/chef-dk/policyfile/dsl.rb +7 -0
- data/lib/chef-dk/policyfile/uploader.rb +25 -4
- data/lib/chef-dk/policyfile_compiler.rb +21 -1
- data/lib/chef-dk/policyfile_lock.rb +5 -0
- data/lib/chef-dk/policyfile_services/export_repo.rb +194 -0
- data/lib/chef-dk/policyfile_services/install.rb +8 -2
- data/lib/chef-dk/policyfile_services/push.rb +4 -1
- data/lib/chef-dk/service_exceptions.rb +6 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +1 -1
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +1 -1
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/README.md +1 -1
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +2 -2
- data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +3 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +1 -7
- data/lib/chef-dk/skeletons/code_generator/metadata.rb +1 -1
- data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +31 -1
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +32 -2
- data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +18 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +23 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +12 -0
- data/lib/chef-dk/version.rb +1 -1
- data/lib/kitchen/provisioner/policyfile_zero.rb +149 -0
- data/spec/shared/a_file_generator.rb +1 -0
- data/spec/shared/command_with_ui_object.rb +11 -0
- data/spec/shared/custom_generator_cookbook.rb +117 -0
- data/spec/unit/chef_runner_spec.rb +26 -0
- data/spec/unit/command/exec_spec.rb +46 -5
- data/spec/unit/command/export_spec.rb +176 -0
- data/spec/unit/command/generator_commands/app_spec.rb +38 -0
- data/spec/unit/command/generator_commands/cookbook_spec.rb +37 -28
- data/spec/unit/command/generator_commands/recipe_spec.rb +4 -2
- data/spec/unit/command/install_spec.rb +3 -6
- data/spec/unit/command/push_spec.rb +3 -6
- data/spec/unit/command/shell_init_spec.rb +77 -49
- data/spec/unit/command/update_spec.rb +155 -0
- data/spec/unit/command/verify_spec.rb +22 -7
- data/spec/unit/cookbook_metadata_spec.rb +44 -8
- data/spec/unit/cookbook_profiler/git_spec.rb +12 -0
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +1 -1
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +1 -1
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +1 -1
- data/spec/unit/fixtures/cookbooks_api/small_universe.json +667 -667
- data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
- data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +1 -1
- data/spec/unit/fixtures/example_cookbook/Berksfile +1 -1
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
- data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +1 -1
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +2 -2
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +3 -3
- data/spec/unit/policyfile/uploader_spec.rb +61 -25
- data/spec/unit/policyfile_demands_spec.rb +47 -0
- data/spec/unit/policyfile_evaluation_spec.rb +1 -1
- data/spec/unit/policyfile_lock_build_spec.rb +60 -3
- data/spec/unit/policyfile_services/export_repo_spec.rb +321 -0
- data/spec/unit/policyfile_services/install_spec.rb +20 -1
- data/spec/unit/policyfile_services/push_spec.rb +36 -9
- metadata +53 -38
- data/lib/chef-dk/skeletons/code_generator/files/default/converge_spec.rb +0 -9
- data/lib/chef-dk/skeletons/code_generator/templates/default/default_recipe.rb.erb +0 -5
@@ -0,0 +1,176 @@
|
|
1
|
+
#
|
2
|
+
# Copyright:: Copyright (c) 2014 Chef Software Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require 'spec_helper'
|
19
|
+
require 'shared/command_with_ui_object'
|
20
|
+
require 'chef-dk/command/export'
|
21
|
+
|
22
|
+
describe ChefDK::Command::Export do
|
23
|
+
|
24
|
+
it_behaves_like "a command with a UI object"
|
25
|
+
|
26
|
+
let(:params) { [] }
|
27
|
+
|
28
|
+
let(:command) do
|
29
|
+
described_class.new
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:policyfile_lock) do
|
33
|
+
instance_double(ChefDK::PolicyfileLock, name: "example-policy")
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:export_service) do
|
37
|
+
instance_double(ChefDK::PolicyfileServices::ExportRepo,
|
38
|
+
policyfile_lock: policyfile_lock)
|
39
|
+
end
|
40
|
+
|
41
|
+
context "after evaluating params" do
|
42
|
+
|
43
|
+
let(:params) { [ "path/to/export" ] }
|
44
|
+
|
45
|
+
before do
|
46
|
+
command.apply_params!(params)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "disables debug by default" do
|
50
|
+
expect(command.debug?).to be(false)
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when debug mode is set" do
|
54
|
+
|
55
|
+
let(:params) { [ "path/to/export", "-D" ] }
|
56
|
+
|
57
|
+
it "enables debug" do
|
58
|
+
expect(command.debug?).to be(true)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when the path to the exported repo is given" do
|
63
|
+
|
64
|
+
let(:params) { [ "path/to/export" ] }
|
65
|
+
|
66
|
+
it "configures the export service with the export path" do
|
67
|
+
expect(command.export_service.export_dir).to eq(File.expand_path("path/to/export"))
|
68
|
+
end
|
69
|
+
|
70
|
+
it "uses the default policyfile name" do
|
71
|
+
expect(command.export_service.policyfile_filename).to eq(File.expand_path("Policyfile.rb"))
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
context "when a Policyfile relative path and export path are given" do
|
77
|
+
|
78
|
+
let(:params) { [ "CustomNamedPolicy.rb", "path/to/export" ] }
|
79
|
+
|
80
|
+
it "configures the export service with the export path" do
|
81
|
+
expect(command.export_service.export_dir).to eq(File.expand_path("path/to/export"))
|
82
|
+
end
|
83
|
+
|
84
|
+
it "configures the export service with the policyfile relative path" do
|
85
|
+
expect(command.export_service.policyfile_filename).to eq(File.expand_path("CustomNamedPolicy.rb"))
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "running the export" do
|
91
|
+
|
92
|
+
let(:params) { [ "/path/to/export" ] }
|
93
|
+
|
94
|
+
let(:ui) { TestHelpers::TestUI.new }
|
95
|
+
|
96
|
+
before do
|
97
|
+
command.ui = ui
|
98
|
+
allow(command).to receive(:export_service).and_return(export_service)
|
99
|
+
end
|
100
|
+
|
101
|
+
context "with no arguments" do
|
102
|
+
|
103
|
+
it "exits non-zero and prints a help message" do
|
104
|
+
expect(command.run).to eq(1)
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
context "when the command is successful" do
|
110
|
+
|
111
|
+
before do
|
112
|
+
expect(export_service).to receive(:run)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "returns 0" do
|
116
|
+
expect(command.run(params)).to eq(0)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context "when the command is unsuccessful" do
|
121
|
+
|
122
|
+
let(:backtrace) { caller[0...3] }
|
123
|
+
|
124
|
+
let(:cause) do
|
125
|
+
e = StandardError.new("some operation failed")
|
126
|
+
e.set_backtrace(backtrace)
|
127
|
+
e
|
128
|
+
end
|
129
|
+
|
130
|
+
let(:exception) do
|
131
|
+
ChefDK::PolicyfileExportRepoError.new("export failed", cause)
|
132
|
+
end
|
133
|
+
|
134
|
+
before do
|
135
|
+
expect(export_service).to receive(:run).and_raise(exception)
|
136
|
+
end
|
137
|
+
|
138
|
+
it "returns 1" do
|
139
|
+
expect(command.run(params)).to eq(1)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "displays the exception and cause" do
|
143
|
+
expected_error_text=<<-E
|
144
|
+
Error: export failed
|
145
|
+
Reason: (StandardError) some operation failed
|
146
|
+
|
147
|
+
E
|
148
|
+
|
149
|
+
command.run(params)
|
150
|
+
expect(ui.output).to eq(expected_error_text)
|
151
|
+
end
|
152
|
+
|
153
|
+
context "and debug is enabled" do
|
154
|
+
|
155
|
+
let(:params) { [ "path/to/export", "-D"] }
|
156
|
+
|
157
|
+
it "displays the exception and cause with backtrace" do
|
158
|
+
expected_error_text=<<-E
|
159
|
+
Error: export failed
|
160
|
+
Reason: (StandardError) some operation failed
|
161
|
+
|
162
|
+
|
163
|
+
E
|
164
|
+
|
165
|
+
expected_error_text << backtrace.join("\n") << "\n"
|
166
|
+
|
167
|
+
command.run(params)
|
168
|
+
expect(ui.output).to eq(expected_error_text)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
@@ -16,6 +16,7 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
require 'spec_helper'
|
19
|
+
require 'shared/custom_generator_cookbook'
|
19
20
|
require 'chef-dk/command/generator_commands/app'
|
20
21
|
|
21
22
|
describe ChefDK::Command::GeneratorCommands::App do
|
@@ -29,12 +30,23 @@ describe ChefDK::Command::GeneratorCommands::App do
|
|
29
30
|
%w[
|
30
31
|
.gitignore
|
31
32
|
.kitchen.yml
|
33
|
+
test
|
34
|
+
test/integration
|
35
|
+
test/integration/default
|
36
|
+
test/integration/default/serverspec
|
37
|
+
test/integration/default/serverspec/default_spec.rb
|
38
|
+
test/integration/default/serverspec/spec_helper.rb
|
32
39
|
README.md
|
33
40
|
cookbooks/new_app/Berksfile
|
34
41
|
cookbooks/new_app/chefignore
|
35
42
|
cookbooks/new_app/metadata.rb
|
36
43
|
cookbooks/new_app/recipes
|
37
44
|
cookbooks/new_app/recipes/default.rb
|
45
|
+
cookbooks/new_app/spec
|
46
|
+
cookbooks/new_app/spec/spec_helper.rb
|
47
|
+
cookbooks/new_app/spec/unit
|
48
|
+
cookbooks/new_app/spec/unit/recipes
|
49
|
+
cookbooks/new_app/spec/unit/recipes/default_spec.rb
|
38
50
|
]
|
39
51
|
end
|
40
52
|
|
@@ -54,6 +66,14 @@ describe ChefDK::Command::GeneratorCommands::App do
|
|
54
66
|
ChefDK::Generator.reset
|
55
67
|
end
|
56
68
|
|
69
|
+
include_examples "custom generator cookbook" do
|
70
|
+
|
71
|
+
let(:generator_arg) { "new_app" }
|
72
|
+
|
73
|
+
let(:generator_name) { "app" }
|
74
|
+
|
75
|
+
end
|
76
|
+
|
57
77
|
context "when given the name of the cookbook to generate" do
|
58
78
|
|
59
79
|
before do
|
@@ -67,6 +87,7 @@ describe ChefDK::Command::GeneratorCommands::App do
|
|
67
87
|
expect(generator_context.app_name).to eq("new_app")
|
68
88
|
expect(generator_context.cookbook_root).to eq(File.join(Dir.pwd, "new_app", "cookbooks"))
|
69
89
|
expect(generator_context.cookbook_name).to eq("new_app")
|
90
|
+
expect(generator_context.recipe_name).to eq("default")
|
70
91
|
end
|
71
92
|
|
72
93
|
describe "generated files" do
|
@@ -110,6 +131,14 @@ describe ChefDK::Command::GeneratorCommands::App do
|
|
110
131
|
end
|
111
132
|
end
|
112
133
|
|
134
|
+
describe "test/integration/default/serverspec/default_spec.rb" do
|
135
|
+
let(:file) { File.join(tempdir, "new_app", "test", "integration", "default", "serverspec", "default_spec.rb") }
|
136
|
+
|
137
|
+
include_examples "a generated file", :cookbook_name do
|
138
|
+
let(:line) { "describe 'new_app::default' do" }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
113
142
|
describe "cookbooks/new_app/metadata.rb" do
|
114
143
|
let(:file) { File.join(tempdir, "new_app", "cookbooks", "new_app", "metadata.rb") }
|
115
144
|
|
@@ -125,6 +154,15 @@ describe ChefDK::Command::GeneratorCommands::App do
|
|
125
154
|
let(:line) { "# Cookbook Name:: new_app" }
|
126
155
|
end
|
127
156
|
end
|
157
|
+
|
158
|
+
describe "cookbooks/new_app/spec/unit/recipes/default_spec.rb" do
|
159
|
+
let(:file) { File.join(tempdir, "new_app", "cookbooks", "new_app", "spec", "unit", "recipes", "default_spec.rb") }
|
160
|
+
|
161
|
+
include_examples "a generated file", :cookbook_name do
|
162
|
+
let(:line) { "describe \'new_app::default\' do" }
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
128
166
|
end
|
129
167
|
end
|
130
168
|
end
|
@@ -16,6 +16,7 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
require 'spec_helper'
|
19
|
+
require 'shared/custom_generator_cookbook'
|
19
20
|
require 'chef-dk/command/generator_commands/cookbook'
|
20
21
|
|
21
22
|
describe ChefDK::Command::GeneratorCommands::Cookbook do
|
@@ -29,12 +30,23 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do
|
|
29
30
|
%w[
|
30
31
|
.gitignore
|
31
32
|
.kitchen.yml
|
33
|
+
test
|
34
|
+
test/integration
|
35
|
+
test/integration/default
|
36
|
+
test/integration/default/serverspec
|
37
|
+
test/integration/default/serverspec/default_spec.rb
|
38
|
+
test/integration/default/serverspec/spec_helper.rb
|
32
39
|
Berksfile
|
33
40
|
chefignore
|
34
41
|
metadata.rb
|
35
42
|
README.md
|
36
43
|
recipes
|
37
44
|
recipes/default.rb
|
45
|
+
spec
|
46
|
+
spec/spec_helper.rb
|
47
|
+
spec/unit
|
48
|
+
spec/unit/recipes
|
49
|
+
spec/unit/recipes/default_spec.rb
|
38
50
|
]
|
39
51
|
end
|
40
52
|
|
@@ -58,6 +70,14 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do
|
|
58
70
|
ChefDK::Generator.reset
|
59
71
|
end
|
60
72
|
|
73
|
+
include_examples "custom generator cookbook" do
|
74
|
+
|
75
|
+
let(:generator_arg) { "new_cookbook" }
|
76
|
+
|
77
|
+
let(:generator_name) { "cookbook" }
|
78
|
+
|
79
|
+
end
|
80
|
+
|
61
81
|
it "configures the chef runner" do
|
62
82
|
expect(cookbook_generator.chef_runner).to be_a(ChefDK::ChefRunner)
|
63
83
|
expect(cookbook_generator.chef_runner.cookbook_path).to eq(File.expand_path('lib/chef-dk/skeletons', project_root))
|
@@ -97,6 +117,7 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do
|
|
97
117
|
cookbook_generator.setup_context
|
98
118
|
expect(generator_context.cookbook_root).to eq(Dir.pwd)
|
99
119
|
expect(generator_context.cookbook_name).to eq("new_cookbook")
|
120
|
+
expect(generator_context.recipe_name).to eq("default")
|
100
121
|
end
|
101
122
|
|
102
123
|
it "creates a new cookbook" do
|
@@ -139,6 +160,14 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do
|
|
139
160
|
end
|
140
161
|
end
|
141
162
|
|
163
|
+
describe "test/integration/default/serverspec/default_spec.rb" do
|
164
|
+
let(:file) { File.join(tempdir, "new_cookbook", "test", "integration", "default", "serverspec", "default_spec.rb") }
|
165
|
+
|
166
|
+
include_examples "a generated file", :cookbook_name do
|
167
|
+
let(:line) { "describe 'new_cookbook::default' do" }
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
142
171
|
describe "metadata.rb" do
|
143
172
|
let(:file) { File.join(tempdir, "new_cookbook", "metadata.rb") }
|
144
173
|
|
@@ -155,6 +184,14 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do
|
|
155
184
|
end
|
156
185
|
end
|
157
186
|
|
187
|
+
describe "spec/unit/recipes/default_spec.rb" do
|
188
|
+
let(:file) { File.join(tempdir, "new_cookbook", "spec", "unit", "recipes", "default_spec.rb") }
|
189
|
+
|
190
|
+
include_examples "a generated file", :cookbook_name do
|
191
|
+
let(:line) { "describe \'new_cookbook::default\' do" }
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
158
195
|
end
|
159
196
|
|
160
197
|
context "when given the path to the cookbook to generate" do
|
@@ -173,34 +210,6 @@ describe ChefDK::Command::GeneratorCommands::Cookbook do
|
|
173
210
|
|
174
211
|
end
|
175
212
|
|
176
|
-
context "when given a generator-cookbook path" do
|
177
|
-
let(:generator_cookbook_path) { File.join(tempdir, 'a_generator_cookbook') }
|
178
|
-
let(:argv) { ["new_cookbook", "--generator-cookbook", generator_cookbook_path] }
|
179
|
-
|
180
|
-
before do
|
181
|
-
reset_tempdir
|
182
|
-
end
|
183
|
-
|
184
|
-
it "configures the generator context" do
|
185
|
-
cookbook_generator.read_and_validate_params
|
186
|
-
cookbook_generator.setup_context
|
187
|
-
expect(generator_context.cookbook_root).to eq(Dir.pwd)
|
188
|
-
expect(generator_context.cookbook_name).to eq("new_cookbook")
|
189
|
-
expect(cookbook_generator.chef_runner.cookbook_path).to eq(generator_cookbook_path)
|
190
|
-
end
|
191
|
-
|
192
|
-
it "creates a new cookbook" do
|
193
|
-
Dir.chdir(tempdir) do
|
194
|
-
allow(cookbook_generator.chef_runner).to receive(:stdout).and_return(stdout_io)
|
195
|
-
cookbook_generator.run
|
196
|
-
end
|
197
|
-
generated_files = Dir.glob("#{tempdir}/new_cookbook/**/*", File::FNM_DOTMATCH)
|
198
|
-
expected_cookbook_files.each do |expected_file|
|
199
|
-
expect(generated_files).to include(expected_file)
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
213
|
context "when given generic arguments to populate the generator context" do
|
205
214
|
let(:argv) { [ "new_cookbook", "--generator-arg", "key1=value1", "-a", "key2=value2", "-a", " key3 = value3 " ] }
|
206
215
|
|
@@ -24,9 +24,11 @@ describe ChefDK::Command::GeneratorCommands::Recipe do
|
|
24
24
|
include_examples "a file generator" do
|
25
25
|
|
26
26
|
let(:generator_name) { "recipe" }
|
27
|
-
let(:generated_files) { [ "recipes/new_recipe.rb"
|
27
|
+
let(:generated_files) { [ "recipes/new_recipe.rb",
|
28
|
+
"spec/spec_helper.rb",
|
29
|
+
"spec/unit/recipes/new_recipe_spec.rb" ] }
|
28
30
|
let(:new_file_name) { "new_recipe" }
|
29
31
|
|
30
32
|
end
|
31
|
-
end
|
32
33
|
|
34
|
+
end
|
@@ -16,10 +16,13 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
require 'spec_helper'
|
19
|
+
require 'shared/command_with_ui_object'
|
19
20
|
require 'chef-dk/command/install'
|
20
21
|
|
21
22
|
describe ChefDK::Command::Install do
|
22
23
|
|
24
|
+
it_behaves_like "a command with a UI object"
|
25
|
+
|
23
26
|
let(:params) { [] }
|
24
27
|
|
25
28
|
let(:command) do
|
@@ -34,12 +37,6 @@ describe ChefDK::Command::Install do
|
|
34
37
|
expect(command.debug?).to be(false)
|
35
38
|
end
|
36
39
|
|
37
|
-
it "configures a default UI component" do
|
38
|
-
ui = command.ui
|
39
|
-
expect(ui.out_stream).to eq($stdout)
|
40
|
-
expect(ui.err_stream).to eq($stderr)
|
41
|
-
end
|
42
|
-
|
43
40
|
context "when debug mode is set" do
|
44
41
|
|
45
42
|
let(:params) { [ "-D" ] }
|
@@ -16,10 +16,13 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
require 'spec_helper'
|
19
|
+
require 'shared/command_with_ui_object'
|
19
20
|
require 'chef-dk/command/push'
|
20
21
|
|
21
22
|
describe ChefDK::Command::Push do
|
22
23
|
|
24
|
+
it_behaves_like "a command with a UI object"
|
25
|
+
|
23
26
|
let(:policy_group) { "dev" }
|
24
27
|
|
25
28
|
let(:params) { [policy_group] }
|
@@ -51,12 +54,6 @@ describe ChefDK::Command::Push do
|
|
51
54
|
expect(command.debug?).to be(false)
|
52
55
|
end
|
53
56
|
|
54
|
-
it "configures a default UI component" do
|
55
|
-
ui = command.ui
|
56
|
-
expect(ui.out_stream).to eq($stdout)
|
57
|
-
expect(ui.err_stream).to eq($stderr)
|
58
|
-
end
|
59
|
-
|
60
57
|
describe "when configuring components that depend on chef config" do
|
61
58
|
|
62
59
|
before do
|
@@ -30,84 +30,112 @@ describe ChefDK::Command::ShellInit do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
shared_context "shell init script" do |shell|
|
34
|
+
let(:user_bin_dir) { File.expand_path(File.join(Gem.user_dir, 'bin')) }
|
35
|
+
let(:expected_path) { [omnibus_bin_dir, user_bin_dir, omnibus_embedded_bin_dir, ENV['PATH']].join(File::PATH_SEPARATOR) }
|
36
|
+
let(:expected_gem_root) { Gem.default_dir.to_s }
|
37
|
+
let(:expected_gem_home) { Gem.user_dir }
|
38
|
+
let(:expected_gem_path) { Gem.path.join(File::PATH_SEPARATOR) }
|
39
|
+
|
40
|
+
context "with no explicit omnibus directory" do
|
41
|
+
|
42
|
+
let(:omnibus_bin_dir) { "/foo/bin" }
|
43
|
+
let(:omnibus_embedded_bin_dir) { "/foo/embedded/bin" }
|
44
|
+
let(:argv) { [shell] }
|
45
|
+
|
46
|
+
before do
|
47
|
+
allow(command_instance).to receive(:omnibus_embedded_bin_dir).and_return(omnibus_embedded_bin_dir)
|
48
|
+
allow(command_instance).to receive(:omnibus_bin_dir).and_return(omnibus_bin_dir)
|
49
|
+
end
|
36
50
|
|
37
|
-
|
51
|
+
it "emits a script to add ChefDK's ruby to the shell environment" do
|
52
|
+
command_instance.run(argv)
|
53
|
+
expect(stdout_io.string).to eq(expected_environment_commands)
|
54
|
+
end
|
55
|
+
end
|
38
56
|
|
39
|
-
|
57
|
+
context "with an explicit omnibus directory as an argument" do
|
40
58
|
|
41
|
-
|
59
|
+
let(:omnibus_root) { File.join(fixtures_path, "eg_omnibus_dir/valid/") }
|
60
|
+
let(:omnibus_bin_dir) { File.join(omnibus_root, "bin") }
|
61
|
+
let(:omnibus_embedded_bin_dir) { File.join(omnibus_root, "embedded/bin") }
|
42
62
|
|
43
|
-
|
63
|
+
let(:argv) { [shell, "--omnibus-dir", omnibus_root] }
|
44
64
|
|
45
|
-
|
65
|
+
it "emits a script to add ChefDK's ruby to the shell environment" do
|
66
|
+
command_instance.run(argv)
|
67
|
+
expect(stdout_io.string).to eq(expected_environment_commands)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
46
71
|
|
47
|
-
|
72
|
+
shared_examples "a posix shell script" do |shell|
|
73
|
+
before do
|
74
|
+
stub_const("File::PATH_SEPARATOR", ':')
|
75
|
+
end
|
48
76
|
|
49
|
-
|
50
|
-
|
51
|
-
export PATH
|
77
|
+
let(:expected_environment_commands) do
|
78
|
+
<<-EOH
|
79
|
+
export PATH="#{expected_path}"
|
52
80
|
export GEM_ROOT="#{expected_gem_root}"
|
53
|
-
export GEM_HOME
|
54
|
-
export GEM_PATH
|
81
|
+
export GEM_HOME="#{expected_gem_home}"
|
82
|
+
export GEM_PATH="#{expected_gem_path}"
|
55
83
|
EOH
|
84
|
+
end
|
85
|
+
include_context "shell init script", shell
|
56
86
|
end
|
57
87
|
|
58
|
-
|
59
|
-
|
60
|
-
let(:omnibus_bin_dir) { "/foo/bin" }
|
61
|
-
let(:omnibus_embedded_bin_dir) { "/foo/embedded/bin" }
|
62
|
-
|
88
|
+
shared_examples "a powershell script" do |shell|
|
63
89
|
before do
|
64
|
-
|
65
|
-
allow(command_instance).to receive(:omnibus_bin_dir).and_return(omnibus_bin_dir)
|
90
|
+
stub_const("File::PATH_SEPARATOR", ';')
|
66
91
|
end
|
67
92
|
|
68
|
-
|
69
|
-
|
70
|
-
|
93
|
+
let(:expected_environment_commands) do
|
94
|
+
<<-EOH
|
95
|
+
$env:PATH="#{expected_path}"
|
96
|
+
$env:GEM_ROOT="#{expected_gem_root}"
|
97
|
+
$env:GEM_HOME="#{expected_gem_home}"
|
98
|
+
$env:GEM_PATH="#{expected_gem_path}"
|
99
|
+
EOH
|
71
100
|
end
|
101
|
+
include_context "shell init script", shell
|
102
|
+
end
|
72
103
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
it "exits with an error message" do
|
78
|
-
expect(command_instance.run(argv)).to eq(1)
|
79
|
-
expect(stderr_io.string).to include("Please specify what shell you are using")
|
80
|
-
end
|
81
|
-
|
104
|
+
['bash', 'sh', 'zsh'].each do |shell|
|
105
|
+
context "for #{shell}" do
|
106
|
+
it_behaves_like "a posix shell script", shell
|
82
107
|
end
|
108
|
+
end
|
83
109
|
|
84
|
-
|
110
|
+
['powershell', 'posh'].each do |shell|
|
111
|
+
context "for #{shell}" do
|
112
|
+
it_behaves_like "a powershell script", shell
|
113
|
+
end
|
114
|
+
end
|
85
115
|
|
86
|
-
|
116
|
+
context "when no shell is specified" do
|
87
117
|
|
88
|
-
|
89
|
-
expect(command_instance.run(argv)).to eq(1)
|
90
|
-
expect(stderr_io.string).to include("Shell `nosuchsh' is not currently supported")
|
91
|
-
expect(stderr_io.string).to include("Supported shells are: bash zsh sh")
|
92
|
-
end
|
118
|
+
let(:argv) { [] }
|
93
119
|
|
120
|
+
it "exits with an error message" do
|
121
|
+
expect(command_instance.run(argv)).to eq(1)
|
122
|
+
expect(stderr_io.string).to include("Please specify what shell you are using")
|
94
123
|
end
|
95
124
|
|
96
125
|
end
|
97
126
|
|
98
|
-
context "
|
127
|
+
context "when an unsupported shell is specified" do
|
99
128
|
|
100
|
-
let(:
|
101
|
-
let(:omnibus_bin_dir) { File.join(omnibus_root, "bin") }
|
102
|
-
let(:omnibus_embedded_bin_dir) { File.join(omnibus_root, "embedded/bin") }
|
129
|
+
let(:argv) { ['nosuchsh'] }
|
103
130
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
expect(stdout_io.string).to eq(expected_environment_commands)
|
131
|
+
it "exits with an error message" do
|
132
|
+
expect(command_instance.run(argv)).to eq(1)
|
133
|
+
expect(stderr_io.string).to include("Shell `nosuchsh' is not currently supported")
|
134
|
+
expect(stderr_io.string).to include("Supported shells are: bash zsh sh powershell posh")
|
109
135
|
end
|
136
|
+
|
110
137
|
end
|
111
138
|
|
139
|
+
|
112
140
|
end
|
113
141
|
|