Cleaned up unit tests.
[puppet-modules/puppetlabs-apt.git] / spec / classes / apt_spec.rb
index 71a438e0627780794fdfb47f1fbad687d6ab3fe4..2c70e3e0901258b106a7c42e940131b35acf5e1c 100644 (file)
 require 'spec_helper'
 describe 'apt', :type => :class do
-  let :default_params do
-    {
-      :disable_keys => :undef,
-      :always_apt_update => false,
-      :purge_sources_list => false,
-      :purge_sources_list_d => false,
-    }
+  let(:facts) { { :lsbdistid => 'Debian', :osfamily => 'Debian' } }
+
+  context 'defaults' do
+    it { should contain_file('sources.list').that_notifies('Exec[apt_update]').only_with({
+      'ensure' => 'present',
+      'path'   => '/etc/apt/sources.list',
+      'owner'  => 'root',
+      'group'  => 'root',
+      'mode'   => '0644',
+      'notify' => 'Exec[apt_update]',
+    })}
+
+    it { should contain_file('sources.list.d').that_notifies('Exec[apt_update]').only_with({
+      'ensure'  => 'directory',
+      'path'    => '/etc/apt/sources.list.d',
+      'owner'   => 'root',
+      'group'   => 'root',
+      'purge'   => false,
+      'recurse' => false,
+      'notify'  => 'Exec[apt_update]',
+    })}
+
+    it { should contain_file('preferences.d').only_with({
+      'ensure'  => 'directory',
+      'path'    => '/etc/apt/preferences.d',
+      'owner'   => 'root',
+      'group'   => 'root',
+      'purge'   => false,
+      'recurse' => false,
+    })}
+
+    it { should contain_file('01proxy').that_notifies('Exec[apt_update]').only_with({
+      'ensure' => 'absent',
+      'path'   => '/etc/apt/apt.conf.d/01proxy',
+      'notify' => 'Exec[apt_update]',
+    })}
+
+    it { should contain_file('old-proxy-file').that_notifies('Exec[apt_update]').only_with({
+      'ensure' => 'absent',
+      'path'   => '/etc/apt/apt.conf.d/proxy',
+      'notify' => 'Exec[apt_update]',
+    })}
+
+    it { should contain_exec('apt_update').with({
+      'refreshonly' => 'true',
+    })}
   end
 
