#!/usr/bin/env rspec
require 'spec_helper'

describe 'apt::backports', :type => :class do
  let (:pre_condition) { "class{ '::apt': }" }
  describe 'debian/ubuntu tests' do
    context 'defaults on deb' do
      let(:facts) do
        {
          :lsbdistid       => 'Debian',
          :osfamily        => 'Debian',
          :lsbdistcodename => 'wheezy',
          :puppetversion   => Puppet.version,
        }
      end
      it { is_expected.to contain_apt__source('backports').with({
        :location => 'http://httpredir.debian.org/debian',
        :key      => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553',
        :repos    => 'main contrib non-free',
        :release  => 'wheezy-backports',
        :pin      => { 'priority' => 200, 'release' => 'wheezy-backports' },
      })
      }
    end
    context 'defaults on squeeze' do
      let(:facts) do
        {
          :lsbdistid       => 'Debian',
          :osfamily        => 'Debian',
          :lsbdistcodename => 'squeeze',
          :puppetversion   => Puppet.version,
        }
      end
      it { is_expected.to contain_apt__source('backports').with({
        :location => 'http://httpredir.debian.org/debian-backports',
        :key      => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553',
        :repos    => 'main contrib non-free',
        :release  => 'squeeze-backports',
        :pin      => { 'priority' => 200, 'release' => 'squeeze-backports' },
      })
      }
    end
    context 'defaults on ubuntu' do
      let(:facts) do
        {
          :lsbdistid       => 'Ubuntu',
          :osfamily        => 'Debian',
          :lsbdistcodename => 'trusty',
          :puppetversion   => Puppet.version,
        }
      end
      it { is_expected.to contain_apt__source('backports').with({
        :location => 'http://archive.ubuntu.com/ubuntu',
        :key      => '630239CC130E1A7FD81A27B140976EAF437D05B5',
        :repos    => 'main universe multiverse restricted',
        :release  => 'trusty-backports',
        :pin      => { 'priority' => 200, 'release' => 'trusty-backports' },
      })
      }
    end
    context 'set everything' do
      let(:facts) do
        {
          :lsbdistid       => 'Ubuntu',
          :osfamily        => 'Debian',
          :lsbdistcodename => 'trusty',
          :puppetversion   => Puppet.version,
        }
      end
      let(:params) do
        {
          :location => 'http://archive.ubuntu.com/ubuntu-test',
          :release  => 'vivid',
          :repos    => 'main',
          :key      => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553',
          :pin      => '90',
        }
      end
      it { is_expected.to contain_apt__source('backports').with({
        :location => 'http://archive.ubuntu.com/ubuntu-test',
        :key      => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553',
        :repos    => 'main',
        :release  => 'vivid',
        :pin      => { 'priority' => 90, 'release' => 'vivid' },
      })
      }
    end
    context 'set things with hashes' do
      let(:facts) do
        {
          :lsbdistid       => 'Ubuntu',
          :osfamily        => 'Debian',
          :lsbdistcodename => 'trusty',
          :puppetversion   => Puppet.version,
        }
      end
      let(:params) do
        {
          :key => {
            'id' => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553',
          },
          :pin => {
            'priority' => '90',
          },
        }
      end
      it { is_expected.to contain_apt__source('backports').with({
        :key      => { 'id' => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553' },
        :pin      => { 'priority' => '90' },
      })
      }
    end
  end
  describe 'mint tests' do
    let(:facts) do
      {
        :lsbdistid       => 'linuxmint',
        :osfamily        => 'Debian',
        :lsbdistcodename => 'qiana',
        :puppetversion   => Puppet.version,
      }
    end
    context 'sets all the needed things' do
      let(:params) do
        {
          :location => 'http://archive.ubuntu.com/ubuntu',
          :release  => 'trusty-backports',
          :repos    => 'main universe multiverse restricted',
          :key      => '630239CC130E1A7FD81A27B140976EAF437D05B5',
        }
      end
      it { is_expected.to contain_apt__source('backports').with({
        :location => 'http://archive.ubuntu.com/ubuntu',
        :key      => '630239CC130E1A7FD81A27B140976EAF437D05B5',
        :repos    => 'main universe multiverse restricted',
        :release  => 'trusty-backports',
        :pin      => { 'priority' => 200, 'release' => 'trusty-backports' },
      })
      }
    end
    context 'missing location' do
      let(:params) do
        {
          :release  => 'trusty-backports',
          :repos    => 'main universe multiverse restricted',
          :key      => '630239CC130E1A7FD81A27B140976EAF437D05B5',
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key/)
      end
    end
    context 'missing release' do
      let(:params) do
        {
          :location => 'http://archive.ubuntu.com/ubuntu',
          :repos    => 'main universe multiverse restricted',
          :key      => '630239CC130E1A7FD81A27B140976EAF437D05B5',
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key/)
      end
    end
    context 'missing repos' do
      let(:params) do
        {
          :location => 'http://archive.ubuntu.com/ubuntu',
          :release  => 'trusty-backports',
          :key      => '630239CC130E1A7FD81A27B140976EAF437D05B5',
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key/)
      end
    end
    context 'missing key' do
      let(:params) do
        {
          :location => 'http://archive.ubuntu.com/ubuntu',
          :release  => 'trusty-backports',
          :repos    => 'main universe multiverse restricted',
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /If not on Debian or Ubuntu, you must explicitly pass location, release, repos, and key/)
      end
    end
  end
  describe 'validation' do
    let(:facts) do
      {
        :lsbdistid       => 'Ubuntu',
        :osfamily        => 'Debian',
        :lsbdistcodename => 'trusty',
        :puppetversion   => Puppet.version,
      }
    end
    context 'invalid location' do
      let(:params) do
        {
          :location => true
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /is not a string/)
      end
    end
    context 'invalid release' do
      let(:params) do
        {
          :release => true
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /is not a string/)
      end
    end
    context 'invalid repos' do
      let(:params) do
        {
          :repos => true
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /is not a string/)
      end
    end
    context 'invalid key' do
      let(:params) do
        {
          :key => true
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /is not a string/)
      end
    end
    context 'invalid pin' do
      let(:params) do
        {
          :pin => true
        }
      end
      it do
        expect {
          subject.call
        }.to raise_error(Puppet::Error, /pin must be either a string, number or hash/)
      end
    end
  end
end
