spec/unit/command/generator_commands/repo_spec.rb in chef-dk-2.4.17 vs spec/unit/command/generator_commands/repo_spec.rb in chef-dk-2.5.3
- old
+ new
@@ -1,374 +1,374 @@
-#
-# 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_generated_file"
-require "chef-dk/command/generator_commands/repo"
-
-describe ChefDK::Command::GeneratorCommands::Repo do
-
- let(:argv) { %w{new_repo} }
-
- let(:stdout_io) { StringIO.new }
- let(:stderr_io) { StringIO.new }
-
- let(:expected_cookbook_file_relpaths) do
- %w{
- LICENSE
- }
- end
-
- let(:file) { "" }
- let(:file_path) { File.join(repo_path, file) }
- let(:file_contents) { File.read(file_path) }
- let(:repo_path) { File.join(tempdir, "new_repo") }
-
- let(:expected_cookbook_files) do
- expected_cookbook_file_relpaths.map do |relpath|
- File.join(tempdir, "new_repo", relpath)
- end
- end
-
- subject(:generator) { described_class.new(argv) }
-
- def generator_context
- ChefDK::Generator.context
- end
-
- before do
- ChefDK::Generator.reset
- end
-
- describe "when given invalid arguments" do
-
- before do
- allow(generator).to receive(:stdout).and_return(stdout_io)
- allow(generator).to receive(:stderr).and_return(stderr_io)
- end
-
- context "when conflicting --roles and --policy are given" do
-
- let(:argv) { %w{ new-repo --roles --policy } }
-
- it "emits an error saying that the options are exclusive" do
- expected_message = "Roles and Policyfiles are exclusive. Please only select one."
- expect(generator.run).to eq(1)
- expect(stderr_io.string).to include(expected_message)
- end
-
- end
- end
-
- context "when given the name of the repo to generate" do
-
- before do
- reset_tempdir
- end
-
- it "configures the generator context" do
- generator.read_and_validate_params
- generator.setup_context
- expect(generator_context.repo_root).to eq(Dir.pwd)
- expect(generator_context.repo_name).to eq("new_repo")
- end
-
- it "creates a new repo" do
- Dir.chdir(tempdir) do
- allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
- generator.run
- end
- generated_files = Dir.glob(File.join(tempdir, "new_repo", "**", "*"), File::FNM_DOTMATCH)
- expected_cookbook_files.each do |expected_file|
- expect(generated_files).to include(expected_file)
- end
- end
-
- describe "generated files" do
- before do
- Dir.chdir(tempdir) do
- allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
- expect(generator.run).to eq(0)
- end
- end
-
- describe "LICENSE" do
- let(:file) { "LICENSE" }
-
- context "all_rights" do
- it "is the default" do
- expect(file_contents).to match(/Copyright \d\d\d\d/)
- expect(file_contents).to match(/All rights reserved, do not redistribute/)
- end
-
- context "with copyright_holder" do
- let(:argv) { ["new_repo", "-C", "Adam Jacob"] }
- it "includes the name" do
- expect(file_contents).to match(/Copyright \d\d\d\d Adam Jacob/)
- end
- end
- end
-
- context "apache2" do
- let(:argv) { ["new_repo", "-I", "apache2" ] }
-
- it "is the apache license" do
- expect(file_contents).to match(/Apache License/)
- expect(file_contents).to match(/Version 2.0/)
- end
- end
-
- context "apachev2" do
- let(:argv) { ["new_repo", "-I", "apachev2" ] }
-
- it "is the apache license" do
- expect(file_contents).to match(/Apache License/)
- expect(file_contents).to match(/Version 2.0/)
- end
- end
-
- context "mit" do
- let(:argv) { ["new_repo", "-I", "mit" ] }
-
- it "is the mit license" do
- expect(file_contents).to match(/The MIT License \(MIT\)/)
- end
-
- context "with copyright_holder" do
- let(:argv) { ["new_repo", "-I", "mit", "-C", "Adam Jacob"] }
- it "includes the name" do
- expect(file_contents).to match(/Copyright \(c\) \d\d\d\d Adam Jacob/)
- end
- end
- end
-
- context "gplv2" do
- let(:argv) { ["new_repo", "-I", "gplv2" ] }
-
- it "is the GPL version 2 license" do
- expect(file_contents).to match(/GNU GENERAL PUBLIC LICENSE/)
- expect(file_contents).to match(/Version 2, June 1991/)
- end
- end
-
- context "gplv3" do
- let(:argv) { ["new_repo", "-I", "gplv3" ] }
-
- it "is the GPL version 2 license" do
- expect(file_contents).to match(/GNU GENERAL PUBLIC LICENSE/)
- expect(file_contents).to match(/Version 3, 29 June 2007/)
- end
- end
- end
-
- describe "README.md" do
- let(:file) { "README.md" }
-
- it "is the standard readme" do
- expect(file_contents).to match(/Every Chef installation needs a Chef Repository/)
- end
- end
-
- describe "chefignore" do
- let(:file) { "chefignore" }
-
- it "has the preamble" do
- expect(file_contents).to match(/Put files\/directories that should be ignored in this file when uploading/)
- end
- end
-
- describe ".gitignore" do
- let(:file) { ".gitignore" }
-
- it "has the right contents" do
- expect(file_contents).to match(/\.rake_test_cache/)
- expect(file_contents).to match(/\.chef\/\*\.pem/)
- expect(file_contents).to match(/\.chef\/encrypted_data_bag_secret/)
- expect(file_contents).to_not match(/cookbooks\/\*\*/)
- end
-
- context "with --policy-only" do
- let(:argv) { ["new_repo", "--policy-only" ] }
-
- it "blocks cookbooks" do
- expect(file_contents).to match(/cookbooks\/\*\*/)
- expect(file_contents).to match(/cookbooks\/README\.md/)
- end
- end
- end
-
- describe ".chef-repo.txt" do
-
- let(:file) { ".chef-repo.txt" }
-
- it "explains why it's there" do
- expect(file_contents).to include("This file gives ChefDK's generators a hint")
- end
- end
-
- describe "cookbooks" do
- describe "README.md" do
- let(:file) { "cookbooks/README.md" }
-
- it "has the right contents" do
- expect(file_contents).to match(/This directory contains the cookbooks/)
- end
-
- context "with --policy-only" do
- let(:argv) { ["new_repo", "--policy-only" ] }
-
- it "tells you whats up" do
- expect(file_contents).to match(/This directory typically contains Chef cookbooks/)
- end
- end
- end
-
- describe "example/metadata.rb" do
- let(:file) { "cookbooks/example/metadata.rb" }
-
- it "has the right contents" do
- expect(file_contents).to match(/name 'example'/)
- end
- end
-
- describe "example/attributes/default.rb" do
- let(:file) { "cookbooks/example/attributes/default.rb" }
-
- it "has the right contents" do
- expect(file_contents).to match(/default\['example'\]\['name'\] = 'Sam Doe'/)
- end
- end
-
- describe "example/recipes/default.rb" do
- let(:file) { "cookbooks/example/recipes/default.rb" }
-
- it "has the right contents" do
- expect(file_contents).to match(/log "Welcome to Chef, \#\{node\['example'\]\['name'\]\}!" do/)
- end
- end
- end
-
- describe "data_bags" do
- describe "README.md" do
- let(:file) { "data_bags/README.md" }
-
- it "has the right contents" do
- expect(file_contents).to match(/This directory contains directories of the various data bags/)
- end
- end
-
- describe "example_item.json" do
- let(:file) { "data_bags/example/example_item.json" }
-
- it "has the right contents" do
- expect(file_contents).to match(/"id": "example_item"/)
- end
- end
- end
-
- context "when Policyfiles are enabled" do
-
- let(:argv) { %w{ new_repo --policy } }
-
- it "does not create a roles directory" do
- expect(File).to_not exist(File.join(repo_path, "roles"))
- end
-
- it "does not create an environments directory" do
- expect(File).to_not exist(File.join(repo_path, "environments"))
- end
-
- describe "policies" do
- describe "README.md" do
- let(:file) { "policies/README.md" }
-
- let(:expected_content) do
- <<-README
-Create policyfiles here. When using a chef-repo, give your policyfiles
-the same filename as the name set in the policyfile itself, and use the
-`.rb` file extension.
-README
- end
-
- it "has the right contents" do
- expect(file_contents).to include(expected_content)
- end
- end
- end
-
- end
-
- context "when roles/environments are enabled" do
-
- let(:argv) { %w{new_repo --roles} }
-
- it "does not create a policies directory" do
- expect(File).to_not exist(File.join(repo_path, "policies"))
- end
-
- describe "roles" do
- describe "README.md" do
- let(:file) { "roles/README.md" }
-
- let(:expected_content) do
- <<-README
-Create roles here, in either the Role Ruby DSL (.rb) or JSON (.json) files. To install roles on the server, use knife.
-
-For example, in this directory you'll find an example role file called `example.json` which can be uploaded to the Chef Server:
-
- knife role from file roles/example.json
-
-For more information on roles, see the Chef wiki page:
-
-https://docs.chef.io/roles.html
-README
- end
-
- it "has the right contents" do
- expect(file_contents).to include(expected_content)
- end
- end
- end
-
- describe "environments" do
- describe "README.md" do
- let(:file) { "environments/README.md" }
-
- let(:expected_content) do
- <<-README
-Create environments here, in either the Role Ruby DSL (.rb) or JSON (.json) files. To install environments on the server, use knife.
-
-For example, in this directory you'll find an example environment file called `example.json` which can be uploaded to the Chef Server:
-
- knife environment from file environments/example.json
-
-For more information on environments, see the Chef wiki page:
-
-https://docs.chef.io/environments.html
-README
- end
-
- it "has the right contents" do
- expect(file_contents).to include(expected_content)
- end
- end
- end
-
- end
-
- 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_generated_file"
+require "chef-dk/command/generator_commands/repo"
+
+describe ChefDK::Command::GeneratorCommands::Repo do
+
+ let(:argv) { %w{new_repo} }
+
+ let(:stdout_io) { StringIO.new }
+ let(:stderr_io) { StringIO.new }
+
+ let(:expected_cookbook_file_relpaths) do
+ %w{
+ LICENSE
+ }
+ end
+
+ let(:file) { "" }
+ let(:file_path) { File.join(repo_path, file) }
+ let(:file_contents) { File.read(file_path) }
+ let(:repo_path) { File.join(tempdir, "new_repo") }
+
+ let(:expected_cookbook_files) do
+ expected_cookbook_file_relpaths.map do |relpath|
+ File.join(tempdir, "new_repo", relpath)
+ end
+ end
+
+ subject(:generator) { described_class.new(argv) }
+
+ def generator_context
+ ChefDK::Generator.context
+ end
+
+ before do
+ ChefDK::Generator.reset
+ end
+
+ describe "when given invalid arguments" do
+
+ before do
+ allow(generator).to receive(:stdout).and_return(stdout_io)
+ allow(generator).to receive(:stderr).and_return(stderr_io)
+ end
+
+ context "when conflicting --roles and --policy are given" do
+
+ let(:argv) { %w{ new-repo --roles --policy } }
+
+ it "emits an error saying that the options are exclusive" do
+ expected_message = "Roles and Policyfiles are exclusive. Please only select one."
+ expect(generator.run).to eq(1)
+ expect(stderr_io.string).to include(expected_message)
+ end
+
+ end
+ end
+
+ context "when given the name of the repo to generate" do
+
+ before do
+ reset_tempdir
+ end
+
+ it "configures the generator context" do
+ generator.read_and_validate_params
+ generator.setup_context
+ expect(generator_context.repo_root).to eq(Dir.pwd)
+ expect(generator_context.repo_name).to eq("new_repo")
+ end
+
+ it "creates a new repo" do
+ Dir.chdir(tempdir) do
+ allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
+ generator.run
+ end
+ generated_files = Dir.glob(File.join(tempdir, "new_repo", "**", "*"), File::FNM_DOTMATCH)
+ expected_cookbook_files.each do |expected_file|
+ expect(generated_files).to include(expected_file)
+ end
+ end
+
+ describe "generated files" do
+ before do
+ Dir.chdir(tempdir) do
+ allow(generator.chef_runner).to receive(:stdout).and_return(stdout_io)
+ expect(generator.run).to eq(0)
+ end
+ end
+
+ describe "LICENSE" do
+ let(:file) { "LICENSE" }
+
+ context "all_rights" do
+ it "is the default" do
+ expect(file_contents).to match(/Copyright \d\d\d\d/)
+ expect(file_contents).to match(/All rights reserved, do not redistribute/)
+ end
+
+ context "with copyright_holder" do
+ let(:argv) { ["new_repo", "-C", "Adam Jacob"] }
+ it "includes the name" do
+ expect(file_contents).to match(/Copyright \d\d\d\d Adam Jacob/)
+ end
+ end
+ end
+
+ context "apache2" do
+ let(:argv) { ["new_repo", "-I", "apache2" ] }
+
+ it "is the apache license" do
+ expect(file_contents).to match(/Apache License/)
+ expect(file_contents).to match(/Version 2.0/)
+ end
+ end
+
+ context "apachev2" do
+ let(:argv) { ["new_repo", "-I", "apachev2" ] }
+
+ it "is the apache license" do
+ expect(file_contents).to match(/Apache License/)
+ expect(file_contents).to match(/Version 2.0/)
+ end
+ end
+
+ context "mit" do
+ let(:argv) { ["new_repo", "-I", "mit" ] }
+
+ it "is the mit license" do
+ expect(file_contents).to match(/The MIT License \(MIT\)/)
+ end
+
+ context "with copyright_holder" do
+ let(:argv) { ["new_repo", "-I", "mit", "-C", "Adam Jacob"] }
+ it "includes the name" do
+ expect(file_contents).to match(/Copyright \(c\) \d\d\d\d Adam Jacob/)
+ end
+ end
+ end
+
+ context "gplv2" do
+ let(:argv) { ["new_repo", "-I", "gplv2" ] }
+
+ it "is the GPL version 2 license" do
+ expect(file_contents).to match(/GNU GENERAL PUBLIC LICENSE/)
+ expect(file_contents).to match(/Version 2, June 1991/)
+ end
+ end
+
+ context "gplv3" do
+ let(:argv) { ["new_repo", "-I", "gplv3" ] }
+
+ it "is the GPL version 2 license" do
+ expect(file_contents).to match(/GNU GENERAL PUBLIC LICENSE/)
+ expect(file_contents).to match(/Version 3, 29 June 2007/)
+ end
+ end
+ end
+
+ describe "README.md" do
+ let(:file) { "README.md" }
+
+ it "is the standard readme" do
+ expect(file_contents).to match(/Every Chef installation needs a Chef Repository/)
+ end
+ end
+
+ describe "chefignore" do
+ let(:file) { "chefignore" }
+
+ it "has the preamble" do
+ expect(file_contents).to match(/Put files\/directories that should be ignored in this file when uploading/)
+ end
+ end
+
+ describe ".gitignore" do
+ let(:file) { ".gitignore" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/\.rake_test_cache/)
+ expect(file_contents).to match(/\.chef\/\*\.pem/)
+ expect(file_contents).to match(/\.chef\/encrypted_data_bag_secret/)
+ expect(file_contents).to_not match(/cookbooks\/\*\*/)
+ end
+
+ context "with --policy-only" do
+ let(:argv) { ["new_repo", "--policy-only" ] }
+
+ it "blocks cookbooks" do
+ expect(file_contents).to match(/cookbooks\/\*\*/)
+ expect(file_contents).to match(/cookbooks\/README\.md/)
+ end
+ end
+ end
+
+ describe ".chef-repo.txt" do
+
+ let(:file) { ".chef-repo.txt" }
+
+ it "explains why it's there" do
+ expect(file_contents).to include("This file gives ChefDK's generators a hint")
+ end
+ end
+
+ describe "cookbooks" do
+ describe "README.md" do
+ let(:file) { "cookbooks/README.md" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/This directory contains the cookbooks/)
+ end
+
+ context "with --policy-only" do
+ let(:argv) { ["new_repo", "--policy-only" ] }
+
+ it "tells you whats up" do
+ expect(file_contents).to match(/This directory typically contains Chef cookbooks/)
+ end
+ end
+ end
+
+ describe "example/metadata.rb" do
+ let(:file) { "cookbooks/example/metadata.rb" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/name 'example'/)
+ end
+ end
+
+ describe "example/attributes/default.rb" do
+ let(:file) { "cookbooks/example/attributes/default.rb" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/default\['example'\]\['name'\] = 'Sam Doe'/)
+ end
+ end
+
+ describe "example/recipes/default.rb" do
+ let(:file) { "cookbooks/example/recipes/default.rb" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/log "Welcome to Chef, \#\{node\['example'\]\['name'\]\}!" do/)
+ end
+ end
+ end
+
+ describe "data_bags" do
+ describe "README.md" do
+ let(:file) { "data_bags/README.md" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/This directory contains directories of the various data bags/)
+ end
+ end
+
+ describe "example_item.json" do
+ let(:file) { "data_bags/example/example_item.json" }
+
+ it "has the right contents" do
+ expect(file_contents).to match(/"id": "example_item"/)
+ end
+ end
+ end
+
+ context "when Policyfiles are enabled" do
+
+ let(:argv) { %w{ new_repo --policy } }
+
+ it "does not create a roles directory" do
+ expect(File).to_not exist(File.join(repo_path, "roles"))
+ end
+
+ it "does not create an environments directory" do
+ expect(File).to_not exist(File.join(repo_path, "environments"))
+ end
+
+ describe "policies" do
+ describe "README.md" do
+ let(:file) { "policies/README.md" }
+
+ let(:expected_content) do
+ <<-README
+Create policyfiles here. When using a chef-repo, give your policyfiles
+the same filename as the name set in the policyfile itself, and use the
+`.rb` file extension.
+README
+ end
+
+ it "has the right contents" do
+ expect(file_contents).to include(expected_content)
+ end
+ end
+ end
+
+ end
+
+ context "when roles/environments are enabled" do
+
+ let(:argv) { %w{new_repo --roles} }
+
+ it "does not create a policies directory" do
+ expect(File).to_not exist(File.join(repo_path, "policies"))
+ end
+
+ describe "roles" do
+ describe "README.md" do
+ let(:file) { "roles/README.md" }
+
+ let(:expected_content) do
+ <<-README
+Create roles here, in either the Role Ruby DSL (.rb) or JSON (.json) files. To install roles on the server, use knife.
+
+For example, in this directory you'll find an example role file called `example.json` which can be uploaded to the Chef Server:
+
+ knife role from file roles/example.json
+
+For more information on roles, see the Chef wiki page:
+
+https://docs.chef.io/roles.html
+README
+ end
+
+ it "has the right contents" do
+ expect(file_contents).to include(expected_content)
+ end
+ end
+ end
+
+ describe "environments" do
+ describe "README.md" do
+ let(:file) { "environments/README.md" }
+
+ let(:expected_content) do
+ <<-README
+Create environments here, in either the Role Ruby DSL (.rb) or JSON (.json) files. To install environments on the server, use knife.
+
+For example, in this directory you'll find an example environment file called `example.json` which can be uploaded to the Chef Server:
+
+ knife environment from file environments/example.json
+
+For more information on environments, see the Chef wiki page:
+
+https://docs.chef.io/environments.html
+README
+ end
+
+ it "has the right contents" do
+ expect(file_contents).to include(expected_content)
+ end
+ end
+ end
+
+ end
+
+ end
+ end
+end