diff options
Diffstat (limited to 'spec/unit/knife/supermarket_download_spec.rb')
-rw-r--r-- | spec/unit/knife/supermarket_download_spec.rb | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/spec/unit/knife/supermarket_download_spec.rb b/spec/unit/knife/supermarket_download_spec.rb new file mode 100644 index 0000000000..0332bd4390 --- /dev/null +++ b/spec/unit/knife/supermarket_download_spec.rb @@ -0,0 +1,152 @@ +# +# Author:: Thomas Bishop (<bishop.thomas@gmail.com>) +# Copyright:: Copyright 2012-2016, Thomas Bishop +# Copyright:: Copyright 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 "chef/knife/supermarket_download" +require "spec_helper" + +describe Chef::Knife::SupermarketDownload do + + describe "run" do + before do + @knife = Chef::Knife::SupermarketDownload.new + @knife.name_args = ["apache2"] + @noauth_rest = double("no auth rest") + @stderr = StringIO.new + @cookbook_api_url = "https://supermarket.chef.io/api/v1/cookbooks" + @version = "1.0.2" + @version_us = @version.tr ".", "_" + @current_data = { "deprecated" => false, + "latest_version" => "#{@cookbook_api_url}/apache2/versions/#{@version_us}", + "replacement" => "other_apache2" } + + allow(@knife.ui).to receive(:stderr).and_return(@stderr) + allow(@knife).to receive(:noauth_rest).and_return(@noauth_rest) + expect(@noauth_rest).to receive(:get) + .with("#{@cookbook_api_url}/apache2") + .and_return(@current_data) + @knife.configure_chef + end + + context "when the cookbook is deprecated and not forced" do + before do + @current_data["deprecated"] = true + end + + it "should warn with info about the replacement" do + expect(@knife.ui).to receive(:warn) + .with(/.+deprecated.+replaced by other_apache2.+/i) + expect(@knife.ui).to receive(:warn) + .with(/use --force.+download.+/i) + @knife.run + end + end + + context "when" do + before do + @cookbook_data = { "version" => @version, + "file" => "http://example.com/apache2_#{@version_us}.tgz" } + @temp_file = double( path: "/tmp/apache2_#{@version_us}.tgz" ) + @file = File.join(Dir.pwd, "apache2-#{@version}.tar.gz") + end + + context "downloading the latest version" do + before do + expect(@noauth_rest).to receive(:get) + .with(@current_data["latest_version"]) + .and_return(@cookbook_data) + expect(@noauth_rest).to receive(:streaming_request) + .with(@cookbook_data["file"]) + .and_return(@temp_file) + end + + context "and it is deprecated and with --force" do + before do + @current_data["deprecated"] = true + @knife.config[:force] = true + end + + it "should download the latest version" do + expect(@knife.ui).to receive(:warn) + .with(/.+deprecated.+replaced by other_apache2.+/i) + expect(FileUtils).to receive(:cp).with(@temp_file.path, @file) + @knife.run + expect(@stderr.string).to match /downloading apache2.+version.+#{Regexp.escape(@version)}/i + expect(@stderr.string).to match /cookbook save.+#{Regexp.escape(@file)}/i + end + + end + + it "should download the latest version" do + expect(FileUtils).to receive(:cp).with(@temp_file.path, @file) + @knife.run + expect(@stderr.string).to match /downloading apache2.+version.+#{Regexp.escape(@version)}/i + expect(@stderr.string).to match /cookbook save.+#{Regexp.escape(@file)}/i + end + + context "with -f or --file" do + before do + @file = "/opt/chef/cookbooks/apache2.tar.gz" + @knife.config[:file] = @file + expect(FileUtils).to receive(:cp).with(@temp_file.path, @file) + end + + it "should download the cookbook to the desired file" do + @knife.run + expect(@stderr.string).to match /downloading apache2.+version.+#{Regexp.escape(@version)}/i + expect(@stderr.string).to match /cookbook save.+#{Regexp.escape(@file)}/i + end + end + + it "should provide an accessor to the version" do + allow(FileUtils).to receive(:cp).and_return(true) + expect(@knife.version).to eq(@version) + @knife.run + end + end + + context "downloading a cookbook of a specific version" do + before do + @version = "1.0.1" + @version_us = @version.tr ".", "_" + @cookbook_data = { "version" => @version, + "file" => "http://example.com/apache2_#{@version_us}.tgz" } + @temp_file = double(path: "/tmp/apache2_#{@version_us}.tgz") + @file = File.join(Dir.pwd, "apache2-#{@version}.tar.gz") + @knife.name_args << @version + end + + it "should download the desired version" do + expect(@noauth_rest).to receive(:get) + .with("#{@cookbook_api_url}/apache2/versions/#{@version_us}") + .and_return(@cookbook_data) + expect(@noauth_rest).to receive(:streaming_request) + .with(@cookbook_data["file"]) + .and_return(@temp_file) + expect(FileUtils).to receive(:cp).with(@temp_file.path, @file) + @knife.run + expect(@stderr.string).to match /downloading apache2.+version.+#{Regexp.escape(@version)}/i + expect(@stderr.string).to match /cookbook save.+#{Regexp.escape(@file)}/i + end + end + + end + + end + +end |