summaryrefslogtreecommitdiff
path: root/spec/unit/knife/cookbook_site_download_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/knife/cookbook_site_download_spec.rb')
-rw-r--r--spec/unit/knife/cookbook_site_download_spec.rb151
1 files changed, 151 insertions, 0 deletions
diff --git a/spec/unit/knife/cookbook_site_download_spec.rb b/spec/unit/knife/cookbook_site_download_spec.rb
new file mode 100644
index 0000000000..a3d43c5b4a
--- /dev/null
+++ b/spec/unit/knife/cookbook_site_download_spec.rb
@@ -0,0 +1,151 @@
+#
+# Author:: Thomas Bishop (<bishop.thomas@gmail.com>)
+# Copyright:: Copyright (c) 2012 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 File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
+
+describe Chef::Knife::CookbookSiteDownload do
+
+ describe 'run' do
+ before do
+ @knife = Chef::Knife::CookbookSiteDownload.new
+ @knife.name_args = ['apache2']
+ @noauth_rest = mock 'no auth rest'
+ @stdout = StringIO.new
+ @cookbook_api_url = 'http://cookbooks.opscode.com/api/v1/cookbooks'
+ @version = '1.0.2'
+ @version_us = @version.gsub '.', '_'
+ @current_data = { 'deprecated' => false,
+ 'latest_version' => "#{@cookbook_api_url}/apache2/versions/#{@version_us}",
+ 'replacement' => 'other_apache2' }
+
+ @knife.ui.stub(:stdout).and_return(@stdout)
+ @knife.stub(:noauth_rest).and_return(@noauth_rest)
+ @noauth_rest.should_receive(:get_rest).
+ with("#{@cookbook_api_url}/apache2").
+ and_return(@current_data)
+ 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
+ @knife.ui.should_receive(:warn).
+ with(/.+deprecated.+replaced by other_apache2.+/i)
+ @knife.ui.should_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 = stub :path => "/tmp/apache2_#{@version_us}.tgz"
+ @file = File.join(Dir.pwd, "apache2-#{@version}.tar.gz")
+
+ @noauth_rest.should_receive(:sign_on_redirect=).with(false)
+ end
+
+ context 'downloading the latest version' do
+ before do
+ @noauth_rest.should_receive(:get_rest).
+ with(@current_data['latest_version']).
+ and_return(@cookbook_data)
+ @noauth_rest.should_receive(:get_rest).
+ with(@cookbook_data['file'], true).
+ 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
+ @knife.ui.should_receive(:warn).
+ with(/.+deprecated.+replaced by other_apache2.+/i)
+ FileUtils.should_receive(:cp).with(@temp_file.path, @file)
+ @knife.run
+ @stdout.string.should match /downloading apache2.+version.+#{Regexp.escape(@version)}/i
+ @stdout.string.should match /cookbook save.+#{Regexp.escape(@file)}/i
+ end
+
+ end
+
+ it 'should download the latest version' do
+ FileUtils.should_receive(:cp).with(@temp_file.path, @file)
+ @knife.run
+ @stdout.string.should match /downloading apache2.+version.+#{Regexp.escape(@version)}/i
+ @stdout.string.should 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
+ FileUtils.should_receive(:cp).with(@temp_file.path, @file)
+ end
+
+ it 'should download the cookbook to the desired file' do
+ @knife.run
+ @stdout.string.should match /downloading apache2.+version.+#{Regexp.escape(@version)}/i
+ @stdout.string.should match /cookbook save.+#{Regexp.escape(@file)}/i
+ end
+ end
+
+ it 'should provide an accessor to the version' do
+ FileUtils.stub(:cp).and_return(true)
+ @knife.version.should == @version
+ @knife.run
+ end
+ end
+
+ context 'downloading a cookbook of a specific version' do
+ before do
+ @version = '1.0.1'
+ @version_us = @version.gsub '.', '_'
+ @cookbook_data = { 'version' => @version,
+ 'file' => "http://example.com/apache2_#{@version_us}.tgz" }
+ @temp_file = stub :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
+ @noauth_rest.should_receive(:get_rest).
+ with("#{@cookbook_api_url}/apache2/versions/#{@version_us}").
+ and_return(@cookbook_data)
+ @noauth_rest.should_receive(:get_rest).
+ with(@cookbook_data['file'], true).
+ and_return(@temp_file)
+ FileUtils.should_receive(:cp).with(@temp_file.path, @file)
+ @knife.run
+ @stdout.string.should match /downloading apache2.+version.+#{Regexp.escape(@version)}/i
+ @stdout.string.should match /cookbook save.+#{Regexp.escape(@file)}/i
+ end
+ end
+
+ end
+
+ end
+
+end