spec/unit/command/generator_commands/policyfile_spec.rb in chef-dk-0.9.0 vs spec/unit/command/generator_commands/policyfile_spec.rb in chef-dk-0.10.0
- old
+ new
@@ -1,125 +1,225 @@
-#
-# Copyright:: Copyright (c) 2014 Chef Software Inc.
-# License:: Apache License, Version 2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-require 'spec_helper'
-require 'shared/a_file_generator'
-require 'chef-dk/command/generator_commands/policyfile'
-
-describe ChefDK::Command::GeneratorCommands::Policyfile do
-
- let(:stdout_io) { StringIO.new }
- let(:stderr_io) { StringIO.new }
-
- def stdout
- stdout_io.string
- end
-
- def stderr
- stderr_io.string
- end
-
- subject(:generator) do
- generator = described_class.new(argv)
- allow(generator).to receive(:stdout).and_return(stdout_io)
- allow(generator).to receive(:stderr).and_return(stderr_io)
- generator
- end
-
- def generator_context
- ChefDK::Generator.context
- end
-
- before do
- allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
- ChefDK::Generator.reset
- reset_tempdir
- end
-
- after(:each) do
- ChefDK::Generator::Context.reset
- end
-
- shared_examples_for "it creates a Policyfile" do
-
- it "configures the generator context" do
- Dir.chdir(tempdir) do
- generator.read_and_validate_params
- generator.setup_context
-
- expect(generator_context.policyfile_dir).to eq(tempdir)
- expect(generator_context.new_file_basename).to eq(new_file_basename)
- end
- end
-
- it "generates a Policyfile.rb in the CWD" do
- Dir.chdir(tempdir) do
- expect(generator.run).to eq(0)
- expect(File).to exist(File.join(tempdir, expected_file_name))
- end
- end
-
- end
-
- context "when ARGV is empty" do
-
- let(:argv) { [] }
-
- let(:expected_file_name) { "Policyfile.rb" }
- let(:new_file_basename) { "Policyfile" }
-
- include_examples "it creates a Policyfile"
-
- end
-
- context "when ARGV is a relative path with no `.rb' extension" do
-
- let(:argv) { ["MyPolicy"] }
-
- let(:expected_file_name) { "MyPolicy.rb" }
- let(:new_file_basename) { "MyPolicy" }
-
- include_examples "it creates a Policyfile"
-
- end
-
- context "when ARGV is a relative path with a `.rb' extension" do
-
- let(:argv) { ["MyApplication.rb"] }
-
- let(:expected_file_name) { "MyApplication.rb" }
- let(:new_file_basename) { "MyApplication" }
-
- include_examples "it creates a Policyfile"
-
- end
-
- context "when ARGV has too many arguments" do
-
- let(:argv) { %w{ foo bar baz } }
-
- it "shows usage and exits" do
- expected_stdout = "Usage: chef generate policyfile [NAME] [options]"
-
- expect(generator.run).to eq(1)
- expect(stderr).to include(expected_stdout)
- end
-
- end
-
-end
-
-
+#
+# Copyright:: Copyright (c) 2014 Chef Software Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'spec_helper'
+require 'shared/a_file_generator'
+require 'chef-dk/command/generator_commands/policyfile'
+
+describe ChefDK::Command::GeneratorCommands::Policyfile do
+
+ let(:stdout_io) { StringIO.new }
+ let(:stderr_io) { StringIO.new }
+
+ def stdout
+ stdout_io.string
+ end
+
+ def stderr
+ stderr_io.string
+ end
+
+ subject(:generator) do
+ generator = described_class.new(argv)
+ allow(generator).to receive(:stdout).and_return(stdout_io)
+ allow(generator).to receive(:stderr).and_return(stderr_io)
+ generator
+ end
+
+ def generator_context
+ ChefDK::Generator.context
+ end
+
+ before do
+ allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
+ ChefDK::Generator.reset
+ reset_tempdir
+ end
+
+ after(:each) do
+ ChefDK::Generator::Context.reset
+ end
+
+ shared_examples_for "it creates a Policyfile" do
+
+ it "configures the generator context" do
+ Dir.chdir(tempdir) do
+ generator.read_and_validate_params
+ generator.setup_context
+
+ expect(generator_context.policyfile_dir).to eq(tempdir)
+ expect(generator_context.new_file_basename).to eq(new_file_basename)
+ end
+ end
+
+ it "generates a Policyfile.rb in the CWD" do
+ Dir.chdir(tempdir) do
+ expect(generator.run).to eq(0)
+ expect(File).to exist(File.join(tempdir, expected_file_name))
+ end
+ end
+
+ end
+
+ context "when ARGV is empty" do
+
+ let(:argv) { [] }
+
+ let(:expected_file_name) { "Policyfile.rb" }
+ let(:new_file_basename) { "Policyfile" }
+
+ include_examples "it creates a Policyfile"
+
+ end
+
+ context "when ARGV is a relative path with no `.rb' extension" do
+
+ let(:argv) { ["MyPolicy"] }
+
+ let(:expected_file_name) { "MyPolicy.rb" }
+ let(:new_file_basename) { "MyPolicy" }
+
+ include_examples "it creates a Policyfile"
+
+ end
+
+ context "when ARGV is a relative path with a `.rb' extension" do
+
+ let(:argv) { ["MyApplication.rb"] }
+
+ let(:expected_file_name) { "MyApplication.rb" }
+ let(:new_file_basename) { "MyApplication" }
+
+ include_examples "it creates a Policyfile"
+
+ end
+
+ context "when the current working directory is a chef repo" do
+
+ let(:chef_repo_dot_txt) { File.join(tempdir, ".chef-repo.txt") }
+
+ let(:policies_dir) { File.join(tempdir, "policies") }
+
+ let(:expected_policyfile_content) do
+ <<-POLICYFILE_RB
+# Policyfile.rb - Describe how you want Chef to build your system.
+#
+# For more information on the Policyfile feature, visit
+# https://github.com/opscode/chef-dk/blob/master/POLICYFILE_README.md
+
+# A name that describes what the system you're building with Chef does.
+name "my-app-frontend"
+
+# This lets you source cookbooks from your chef-repo.
+default_source :chef_repo, "../"
+
+# Where to find external cookbooks:
+default_source :supermarket
+
+# run_list: chef-client will run these recipes in the order specified.
+run_list "my-app-frontend::default"
+
+# Specify a custom source for a single cookbook:
+# cookbook "example_cookbook", path: "../cookbooks/example_cookbook"
+POLICYFILE_RB
+ end
+
+ before do
+ FileUtils.touch(chef_repo_dot_txt)
+ FileUtils.mkdir(policies_dir)
+ end
+
+ context "when ARGV is empty" do
+
+ let(:argv) { [] }
+
+ it "errors and explains a policy name is required when using a chef-repo" do
+ Dir.chdir(tempdir) do
+ expect(generator.run).to eq(1)
+ end
+ expect(File).to_not exist(File.join(tempdir, "Policyfile.rb"))
+ expected_error = "ERROR: You must give a policy name when generating a policy in a chef-repo."
+ expect(stderr).to include(expected_error)
+ end
+
+ end
+
+ context "when ARGV is a single name with no path separators" do
+
+ let(:argv) { ["my-app-frontend"] }
+
+ let(:expected_policyfile_path) { File.join(policies_dir, "my-app-frontend.rb") }
+
+ before do
+ Dir.chdir(tempdir) do
+ expect(generator.run).to eq(0)
+ end
+ end
+
+ it "creates the policy under the policies/ directory" do
+ expect(File).to exist(expected_policyfile_path)
+ end
+
+ it "adds chef_repo as a default source and uses argv for the policy name" do
+ expect(IO.read(expected_policyfile_path)).to eq(expected_policyfile_content)
+ end
+
+ end
+
+ context "when ARGV looks like a path" do
+
+ let(:other_policy_dir) { File.join(tempdir, "other-policies") }
+
+ let(:expected_policyfile_path) { File.join(other_policy_dir, "my-app-frontend.rb") }
+
+ let(:argv) { [ "other-policies/my-app-frontend" ] }
+
+ before do
+ FileUtils.mkdir(other_policy_dir)
+
+ Dir.chdir(tempdir) do
+ expect(generator.run).to eq(0)
+ end
+ end
+
+ it "creates the policy in the specified path" do
+ expect(File).to exist(expected_policyfile_path)
+ end
+
+ it "adds chef_repo as a default source" do
+ expect(IO.read(expected_policyfile_path)).to eq(expected_policyfile_content)
+ end
+
+ end
+
+ end
+
+ context "when ARGV has too many arguments" do
+
+ let(:argv) { %w{ foo bar baz } }
+
+ it "shows usage and exits" do
+ expected_stdout = "Usage: chef generate policyfile [NAME] [options]"
+
+ expect(generator.run).to eq(1)
+ expect(stderr).to include(expected_stdout)
+ end
+
+ end
+
+end
+
+