From 438a48a21f416c4a5202160e7d2d4775c6e6739b Mon Sep 17 00:00:00 2001 From: Will Meek Date: Wed, 8 Nov 2017 16:54:52 +0000 Subject: [PATCH] Rubocopification --- .rubocop_todo.yml | 110 -- spec/acceptance/apt_key_provider_spec.rb | 1143 ++++++++--------- spec/acceptance/apt_spec.rb | 26 +- spec/classes/apt_backports_spec.rb | 38 +- spec/classes/apt_spec.rb | 85 +- spec/classes/apt_update_spec.rb | 15 +- spec/defines/conf_spec.rb | 2 +- spec/defines/key_compat_spec.rb | 127 +- spec/defines/key_spec.rb | 151 ++- spec/defines/pin_spec.rb | 20 +- spec/defines/ppa_spec.rb | 14 +- spec/defines/setting_spec.rb | 8 +- spec/defines/source_compat_spec.rb | 11 +- spec/defines/source_spec.rb | 21 +- spec/spec_helper.rb | 3 +- spec/spec_helper_acceptance.rb | 14 +- .../apt_dist_package_security_updates_spec.rb | 24 +- .../facter/apt_dist_package_updates_spec.rb | 12 +- .../apt_package_security_updates_spec.rb | 24 +- spec/unit/facter/apt_package_updates_spec.rb | 12 +- spec/unit/puppet/type/apt_key_spec.rb | 70 +- 21 files changed, 877 insertions(+), 1053 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 69304c9..e69de29 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,110 +0,0 @@ -# This configuration was generated by -# `rubocop --auto-gen-config` -# on 2017-09-26 11:49:52 +0100 using RuboCop version 0.49.1. -# The point is for the user to remove these configuration records -# one by one as the offenses are removed from the code base. -# Note that changes in the inspected code, or installation of new -# versions of RuboCop, may require this file to be generated again. - -# Offense count: 7 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles. -# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent -Layout/IndentHeredoc: - Exclude: - - 'spec/acceptance/apt_key_provider_spec.rb' - - 'spec/unit/facter/apt_has_updates_spec.rb' - - 'spec/unit/facter/apt_package_security_updates_spec.rb' - - 'spec/unit/facter/apt_package_updates_spec.rb' - - 'spec/unit/facter/apt_security_updates_spec.rb' - - 'spec/unit/facter/apt_updates_spec.rb' - -# Offense count: 1 -Lint/HandleExceptions: - Exclude: - - 'spec/spec_helper.rb' - -# Offense count: 8 -Lint/ParenthesesAsGroupedExpression: - Exclude: - - 'spec/classes/apt_backports_spec.rb' - - 'spec/classes/apt_update_spec.rb' - -# Offense count: 1 -Lint/RescueException: - Exclude: - - 'spec/spec_helper_acceptance.rb' - -# Offense count: 1 -Lint/ScriptPermission: - Exclude: - - 'spec/classes/apt_update_spec.rb' - -# Offense count: 1 -Lint/UselessAssignment: - Exclude: - - 'spec/spec_helper_acceptance.rb' - -# Offense count: 1 -# Configuration parameters: CustomIncludeMethods. -RSpec/EmptyExampleGroup: - Exclude: - - 'spec/defines/ppa_spec.rb' - -# Offense count: 51 -# Configuration parameters: Max. -RSpec/ExampleLength: - Exclude: - - 'spec/acceptance/apt_key_provider_spec.rb' - - 'spec/acceptance/apt_spec.rb' - - 'spec/classes/apt_spec.rb' - - 'spec/defines/key_compat_spec.rb' - - 'spec/defines/key_spec.rb' - - 'spec/unit/puppet/type/apt_key_spec.rb' - -# Offense count: 4 -RSpec/MultipleExpectations: - Max: 2 - -# Offense count: 61 -RSpec/NamedSubject: - Exclude: - - 'spec/classes/apt_backports_spec.rb' - - 'spec/classes/apt_spec.rb' - - 'spec/defines/conf_spec.rb' - - 'spec/defines/key_compat_spec.rb' - - 'spec/defines/key_spec.rb' - - 'spec/defines/pin_spec.rb' - - 'spec/defines/ppa_spec.rb' - - 'spec/defines/setting_spec.rb' - - 'spec/defines/source_compat_spec.rb' - - 'spec/defines/source_spec.rb' - -# Offense count: 4 -# Configuration parameters: Max. -RSpec/NestedGroups: - Exclude: - - 'spec/defines/key_compat_spec.rb' - - 'spec/defines/key_spec.rb' - -# Offense count: 3 -RSpec/ScatteredLet: - Exclude: - - 'spec/defines/key_compat_spec.rb' - - 'spec/defines/key_spec.rb' - -# Offense count: 1 -# Configuration parameters: MinBodyLength. -Style/GuardClause: - Exclude: - - 'spec/spec_helper_acceptance.rb' - -# Offense count: 15 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes. -# SupportedStyles: slashes, percent_r, mixed -Style/RegexpLiteral: - Exclude: - - 'spec/classes/apt_spec.rb' - - 'spec/defines/source_compat_spec.rb' - - 'spec/defines/source_spec.rb' diff --git a/spec/acceptance/apt_key_provider_spec.rb b/spec/acceptance/apt_key_provider_spec.rb index 1ea5411..0644cb5 100644 --- a/spec/acceptance/apt_key_provider_spec.rb +++ b/spec/acceptance/apt_key_provider_spec.rb @@ -21,6 +21,536 @@ MAX_TIMEOUT_RETRY = 3 TIMEOUT_RETRY_WAIT = 5 TIMEOUT_ERROR_MATCHER = %r{no valid OpenPGP data found} +def populate_default_options_pp(value) + default_options_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{value}', + ensure => 'present', + } + EOS + default_options_pp +end + +def install_key(key) + retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do + shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \ + --recv-keys #{key}") + end +end + +def apply_manifest_twice(manifest_pp) + apply_manifest(manifest_pp, catch_failures: true) + apply_manifest(manifest_pp, catch_changes: true) +end + +invalid_key_length_pp = <<-EOS + apt_key { 'puppetlabs': + id => '8280EF8D349F', + } + EOS + +ensure_absent_pp = <<-EOS + apt_key { 'centos': + id => '#{CENTOS_GPG_KEY_LONG_ID}', + ensure => 'absent', + } + EOS + +ensure_absent_long_key_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'absent', + } + EOS + +gpg_key_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', + ensure => 'present', + content => "-----BEGIN PGP PUBLIC KEY BLOCK----- + + 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 + 3xJn + =mMjt + -----END PGP PUBLIC KEY BLOCK-----", + } + EOS + +multiple_keys_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', + ensure => 'present', + content => "-----BEGIN PGP PUBLIC KEY BLOCK----- + Version: GnuPG v1 + + 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 + FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= + =TREp + -----END PGP PUBLIC KEY BLOCK----- ", + } + EOS + +bogus_key_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + content => 'For posterity: such content, much bogus, wow', + } + EOS + +hkps_pool_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + server => 'hkps.pool.sks-keyservers.net', + } + EOS + +hkp_pool_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', + ensure => 'present', + server => 'hkp://hkps.pool.sks-keyservers.net:80', + } + EOS + +nonexistant_key_server_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + server => 'nonexistant.key.server', + } + EOS + +dot_server_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + server => '.pgp.key.server', + } + EOS + +http_works_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', + } + EOS + +http_works_userinfo_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'http://dummyuser:dummypassword@#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', + } + EOS + +four_oh_four_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'http://#{PUPPETLABS_APT_URL}/herpderp.gpg', + } + EOS + +socket_error_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'http://apt.puppetlabss.com/herpderp.gpg', + } + EOS + +ftp_works_pp = <<-EOS + apt_key { 'CentOS 6': + id => '#{CENTOS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'ftp://#{CENTOS_REPO_URL}/#{CENTOS_GPG_KEY_FILE}', + } + EOS + +ftp_550_pp = <<-EOS + apt_key { 'CentOS 6': + id => '#{SHOULD_NEVER_EXIST_ID}', + ensure => 'present', + source => 'ftp://#{CENTOS_REPO_URL}/herpderp.gpg', + } + EOS + +ftp_socket_error_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'ftp://apt.puppetlabss.com/herpderp.gpg', + } + EOS + +https_works_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', + } + EOS + +https_userinfo_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => 'https://dummyuser:dummypassword@#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', + } + EOS + +https_404_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{SHOULD_NEVER_EXIST_ID}', + ensure => 'present', + source => 'https://#{PUPPETLABS_APT_URL}/herpderp.gpg', + } + EOS + +https_socket_error_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{SHOULD_NEVER_EXIST_ID}', + ensure => 'present', + source => 'https://apt.puppetlabss.com/herpderp.gpg', + } + EOS + +path_exists_pp = <<-EOS + apt_key { 'puppetlabs': + id => 'EF8D349F', + ensure => 'present', + source => '/tmp/puppetlabs-pubkey.gpg', + } + EOS + +path_does_not_exist_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => '/tmp/totally_bogus.file', + } + EOS + +path_bogus_content_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + source => '/tmp/fake-key.gpg', + } + EOS + +debug_works_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', + ensure => 'present', + options => 'debug', + } + EOS + +fingerprint_match_pp = <<-EOS + apt_key { 'puppetlabs': + id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', + ensure => 'present', + source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', + } + EOS + +fingerprint_does_not_match_pp = <<-EOS + apt_key { 'puppetlabs': + id => '6F6B15509CF8E59E6E469F327F438280EF8D9999', + ensure => 'present', + source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', + } + EOS + describe 'apt_key' do before(:each) do # Delete twice to make sure everything is cleaned @@ -50,15 +580,7 @@ describe 'apt_key' do key_versions.each do |key, value| context key.to_s do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{value}', - ensure => 'present', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(populate_default_options_pp(value)) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end @@ -66,13 +588,7 @@ describe 'apt_key' do context 'invalid length key id' do it 'fails' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '8280EF8D349F', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(invalid_key_length_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{Valid values match}) end end @@ -82,58 +598,30 @@ describe 'apt_key' do describe 'ensure =>' do context 'absent' do it 'is removed' do - pp = <<-EOS - apt_key { 'centos': - id => '#{CENTOS_GPG_KEY_LONG_ID}', - ensure => 'absent', - } - EOS - # Install the key first (retry because key pool may timeout) - retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \ - --recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}") - end + install_key(CENTOS_GPG_KEY_FINGERPRINT) shell(CENTOS_KEY_CHECK_COMMAND) # Time to remove it using Puppet - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(ensure_absent_pp) - shell(CENTOS_KEY_CHECK_COMMAND, - acceptable_exit_codes: [1]) + shell(CENTOS_KEY_CHECK_COMMAND, acceptable_exit_codes: [1]) # Re-Install the key (retry because key pool may timeout) - retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \ - --recv-keys #{CENTOS_GPG_KEY_FINGERPRINT}") - end + install_key(CENTOS_GPG_KEY_FINGERPRINT) end end context 'absent, added with long key', unless: (fact('operatingsystem') == 'Debian' && fact('operatingsystemmajrelease') == '6') do it 'is removed' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'absent', - } - EOS - # Install the key first (retry because key pool may timeout) - retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - shell("apt-key adv --keyserver hkps.pool.sks-keyservers.net \ - --recv-keys #{PUPPETLABS_GPG_KEY_LONG_ID}") - end - + install_key(PUPPETLABS_GPG_KEY_LONG_ID) shell(PUPPETLABS_KEY_CHECK_COMMAND) # Time to remove it using Puppet - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(ensure_absent_long_key_pp) - shell(PUPPETLABS_KEY_CHECK_COMMAND, - acceptable_exit_codes: [1]) + shell(PUPPETLABS_KEY_CHECK_COMMAND, acceptable_exit_codes: [1]) end end end @@ -141,347 +629,26 @@ describe 'apt_key' do describe 'content =>' do context 'puppetlabs gpg key' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', - ensure => 'present', - content => "-----BEGIN PGP PUBLIC KEY BLOCK----- - -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 -3xJn -=mMjt ------END PGP PUBLIC KEY BLOCK-----", - } - EOS - # Apply the manifest (Retry if timeout error is received from key pool) retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - apply_manifest(pp, catch_failures: true) + apply_manifest(gpg_key_pp, catch_failures: true) end - apply_manifest(pp, catch_changes: true) + apply_manifest(gpg_key_pp, catch_changes: true) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end context 'multiple keys' do it 'runs without errors' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', - ensure => 'present', - content => "-----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -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 -FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= -=TREp ------END PGP PUBLIC KEY BLOCK----- ", - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(multiple_keys_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end context 'bogus key' do it 'fails' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - content => 'For posterity: such content, much bogus, wow', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(bogus_key_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{no valid OpenPGP data found}) end end @@ -491,54 +658,30 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= describe 'server =>' do context 'hkps.pool.sks-keyservers.net' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - server => 'hkps.pool.sks-keyservers.net', - } - EOS - # Apply the manifest (Retry if timeout error is received from key pool) retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - apply_manifest(pp, catch_failures: true) + apply_manifest(hkps_pool_pp, catch_failures: true) end - apply_manifest(pp, catch_changes: true) + apply_manifest(hkps_pool_pp, catch_changes: true) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end context 'hkp://hkps.pool.sks-keyservers.net:80' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', - ensure => 'present', - server => 'hkp://hkps.pool.sks-keyservers.net:80', - } - EOS - retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - apply_manifest(pp, catch_failures: true) + apply_manifest(hkp_pool_pp, catch_failures: true) end - apply_manifest(pp, catch_changes: true) + apply_manifest(hkp_pool_pp, catch_changes: true) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end context 'nonexistant.key.server' do it 'fails' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - server => 'nonexistant.key.server', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(nonexistant_key_server_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{(Host not found|Couldn't resolve host)}) end end @@ -546,16 +689,8 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= context 'key server start with dot' do it 'fails' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - server => '.pgp.key.server', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| - expect(r.stderr).to match(%r{Invalid value \".pgp.key.server\"}) + apply_manifest(dot_server_pp, expect_failures: true) do |r| + expect(r.stderr).to match(%r{Invalid value ".pgp.key.server"}) end end end @@ -564,57 +699,23 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= describe 'source =>' do context 'http://' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'http://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(http_works_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end it 'works with userinfo' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'http://dummyuser:dummypassword@#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(http_works_userinfo_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end it 'fails with a 404' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'http://#{PUPPETLABS_APT_URL}/herpderp.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(four_oh_four_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{404 Not Found}) end end it 'fails with a socket error' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'http://apt.puppetlabss.com/herpderp.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(socket_error_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{could not resolve}) end end @@ -627,43 +728,18 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= end it 'works' do - pp = <<-EOS - apt_key { 'CentOS 6': - id => '#{CENTOS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'ftp://#{CENTOS_REPO_URL}/#{CENTOS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(ftp_works_pp) shell(CENTOS_KEY_CHECK_COMMAND) end it 'fails with a 550' do - pp = <<-EOS - apt_key { 'CentOS 6': - id => '#{SHOULD_NEVER_EXIST_ID}', - ensure => 'present', - source => 'ftp://#{CENTOS_REPO_URL}/herpderp.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(ftp_550_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{550 Failed to open}) end end it 'fails with a socket error' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'ftp://apt.puppetlabss.com/herpderp.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(ftp_socket_error_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{could not resolve}) end end @@ -671,57 +747,23 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= context 'https://' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(https_works_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end it 'works with userinfo' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => 'https://dummyuser:dummypassword@#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(https_userinfo_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end it 'fails with a 404' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{SHOULD_NEVER_EXIST_ID}', - ensure => 'present', - source => 'https://#{PUPPETLABS_APT_URL}/herpderp.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(https_404_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{404 Not Found}) end end it 'fails with a socket error' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{SHOULD_NEVER_EXIST_ID}', - ensure => 'present', - source => 'https://apt.puppetlabss.com/herpderp.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(https_socket_error_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{could not resolve}) end end @@ -738,31 +780,14 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= end it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => 'EF8D349F', - ensure => 'present', - source => '/tmp/puppetlabs-pubkey.gpg', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(path_exists_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end context '/path/that/does/not/exist' do it 'fails' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => '/tmp/totally_bogus.file', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(path_does_not_exist_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{does not exist}) end end @@ -777,15 +802,7 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= shell('rm /tmp/fake-key.gpg') end it 'fails' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - source => '/tmp/fake-key.gpg', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(path_bogus_content_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{no valid OpenPGP data found}) end end @@ -795,16 +812,7 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= describe 'options =>' do context 'debug' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_LONG_ID}', - ensure => 'present', - options => 'debug', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(debug_works_pp) shell(PUPPETLABS_KEY_CHECK_COMMAND) end end @@ -813,30 +821,13 @@ FPfZDNCu/TXoqyJk7434jJrcHgPryzrHFBLfEmc= describe 'fingerprint validation against source/content' do context 'fingerprint in id matches fingerprint from remote key' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '#{PUPPETLABS_GPG_KEY_FINGERPRINT}', - ensure => 'present', - source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, catch_failures: true) - apply_manifest(pp, catch_changes: true) + apply_manifest_twice(fingerprint_match_pp) end end context 'fingerprint in id does NOT match fingerprint from remote key' do it 'works' do - pp = <<-EOS - apt_key { 'puppetlabs': - id => '6F6B15509CF8E59E6E469F327F438280EF8D9999', - ensure => 'present', - source => 'https://#{PUPPETLABS_APT_URL}/#{PUPPETLABS_GPG_KEY_FILE}', - } - EOS - - apply_manifest(pp, expect_failures: true) do |r| + apply_manifest(fingerprint_does_not_match_pp, expect_failures: true) do |r| expect(r.stderr).to match(%r{don't match}) end end diff --git a/spec/acceptance/apt_spec.rb b/spec/acceptance/apt_spec.rb index e8950d1..04f5540 100644 --- a/spec/acceptance/apt_spec.rb +++ b/spec/acceptance/apt_spec.rb @@ -4,16 +4,7 @@ MAX_TIMEOUT_RETRY = 3 TIMEOUT_RETRY_WAIT = 5 TIMEOUT_ERROR_MATCHER = %r{no valid OpenPGP data found} -describe 'apt class' do - context 'reset' do - it 'fixes the sources.list' do - shell('cp /etc/apt/sources.list /tmp') - end - end - - context 'all the things' do - it 'works with no errors' do - pp = <<-EOS +everything_everything_pp = <<-EOS if $::lsbdistcodename == 'lucid' { $sources = undef } else { @@ -43,14 +34,23 @@ describe 'apt class' do }, sources => $sources, } - EOS + EOS +describe 'apt class' do + context 'reset' do + it 'fixes the sources.list' do + shell('cp /etc/apt/sources.list /tmp') + end + end + + context 'all the things' do + it 'works with no errors' do # Apply the manifest (Retry if timeout error is received from key pool) retry_on_error_matching(MAX_TIMEOUT_RETRY, TIMEOUT_RETRY_WAIT, TIMEOUT_ERROR_MATCHER) do - apply_manifest(pp, catch_failures: true) + apply_manifest(everything_everything_pp, catch_failures: true) end - apply_manifest(pp, catch_failures: true) + apply_manifest(everything_everything_pp, catch_failures: true) end it 'stills work' do shell('apt-get update') diff --git a/spec/classes/apt_backports_spec.rb b/spec/classes/apt_backports_spec.rb index 0528831..b8e1424 100644 --- a/spec/classes/apt_backports_spec.rb +++ b/spec/classes/apt_backports_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe 'apt::backports', type: :class do - let (:pre_condition) { "class{ '::apt': }" } + let(:pre_condition) { "class{ '::apt': }" } describe 'debian/ubuntu tests' do context 'defaults on deb' do @@ -139,9 +139,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) + is_expected.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) end end context 'missing release' do @@ -154,9 +152,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) + is_expected.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) end end context 'missing repos' do @@ -169,9 +165,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) + is_expected.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) end end context 'missing key' do @@ -184,9 +178,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) + is_expected.to raise_error(Puppet::Error, %r{If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key}) end end end @@ -210,9 +202,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects a}) + is_expected.to raise_error(Puppet::Error, %r{expects a}) end end context 'invalid release' do @@ -223,9 +213,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects a}) + is_expected.to raise_error(Puppet::Error, %r{expects a}) end end context 'invalid repos' do @@ -236,9 +224,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects a}) + is_expected.to raise_error(Puppet::Error, %r{expects a}) end end context 'invalid key' do @@ -249,9 +235,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects a}) + is_expected.to raise_error(Puppet::Error, %r{expects a}) end end context 'invalid pin' do @@ -262,9 +246,7 @@ describe 'apt::backports', type: :class do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects a}) + is_expected.to raise_error(Puppet::Error, %r{expects a}) end end end diff --git a/spec/classes/apt_spec.rb b/spec/classes/apt_spec.rb index cbbe746..fb84c51 100644 --- a/spec/classes/apt_spec.rb +++ b/spec/classes/apt_spec.rb @@ -1,4 +1,37 @@ require 'spec_helper' + +sources_list = { ensure: 'file', + path: '/etc/apt/sources.list', + owner: 'root', + group: 'root', + mode: '0644', + notify: 'Class[Apt::Update]' } + +sources_list_d = { ensure: 'directory', + path: '/etc/apt/sources.list.d', + owner: 'root', + group: 'root', + mode: '0644', + purge: false, + recurse: false, + notify: 'Class[Apt::Update]' } + +preferences = { ensure: 'file', + path: '/etc/apt/preferences', + owner: 'root', + group: 'root', + mode: '0644', + notify: 'Class[Apt::Update]' } + +preferences_d = { ensure: 'directory', + path: '/etc/apt/preferences.d', + owner: 'root', + group: 'root', + mode: '0644', + purge: false, + recurse: false, + notify: 'Class[Apt::Update]' } + describe 'apt' do let(:facts) do { @@ -12,49 +45,27 @@ describe 'apt' do context 'defaults' do it { - is_expected.to contain_file('sources.list').that_notifies('Class[Apt::Update]').only_with(ensure: 'file', - path: '/etc/apt/sources.list', - owner: 'root', - group: 'root', - mode: '0644', - notify: 'Class[Apt::Update]') + is_expected.to contain_file('sources.list').that_notifies('Class[Apt::Update]').only_with(sources_list) } it { - is_expected.to contain_file('sources.list.d').that_notifies('Class[Apt::Update]').only_with(ensure: 'directory', - path: '/etc/apt/sources.list.d', - owner: 'root', - group: 'root', - mode: '0644', - purge: false, - recurse: false, - notify: 'Class[Apt::Update]') + is_expected.to contain_file('sources.list.d').that_notifies('Class[Apt::Update]').only_with(sources_list_d) } it { - is_expected.to contain_file('preferences').that_notifies('Class[Apt::Update]').only_with(ensure: 'file', - path: '/etc/apt/preferences', - owner: 'root', - group: 'root', - mode: '0644', - notify: 'Class[Apt::Update]') + is_expected.to contain_file('preferences').that_notifies('Class[Apt::Update]').only_with(preferences) } it { - is_expected.to contain_file('preferences.d').that_notifies('Class[Apt::Update]').only_with(ensure: 'directory', - path: '/etc/apt/preferences.d', - owner: 'root', - group: 'root', - mode: '0644', - purge: false, - recurse: false, - notify: 'Class[Apt::Update]') + is_expected.to contain_file('preferences.d').that_notifies('Class[Apt::Update]').only_with(preferences_d) } it 'lays down /etc/apt/apt.conf.d/15update-stamp' do is_expected.to contain_file('/etc/apt/apt.conf.d/15update-stamp').with(group: 'root', mode: '0644', - owner: 'root').with_content(%r{APT::Update::Post-Invoke-Success {"touch /var/lib/apt/periodic/update-success-stamp 2>/dev/null || true";};}) # rubocop:disable Metrics/LineLength + owner: 'root').with_content( + %r{APT::Update::Post-Invoke-Success {"touch /var/lib/apt/periodic/update-success-stamp 2>/dev/null || true";};}, + ) end it { @@ -345,9 +356,7 @@ describe 'apt' do let(:params) { { purge: { 'sources.list' => 'banana' } } } it do - expect { - subject.call - }.to raise_error(Puppet::Error) + is_expected.to raise_error(Puppet::Error) end end @@ -355,9 +364,7 @@ describe 'apt' do let(:params) { { purge: { 'sources.list.d' => 'banana' } } } it do - expect { - subject.call - }.to raise_error(Puppet::Error) + is_expected.to raise_error(Puppet::Error) end end @@ -365,9 +372,7 @@ describe 'apt' do let(:params) { { purge: { 'preferences' => 'banana' } } } it do - expect { - subject.call - }.to raise_error(Puppet::Error) + is_expected.to raise_error(Puppet::Error) end end @@ -375,9 +380,7 @@ describe 'apt' do let(:params) { { purge: { 'preferences.d' => 'banana' } } } it do - expect { - subject.call - }.to raise_error(Puppet::Error) + is_expected.to raise_error(Puppet::Error) end end end diff --git a/spec/classes/apt_update_spec.rb b/spec/classes/apt_update_spec.rb index e178d40..9f91d04 100644 --- a/spec/classes/apt_update_spec.rb +++ b/spec/classes/apt_update_spec.rb @@ -1,4 +1,3 @@ -#!/usr/bin/env rspec require 'spec_helper' describe 'apt::update', type: :class do @@ -19,7 +18,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) do + let(:pre_condition) do "class{'::apt': update => {'frequency' => 'always' },}" end @@ -39,7 +38,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) { "class{ '::apt': update => {'frequency' => 'always' },}" } + let(:pre_condition) { "class{ '::apt': update => {'frequency' => 'always' },}" } it 'triggers an apt-get update run' do # set the apt_update exec\'s refreshonly attribute to false @@ -64,7 +63,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) { "class{ '::apt': update => {'frequency' => 'reluctantly' },}" } + let(:pre_condition) { "class{ '::apt': update => {'frequency' => 'reluctantly' },}" } it 'does not trigger an apt-get update run' do # don't change the apt_update exec's refreshonly attribute. (it should be true) @@ -82,7 +81,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) { "class{ '::apt': update => {'frequency' => 'reluctantly' },}" } + let(:pre_condition) { "class{ '::apt': update => {'frequency' => 'reluctantly' },}" } it 'does not trigger an apt-get update run' do # don't change the apt_update exec's refreshonly attribute. (it should be true) @@ -104,7 +103,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) { "class{ '::apt': update => {'frequency' => '#{update_frequency}',} }" } + let(:pre_condition) { "class{ '::apt': update => {'frequency' => '#{update_frequency}',} }" } it 'triggers an apt-get update run' do # set the apt_update exec\'s refreshonly attribute to false @@ -123,7 +122,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) { "class{ '::apt': update => {'frequency' => '#{update_frequency}',} }" } + let(:pre_condition) { "class{ '::apt': update => {'frequency' => '#{update_frequency}',} }" } it 'does not trigger an apt-get update run' do # don't change the apt_update exec\'s refreshonly attribute. (it should be true) @@ -141,7 +140,7 @@ describe 'apt::update', type: :class do puppetversion: Puppet.version, } end - let (:pre_condition) { "class{ '::apt': update => {'frequency' => '#{update_frequency}',} }" } + let(:pre_condition) { "class{ '::apt': update => {'frequency' => '#{update_frequency}',} }" } it 'triggers an apt-get update run' do # set the apt_update exec\'s refreshonly attribute to false diff --git a/spec/defines/conf_spec.rb b/spec/defines/conf_spec.rb index 1296e99..d79cb22 100644 --- a/spec/defines/conf_spec.rb +++ b/spec/defines/conf_spec.rb @@ -64,7 +64,7 @@ describe 'apt::conf', type: :define do end it 'fails' do - expect { subject.call } .to raise_error(%r{pass in content}) + is_expected.to raise_error(%r{pass in content}) end end diff --git a/spec/defines/key_compat_spec.rb b/spec/defines/key_compat_spec.rb index 6134768..0a450ec 100644 --- a/spec/defines/key_compat_spec.rb +++ b/spec/defines/key_compat_spec.rb @@ -1,6 +1,26 @@ require 'spec_helper' +def contains_apt_key_example(title) + { id: title, + ensure: 'present', + source: 'http://apt.puppetlabs.com/pubkey.gpg', + server: 'pgp.mit.edu', + content: params[:content], + options: 'debug' } +end + +def apt_key_example(title) + { id: title, + ensure: 'present', + source: nil, + server: 'keyserver.ubuntu.com', + content: nil, + keyserver_options: nil } +end + describe 'apt::key', type: :define do + GPG_KEY_ID = '6F6B15509CF8E59E6E469F327F438280EF8D349F'.freeze + let(:facts) do { os: { family: 'Debian', name: 'Debian', release: { major: '7', full: '7.0' } }, @@ -9,7 +29,6 @@ describe 'apt::key', type: :define do puppetversion: Puppet.version, } end - GPG_KEY_ID = '6F6B15509CF8E59E6E469F327F438280EF8D349F'.freeze let :title do GPG_KEY_ID @@ -86,12 +105,7 @@ describe 'apt::key', type: :define do end it 'contains the apt_key' do - is_expected.to contain_apt_key(title).with(id: title, - ensure: 'present', - source: 'http://apt.puppetlabs.com/pubkey.gpg', - server: 'pgp.mit.edu', - content: params[:content], - options: 'debug') + is_expected.to contain_apt_key(title).with(contains_apt_key_example(title)) end it 'contains the apt_key present anchor' do is_expected.to contain_anchor("apt_key #{title} present") @@ -146,7 +160,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call } .to raise_error(%r{expects a match}) + is_expected .to raise_error(%r{expects a match}) end end @@ -158,7 +172,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call } .to raise_error(%r{expects a match}) + is_expected .to raise_error(%r{expects a match}) end end @@ -170,7 +184,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call } .to raise_error(%r{expects a match}) + is_expected .to raise_error(%r{expects a match}) end end context 'exceed character url' do @@ -181,7 +195,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'incorrect port number url' do @@ -192,7 +206,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'incorrect protocol for url' do @@ -203,7 +217,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'missing port number url' do @@ -214,7 +228,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'url ending with a dot' do @@ -225,7 +239,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'url begin with a dash' do @@ -236,7 +250,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'invalid key' do @@ -245,7 +259,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end @@ -257,7 +271,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end @@ -269,7 +283,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a}) + is_expected.to raise_error(%r{expects a}) end end @@ -281,7 +295,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end @@ -293,7 +307,7 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a}) + is_expected.to raise_error(%r{expects a}) end end @@ -305,48 +319,41 @@ describe 'apt::key', type: :define do end it 'fails' do - expect { subject.call }.to raise_error(%r{Enum\['absent', 'present'\]}) + is_expected.to raise_error(%r{Enum\['absent', 'present'\]}) + end + end + + describe 'duplication - two apt::key resources for same key, different titles' do + let :pre_condition do + "#{super()}\napt::key { 'duplicate': id => '#{title}', }" + end + + it 'contains the duplicate apt::key resource' do + is_expected.to contain_apt__key('duplicate').with(id: title, + ensure: 'present') + end + + it 'contains the original apt::key resource' do + is_expected.to contain_apt__key(title).with(id: title, + ensure: 'present') + end + + it 'contains the native apt_key' do + is_expected.to contain_apt_key('duplicate').with(apt_key_example(title)) + end + + it 'does not contain the original apt_key' do + is_expected.not_to contain_apt_key(title) end end - describe 'duplication' do - context 'two apt::key resources for same key, different titles' do - let :pre_condition do - "#{super()}\napt::key { 'duplicate': id => '#{title}', }" - end - - it 'contains the duplicate apt::key resource' do - is_expected.to contain_apt__key('duplicate').with(id: title, - ensure: 'present') - end - - it 'contains the original apt::key resource' do - is_expected.to contain_apt__key(title).with(id: title, - ensure: 'present') - end - - it 'contains the native apt_key' do - is_expected.to contain_apt_key('duplicate').with(id: title, - ensure: 'present', - source: nil, - server: 'keyserver.ubuntu.com', - content: nil, - keyserver_options: nil) - end - - it 'does not contain the original apt_key' do - is_expected.not_to contain_apt_key(title) - end - end - - context 'two apt::key resources, different ensure' do - let :pre_condition do - "#{super()}\napt::key { 'duplicate': id => '#{title}', ensure => 'absent', }" - end - - it 'informs the user of the impossibility' do - expect { subject.call }.to raise_error(%r{already ensured as absent}) - end + describe 'duplication - two apt::key resources, different ensure' do + let :pre_condition do + "#{super()}\napt::key { 'duplicate': id => '#{title}', ensure => 'absent', }" + end + + it 'informs the user of the impossibility' do + is_expected.to raise_error(%r{already ensured as absent}) end end end diff --git a/spec/defines/key_spec.rb b/spec/defines/key_spec.rb index e9ec0c5..d668780 100644 --- a/spec/defines/key_spec.rb +++ b/spec/defines/key_spec.rb @@ -1,5 +1,41 @@ require 'spec_helper' +GPG_KEY_ID = '6F6B15509CF8E59E6E469F327F438280EF8D349F'.freeze + +title_key_example = { id: GPG_KEY_ID, + ensure: 'present', + source: nil, + server: 'keyserver.ubuntu.com', + content: nil, + options: nil } + +def default_apt_key_example(title) + { id: title, + ensure: 'present', + source: nil, + server: 'keyserver.ubuntu.com', + content: nil, + options: nil } +end + +def bunch_things_apt_key_example(title, params) + { id: title, + ensure: 'present', + source: 'http://apt.puppetlabs.com/pubkey.gpg', + server: 'pgp.mit.edu', + content: params[:content], + options: 'debug' } +end + +def absent_apt_key(title) + { id: title, + ensure: 'absent', + source: nil, + server: 'keyserver.ubuntu.com', + content: nil, + keyserver: nil } +end + describe 'apt::key' do let :pre_condition do 'class { "apt": }' @@ -15,8 +51,6 @@ describe 'apt::key' do } end - GPG_KEY_ID = '6F6B15509CF8E59E6E469F327F438280EF8D349F'.freeze - let :title do GPG_KEY_ID end @@ -24,12 +58,7 @@ describe 'apt::key' do describe 'normal operation' do describe 'default options' do it 'contains the apt_key' do - is_expected.to contain_apt_key(title).with(id: title, - ensure: 'present', - source: nil, - server: 'keyserver.ubuntu.com', - content: nil, - options: nil) + is_expected.to contain_apt_key(title).with(default_apt_key_example(title)) end it 'contains the apt_key present anchor' do is_expected.to contain_anchor("apt_key #{title} present") @@ -48,12 +77,7 @@ describe 'apt::key' do end it 'contains the apt_key' do - is_expected.to contain_apt_key(title).with(id: GPG_KEY_ID, - ensure: 'present', - source: nil, - server: 'keyserver.ubuntu.com', - content: nil, - options: nil) + is_expected.to contain_apt_key(title).with(title_key_example) end it 'contains the apt_key present anchor' do is_expected.to contain_anchor("apt_key #{GPG_KEY_ID} present") @@ -68,12 +92,7 @@ describe 'apt::key' do end it 'contains the apt_key' do - is_expected.to contain_apt_key(title).with(id: title, - ensure: 'absent', - source: nil, - server: 'keyserver.ubuntu.com', - content: nil, - keyserver: nil) + is_expected.to contain_apt_key(title).with(absent_apt_key(title)) end it 'contains the apt_key absent anchor' do is_expected.to contain_anchor("apt_key #{title} absent") @@ -91,12 +110,7 @@ describe 'apt::key' do end it 'contains the apt_key' do - is_expected.to contain_apt_key(title).with(id: title, - ensure: 'present', - source: 'http://apt.puppetlabs.com/pubkey.gpg', - server: 'pgp.mit.edu', - content: params[:content], - options: 'debug') + is_expected.to contain_apt_key(title).with(bunch_things_apt_key_example(title, params)) end it 'contains the apt_key present anchor' do is_expected.to contain_anchor("apt_key #{title} present") @@ -151,7 +165,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call } .to raise_error(%r{expects a match}) + is_expected .to raise_error(%r{expects a match}) end end @@ -163,7 +177,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call } .to raise_error(%r{expects a match}) + is_expected .to raise_error(%r{expects a match}) end end @@ -175,7 +189,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call } .to raise_error(%r{expects a match}) + is_expected .to raise_error(%r{expects a match}) end end context 'exceed character url' do @@ -186,7 +200,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'incorrect port number url' do @@ -197,7 +211,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'incorrect protocol for url' do @@ -208,7 +222,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'missing port number url' do @@ -219,7 +233,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'url ending with a dot' do @@ -230,7 +244,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'url begin with a dash' do @@ -241,7 +255,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end context 'invalid key' do @@ -250,7 +264,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end @@ -262,7 +276,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end @@ -274,7 +288,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a}) + is_expected.to raise_error(%r{expects a}) end end @@ -286,7 +300,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a match}) + is_expected.to raise_error(%r{expects a match}) end end @@ -298,7 +312,7 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{expects a}) + is_expected.to raise_error(%r{expects a}) end end @@ -311,45 +325,42 @@ describe 'apt::key' do end it 'fails' do - expect { subject.call }.to raise_error(%r{for Enum\['absent', 'present'\], got}) + is_expected.to raise_error(%r{for Enum\['absent', 'present'\], got}) end end end - describe 'duplication' do - context 'two apt::key resources for same key, different titles' do - let :pre_condition do - "class { 'apt': } - apt::key { 'duplicate': id => '#{title}', }" - end + describe 'duplication - two apt::key resources for same key, different titles' do + let :pre_condition do + "class { 'apt': } + apt::key { 'duplicate': id => '#{title}', }" + end - it 'contains two apt::key resources' do - is_expected.to contain_apt__key('duplicate').with(id: title, - ensure: 'present') - is_expected.to contain_apt__key(title).with(id: title, - ensure: 'present') - end + it 'contains two apt::key resource - duplicate' do + is_expected.to contain_apt__key('duplicate').with(id: title, + ensure: 'present') + end + it 'contains two apt::key resource - title' do + is_expected.to contain_apt__key(title).with(id: title, + ensure: 'present') + end - it 'contains only a single apt_key' do - is_expected.to contain_apt_key('duplicate').with(id: title, - ensure: 'present', - source: nil, - server: 'keyserver.ubuntu.com', - content: nil, - options: nil) - is_expected.not_to contain_apt_key(title) - end + it 'contains only a single apt_key - duplicate' do + is_expected.to contain_apt_key('duplicate').with(default_apt_key_example(title)) end + it 'contains only a single apt_key - no title' do + is_expected.not_to contain_apt_key(title) + end + end - context 'two apt::key resources, different ensure' do - let :pre_condition do - "class { 'apt': } - apt::key { 'duplicate': id => '#{title}', ensure => 'absent', }" - end + describe 'duplication - two apt::key resources, different ensure' do + let :pre_condition do + "class { 'apt': } + apt::key { 'duplicate': id => '#{title}', ensure => 'absent', }" + end - it 'informs the user of the impossibility' do - expect { subject.call }.to raise_error(%r{already ensured as absent}) - end + it 'informs the user of the impossibility' do + is_expected.to raise_error(%r{already ensured as absent}) end end end diff --git a/spec/defines/pin_spec.rb b/spec/defines/pin_spec.rb index a01a919..52ecb97 100644 --- a/spec/defines/pin_spec.rb +++ b/spec/defines/pin_spec.rb @@ -88,9 +88,7 @@ describe 'apt::pin', type: :define do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects an Integer value, got String}) + is_expected.to raise_error(Puppet::Error, %r{expects an Integer value, got String}) end end @@ -102,9 +100,7 @@ describe 'apt::pin', type: :define do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{parameter version cannot be used in general form}) + is_expected.to raise_error(Puppet::Error, %r{parameter version cannot be used in general form}) end end @@ -117,9 +113,7 @@ describe 'apt::pin', type: :define do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{parameters release and origin are mutually exclusive}) + is_expected.to raise_error(Puppet::Error, %r{parameters release and origin are mutually exclusive}) end end @@ -133,9 +127,7 @@ describe 'apt::pin', type: :define do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{parameters release, origin, and version are mutually exclusive}) + is_expected.to raise_error(Puppet::Error, %r{parameters release, origin, and version are mutually exclusive}) end end @@ -149,9 +141,7 @@ describe 'apt::pin', type: :define do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{parameters release, origin, and version are mutually exclusive}) + is_expected.to raise_error(Puppet::Error, %r{parameters release, origin, and version are mutually exclusive}) end end end diff --git a/spec/defines/ppa_spec.rb b/spec/defines/ppa_spec.rb index 89e5b36..7a11811 100644 --- a/spec/defines/ppa_spec.rb +++ b/spec/defines/ppa_spec.rb @@ -53,12 +53,6 @@ describe 'apt::ppa' do } end - describe 'ppa depending on ppa, MODULES-1156' do - let :pre_condition do - 'class { "apt": }' - end - end - describe 'package_name => software-properties-common' do let :pre_condition do 'class { "apt": }' @@ -359,9 +353,7 @@ describe 'apt::ppa' do let(:title) { 'ppa:user/foo' } it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{lsbdistcodename fact not available: release parameter required}) + is_expected.to raise_error(Puppet::Error, %r{lsbdistcodename fact not available: release parameter required}) end end @@ -380,9 +372,7 @@ describe 'apt::ppa' do let(:title) { 'ppa:user/foo' } it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{not currently supported on Debian}) + is_expected.to raise_error(Puppet::Error, %r{not currently supported on Debian}) end end end diff --git a/spec/defines/setting_spec.rb b/spec/defines/setting_spec.rb index 0b6ca99..1a94de7 100644 --- a/spec/defines/setting_spec.rb +++ b/spec/defines/setting_spec.rb @@ -20,7 +20,7 @@ describe 'apt::setting' do describe 'when using the defaults' do context 'without source or content' do it do - expect { subject.call }.to raise_error(Puppet::Error, %r{needs either of }) + is_expected.to raise_error(Puppet::Error, %r{needs either of }) end end @@ -97,7 +97,7 @@ describe 'apt::setting' do let(:params) { default_params.merge(source: 'la') } it do - expect { subject.call }.to raise_error(Puppet::Error, %r{cannot have both }) + is_expected.to raise_error(Puppet::Error, %r{cannot have both }) end end @@ -106,7 +106,7 @@ describe 'apt::setting' do let(:params) { default_params } it do - expect { subject.call }.to raise_error(Puppet::Error, %r{must start with either}) + is_expected.to raise_error(Puppet::Error, %r{must start with either}) end end @@ -114,7 +114,7 @@ describe 'apt::setting' do let(:params) { default_params.merge(ensure: 'banana') } it do - expect { subject.call }.to raise_error(Puppet::Error, %r{Enum\['absent', 'file', 'present'\]}) + is_expected.to raise_error(Puppet::Error, %r{Enum\['absent', 'file', 'present'\]}) end end diff --git a/spec/defines/source_compat_spec.rb b/spec/defines/source_compat_spec.rb index c6b6aef..23f9549 100644 --- a/spec/defines/source_compat_spec.rb +++ b/spec/defines/source_compat_spec.rb @@ -26,7 +26,7 @@ describe 'apt::source', type: :define do end it { - is_expected.to contain_apt__setting('list-my_source').with_content(/# my_source\ndeb-src http:\/\/debian\.mirror\.iweb\.ca\/debian\/ wheezy main\n/) + is_expected.to contain_apt__setting('list-my_source').with_content(%r{# my_source\ndeb-src http://debian.mirror.iweb.ca/debian/ wheezy main\n}) } end @@ -55,7 +55,8 @@ describe 'apt::source', type: :define do end it { - is_expected.to contain_apt__setting('list-my_source').with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(%r{deb-src}) # rubocop:disable Metrics/LineLength + is_expected.to contain_apt__setting('list-my_source').with_content(%r{# foo\ndeb \[arch=x86_64 trusted=yes\] http://debian.mirror.iweb.ca/debian/ sid testing\n}) + .without_content(%r{deb-src}) } it { @@ -88,7 +89,7 @@ describe 'apt::source', type: :define do } end - it { is_expected.to contain_apt__setting('list-my_source').with_content(/# my_source\ndeb \[trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ wheezy main\n/) } + it { is_expected.to contain_apt__setting('list-my_source').with_content(%r{# my_source\ndeb \[trusted=yes\] http://debian.mirror.iweb.ca/debian/ wheezy main\n}) } end context 'architecture equals x86_64' do @@ -109,7 +110,7 @@ describe 'apt::source', type: :define do end it { - is_expected.to contain_apt__setting('list-my_source').with_content(/# my_source\ndeb \[arch=x86_64\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ wheezy main\n/) + is_expected.to contain_apt__setting('list-my_source').with_content(%r{# my_source\ndeb \[arch=x86_64\] http://debian.mirror.iweb.ca/debian/ wheezy main\n}) } end @@ -146,7 +147,7 @@ describe 'apt::source', type: :define do end it do - expect { subject.call }.to raise_error(Puppet::Error, %r{lsbdistcodename fact not available: release parameter required}) + is_expected.to raise_error(Puppet::Error, %r{lsbdistcodename fact not available: release parameter required}) end end end diff --git a/spec/defines/source_spec.rb b/spec/defines/source_spec.rb index 52a7ca9..9cec580 100644 --- a/spec/defines/source_spec.rb +++ b/spec/defines/source_spec.rb @@ -23,9 +23,7 @@ describe 'apt::source' do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{source entry without specifying a location}) + is_expected.to raise_error(Puppet::Error, %r{source entry without specifying a location}) end end context 'with location' do @@ -98,7 +96,8 @@ describe 'apt::source' do end it { - is_expected.to contain_apt__setting('list-my_source').with(ensure: 'present').with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(%r{deb-src}) # rubocop:disable Metrics/LineLength + is_expected.to contain_apt__setting('list-my_source').with(ensure: 'present').with_content(%r{# foo\ndeb \[arch=x86_64 trusted=yes\] http://debian.mirror.iweb.ca/debian/ sid testing\n}) + .without_content(%r{deb-src}) } it { @@ -130,7 +129,8 @@ describe 'apt::source' do end it { - is_expected.to contain_apt__setting('list-my_source').with(ensure: 'present').with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(%r{deb-src}) # rubocop:disable Metrics/LineLength + is_expected.to contain_apt__setting('list-my_source').with(ensure: 'present').with_content(%r{# foo\ndeb \[arch=x86_64 trusted=yes\] http://debian.mirror.iweb.ca/debian/ sid testing\n}) + .without_content(%r{deb-src}) } it { @@ -163,7 +163,8 @@ describe 'apt::source' do end it { - is_expected.to contain_apt__setting('list-my_source').with(ensure: 'present').with_content(/# foo\ndeb \[arch=x86_64 trusted=yes\] http:\/\/debian\.mirror\.iweb\.ca\/debian\/ sid testing\n/).without_content(%r{deb-src}) # rubocop:disable Metrics/LineLength + is_expected.to contain_apt__setting('list-my_source').with(ensure: 'present').with_content(%r{# foo\ndeb \[arch=x86_64 trusted=yes\] http://debian.mirror.iweb.ca/debian/ sid testing\n}) + .without_content(%r{deb-src}) } it { @@ -349,9 +350,7 @@ describe 'apt::source' do let(:params) { { location: 'hello.there' } } it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{lsbdistcodename fact not available: release parameter required}) + is_expected.to raise_error(Puppet::Error, %r{lsbdistcodename fact not available: release parameter required}) end end @@ -387,9 +386,7 @@ describe 'apt::source' do end it do - expect { - subject.call - }.to raise_error(Puppet::Error, %r{expects a value}) + is_expected.to raise_error(Puppet::Error, %r{expects a value}) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1b8480d..01912b6 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -4,5 +4,6 @@ require 'puppetlabs_spec_helper/module_spec_helper' # put local configuration and setup into spec_helper_local begin require 'spec_helper_local' -rescue LoadError +rescue LoadError => loaderror + puts "Could not require spec_helper_local: #{loaderror.message}" end diff --git a/spec/spec_helper_acceptance.rb b/spec/spec_helper_acceptance.rb index e9d51bf..67bf096 100644 --- a/spec/spec_helper_acceptance.rb +++ b/spec/spec_helper_acceptance.rb @@ -69,19 +69,15 @@ def retry_on_error_matching(max_retry_count = 3, retry_wait_interval_secs = 5, e begin try += 1 yield - rescue Exception => e - if try < max_retry_count && (error_matcher.nil? || e.message =~ error_matcher) - sleep retry_wait_interval_secs - retry - else - raise - end + rescue StandardError => e + raise unless try < max_retry_count && (error_matcher.nil? || e.message =~ error_matcher) + sleep retry_wait_interval_secs + retry end end RSpec.configure do |c| - # Project root - proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..')) + File.expand_path(File.join(File.dirname(__FILE__), '..')) # Readable test descriptions c.formatter = :documentation diff --git a/spec/unit/facter/apt_dist_package_security_updates_spec.rb b/spec/unit/facter/apt_dist_package_security_updates_spec.rb index 316dbfc..7f4f16a 100644 --- a/spec/unit/facter/apt_dist_package_security_updates_spec.rb +++ b/spec/unit/facter/apt_dist_package_security_updates_spec.rb @@ -33,13 +33,11 @@ describe 'apt_package_security_dist_updates fact' do "Conf vim (7.52.1-5+deb9u2 Debian-Security:9/stable [amd64])\n" \ end - it { - if Facter.version < '2.0.0' - is_expected.to eq('vim') - else - is_expected.to eq(['vim']) - end - } + if Facter.version < '2.0.0' + it { is_expected.to eq('vim') } + else + it { is_expected.to eq(['vim']) } + end end describe 'on Ubuntu' do @@ -52,13 +50,11 @@ describe 'apt_package_security_dist_updates fact' do "Conf onioncircuits (2:3.3.10-4ubuntu2.3 Ubuntu:16.04/xenial-updates [amd64])\n" end - it { - if Facter.version < '2.0.0' - is_expected.to eq('extremetuxracer,vim') - else - is_expected.to eq(%w[extremetuxracer vim]) - end - } + if Facter.version < '2.0.0' + it { is_expected.to eq('extremetuxracer,vim') } + else + it { is_expected.to eq(%w[extremetuxracer vim]) } + end end end end diff --git a/spec/unit/facter/apt_dist_package_updates_spec.rb b/spec/unit/facter/apt_dist_package_updates_spec.rb index 557e3b3..080e21f 100644 --- a/spec/unit/facter/apt_dist_package_updates_spec.rb +++ b/spec/unit/facter/apt_dist_package_updates_spec.rb @@ -26,12 +26,10 @@ describe 'apt_package_dist_updates fact' do "Conf planet.rb (22-2~bpo8+1 Debian Backports:jessie-backports [all])\n" Facter::Util::Resolution.expects(:exec).with('/usr/bin/apt-get -s -o Debug::NoLocking=true dist-upgrade 2>&1').returns apt_output end - it { - if Facter.version < '2.0.0' - is_expected.to eq('extremetuxracer,planet.rb') - else - is_expected.to eq(['extremetuxracer', 'planet.rb']) - end - } + if Facter.version < '2.0.0' + it { is_expected.to eq('extremetuxracer,planet.rb') } + else + it { is_expected.to eq(['extremetuxracer', 'planet.rb']) } + end end end diff --git a/spec/unit/facter/apt_package_security_updates_spec.rb b/spec/unit/facter/apt_package_security_updates_spec.rb index b6a713f..1cd992d 100644 --- a/spec/unit/facter/apt_package_security_updates_spec.rb +++ b/spec/unit/facter/apt_package_security_updates_spec.rb @@ -31,13 +31,11 @@ describe 'apt_package_security_updates fact' do "Conf curl (7.52.1-5+deb9u2 Debian-Security:9/stable [amd64])\n" \ end - it { - if Facter.version < '2.0.0' - is_expected.to eq('curl') - else - is_expected.to eq(['curl']) - end - } + if Facter.version < '2.0.0' + it { is_expected.to eq('curl') } + else + it { is_expected.to eq(['curl']) } + end end describe 'on Ubuntu' do @@ -50,13 +48,11 @@ describe 'apt_package_security_updates fact' do "Conf procps (2:3.3.10-4ubuntu2.3 Ubuntu:16.04/xenial-updates [amd64])\n" end - it { - if Facter.version < '2.0.0' - is_expected.to eq('tzdata,curl') - else - is_expected.to eq(%w[tzdata curl]) - end - } + if Facter.version < '2.0.0' + it { is_expected.to eq('tzdata,curl') } + else + it { is_expected.to eq(%w[tzdata curl]) } + end end end end diff --git a/spec/unit/facter/apt_package_updates_spec.rb b/spec/unit/facter/apt_package_updates_spec.rb index 355ab18..f24481a 100644 --- a/spec/unit/facter/apt_package_updates_spec.rb +++ b/spec/unit/facter/apt_package_updates_spec.rb @@ -24,12 +24,10 @@ describe 'apt_package_updates fact' do "Conf unhide.rb (22-2~bpo8+1 Debian Backports:jessie-backports [all])\n" Facter::Util::Resolution.expects(:exec).with('/usr/bin/apt-get -s -o Debug::NoLocking=true upgrade 2>&1').returns apt_output end - it { - if Facter.version < '2.0.0' - is_expected.to eq('tzdata,unhide.rb') - else - is_expected.to eq(['tzdata', 'unhide.rb']) - end - } + if Facter.version < '2.0.0' + it { is_expected.to eq('tzdata,unhide.rb') } + else + it { is_expected.to eq(['tzdata', 'unhide.rb']) } + end end end diff --git a/spec/unit/puppet/type/apt_key_spec.rb b/spec/unit/puppet/type/apt_key_spec.rb index a1f24b5..0428040 100644 --- a/spec/unit/puppet/type/apt_key_spec.rb +++ b/spec/unit/puppet/type/apt_key_spec.rb @@ -132,102 +132,80 @@ describe Puppet::Type.type(:apt_key) do context 'validation' do it 'raises an error if content and source are set' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'http://apt.puppetlabs.com/pubkey.gpg', - content: 'Completely invalid as a GPG key', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'http://apt.puppetlabs.com/pubkey.gpg', + content: 'Completely invalid as a GPG key') }.to raise_error(%r{content and source are mutually exclusive}) end it 'raises an error if a weird length key is used' do expect { - Puppet::Type.type(:apt_key).new( - id: 'FEF8D349F', - source: 'http://apt.puppetlabs.com/pubkey.gpg', - content: 'Completely invalid as a GPG key', - ) + Puppet::Type.type(:apt_key).new(id: 'FEF8D349F', + source: 'http://apt.puppetlabs.com/pubkey.gpg', + content: 'Completely invalid as a GPG key') }.to raise_error(%r{Valid values match}) end it 'raises an error when an invalid URI scheme is used in source' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'hkp://pgp.mit.edu', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'hkp://pgp.mit.edu') }.to raise_error(%r{Valid values match}) end it 'allows the http URI scheme in source' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'http://pgp.mit.edu', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'http://pgp.mit.edu') }.not_to raise_error end it 'allows the http URI with username and password' do expect { - Puppet::Type.type(:apt_key).new( - id: '4BD6EC30', - source: 'http://testme:Password2@pgp.mit.edu', - ) + Puppet::Type.type(:apt_key).new(id: '4BD6EC30', + source: 'http://testme:Password2@pgp.mit.edu') }.not_to raise_error end it 'allows the https URI scheme in source' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'https://pgp.mit.edu', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'https://pgp.mit.edu') }.not_to raise_error end it 'allows the https URI with username and password' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'https://testme:Password2@pgp.mit.edu', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'https://testme:Password2@pgp.mit.edu') }.not_to raise_error end it 'allows the ftp URI scheme in source' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'ftp://pgp.mit.edu', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'ftp://pgp.mit.edu') }.not_to raise_error end it 'allows an absolute path in source' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: '/path/to/a/file', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: '/path/to/a/file') }.not_to raise_error end it 'allows 5-digit ports' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - source: 'http://pgp.mit.edu:12345/key', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + source: 'http://pgp.mit.edu:12345/key') }.not_to raise_error end it 'allows 5-digit ports when using key servers' do expect { - Puppet::Type.type(:apt_key).new( - id: 'EF8D349F', - server: 'http://pgp.mit.edu:12345', - ) + Puppet::Type.type(:apt_key).new(id: 'EF8D349F', + server: 'http://pgp.mit.edu:12345') }.not_to raise_error end end -- 2.32.3