diff --git a/libraries/resource_chef_dk_app.rb b/libraries/resource_chef_dk_app.rb index 7b7ed1f..6044955 100644 --- a/libraries/resource_chef_dk_app.rb +++ b/libraries/resource_chef_dk_app.rb @@ -36,10 +36,8 @@ class ChefDkApp < Resource property :version, [String, FalseClass], default: 'latest', - callbacks: { - 'Invalid version string' => - ->(a) { ::ChefDk::Helpers.valid_version?(a) } - } + callbacks: { 'Invalid version string' => + ->(a) { ::ChefDk::Helpers.valid_version?(a) } } # # The Chef-DK can be installed from the :stable or :current channel. @@ -101,6 +99,14 @@ class ChefDkApp < Resource when :repo install_repo! else + if new_resource.channel != :stable + raise(Chef::Exceptions::UnsupportedAction, + 'A channel property cannot be set with a custom source') + end + if new_resource.version != 'latest' + raise(Chef::Exceptions::UnsupportedAction, + 'A version property cannot be set with a custom source') + end converge_if_changed(:installed) { install_custom! } end end @@ -116,10 +122,23 @@ class ChefDkApp < Resource # action :upgrade do new_resource.installed(true) - new_resource.version('latest') + + if new_resource.version != 'latest' + raise(Chef::Exceptions::UnsupportedAction, + 'A version property cannot be used with the :upgrade action') + end case new_resource.source when :direct + # TODO: Is this a Chef bug? The converge_if_changed block doesn't + # execute if new_resource.version is its default value, even though + # that is also 'latest'. + # + # [2016-08-24T10:22:20-07:00] WARN: CURRENT: true, 0.1.2 + # [2016-08-24T10:22:20-07:00] WARN: NEW: true, latest + # (upgrade_direct! should be called here, but isn't) + # + new_resource.version('latest') converge_if_changed(:installed, :version) { upgrade_direct! } when :repo upgrade_repo! @@ -137,12 +156,9 @@ class ChefDkApp < Resource new_resource.installed(false) case new_resource.source - when :direct - remove_direct! - when :repo - remove_repo! - else - remove_custom! + when :direct then remove_direct! + when :repo then remove_repo! + else remove_custom! end end @@ -151,16 +167,8 @@ class ChefDkApp < Resource # must be defined for each sub-provider # action_class.class_eval do - %i( - install_direct! - install_repo! - install_custom! - upgrade_direct! - upgrade_repo! - remove_direct! - remove_repo! - remove_custom! - ).each do |m| + %i(install_direct! install_repo! install_custom! upgrade_direct! + upgrade_repo! remove_direct! remove_repo! remove_custom!).each do |m| define_method(m) do raise(NotImplementedError, "The `#{m}` method must be implemented for the " \ diff --git a/libraries/resource_chef_dk_app_mac_os_x.rb b/libraries/resource_chef_dk_app_mac_os_x.rb index a77abe3..a568d45 100644 --- a/libraries/resource_chef_dk_app_mac_os_x.rb +++ b/libraries/resource_chef_dk_app_mac_os_x.rb @@ -49,6 +49,14 @@ def install_direct! # (see Chef::Resource::ChefDkApp#install_repo! # def install_repo! + if new_resource.version != 'latest' + raise(Chef::Exceptions::UnsupportedAction, + 'A version property cannot be used with the :repo source') + end + if new_resource.channel != :stable + raise(Chef::Exceptions::UnsupportedAction, + 'A channel property cannot be used with the :repo source') + end include_recipe 'homebrew' homebrew_cask 'chefdk' end diff --git a/libraries/resource_chef_dk_app_windows.rb b/libraries/resource_chef_dk_app_windows.rb index 9257567..9ff07a0 100644 --- a/libraries/resource_chef_dk_app_windows.rb +++ b/libraries/resource_chef_dk_app_windows.rb @@ -53,9 +53,13 @@ def install_direct! # (see Chef::Resource::ChefDkApp#install_repo!) # def install_repo! + if new_resource.channel != :stable + raise(Chef::Exceptions::UnsupportedAction, + 'A channel property cannot be used with the :repo source') + end include_recipe 'chocolatey' chocolatey_package 'chefdk' do - if !new_resource.version.nil? && new_resource.version != 'latest' + unless [nil, 'latest'].include?(new_resource.version) version new_resource.version end end @@ -93,6 +97,10 @@ def upgrade_direct! # (see Chef::Resource::ChefDkApp#upgrade_repo!) # def upgrade_repo! + if new_resource.channel != :stable + raise(Chef::Exceptions::UnsupportedAction, + 'A channel property cannot be used with the :repo source') + end include_recipe 'chocolatey' chocolatey_package 'chefdk' do action :upgrade diff --git a/spec/resources/chef_dk_app.rb b/spec/resources/chef_dk_app.rb index 1e6f6df..1e9e65f 100644 --- a/spec/resources/chef_dk_app.rb +++ b/spec/resources/chef_dk_app.rb @@ -14,6 +14,58 @@ let(:installed_version) { nil } + shared_examples_for 'any platform' do + context 'the default action (:install)' do + context 'a custom source' do + let(:source) { 'https://example.biz.cdk' } + + context 'an overridden channel property' do + let(:channel) { :current } + + it 'raises an error' do + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) + end + end + + context 'an overridden version property' do + let(:version) { '4.5.6' } + + it 'raises an error' do + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) + end + end + end + end + + context 'the :upgrade action' do + let(:action) { :upgrade } + + context 'a custom source' do + let(:source) { 'https://example.biz.cdk' } + + it 'raises an error' do + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) + end + end + + context 'an overridden version property' do + let(:version) { '1.2.3' } + + it 'raises an error' do + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) + end + end + end + end + shared_context 'the default action (:install)' do before(:each) do allow(Kernel).to receive(:load).and_call_original diff --git a/spec/resources/chef_dk_app/debian.rb b/spec/resources/chef_dk_app/debian.rb index 653a414..8e20067 100644 --- a/spec/resources/chef_dk_app/debian.rb +++ b/spec/resources/chef_dk_app/debian.rb @@ -11,6 +11,8 @@ end shared_examples_for 'any Debian platform' do + it_behaves_like 'any platform' + context 'the default action (:install)' do include_context description @@ -122,24 +124,6 @@ end end - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -193,15 +177,6 @@ end end - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -244,46 +219,6 @@ it_behaves_like 'any property set' end end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - end - - context 'a custom source' do - include_context description - - context 'all default properties' do - include_context description - - it 'raises an error' do - expect { chef_run } - .to raise_error(Chef::Exceptions::UnsupportedAction) - end - end - - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end end end diff --git a/spec/resources/chef_dk_app/mac_os_x.rb b/spec/resources/chef_dk_app/mac_os_x.rb index d66350f..44e2e8f 100644 --- a/spec/resources/chef_dk_app/mac_os_x.rb +++ b/spec/resources/chef_dk_app/mac_os_x.rb @@ -20,6 +20,8 @@ end shared_examples_for 'any Mac OS X platform' do + it_behaves_like 'any platform' + context 'the default action (:install)' do include_context description @@ -92,8 +94,9 @@ include_context description it 'raises an error' do - pending - expect(false).to eq(true) + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) end end @@ -101,8 +104,9 @@ include_context description it 'raises an error' do - pending - expect(false).to eq(true) + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) end end end @@ -130,24 +134,6 @@ end end - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -197,15 +183,6 @@ end end - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -253,37 +230,6 @@ end end end - - context 'a custom source' do - include_context description - - context 'all default properties' do - include_context description - - it 'raises an error' do - expect { chef_run } - .to raise_error(Chef::Exceptions::UnsupportedAction) - end - end - - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - end end context 'the :remove action' do diff --git a/spec/resources/chef_dk_app/rhel.rb b/spec/resources/chef_dk_app/rhel.rb index d844872..79bab91 100644 --- a/spec/resources/chef_dk_app/rhel.rb +++ b/spec/resources/chef_dk_app/rhel.rb @@ -14,6 +14,8 @@ end shared_examples_for 'any RHEL platform' do + it_behaves_like 'any platform' + context 'the default action (:install)' do include_context description @@ -110,24 +112,6 @@ expect(chef_run).to install_rpm_package('/tmp/cache/cdk') end end - - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end end end @@ -170,15 +154,6 @@ end end - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -217,46 +192,6 @@ it_behaves_like 'any property set' end end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - end - - context 'a custom source' do - include_context description - - context 'all default properties' do - include_context description - - it 'raises an error' do - expect { chef_run } - .to raise_error(Chef::Exceptions::UnsupportedAction) - end - end - - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end end end diff --git a/spec/resources/chef_dk_app/windows.rb b/spec/resources/chef_dk_app/windows.rb index 89e3e7f..218d595 100644 --- a/spec/resources/chef_dk_app/windows.rb +++ b/spec/resources/chef_dk_app/windows.rb @@ -27,6 +27,8 @@ end shared_examples_for 'any Windows platform' do + it_behaves_like 'any platform' + context 'the default action (:install)' do include_context description @@ -105,8 +107,9 @@ include_context description it 'raises an error' do - pending - expect(false).to eq(true) + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) end end end @@ -133,24 +136,6 @@ end end - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -199,15 +184,6 @@ end end - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - context 'the latest version already installed' do include_context description @@ -229,21 +205,16 @@ .to receive(:chocolatey_installed?).and_return(false) end - [ - 'all default properties', - 'an overridden version property' - ].each do |c| - context c do - include_context description + context 'all default properties' do + include_context description - it 'ensures Chocolatey is installed' do - expect(chef_run).to include_recipe('chocolatey') - end + it 'ensures Chocolatey is installed' do + expect(chef_run).to include_recipe('chocolatey') + end - it 'installs the chefdk Chocolatey package' do - expect(chef_run).to upgrade_chocolatey_package('chefdk') - .with(version: nil) - end + it 'installs the chefdk Chocolatey package' do + expect(chef_run).to upgrade_chocolatey_package('chefdk') + .with(version: nil) end end @@ -251,8 +222,9 @@ include_context description it 'raises an error' do - pending - expect(false).to eq(true) + expect { chef_run }.to raise_error( + Chef::Exceptions::UnsupportedAction + ) end end end @@ -268,24 +240,6 @@ .to raise_error(Chef::Exceptions::UnsupportedAction) end end - - context 'an overridden channel property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end - - context 'an overridden version property' do - include_context description - - it 'raises an error' do - pending - expect(true).to eq(false) - end - end end end