require 'spec_helper'

describe 'puppetdb::server::jetty', :type => :class do
  context 'on a supported platform' do
    let(:facts) do
      {
        :osfamily                 => 'RedHat',
        :fqdn                     => 'test.domain.local',
      }
    end

    it { should contain_class('puppetdb::server::jetty') }

    describe 'when using default values' do
      it { should contain_file('/etc/puppetlabs/puppetdb/conf.d/jetty.ini').
        with(
             'ensure'  => 'file',
             'owner'   => 'puppetdb',
             'group'   => 'puppetdb',
             'mode'    => '0600'
             )}
      it { should contain_ini_setting('puppetdb_host').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'host',
             'value'   => 'localhost'
             )}
      it { should contain_ini_setting('puppetdb_port').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'port',
             'value'   => 8080
             )}
      it { should contain_ini_setting('puppetdb_sslhost').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'ssl-host',
             'value'   => '0.0.0.0'
             )}
      it { should contain_ini_setting('puppetdb_sslport').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'ssl-port',
             'value'   => 8081
             )}
      it { should_not contain_ini_setting('puppetdb_sslprotocols') }
    end

    describe 'when using a legacy PuppetDB version' do
      let (:pre_condition) { 'class { "puppetdb::globals": version => "2.2.0", }' }
      it { should contain_ini_setting('puppetdb_host').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'host',
             'value'   => 'localhost'
             )}
      it { should contain_ini_setting('puppetdb_port').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'port',
             'value'   => 8080
             )}
      it { should contain_ini_setting('puppetdb_sslhost').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'ssl-host',
             'value'   => '0.0.0.0'
             )}
      it { should contain_ini_setting('puppetdb_sslport').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'ssl-port',
             'value'   => 8081
             )}
      it { should_not contain_ini_setting('puppetdb_sslprotocols') }
    end

    describe 'when disabling ssl' do
      let(:params) do
        {
          'disable_ssl' => true
        }
      end
      it { should contain_ini_setting('puppetdb_host').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'host',
             'value'   => 'localhost'
             )}
      it { should contain_ini_setting('puppetdb_port').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'port',
             'value'   => 8080
             )}
      it { should contain_ini_setting('puppetdb_sslhost').
        with(
             'ensure'  => 'absent',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'ssl-host'
             )}
      it { should contain_ini_setting('puppetdb_sslport').
        with(
             'ensure'  => 'absent',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'ssl-port'
             )}
    end

    describe 'when setting max_threads' do
      let(:params) do
        {
          'max_threads' => 150
        }
      end
      it { should contain_ini_setting('puppetdb_max_threads').
        with(
             'ensure'  => 'present',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'max-threads',
             'value'   => '150'
             )}
    end

    describe 'when setting ssl_protocols' do
      context 'to a valid string' do
        let(:params) { { 'ssl_protocols' => 'TLSv1, TLSv1.1, TLSv1.2' } }

        it {
          should contain_ini_setting('puppetdb_sslprotocols').with(
            'ensure' => 'present',
            'path' => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
            'section' => 'jetty',
            'setting' => 'ssl-protocols',
            'value' => 'TLSv1, TLSv1.1, TLSv1.2'
          )
        }
      end

      context 'to an invalid type (non-string)' do
        let(:params) { { 'ssl_protocols' => ['invalid','type'] } }

        it 'should fail' do
          expect {
            should contain_class('puppetdb::server::jetty')
          }.to raise_error(Puppet::Error)
        end
      end
    end

    describe 'when disabling the cleartext HTTP port' do
      let(:params) do
        {
          'disable_cleartext' => true
        }
      end
      it { should contain_ini_setting('puppetdb_host').
        with(
             'ensure'  => 'absent',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'host',
             'value'   => 'localhost'
             )}
      it { should contain_ini_setting('puppetdb_port').
        with(
             'ensure'  => 'absent',
             'path'    => '/etc/puppetlabs/puppetdb/conf.d/jetty.ini',
             'section' => 'jetty',
             'setting' => 'port',
             'value'   => 8080
             )}
    end
  end
end
