diff options
author | Matt Wrock <matt@mattwrock.com> | 2016-01-13 14:44:24 -0800 |
---|---|---|
committer | Matt Wrock <matt@mattwrock.com> | 2016-01-14 12:14:22 -0800 |
commit | 1d26aaa3c2eb663b002f144568017a6aa1925013 (patch) | |
tree | e27dd213e60334fbf7a1a56945b93e3264ccdde5 | |
parent | dc62c8d52b83adbb2be402bb246794d23d404fd1 (diff) | |
download | chef-1d26aaa3c2eb663b002f144568017a6aa1925013.tar.gz |
fix candidate version filtering
-rw-r--r-- | lib/chef/provider/package/chocolatey.rb | 33 | ||||
-rw-r--r-- | spec/functional/resource/chocolatey_package_spec.rb | 38 |
2 files changed, 54 insertions, 17 deletions
diff --git a/lib/chef/provider/package/chocolatey.rb b/lib/chef/provider/package/chocolatey.rb index 55ac304a79..3bf2ced297 100644 --- a/lib/chef/provider/package/chocolatey.rb +++ b/lib/chef/provider/package/chocolatey.rb @@ -66,7 +66,7 @@ class Chef # @param names [Array<String>] array of package names to install # @param versions [Array<String>] array of versions to install def install_package(names, versions) - name_versions_to_install = desired_name_versions.select { |n, v| names.include?(n) } + name_versions_to_install = desired_name_versions.select { |n, v| lowercase_names(names).include?(n) } name_nil_versions = name_versions_to_install.select { |n,v| v.nil? } name_has_versions = name_versions_to_install.reject { |n,v| v.nil? } @@ -88,7 +88,7 @@ class Chef # @param names [Array<String>] array of package names to install # @param versions [Array<String>] array of versions to install def upgrade_package(names, versions) - name_versions_to_install = desired_name_versions.select { |n, v| names.include?(n) } + name_versions_to_install = desired_name_versions.select { |n, v| lowercase_names(names).include?(n) } name_nil_versions = name_versions_to_install.select { |n,v| v.nil? } name_has_versions = name_versions_to_install.reject { |n,v| v.nil? } @@ -181,7 +181,7 @@ class Chef # @return [Hash] Mapping of requested names to versions def desired_name_versions desired_versions = new_resource.version || new_resource.package_name.map { nil } - Hash[*new_resource.package_name.zip(desired_versions).flatten] + Hash[*lowercase_names(new_resource.package_name).zip(desired_versions).flatten] end # Helper to construct optional args out of new_resource @@ -213,8 +213,11 @@ class Chef begin cmd = [ "list -ar #{package_name_array.join ' '}" ] cmd.push( "-source #{new_resource.source}" ) if new_resource.source - parse_list_output(*cmd).reject do |name,version| - desired_name_versions[name] && desired_name_versions[name] != version + parse_list_output(*cmd).each_with_object({}) do |name_version, available| + name, version = name_version + if desired_name_versions[name].nil? || desired_name_versions[name] == version + available[name] = version + end end end end @@ -224,21 +227,29 @@ class Chef # # @return [Hash] name-to-version mapping of installed packages def installed_packages - @installed_packages ||= parse_list_output("list -l -r") + @installed_packages ||= Hash[*parse_list_output("list -l -r").flatten] end # Helper to convert choco.exe list output to a Hash # (names are downcased for case-insenstive matching) # # @param cmd [String] command to run - # @return [String] list output converted to ruby Hash + # @return [Array] list output converted to ruby Hash def parse_list_output(*args) - hash = {} + list = [] choco_command(*args).stdout.each_line do |line| - name, version = line.split("|") - hash[name.downcase] = version.chomp + name, version = line.split('|') + list << [ name.downcase, version.chomp ] end - hash + list + end + + # Helper to downcase all names in an array + # + # @param names [Array] original mixed case names + # @return [Array] same names in lower case + def lowercase_names(names) + names.map { |name| name.downcase } end end end diff --git a/spec/functional/resource/chocolatey_package_spec.rb b/spec/functional/resource/chocolatey_package_spec.rb index c180f8a938..ad9025420b 100644 --- a/spec/functional/resource/chocolatey_package_spec.rb +++ b/spec/functional/resource/chocolatey_package_spec.rb @@ -75,13 +75,39 @@ describe Chef::Resource::ChocolateyPackage, :windows_only do end end - context 'installing a bogus package' do - let(:package_name) { 'blah' } - let(:package_source) { nil } + it 'raises if package is not found' do + subject.package_name 'blah' + expect{ subject.run_action(:install) }.to raise_error Chef::Exceptions::Package + end - it 'raises if package is not found' do - expect{ subject.run_action(:install) }.to raise_error Chef::Exceptions::Package - end + it 'raises if package version is not found' do + subject.version '3.0' + expect{ subject.run_action(:install) }.to raise_error Chef::Exceptions::Package + end + end + + context 'upgrading a package' do + after { Chef::Resource::ChocolateyPackage.new(package_name, run_context).run_action(:remove) } + + it 'upgrades to a specific version' do + subject.version '1.0' + subject.run_action(:install) + expect(package_list.call).to eq("#{package_name}|1.0") + + subject.version '1.5' + subject.run_action(:upgrade) + expect(package_list.call).to eq("#{package_name}|1.5") + end + + it 'upgrades to the latest version if no version given' do + subject.version '1.0' + subject.run_action(:install) + expect(package_list.call).to eq("#{package_name}|1.0") + + subject2 = Chef::Resource::ChocolateyPackage.new('test-A', run_context) + subject2.source package_source + subject2.run_action(:upgrade) + expect(package_list.call).to eq("#{package_name}|2.0") end end |