require 'spec_helper'

describe 'swift::storage::object' do

  let :pre_condition do
    "class { 'swift': swift_hash_suffix => 'foo' }
     class { 'swift::storage': storage_local_net_ip => '10.0.0.1' }"
  end

  let :params do
    { :package_ensure => 'present',
      :enabled        => true,
      :manage_service => true }
  end

  shared_examples_for 'swift-storage-object' do

    [{},
     { :package_ensure => 'latest' }
    ].each do |param_set|
      describe "when #{param_set == {} ? "using default" : "specifying"} class parameters" do
        before do
          params.merge!(param_set)
        end

        it { is_expected.to contain_swift__storage__generic('object').with_package_ensure(params[:package_ensure]) }
      end
    end

    [{ :enabled => true, :manage_service => true },
     { :enabled => false, :manage_service => true }].each do |param_hash|
      context "when service should be #{param_hash[:enabled] ? 'enabled' : 'disabled'}" do
        before do
          params.merge!(param_hash)
        end

        it 'configures services' do
          platform_params[:service_names].each do |service_alias, service_name|
            is_expected.to contain_service(service_alias).with(
              :name    => service_name,
              :ensure  => (param_hash[:manage_service] && param_hash[:enabled]) ? 'running' : 'stopped',
              :enable  => param_hash[:enabled],
              :tag     => 'swift-service',
            )
          end
        end
      end
    end

    context 'with disabled service managing' do
      before do
        params.merge!({
          :manage_service => false,
          :enabled        => false })
      end

      it 'configures services' do
        platform_params[:service_names].each do |service_alias, service_name|
          is_expected.to contain_service(service_alias).with(
            :ensure    => nil,
            :name      => service_name,
            :enable    => false,
            :tag       => 'swift-service',
          )
        end
      end
    end
  end

  context 'on Debian platforms' do
    let :facts do
      {:operatingsystem => 'Ubuntu',
       :osfamily        => 'Debian' }

    end

    let :platform_params do
      { :service_names => {
          'swift-object'            => 'swift-object',
          'swift-object-replicator' => 'swift-object-replicator',
          'swift-object-updater'    => 'swift-object-updater',
          'swift-object-auditor'    => 'swift-object-auditor'
        }
      }
    end

    it_configures 'swift-storage-object'
  end

  context 'on RedHat platforms' do
    let :facts do
      { :osfamily        => 'RedHat',
        :operatingsystem => 'RedHat' }
    end

    let :platform_params do
      { :service_names => {
          'swift-object'            => 'openstack-swift-object',
          'swift-object-replicator' => 'openstack-swift-object-replicator',
          'swift-object-updater'    => 'openstack-swift-object-updater',
          'swift-object-auditor'    => 'openstack-swift-object-auditor'
        }
      }
    end

    it_configures 'swift-storage-object'
  end
end
