]> review.fuel-infra Code Review - puppet-modules/puppetlabs-apt.git/commitdiff
Merge pull request #732 from willmeek/release_4_4_1 4.4.1
authorPaula McMaw <paula@puppet.com>
Thu, 16 Nov 2017 15:19:22 +0000 (15:19 +0000)
committerGitHub <noreply@github.com>
Thu, 16 Nov 2017 15:19:22 +0000 (15:19 +0000)
Release prep for 4.4.1

21 files changed:
.rubocop_todo.yml
spec/acceptance/apt_key_provider_spec.rb
spec/acceptance/apt_spec.rb
spec/classes/apt_backports_spec.rb
spec/classes/apt_spec.rb
spec/classes/apt_update_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
spec/spec_helper.rb
spec/spec_helper_acceptance.rb
spec/unit/facter/apt_dist_package_security_updates_spec.rb
spec/unit/facter/apt_dist_package_updates_spec.rb
spec/unit/facter/apt_package_security_updates_spec.rb
spec/unit/facter/apt_package_updates_spec.rb
spec/unit/puppet/type/apt_key_spec.rb

index 69304c9545a9bcbfa8a944ef4987bafd092a9882..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -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'
index 1ea5411542a54eba78b6034ed1ed1acea6a1ff1d..0644cb5945f3ba261753fd371309ee96fcbbbeab 100644 (file)
@@ -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
index e8950d1fbda992144e63ac653eb817148ad649f6..04f554072bd2a9a2c127c20df51ee5f64db00ab9 100644 (file)
@@ -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')
index 052883166cd1d48c3dd4239258bc83ecaddfe493..b8e14245a79419fc04c4464ca87bd785eb95b85a 100644 (file)
@@ -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
index cbbe746b0edb364ef0908fe0bb81595d113c2960..fb84c51cfbfe504ea21597f60c37e49305f85018 100644 (file)
@@ -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
index e178d40f508ec7fe385e43514ae1ee1c8be70bda..9f91d04c1d535740aa13cd11aae6642d7a6222cc 100644 (file)
@@ -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
index 1296e999f89c283ce602a3b5bde5f51a99772cd9..d79cb22921571ef2af8011a9b3f37dc2009e91f5 100644 (file)
@@ -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
 
index 61347685c184d61e68e7e978715ba99f899f4564..0a450ecf0140095151b7c83504e8c9cac26542e7 100644 (file)
@@ -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
index e9ec0c5c427ccd8b702ad9ca94c90aff8f9f0c2d..d668780eaa99fd11adade8a408794ebc737579b9 100644 (file)
@@ -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
index a01a919a5b2e42636b49aa8a97460613a54f45ee..52ecb97132beddc48116fca47227a889c5b61142 100644 (file)
@@ -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
index 89e5b36c57f4373590e27eae895bc93636e652bb..7a11811e461dea4d6f4d0e845c27495aecd54e14 100644 (file)
@@ -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
index 0b6ca99b60eadb5f706c4da31f6d51b257f4d2f8..1a94de78f41f62f8e3bcfb177173f0546d090114 100644 (file)
@@ -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
 
index c6b6aefc2eff797b17f6229a2bc94c090e09e037..23f9549052535ed934f5d37a13eb11cd7f45936b 100644 (file)
@@ -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
index 52a7ca9e9cf64b398df1b443e7c54e05fa33ec22..9cec5802d0f9d80b8556184559959d6c3a89a87f 100644 (file)
@@ -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
 
index 1b8480d41688bc1079e2dc5d119ad3ebfb3fe8eb..01912b60c44d9b6e9444dbcc3f898e3dc295ef80 100644 (file)
@@ -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
index e9d51bfd11c60c4d38b5861b29a9ffefd6a1169f..67bf096d830ae1c1b6449edf69773ca0a897772b 100644 (file)
@@ -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
index 316dbfc6ffc0df4e756f5f6bbdbadb2796a771fc..7f4f16a6c1263117e9d22f3089f722312b223ba2 100644 (file)
@@ -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
index 557e3b3b2fe9190089d244ce91e3f5181578b26e..080e21f68326c5844e0bbedfed9ccb95a10a4577 100644 (file)
@@ -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
index b6a713f18697f46a1899da4602be8556aca4d838..1cd992d616fce5a4644746401783438264168adc 100644 (file)
@@ -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
index 355ab183d2f5e6e5c7583abb8cc0522dbf6c9972..f24481a98239d593ea2d458b46e60433205b8a91 100644 (file)
@@ -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
index a1f24b5ad2f35a4e26c910032c279dd9369779e4..042804099bf906591e3056ed83d2eda5ab4b5141 100644 (file)
@@ -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