-  [{},
-    {
-      :disable_keys => true,
-      :always_apt_update => true,
-      :proxy_host => true,
-      :proxy_port => '3128',
-      :purge_sources_list => true,
-      :purge_sources_list_d => true,
-    },
-    {
-      :disable_keys => false
+  context 'lots of non-defaults' do
+    let :params do
+      {
+        :always_apt_update    => true,
+        :disable_keys         => true,
+        :proxy_host           => 'foo',
+        :proxy_port           => '9876',
+        :purge_sources_list   => true,
+        :purge_sources_list_d => true,
+        :purge_preferences    => true,
+        :purge_preferences_d  => true,
+        :update_timeout       => '1',
+        :update_tries         => '3',
+        :fancy_progress       => true,
+      }
+    end
+
+    it { should contain_file('sources.list').with({
+      'content' => "# Repos managed by puppet.\n"
+    })}
+
+    it { should contain_file('sources.list.d').with({
+      'purge'   => 'true',
+      'recurse' => 'true',
+    })}
+
+    it { should contain_file('apt-preferences').only_with({
+      'ensure' => 'absent',
+      'path'   => '/etc/apt/preferences',
+    })}
+
+    it { should contain_file('preferences.d').with({
+      'purge'   => 'true',
+      'recurse' => 'true',
+    })}
+
+    it { should contain_file('99progressbar').only_with({
+      'ensure'  => 'present',
+      'content' => 'Dpkg::Progress-Fancy "1";',
+      'path'    => '/etc/apt/apt.conf.d/99progressbar',
+    })}
+
+    it { should contain_file('99unauth').only_with({
+      'ensure'  => 'present',
+      'content' => "APT::Get::AllowUnauthenticated 1;\n",
+      'path'    => '/etc/apt/apt.conf.d/99unauth',
+    })}
+
+    it { should contain_file('01proxy').that_notifies('Exec[apt_update]').only_with({
+      'ensure'  => 'present',
+      'path'    => '/etc/apt/apt.conf.d/01proxy',
+      'content' => "Acquire::http::Proxy \"http://foo:9876\";\n",
+      'notify'  => 'Exec[apt_update]',
+      'mode'    => '0644',
+      'owner'   => 'root',
+      'group'   => 'root'
+    })}
+
+    it { should contain_exec('apt_update').with({
+      'refreshonly' => 'false',
+      'timeout'     => '1',
+      'tries'       => '3',
+    })}
+
+  end
+
+  context 'more non-default' do
+    let :params do
+      {
+        :fancy_progress => false,
+        :disable_keys   => false,
+      }
+    end
+
+    it { should contain_file('99progressbar').only_with({
+      'ensure'  => 'absent',
+      'path'    => '/etc/apt/apt.conf.d/99progressbar',
+    })}
+
+    it { should contain_file('99unauth').only_with({
+      'ensure'  => 'absent',
+      'path'    => '/etc/apt/apt.conf.d/99unauth',
+    })}
+
+  end
+
+  context 'with sources defined on valid osfamily' do
+    let :facts do
+      { :osfamily        => 'Debian',
+        :lsbdistcodename => 'precise',
+        :lsbdistid       => 'Debian',
+      }
+    end
+    let(:params) { { :sources => {
+      'debian_unstable' => {
+        'location'          => 'http://debian.mirror.iweb.ca/debian/',
+        'release'           => 'unstable',
+        'repos'             => 'main contrib non-free',
+        'required_packages' => 'debian-keyring debian-archive-keyring',
+        'key'               => '55BE302B',
+        'key_server'        => 'subkeys.pgp.net',
+        'pin'               => '-10',
+        'include_src'       => true
+      },
+      'puppetlabs' => {
+        'location'   => 'http://apt.puppetlabs.com',
+        'repos'      => 'main',
+        'key'        => '4BD6EC30',
+        'key_server' => 'pgp.mit.edu',
+      }
+    } } }
+
+    it {
+      should contain_file('debian_unstable.list').with({
+        'ensure'  => 'present',
+        'path'    => '/etc/apt/sources.list.d/debian_unstable.list',
+        'owner'   => 'root',
+        'group'   => 'root',
+        'mode'    => '0644',
+        'notify'  => 'Exec[apt_update]',
+      })
+    }
+
+    it { should contain_file('debian_unstable.list').with_content(/^deb http:\/\/debian.mirror.iweb.ca\/debian\/ unstable main contrib non-free$/) }
+    it { should contain_file('debian_unstable.list').with_content(/^deb-src http:\/\/debian.mirror.iweb.ca\/debian\/ unstable main contrib non-free$/) }
+
+    it {
+      should contain_file('puppetlabs.list').with({
+        'ensure'  => 'present',
+        'path'    => '/etc/apt/sources.list.d/puppetlabs.list',
+        'owner'   => 'root',
+        'group'   => 'root',
+        'mode'    => '0644',
+        'notify'  => 'Exec[apt_update]',
+      })
     }
-  ].each do |param_set|
-    describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
-      let :param_hash do
-        default_params.merge(param_set)
-      end
 
+    it { should contain_file('puppetlabs.list').with_content(/^deb http:\/\/apt.puppetlabs.com precise main$/) }
+    it { should contain_file('puppetlabs.list').with_content(/^deb-src http:\/\/apt.puppetlabs.com precise main$/) }
+  end
+
+  describe 'failing tests' do
+    context 'bad purge_sources_list' do
       let :params do
-        param_set
+        {
+          'purge_sources_list' => 'foo'
+        }
       end
-
-      let :refresh_only_apt_update do
-        if param_hash[:always_apt_update]
-          false
-        else
-          true
-        end
+      it do
+        expect {
+          should compile
+        }.to raise_error(Puppet::Error)
       end
+    end
 
-      it { should include_class("apt::params") }
-
-      it { should contain_package("python-software-properties") }
-
-      it {
-        if param_hash[:purge_sources_list]
-        should contain_file("sources.list").with({
-            'path'    => "/etc/apt/sources.list",
-            'ensure'  => "present",
-            'owner'   => "root",
-            'group'   => "root",
-            'mode'    => 644,
-            "content" => "# Repos managed by puppet.\n"
-          })
-        else
-        should contain_file("sources.list").with({
-            'path'    => "/etc/apt/sources.list",
-            'ensure'  => "present",
-            'owner'   => "root",
-            'group'   => "root",
-            'mode'    => 644,
-            'content' => nil
-          })
-        end
-      }
-      it {
-        if param_hash[:purge_sources_list_d]
-          should create_file("sources.list.d").with({
-            'path'    => "/etc/apt/sources.list.d",
-            'ensure'  => "directory",
-            'owner'   => "root",
-            'group'   => "root",
-            'purge'   => true,
-            'recurse' => true
-          })
-        else
-          should create_file("sources.list.d").with({
-            'path'    => "/etc/apt/sources.list.d",
-            'ensure'  => "directory",
-            'owner'   => "root",
-            'group'   => "root",
-            'purge'   => false,
-            'recurse' => false
-          })
-        end
-      }
+    context 'bad purge_sources_list_d' do
+      let :params do
+        {
+          'purge_sources_list_d' => 'foo'
+        }
+      end
+      it do
+        expect {
+          should compile
+        }.to raise_error(Puppet::Error)
+      end
+    end
 
-      it {
-        should contain_exec("apt_update").with({
-          'command'     => "/usr/bin/apt-get update",
-          'subscribe'   => ["File[sources.list]", "File[sources.list.d]"],
-          'refreshonly' => refresh_only_apt_update
-        })
-      }
+    context 'bad purge_preferences' do
+      let :params do
+        {
+          'purge_preferences' => 'foo'
+        }
+      end
+      it do
+        expect {
+          should compile
+        }.to raise_error(Puppet::Error)
+      end
+    end
 
-      it {
-        if param_hash[:disable_keys] == true
-          should create_file("99unauth").with({
-            'content' => "APT::Get::AllowUnauthenticated 1;\n",
-            'ensure'  => "present",
-            'path'    => "/etc/apt/apt.conf.d/99unauth"
-          })
-        elsif param_hash[:disable_keys] == false
-          should create_file("99unauth").with({
-            'ensure' => "absent",
-            'path'   => "/etc/apt/apt.conf.d/99unauth"
-          })
-        elsif param_hash[:disable_keys] != :undef
-          should_not create_file("99unauth").with({
-            'path'   => "/etc/apt/apt.conf.d/99unauth"
-          })
-        end
-      }
-      describe 'when setting a proxy' do
-        it {
-          if param_hash[:proxy_host]
-            should contain_file('configure-apt-proxy').with(
-              'path'    => '/etc/apt/apt.conf.d/proxy',
-              'content' => "Acquire::http::Proxy \"http://#{param_hash[:proxy_host]}:#{param_hash[:proxy_port]}\";"
-            )
-          else
-            should_not contain_file('configure_apt_proxy')
-          end
+    context 'bad purge_preferences_d' do
+      let :params do
+        {
+          'purge_preferences_d' => 'foo'
         }
       end
+      it do
+        expect {
+          should compile
+        }.to raise_error(Puppet::Error)
+      end
     end
-  end
 
-  describe "it should not error if package['python-software-properties'] is already defined" do
-    let(:pre_condition) { 'package { "python-software-properties": }->Class["Apt"]' }
-    it { should contain_package("python-software-properties") }
+    context 'with unsupported osfamily' do
+      let :facts do
+        { :osfamily => 'Darwin', }
+      end
+
+      it do
+        expect {
+          should compile
+        }.to raise_error(Puppet::Error, /This module only works on Debian or derivatives like Ubuntu/)
+      end
+    end
   end
 end