spec/unit/cli_spec.rb in chef-dk-3.9.0 vs spec/unit/cli_spec.rb in chef-dk-3.10.1

- old
+ new

@@ -1,377 +1,377 @@ -# Copyright:: Copyright (c) 2014-2018 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 "stringio" -require "chef-dk/cli" -require "unit/fixtures/command/cli_test_command" - -describe ChefDK::CLI do - - let(:argv) { [] } - - # Setup a new commands map so we control what subcommands exist. Otherwise - # we'd have to update this test for every new subcommand we add or code the - # tests defensively. - let(:commands_map) { ChefDK::CommandsMap.new } - - let(:stdout_io) { StringIO.new } - let(:stderr_io) { StringIO.new } - - def stdout - stdout_io.string - end - - def stderr - stderr_io.string - end - - let(:base_help_message) do - <<~E - Usage: - chef -h/--help - chef -v/--version - chef command [arguments...] [options...] - - - Available Commands: - verify Test the embedded ChefDK applications - gem Runs the `gem` command in context of the embedded ruby - example Example subcommand for testing - E - end - - let(:version_message) { "Chef Development Kit Version: #{ChefDK::VERSION}\n" } - - def run_cli(expected_exit_code) - expect(cli).to receive(:exit).with(expected_exit_code) - expect(cli).to receive(:sanity_check!) - cli.run - end - - def run_cli_with_sanity_check(expected_exit_code) - expect(cli).to receive(:exit).with(expected_exit_code) - cli.run - end - - def run_cli_and_validate_tool_versions - full_version_message = version_message - tools.each do |name, version| - expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", "")) - full_version_message += "#{name} version: #{version["expected_version"]}\n" - end - run_cli(0) - expect(stdout).to eq(full_version_message) - end - - def mock_shell_out(exitstatus, stdout, stderr) - shell_out = double("mixlib_shell_out") - allow(shell_out).to receive(:exitstatus).and_return(exitstatus) - allow(shell_out).to receive(:stdout).and_return(stdout) - allow(shell_out).to receive(:stderr).and_return(stderr) - shell_out - end - - subject(:cli) do - ChefDK::CLI.new(argv).tap do |c| - allow(c).to receive(:commands_map).and_return(commands_map) - allow(c).to receive(:stdout).and_return(stdout_io) - allow(c).to receive(:stderr).and_return(stderr_io) - end - end - - before do - commands_map.builtin "verify", :Verify, desc: "Test the embedded ChefDK applications" - - commands_map.builtin "gem", :GemForwarder, require_path: "chef-dk/command/gem", - desc: "Runs the `gem` command in context of the embedded ruby" - - commands_map.builtin "example", :TestCommand, require_path: "unit/fixtures/command/cli_test_command", - desc: "Example subcommand for testing" - end - - context "given no arguments or options" do - - it "prints the help output" do - run_cli(0) - expect(stdout).to eq(base_help_message) - end - - end - - context "given -h" do - let(:argv) { %w{-h} } - - it "prints the help output" do - run_cli(0) - expect(stdout).to eq(base_help_message) - end - end - - context "given -v" do - let(:argv) { %w{-v} } - let(:delivery_version) { "master (454c3f37819ed508a49c971f38e42267ce8a47de)" } - - let(:tools) do - { - "chef-client" => { - "version_output" => "Chef: 12.0.3", - "expected_version" => "12.0.3", - }, - "delivery" => { - "version_output" => "delivery #{delivery_version}", - "expected_version" => delivery_version, - }, - "berks" => { - "version_output" => "3.2.3", - "expected_version" => "3.2.3", - }, - "kitchen" => { - "version_output" => "Test Kitchen version 1.3.1", - "expected_version" => "1.3.1", - }, - "inspec" => { - "version_output" => "1.19.1\n\nYour version of InSpec is out of date! The latest version is 1.21.0.", - "expected_version" => "1.19.1", - }, - } - end - - it "does not print versions of tools with missing or errored tools" do - full_version_message = version_message - tools.each do |name, version| - if name == "berks" - expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(1, "#{version["version_output"]}", "")) - full_version_message += "#{name} version: ERROR\n" - else - expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", "")) - full_version_message += "#{name} version: #{version["expected_version"]}\n" - end - end - run_cli(0) - expect(stdout).to eq(full_version_message) - end - - it "prints the version and versions of chef-dk tools" do - run_cli_and_validate_tool_versions - end - - context "alternate Delivery CLI version format" do - let(:delivery_version) { "0.0.15 (454c3f37819ed508a49c971f38e42267ce8a47de)" } - - it "prints the expected version of Delivery CLI" do - run_cli_and_validate_tool_versions - end - end - end - - context "given an invalid option" do - - let(:argv) { %w{-nope} } - - it "prints an 'invalid option message and the help output, then exits non-zero" do - run_cli(1) - expect(stdout).to eq(base_help_message) - expect(stderr).to eq("invalid option: -nope\n") - end - - end - - context "given an invalid/unknown subcommand" do - let(:argv) { %w{ancient-aliens} } - - it "prints an 'unknown command' message and the help output" do - expected_err = "Unknown command `ancient-aliens'.\n" - - run_cli(1) - - expect(stderr).to eq(expected_err) - expect(stdout).to eq(base_help_message) - end - - end - - context "given a valid subcommand" do - let(:argv) { %w{example with some args --and-an-option} } - - def test_result - ChefDK::Command::TestCommand.test_result - end - - before do - ChefDK::Command::TestCommand.reset! - end - - it "runs the subcommand" do - run_cli(23) - expect(test_result[:status]).to eq(:success) - end - - it "exits with the return code given by the subcommand" do - run_cli(23) - end - - it "passes arguments and options to the subcommand" do - params = %w{with some args --and-an-option} - run_cli(23) - expect(test_result[:params]).to eq(params) - end - end - - context "sanity_check!" do - - before do - allow(Gem).to receive(:ruby).and_return(ruby_path) - allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(true) - allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path) - end - - context "when installed via omnibus" do - - context "on unix" do - - let(:ruby_path) { "/opt/chefdk/embedded/bin/ruby" } - let(:chefdk_embedded_path) { "/opt/chefdk/embedded/apps/chef-dk" } - - before do - stub_const("File::PATH_SEPARATOR", ":") - allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path| - path - end - end - - it "complains if embedded is first" do - allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin:/opt/chefdk/bin" }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - expect(stderr).to include("please reverse that order") - expect(stderr).to include("chef shell-init") - end - - it "complains if only embedded is present" do - allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin" }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - expect(stderr).to include("you must add") - expect(stderr).to include("chef shell-init") - end - - it "passes when both are present in the correct order" do - allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin:/opt/chefdk/embedded/bin" }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - end - - it "passes when only the omnibus bin dir is present" do - allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin" }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - end - end - - context "on windows" do - - let(:ruby_path) { "c:/opscode/chefdk/embedded/bin/ruby.exe" } - let(:chefdk_embedded_path) { "c:/opscode/chefdk/embedded/apps/chef-dk" } - - before do - # Would be preferable not to stub this, but `File.expand_path` does - # weird things with windows paths on unix machines. - # - # I manually verified the behavior: - # - # $ /c/opscode/chefdk/embedded/bin/ruby -e 'p File.expand_path(File.join(Gem.ruby, "..", "..", ".."))' - # "c:/opscode/chefdk" - allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path) - - allow(Chef::Platform).to receive(:windows?).and_return(true) - stub_const("File::PATH_SEPARATOR", ";") - allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path| - path.tr "/", "\\" - end - end - - it "complains if embedded is first" do - allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin;C:\opscode\chefdk\bin' }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - expect(stderr).to include("please reverse that order") - expect(stderr).to include("chef shell-init") - end - - it "complains if only embedded is present" do - allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin' }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - expect(stderr).to include("you must add") - expect(stderr).to include("chef shell-init") - end - - it "passes when both are present in the correct order" do - allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin;C:\opscode\chefdk\embedded\bin' }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - end - - it "passes when only the omnibus bin dir is present" do - allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin' }) - allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") - allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") - run_cli_with_sanity_check(0) - expect(stdout).to eq(base_help_message) - end - end - end - - context "when not installed via omnibus" do - - let(:ruby_path) { "/Users/bog/.lots_o_rubies/2.1.2/bin/ruby" } - let(:chefdk_embedded_path) { "/Users/bog/.lots_o_rubies/embedded/apps/chef-dk" } - - before do - allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(false) - - [ - :omnibus_root, - :omnibus_apps_dir, - :omnibus_bin_dir, - :omnibus_embedded_bin_dir, - ].each do |method_name| - allow(cli).to receive(method_name).and_raise(ChefDK::OmnibusInstallNotFound.new) - end - end - - it "skips the sanity check without error" do - run_cli_with_sanity_check(0) - end - - end - end -end +# Copyright:: Copyright (c) 2014-2018 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 "stringio" +require "chef-dk/cli" +require "unit/fixtures/command/cli_test_command" + +describe ChefDK::CLI do + + let(:argv) { [] } + + # Setup a new commands map so we control what subcommands exist. Otherwise + # we'd have to update this test for every new subcommand we add or code the + # tests defensively. + let(:commands_map) { ChefDK::CommandsMap.new } + + let(:stdout_io) { StringIO.new } + let(:stderr_io) { StringIO.new } + + def stdout + stdout_io.string + end + + def stderr + stderr_io.string + end + + let(:base_help_message) do + <<~E + Usage: + chef -h/--help + chef -v/--version + chef command [arguments...] [options...] + + + Available Commands: + verify Test the embedded ChefDK applications + gem Runs the `gem` command in context of the embedded ruby + example Example subcommand for testing + E + end + + let(:version_message) { "Chef Development Kit Version: #{ChefDK::VERSION}\n" } + + def run_cli(expected_exit_code) + expect(cli).to receive(:exit).with(expected_exit_code) + expect(cli).to receive(:sanity_check!) + cli.run + end + + def run_cli_with_sanity_check(expected_exit_code) + expect(cli).to receive(:exit).with(expected_exit_code) + cli.run + end + + def run_cli_and_validate_tool_versions + full_version_message = version_message + tools.each do |name, version| + expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", "")) + full_version_message += "#{name} version: #{version["expected_version"]}\n" + end + run_cli(0) + expect(stdout).to eq(full_version_message) + end + + def mock_shell_out(exitstatus, stdout, stderr) + shell_out = double("mixlib_shell_out") + allow(shell_out).to receive(:exitstatus).and_return(exitstatus) + allow(shell_out).to receive(:stdout).and_return(stdout) + allow(shell_out).to receive(:stderr).and_return(stderr) + shell_out + end + + subject(:cli) do + ChefDK::CLI.new(argv).tap do |c| + allow(c).to receive(:commands_map).and_return(commands_map) + allow(c).to receive(:stdout).and_return(stdout_io) + allow(c).to receive(:stderr).and_return(stderr_io) + end + end + + before do + commands_map.builtin "verify", :Verify, desc: "Test the embedded ChefDK applications" + + commands_map.builtin "gem", :GemForwarder, require_path: "chef-dk/command/gem", + desc: "Runs the `gem` command in context of the embedded ruby" + + commands_map.builtin "example", :TestCommand, require_path: "unit/fixtures/command/cli_test_command", + desc: "Example subcommand for testing" + end + + context "given no arguments or options" do + + it "prints the help output" do + run_cli(0) + expect(stdout).to eq(base_help_message) + end + + end + + context "given -h" do + let(:argv) { %w{-h} } + + it "prints the help output" do + run_cli(0) + expect(stdout).to eq(base_help_message) + end + end + + context "given -v" do + let(:argv) { %w{-v} } + let(:delivery_version) { "master (454c3f37819ed508a49c971f38e42267ce8a47de)" } + + let(:tools) do + { + "chef-client" => { + "version_output" => "Chef: 12.0.3", + "expected_version" => "12.0.3", + }, + "delivery" => { + "version_output" => "delivery #{delivery_version}", + "expected_version" => delivery_version, + }, + "berks" => { + "version_output" => "3.2.3", + "expected_version" => "3.2.3", + }, + "kitchen" => { + "version_output" => "Test Kitchen version 1.3.1", + "expected_version" => "1.3.1", + }, + "inspec" => { + "version_output" => "1.19.1\n\nYour version of InSpec is out of date! The latest version is 1.21.0.", + "expected_version" => "1.19.1", + }, + } + end + + it "does not print versions of tools with missing or errored tools" do + full_version_message = version_message + tools.each do |name, version| + if name == "berks" + expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(1, "#{version["version_output"]}", "")) + full_version_message += "#{name} version: ERROR\n" + else + expect(cli).to receive(:shell_out).with("#{name} --version").and_return(mock_shell_out(0, "#{version["version_output"]}", "")) + full_version_message += "#{name} version: #{version["expected_version"]}\n" + end + end + run_cli(0) + expect(stdout).to eq(full_version_message) + end + + it "prints the version and versions of chef-dk tools" do + run_cli_and_validate_tool_versions + end + + context "alternate Delivery CLI version format" do + let(:delivery_version) { "0.0.15 (454c3f37819ed508a49c971f38e42267ce8a47de)" } + + it "prints the expected version of Delivery CLI" do + run_cli_and_validate_tool_versions + end + end + end + + context "given an invalid option" do + + let(:argv) { %w{-nope} } + + it "prints an 'invalid option message and the help output, then exits non-zero" do + run_cli(1) + expect(stdout).to eq(base_help_message) + expect(stderr).to eq("invalid option: -nope\n") + end + + end + + context "given an invalid/unknown subcommand" do + let(:argv) { %w{ancient-aliens} } + + it "prints an 'unknown command' message and the help output" do + expected_err = "Unknown command `ancient-aliens'.\n" + + run_cli(1) + + expect(stderr).to eq(expected_err) + expect(stdout).to eq(base_help_message) + end + + end + + context "given a valid subcommand" do + let(:argv) { %w{example with some args --and-an-option} } + + def test_result + ChefDK::Command::TestCommand.test_result + end + + before do + ChefDK::Command::TestCommand.reset! + end + + it "runs the subcommand" do + run_cli(23) + expect(test_result[:status]).to eq(:success) + end + + it "exits with the return code given by the subcommand" do + run_cli(23) + end + + it "passes arguments and options to the subcommand" do + params = %w{with some args --and-an-option} + run_cli(23) + expect(test_result[:params]).to eq(params) + end + end + + context "sanity_check!" do + + before do + allow(Gem).to receive(:ruby).and_return(ruby_path) + allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(true) + allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path) + end + + context "when installed via omnibus" do + + context "on unix" do + + let(:ruby_path) { "/opt/chefdk/embedded/bin/ruby" } + let(:chefdk_embedded_path) { "/opt/chefdk/embedded/apps/chef-dk" } + + before do + stub_const("File::PATH_SEPARATOR", ":") + allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path| + path + end + end + + it "complains if embedded is first" do + allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin:/opt/chefdk/bin" }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + expect(stderr).to include("please reverse that order") + expect(stderr).to include("chef shell-init") + end + + it "complains if only embedded is present" do + allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/embedded/bin" }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + expect(stderr).to include("you must add") + expect(stderr).to include("chef shell-init") + end + + it "passes when both are present in the correct order" do + allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin:/opt/chefdk/embedded/bin" }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + end + + it "passes when only the omnibus bin dir is present" do + allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chefdk/bin" }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + end + end + + context "on windows" do + + let(:ruby_path) { "c:/opscode/chefdk/embedded/bin/ruby.exe" } + let(:chefdk_embedded_path) { "c:/opscode/chefdk/embedded/apps/chef-dk" } + + before do + # Would be preferable not to stub this, but `File.expand_path` does + # weird things with windows paths on unix machines. + # + # I manually verified the behavior: + # + # $ /c/opscode/chefdk/embedded/bin/ruby -e 'p File.expand_path(File.join(Gem.ruby, "..", "..", ".."))' + # "c:/opscode/chefdk" + allow(cli).to receive(:omnibus_chefdk_location).and_return(chefdk_embedded_path) + + allow(Chef::Platform).to receive(:windows?).and_return(true) + stub_const("File::PATH_SEPARATOR", ";") + allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path| + path.tr "/", "\\" + end + end + + it "complains if embedded is first" do + allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin;C:\opscode\chefdk\bin' }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + expect(stderr).to include("please reverse that order") + expect(stderr).to include("chef shell-init") + end + + it "complains if only embedded is present" do + allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\embedded\bin' }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + expect(stderr).to include("you must add") + expect(stderr).to include("chef shell-init") + end + + it "passes when both are present in the correct order" do + allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin;C:\opscode\chefdk\embedded\bin' }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + end + + it "passes when only the omnibus bin dir is present" do + allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chefdk\bin' }) + allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chefdk/embedded/bin") + allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chefdk/bin") + run_cli_with_sanity_check(0) + expect(stdout).to eq(base_help_message) + end + end + end + + context "when not installed via omnibus" do + + let(:ruby_path) { "/Users/bog/.lots_o_rubies/2.1.2/bin/ruby" } + let(:chefdk_embedded_path) { "/Users/bog/.lots_o_rubies/embedded/apps/chef-dk" } + + before do + allow(File).to receive(:exist?).with(chefdk_embedded_path).and_return(false) + + [ + :omnibus_root, + :omnibus_apps_dir, + :omnibus_bin_dir, + :omnibus_embedded_bin_dir, + ].each do |method_name| + allow(cli).to receive(method_name).and_raise(ChefDK::OmnibusInstallNotFound.new) + end + end + + it "skips the sanity check without error" do + run_cli_with_sanity_check(0) + end + + end + end +end