spec/unit/knife/cookbook_delete_spec.rb in knife-18.0.185 vs spec/unit/knife/cookbook_delete_spec.rb in knife-18.1.0

- old
+ new

@@ -1,239 +1,239 @@ -# -# Author:: Thomas Bishop (<bishop.thomas@gmail.com>) -# Copyright:: Copyright 2011-2016, Thomas Bishop -# 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 "knife_spec_helper" - -describe Chef::Knife::CookbookDelete do - before(:each) do - @knife = Chef::Knife::CookbookDelete.new - @knife.name_args = ["foobar"] - @knife.cookbook_name = "foobar" - @stdout = StringIO.new - allow(@knife.ui).to receive(:stdout).and_return(@stdout) - @stderr = StringIO.new - allow(@knife.ui).to receive(:stderr).and_return(@stderr) - end - - describe "run" do - it "should print usage and exit when a cookbook name is not provided" do - @knife.name_args = [] - expect(@knife).to receive(:show_usage) - expect(@knife.ui).to receive(:fatal) - expect { @knife.run }.to raise_error(SystemExit) - end - - describe "when specifying a cookbook name" do - it "should delete the cookbook without a specific version" do - expect(@knife).to receive(:delete_without_explicit_version) - @knife.run - end - - describe "and a version" do - it "should delete the specific version of the cookbook" do - @knife.name_args << "1.0.0" - expect(@knife).to receive(:delete_explicit_version) - @knife.run - end - end - - describe "with -a or --all" do - it "should delete all versions of the cookbook" do - @knife.config[:all] = true - expect(@knife).to receive(:delete_all_versions) - @knife.run - end - end - - describe "with -p or --purge" do - it "should prompt to purge the files" do - @knife.config[:purge] = true - expect(@knife).to receive(:confirm) - .with(/.+Are you sure you want to purge files.+/) - expect(@knife).to receive(:delete_without_explicit_version) - @knife.run - end - end - end - end - - describe "delete_explicit_version" do - it "should delete the specific cookbook version" do - @knife.cookbook_name = "foobar" - @knife.version = "1.0.0" - expect(@knife).to receive(:delete_object).with(Chef::CookbookVersion, - "foobar version 1.0.0", - "cookbook").and_yield - expect(@knife).to receive(:delete_request).with("cookbooks/foobar/1.0.0") - @knife.delete_explicit_version - end - end - - describe "delete_all_versions" do - it "should prompt to delete all versions of the cookbook" do - @knife.cookbook_name = "foobar" - expect(@knife).to receive(:confirm).with("Do you really want to delete all versions of foobar") - expect(@knife).to receive(:delete_all_without_confirmation) - @knife.delete_all_versions - end - end - - describe "delete_all_without_confirmation" do - it "should delete all versions without confirmation" do - versions = ["1.0.0", "1.1.0"] - expect(@knife).to receive(:available_versions).and_return(versions) - versions.each do |v| - expect(@knife).to receive(:delete_version_without_confirmation).with(v) - end - @knife.delete_all_without_confirmation - end - end - - describe "delete_without_explicit_version" do - it "should exit if there are no available versions" do - expect(@knife).to receive(:available_versions).and_return(nil) - expect { @knife.delete_without_explicit_version }.to raise_error(SystemExit) - end - - it "should delete the version if only one is found" do - expect(@knife).to receive(:available_versions).at_least(:once).and_return(["1.0.0"]) - expect(@knife).to receive(:delete_explicit_version) - @knife.delete_without_explicit_version - end - - it "should ask which version(s) to delete if multiple are found" do - expect(@knife).to receive(:available_versions).at_least(:once).and_return(["1.0.0", "1.1.0"]) - expect(@knife).to receive(:ask_which_versions_to_delete).and_return(["1.0.0", "1.1.0"]) - expect(@knife).to receive(:delete_versions_without_confirmation).with(["1.0.0", "1.1.0"]) - @knife.delete_without_explicit_version - end - end - - describe "available_versions" do - before(:each) do - @rest_mock = double("rest") - expect(@knife).to receive(:rest).and_return(@rest_mock) - @cookbook_data = { "foobar" => { "versions" => [{ "version" => "1.0.0" }, - { "version" => "1.1.0" }, - { "version" => "2.0.0" } ] }, - } - end - - it "should return the list of versions of the cookbook" do - expect(@rest_mock).to receive(:get).with("cookbooks/foobar").and_return(@cookbook_data) - expect(@knife.available_versions).to eq(["1.0.0", "1.1.0", "2.0.0"]) - end - - it "should raise if an error other than HTTP 404 is returned" do - exception = Net::HTTPClientException.new("500 Internal Server Error", "500") - expect(@rest_mock).to receive(:get).and_raise(exception) - expect { @knife.available_versions }.to raise_error Net::HTTPClientException - end - - describe "if the cookbook can't be found" do - before(:each) do - expect(@rest_mock).to receive(:get) - .and_raise(Net::HTTPClientException.new("404 Not Found", "404")) - end - - it "should print an error" do - @knife.available_versions - expect(@stderr.string).to match(/error.+cannot find a cookbook named foobar/i) - end - - it "should return nil" do - expect(@knife.available_versions).to eq(nil) - end - end - end - - describe "ask_which_version_to_delete" do - before(:each) do - allow(@knife).to receive(:available_versions).and_return(["1.0.0", "1.1.0", "2.0.0"]) - end - - it "should prompt the user to select a version" do - prompt = /Which version\(s\) do you want to delete\?.+1\. foobar 1\.0\.0.+2\. foobar 1\.1\.0.+3\. foobar 2\.0\.0.+4\. All versions.+/m - expect(@knife).to receive(:ask_question).with(prompt).and_return("1") - @knife.ask_which_versions_to_delete - end - - it "should print an error and exit if a version wasn't specified" do - expect(@knife).to receive(:ask_question).and_return("") - expect(@knife.ui).to receive(:error).with(/no versions specified/i) - expect { @knife.ask_which_versions_to_delete }.to raise_error(SystemExit) - end - - it "should print an error if an invalid choice was selected" do - expect(@knife).to receive(:ask_question).and_return("100") - expect(@knife.ui).to receive(:error).with(/100 is not a valid choice/i) - @knife.ask_which_versions_to_delete - end - - it "should return the selected versions" do - expect(@knife).to receive(:ask_question).and_return("1, 3") - expect(@knife.ask_which_versions_to_delete).to eq(["1.0.0", "2.0.0"]) - end - - it "should return all of the versions if 'all' was selected" do - expect(@knife).to receive(:ask_question).and_return("4") - expect(@knife.ask_which_versions_to_delete).to eq([:all]) - end - end - - describe "delete_version_without_confirmation" do - it "should delete the cookbook version" do - expect(@knife).to receive(:delete_request).with("cookbooks/foobar/1.0.0") - @knife.delete_version_without_confirmation("1.0.0") - end - - it "should output that the cookbook was deleted" do - allow(@knife).to receive(:delete_request) - @knife.delete_version_without_confirmation("1.0.0") - expect(@stderr.string).to match(/deleted cookbook\[foobar\]\[1.0.0\]/im) - end - - describe "with --print-after" do - it "should display the cookbook data" do - object = "" - @knife.config[:print_after] = true - allow(@knife).to receive(:delete_request).and_return(object) - expect(@knife).to receive(:format_for_display).with(object) - @knife.delete_version_without_confirmation("1.0.0") - end - end - end - - describe "delete_versions_without_confirmation" do - it "should delete each version without confirmation" do - versions = ["1.0.0", "1.1.0"] - versions.each do |v| - expect(@knife).to receive(:delete_version_without_confirmation).with(v) - end - @knife.delete_versions_without_confirmation(versions) - end - - describe "with -a or --all" do - it "should delete all versions without confirmation" do - versions = [:all] - expect(@knife).to receive(:delete_all_without_confirmation) - @knife.delete_versions_without_confirmation(versions) - end - end - end - -end +# +# Author:: Thomas Bishop (<bishop.thomas@gmail.com>) +# Copyright:: Copyright 2011-2016, Thomas Bishop +# 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 "knife_spec_helper" + +describe Chef::Knife::CookbookDelete do + before(:each) do + @knife = Chef::Knife::CookbookDelete.new + @knife.name_args = ["foobar"] + @knife.cookbook_name = "foobar" + @stdout = StringIO.new + allow(@knife.ui).to receive(:stdout).and_return(@stdout) + @stderr = StringIO.new + allow(@knife.ui).to receive(:stderr).and_return(@stderr) + end + + describe "run" do + it "should print usage and exit when a cookbook name is not provided" do + @knife.name_args = [] + expect(@knife).to receive(:show_usage) + expect(@knife.ui).to receive(:fatal) + expect { @knife.run }.to raise_error(SystemExit) + end + + describe "when specifying a cookbook name" do + it "should delete the cookbook without a specific version" do + expect(@knife).to receive(:delete_without_explicit_version) + @knife.run + end + + describe "and a version" do + it "should delete the specific version of the cookbook" do + @knife.name_args << "1.0.0" + expect(@knife).to receive(:delete_explicit_version) + @knife.run + end + end + + describe "with -a or --all" do + it "should delete all versions of the cookbook" do + @knife.config[:all] = true + expect(@knife).to receive(:delete_all_versions) + @knife.run + end + end + + describe "with -p or --purge" do + it "should prompt to purge the files" do + @knife.config[:purge] = true + expect(@knife).to receive(:confirm) + .with(/.+Are you sure you want to purge files.+/) + expect(@knife).to receive(:delete_without_explicit_version) + @knife.run + end + end + end + end + + describe "delete_explicit_version" do + it "should delete the specific cookbook version" do + @knife.cookbook_name = "foobar" + @knife.version = "1.0.0" + expect(@knife).to receive(:delete_object).with(Chef::CookbookVersion, + "foobar version 1.0.0", + "cookbook").and_yield + expect(@knife).to receive(:delete_request).with("cookbooks/foobar/1.0.0") + @knife.delete_explicit_version + end + end + + describe "delete_all_versions" do + it "should prompt to delete all versions of the cookbook" do + @knife.cookbook_name = "foobar" + expect(@knife).to receive(:confirm).with("Do you really want to delete all versions of foobar") + expect(@knife).to receive(:delete_all_without_confirmation) + @knife.delete_all_versions + end + end + + describe "delete_all_without_confirmation" do + it "should delete all versions without confirmation" do + versions = ["1.0.0", "1.1.0"] + expect(@knife).to receive(:available_versions).and_return(versions) + versions.each do |v| + expect(@knife).to receive(:delete_version_without_confirmation).with(v) + end + @knife.delete_all_without_confirmation + end + end + + describe "delete_without_explicit_version" do + it "should exit if there are no available versions" do + expect(@knife).to receive(:available_versions).and_return(nil) + expect { @knife.delete_without_explicit_version }.to raise_error(SystemExit) + end + + it "should delete the version if only one is found" do + expect(@knife).to receive(:available_versions).at_least(:once).and_return(["1.0.0"]) + expect(@knife).to receive(:delete_explicit_version) + @knife.delete_without_explicit_version + end + + it "should ask which version(s) to delete if multiple are found" do + expect(@knife).to receive(:available_versions).at_least(:once).and_return(["1.0.0", "1.1.0"]) + expect(@knife).to receive(:ask_which_versions_to_delete).and_return(["1.0.0", "1.1.0"]) + expect(@knife).to receive(:delete_versions_without_confirmation).with(["1.0.0", "1.1.0"]) + @knife.delete_without_explicit_version + end + end + + describe "available_versions" do + before(:each) do + @rest_mock = double("rest") + expect(@knife).to receive(:rest).and_return(@rest_mock) + @cookbook_data = { "foobar" => { "versions" => [{ "version" => "1.0.0" }, + { "version" => "1.1.0" }, + { "version" => "2.0.0" } ] }, + } + end + + it "should return the list of versions of the cookbook" do + expect(@rest_mock).to receive(:get).with("cookbooks/foobar").and_return(@cookbook_data) + expect(@knife.available_versions).to eq(["1.0.0", "1.1.0", "2.0.0"]) + end + + it "should raise if an error other than HTTP 404 is returned" do + exception = Net::HTTPClientException.new("500 Internal Server Error", "500") + expect(@rest_mock).to receive(:get).and_raise(exception) + expect { @knife.available_versions }.to raise_error Net::HTTPClientException + end + + describe "if the cookbook can't be found" do + before(:each) do + expect(@rest_mock).to receive(:get) + .and_raise(Net::HTTPClientException.new("404 Not Found", "404")) + end + + it "should print an error" do + @knife.available_versions + expect(@stderr.string).to match(/error.+cannot find a cookbook named foobar/i) + end + + it "should return nil" do + expect(@knife.available_versions).to eq(nil) + end + end + end + + describe "ask_which_version_to_delete" do + before(:each) do + allow(@knife).to receive(:available_versions).and_return(["1.0.0", "1.1.0", "2.0.0"]) + end + + it "should prompt the user to select a version" do + prompt = /Which version\(s\) do you want to delete\?.+1\. foobar 1\.0\.0.+2\. foobar 1\.1\.0.+3\. foobar 2\.0\.0.+4\. All versions.+/m + expect(@knife).to receive(:ask_question).with(prompt).and_return("1") + @knife.ask_which_versions_to_delete + end + + it "should print an error and exit if a version wasn't specified" do + expect(@knife).to receive(:ask_question).and_return("") + expect(@knife.ui).to receive(:error).with(/no versions specified/i) + expect { @knife.ask_which_versions_to_delete }.to raise_error(SystemExit) + end + + it "should print an error if an invalid choice was selected" do + expect(@knife).to receive(:ask_question).and_return("100") + expect(@knife.ui).to receive(:error).with(/100 is not a valid choice/i) + @knife.ask_which_versions_to_delete + end + + it "should return the selected versions" do + expect(@knife).to receive(:ask_question).and_return("1, 3") + expect(@knife.ask_which_versions_to_delete).to eq(["1.0.0", "2.0.0"]) + end + + it "should return all of the versions if 'all' was selected" do + expect(@knife).to receive(:ask_question).and_return("4") + expect(@knife.ask_which_versions_to_delete).to eq([:all]) + end + end + + describe "delete_version_without_confirmation" do + it "should delete the cookbook version" do + expect(@knife).to receive(:delete_request).with("cookbooks/foobar/1.0.0") + @knife.delete_version_without_confirmation("1.0.0") + end + + it "should output that the cookbook was deleted" do + allow(@knife).to receive(:delete_request) + @knife.delete_version_without_confirmation("1.0.0") + expect(@stderr.string).to match(/deleted cookbook\[foobar\]\[1.0.0\]/im) + end + + describe "with --print-after" do + it "should display the cookbook data" do + object = "" + @knife.config[:print_after] = true + allow(@knife).to receive(:delete_request).and_return(object) + expect(@knife).to receive(:format_for_display).with(object) + @knife.delete_version_without_confirmation("1.0.0") + end + end + end + + describe "delete_versions_without_confirmation" do + it "should delete each version without confirmation" do + versions = ["1.0.0", "1.1.0"] + versions.each do |v| + expect(@knife).to receive(:delete_version_without_confirmation).with(v) + end + @knife.delete_versions_without_confirmation(versions) + end + + describe "with -a or --all" do + it "should delete all versions without confirmation" do + versions = [:all] + expect(@knife).to receive(:delete_all_without_confirmation) + @knife.delete_versions_without_confirmation(versions) + end + end + end + +end