spec/unit/command/verify_spec.rb in chef-dk-0.11.2 vs spec/unit/command/verify_spec.rb in chef-dk-0.12.0

- old
+ new

@@ -1,325 +1,325 @@ -# -# 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 'chef-dk/command/verify' - -module Gem - - # We stub Gem.ruby because `verify` uses it to locate the omnibus directory, - # but we also use it in some of the "test commands" in these tests. - class << self - alias :real_ruby :ruby - end -end - -describe ChefDK::Command::Verify do - let(:command_instance) { ChefDK::Command::Verify.new() } - - let(:command_options) { [] } - - let(:components) { {} } - - let(:default_components) do - [ - "berkshelf", - "test-kitchen", - "tk-policyfile-provisioner", - "chef-client", - "chef-dk", - "chef-provisioning", - "chefspec", - "generated-cookbooks-pass-chefspec", - "rubocop", - "fauxhai", - "knife-spork", - "kitchen-vagrant", - "package installation", - "openssl", - "inspec" - ] - end - - def run_command(expected_exit_code) - expect(command_instance.run(command_options)).to eq(expected_exit_code) - end - - it "defines berks, tk, chef and chef-dk components by default" do - expect(command_instance.components).not_to be_empty - expect(command_instance.components.map(&:name)).to match_array(default_components) - end - - it "has a usage banner" do - expect(command_instance.banner).to eq("Usage: chef verify [component, ...] [options]") - end - - describe "when locating omnibus directory" do - it "should find omnibus app directory from ruby path" do - allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path, "eg_omnibus_dir/valid/embedded/bin/ruby")) - expect(command_instance.omnibus_apps_dir).to include("eg_omnibus_dir/valid/embedded") - end - - it "should raise OmnibusInstallNotFound if directory is not looking like omnibus" do - allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path,".rbenv/versions/2.1.1/bin/ruby")) - expect{command_instance.omnibus_apps_dir}.to raise_error(ChefDK::OmnibusInstallNotFound) - end - - it "raises OmnibusInstallNotFound if omnibus directory doesn't exist" do - allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path,"eg_omnibus_dir/missing_apps/embedded/bin/ruby")) - expect{command_instance.omnibus_apps_dir}.to raise_error(ChefDK::OmnibusInstallNotFound) - end - - it "raises MissingComponentError when a component doesn't exist" do - allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path,"eg_omnibus_dir/missing_component/embedded/bin/ruby")) - expect{command_instance.validate_components!}.to raise_error(ChefDK::MissingComponentError) - end - end - - describe "when running verify command" do - let(:stdout_io) { StringIO.new } - let(:ruby_path) { File.join(fixtures_path, "eg_omnibus_dir/valid/embedded/bin/ruby") } - - def run_unit_test - # Set rubyopt to empty to prevent bundler from infecting the ruby - # subcommands (and loading a bunch of extra gems). - lambda { |_self| sh("#{Gem.real_ruby} verify_me", env: { "RUBYOPT" => ""}) } - end - - def run_integration_test - lambda { |_self| sh("#{Gem.real_ruby} integration_test", env: { "RUBYOPT" => ""}) } - end - - let(:all_tests_ok) do - ChefDK::ComponentTest.new("successful_comp").tap do |c| - c.base_dir = "berkshelf" - c.unit_test(&run_unit_test) - c.integration_test(&run_integration_test) - c.smoke_test { sh("exit 0") } - end - end - - let(:all_tests_ok_2) do - ChefDK::ComponentTest.new("successful_comp_2").tap do |c| - c.base_dir = "test-kitchen" - c.unit_test(&run_unit_test) - c.smoke_test { sh("exit 0") } - end - end - - let(:failing_unit_test) do - ChefDK::ComponentTest.new("failing_comp").tap do |c| - c.base_dir = "chef" - c.unit_test(&run_unit_test) - c.smoke_test { sh("exit 0") } - end - end - - let(:passing_smoke_test_only) do - component = failing_unit_test.dup - component.smoke_test { sh("exit 0") } - component - end - - let(:failing_smoke_test_only) do - component = all_tests_ok.dup - component.smoke_test { sh("exit 1") } - component - end - - let(:component_without_integration_tests) do - ChefDK::ComponentTest.new("successful_comp").tap do |c| - c.base_dir = "berkshelf" - c.unit_test { sh("./verify_me") } - c.smoke_test { sh("exit 0") } - end - end - - def stdout - stdout_io.string - end - - before do - allow(Gem).to receive(:ruby).and_return(ruby_path) - allow(command_instance).to receive(:stdout).and_return(stdout_io) - allow(command_instance).to receive(:components).and_return(components) - end - - context "when running smoke tests only" do - describe "with single command with success" do - let(:components) do - [ passing_smoke_test_only ] - end - - before do - run_command(0) - end - - it "should report the success of the command" do - expect(stdout).to include("Verification of component 'failing_comp' succeeded.") - end - - end - - describe "with single command with failure" do - let(:components) do - [ failing_smoke_test_only ] - end - - before do - run_command(1) - end - - it "should report the failure of the command" do - expect(stdout).to include("Verification of component 'successful_comp' failed.") - end - - end - end - - context "when running unit tests" do - - let(:command_options) { %w{--unit --verbose} } - - let(:components) do - [ all_tests_ok ] - end - - describe "with single command with success" do - before do - run_command(0) - end - - it "should have embedded/bin on the PATH" do - expect(stdout).to include(File.join(fixtures_path, "eg_omnibus_dir/valid/embedded/bin")) - end - - it "should report the success of the command" do - expect(stdout).to include("Verification of component 'successful_comp' succeeded.") - end - - it "reports the component test output" do - expect(stdout).to include("you are good to go...") - end - - context "and --verbose is not enabled" do - - let(:command_options) { %w{--unit} } - - it "omits the component test output" do - expect(stdout).to_not include("you are good to go...") - end - end - - context "and --integration flag is given" do - - let(:command_options) { %w{--integration --verbose} } - - it "should run the integration command also" do - expect(stdout).to include("integration tests OK") - end - - context "and no integration test command is specifed for the component" do - - let(:components) do - [ component_without_integration_tests ] - end - - it "skips the integration test and succeeds" do - expect(stdout).to include("Verification of component 'successful_comp' succeeded.") - end - - end - - end - - end - - describe "with single command with failure" do - let(:components) do - [ failing_unit_test ] - end - - before do - run_command(1) - end - - it "should report the failure of the command" do - expect(stdout).to include("Verification of component 'failing_comp' failed.") - end - - it "reports the component test output" do - expect(stdout).to include("i'm not feeling good today...") - end - end - - describe "with multiple commands with success" do - let(:components) do - [ all_tests_ok, all_tests_ok_2 ] - end - - before do - run_command(0) - end - - it "should report the success of the command" do - expect(stdout).to include("Verification of component 'successful_comp' succeeded.") - expect(stdout).to include("Verification of component 'successful_comp_2' succeeded.") - end - - it "reports the component test outputs" do - expect(stdout).to include("you are good to go...") - expect(stdout).to include("my friend everything is good...") - end - - context "and components are filtered by CLI args" do - - let(:command_options) { [ "successful_comp_2" ] } - - it "verifies only the desired component" do - expect(stdout).to_not include("Verification of component 'successful_comp_1' succeeded.") - expect(stdout).to include("Verification of component 'successful_comp_2' succeeded.") - end - - end - end - - describe "with multiple commands with failures" do - let(:components) do - [ all_tests_ok, all_tests_ok_2, failing_unit_test ] - end - - before do - run_command(1) - end - - it "should report the success and failure of the commands" do - expect(stdout).to include("Verification of component 'successful_comp' succeeded.") - expect(stdout).to include("Verification of component 'successful_comp_2' succeeded.") - expect(stdout).to include("Verification of component 'failing_comp' failed.") - end - - it "reports the component test outputs" do - expect(stdout).to include("you are good to go...") - expect(stdout).to include("my friend everything is good...") - expect(stdout).to include("i'm not feeling good today...") - 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 'chef-dk/command/verify' + +module Gem + + # We stub Gem.ruby because `verify` uses it to locate the omnibus directory, + # but we also use it in some of the "test commands" in these tests. + class << self + alias :real_ruby :ruby + end +end + +describe ChefDK::Command::Verify do + let(:command_instance) { ChefDK::Command::Verify.new() } + + let(:command_options) { [] } + + let(:components) { {} } + + let(:default_components) do + [ + "berkshelf", + "test-kitchen", + "tk-policyfile-provisioner", + "chef-client", + "chef-dk", + "chef-provisioning", + "chefspec", + "generated-cookbooks-pass-chefspec", + "rubocop", + "fauxhai", + "knife-spork", + "kitchen-vagrant", + "package installation", + "openssl", + "inspec" + ] + end + + def run_command(expected_exit_code) + expect(command_instance.run(command_options)).to eq(expected_exit_code) + end + + it "defines berks, tk, chef and chef-dk components by default" do + expect(command_instance.components).not_to be_empty + expect(command_instance.components.map(&:name)).to match_array(default_components) + end + + it "has a usage banner" do + expect(command_instance.banner).to eq("Usage: chef verify [component, ...] [options]") + end + + describe "when locating omnibus directory" do + it "should find omnibus app directory from ruby path" do + allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path, "eg_omnibus_dir/valid/embedded/bin/ruby")) + expect(command_instance.omnibus_apps_dir).to include("eg_omnibus_dir/valid/embedded") + end + + it "should raise OmnibusInstallNotFound if directory is not looking like omnibus" do + allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path,".rbenv/versions/2.1.1/bin/ruby")) + expect{command_instance.omnibus_apps_dir}.to raise_error(ChefDK::OmnibusInstallNotFound) + end + + it "raises OmnibusInstallNotFound if omnibus directory doesn't exist" do + allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path,"eg_omnibus_dir/missing_apps/embedded/bin/ruby")) + expect{command_instance.omnibus_apps_dir}.to raise_error(ChefDK::OmnibusInstallNotFound) + end + + it "raises MissingComponentError when a component doesn't exist" do + allow(Gem).to receive(:ruby).and_return(File.join(fixtures_path,"eg_omnibus_dir/missing_component/embedded/bin/ruby")) + expect{command_instance.validate_components!}.to raise_error(ChefDK::MissingComponentError) + end + end + + describe "when running verify command" do + let(:stdout_io) { StringIO.new } + let(:ruby_path) { File.join(fixtures_path, "eg_omnibus_dir/valid/embedded/bin/ruby") } + + def run_unit_test + # Set rubyopt to empty to prevent bundler from infecting the ruby + # subcommands (and loading a bunch of extra gems). + lambda { |_self| sh("#{Gem.real_ruby} verify_me", env: { "RUBYOPT" => ""}) } + end + + def run_integration_test + lambda { |_self| sh("#{Gem.real_ruby} integration_test", env: { "RUBYOPT" => ""}) } + end + + let(:all_tests_ok) do + ChefDK::ComponentTest.new("successful_comp").tap do |c| + c.base_dir = "berkshelf" + c.unit_test(&run_unit_test) + c.integration_test(&run_integration_test) + c.smoke_test { sh("exit 0") } + end + end + + let(:all_tests_ok_2) do + ChefDK::ComponentTest.new("successful_comp_2").tap do |c| + c.base_dir = "test-kitchen" + c.unit_test(&run_unit_test) + c.smoke_test { sh("exit 0") } + end + end + + let(:failing_unit_test) do + ChefDK::ComponentTest.new("failing_comp").tap do |c| + c.base_dir = "chef" + c.unit_test(&run_unit_test) + c.smoke_test { sh("exit 0") } + end + end + + let(:passing_smoke_test_only) do + component = failing_unit_test.dup + component.smoke_test { sh("exit 0") } + component + end + + let(:failing_smoke_test_only) do + component = all_tests_ok.dup + component.smoke_test { sh("exit 1") } + component + end + + let(:component_without_integration_tests) do + ChefDK::ComponentTest.new("successful_comp").tap do |c| + c.base_dir = "berkshelf" + c.unit_test { sh("./verify_me") } + c.smoke_test { sh("exit 0") } + end + end + + def stdout + stdout_io.string + end + + before do + allow(Gem).to receive(:ruby).and_return(ruby_path) + allow(command_instance).to receive(:stdout).and_return(stdout_io) + allow(command_instance).to receive(:components).and_return(components) + end + + context "when running smoke tests only" do + describe "with single command with success" do + let(:components) do + [ passing_smoke_test_only ] + end + + before do + run_command(0) + end + + it "should report the success of the command" do + expect(stdout).to include("Verification of component 'failing_comp' succeeded.") + end + + end + + describe "with single command with failure" do + let(:components) do + [ failing_smoke_test_only ] + end + + before do + run_command(1) + end + + it "should report the failure of the command" do + expect(stdout).to include("Verification of component 'successful_comp' failed.") + end + + end + end + + context "when running unit tests" do + + let(:command_options) { %w{--unit --verbose} } + + let(:components) do + [ all_tests_ok ] + end + + describe "with single command with success" do + before do + run_command(0) + end + + it "should have embedded/bin on the PATH" do + expect(stdout).to include(File.join(fixtures_path, "eg_omnibus_dir/valid/embedded/bin")) + end + + it "should report the success of the command" do + expect(stdout).to include("Verification of component 'successful_comp' succeeded.") + end + + it "reports the component test output" do + expect(stdout).to include("you are good to go...") + end + + context "and --verbose is not enabled" do + + let(:command_options) { %w{--unit} } + + it "omits the component test output" do + expect(stdout).to_not include("you are good to go...") + end + end + + context "and --integration flag is given" do + + let(:command_options) { %w{--integration --verbose} } + + it "should run the integration command also" do + expect(stdout).to include("integration tests OK") + end + + context "and no integration test command is specifed for the component" do + + let(:components) do + [ component_without_integration_tests ] + end + + it "skips the integration test and succeeds" do + expect(stdout).to include("Verification of component 'successful_comp' succeeded.") + end + + end + + end + + end + + describe "with single command with failure" do + let(:components) do + [ failing_unit_test ] + end + + before do + run_command(1) + end + + it "should report the failure of the command" do + expect(stdout).to include("Verification of component 'failing_comp' failed.") + end + + it "reports the component test output" do + expect(stdout).to include("i'm not feeling good today...") + end + end + + describe "with multiple commands with success" do + let(:components) do + [ all_tests_ok, all_tests_ok_2 ] + end + + before do + run_command(0) + end + + it "should report the success of the command" do + expect(stdout).to include("Verification of component 'successful_comp' succeeded.") + expect(stdout).to include("Verification of component 'successful_comp_2' succeeded.") + end + + it "reports the component test outputs" do + expect(stdout).to include("you are good to go...") + expect(stdout).to include("my friend everything is good...") + end + + context "and components are filtered by CLI args" do + + let(:command_options) { [ "successful_comp_2" ] } + + it "verifies only the desired component" do + expect(stdout).to_not include("Verification of component 'successful_comp_1' succeeded.") + expect(stdout).to include("Verification of component 'successful_comp_2' succeeded.") + end + + end + end + + describe "with multiple commands with failures" do + let(:components) do + [ all_tests_ok, all_tests_ok_2, failing_unit_test ] + end + + before do + run_command(1) + end + + it "should report the success and failure of the commands" do + expect(stdout).to include("Verification of component 'successful_comp' succeeded.") + expect(stdout).to include("Verification of component 'successful_comp_2' succeeded.") + expect(stdout).to include("Verification of component 'failing_comp' failed.") + end + + it "reports the component test outputs" do + expect(stdout).to include("you are good to go...") + expect(stdout).to include("my friend everything is good...") + expect(stdout).to include("i'm not feeling good today...") + end + end + + end + end + +end