control 'Slaughterhouse functionality' do
  title 'Slaughterhouse packages and configs'

  nodes_dir = '/tmp/kitchen/nodes'
  output = command("ls #{nodes_dir}").stdout.strip
  node_json = "#{nodes_dir}/#{output}"
  node = json(node_json).params

  case node['automatic']['platform_family']
  when 'debian'
    php_module = 'php_module'
    apache_parent_dir = 'apache2'
  when 'rhel'
    php_module = 'php5_module'
    apache_parent_dir = 'httpd'
  end

  packages = %w(
    git
    unzip
    zip
  )
  packages.each do |pkg|
    describe package(pkg) do
      it { should be_installed }
    end
  end

  slaughterhouse_root_directory = node['default']['slaughterhouse']['root_directory']
  describe directory(slaughterhouse_root_directory) do
    it { should exist }
    its('owner') { should eq node['default']['php']['deploy_user'] }
    its('group') { should eq 'webdev' }
  end

  # Check for git repository in root location
  describe command("su #{node['default']['php']['deploy_user']} -c \"cd #{slaughterhouse_root_directory} && git log\"") do
    its('exit_status') { should eq 0 }
  end

  # Slaughterhouse SFTP user
  slaughterhouse_sftp_user = node['default']['slaughterhouse']['sftp_user']
  home_directory = node['default']['slaughterhouse']['sftp_user_home_directory']

  describe user(slaughterhouse_sftp_user) do
    it { should exist }
    its('home') { should eq home_directory }
    its('shell') { should eq '/sbin/nologin' }
  end

  describe directory(home_directory) do
    it { should exist }
    its('owner') { should eq 'root' }
    its('group') { should eq slaughterhouse_sftp_user }
    its('mode') { should cmp '0755' }
  end

  describe sshd_config do
    its('PermitRootLogin') { should eq 'yes' }
    its('PasswordAuthentication') { should eq 'no' }
    its('Match') { should include slaughterhouse_sftp_user }
  end

  # Slaughterhouse has several hard-coded directory paths, so test them all
  slaughterhouse_sftp_directories = %W(
    #{home_directory}/dropbox
    #{home_directory}/dropbox/trash
  )

  slaughterhouse_sftp_directories.each do |slaughterhouse_directory|
    describe directory(slaughterhouse_directory) do
      it { should exist }
      its('owner') { should eq slaughterhouse_sftp_user }
      its('group') { should eq node['default']['apache']['group'] }
      its('mode') { should cmp '0775' }
    end
  end

  # Symlink for dropbox directory
  describe file("#{slaughterhouse_root_directory}/slaughterhouse/dropbox") do
    its('link_path') { should eq "#{home_directory}/dropbox" }
  end

  # Test healthcheck
  describe file("#{slaughterhouse_root_directory}/healthchk.html") do
    it { should exist }
    its('content') { should eq 'hello' }
    its('owner') { should eq node['default']['php']['deploy_user'] }
    its('group') { should eq 'webdev' }
    its('mode') { should cmp '0644' }
  end

  # Test engine env file
  engine_env_file = "#{node['default']['php']['deploy_home_dir']}/.env"

  describe file(engine_env_file) do
    it { should exist }
    its('content') { should include 'STATEMENT_DB_HOST' }
    its('owner') { should eq node['default']['php']['deploy_user'] }
    its('mode') { should cmp '0600' }
  end

  slaughterhouse_log_directory = '/tmp/slaughterhouse'

  describe directory(slaughterhouse_log_directory) do
    it { should exist }
    its('owner') { should eq node['default']['php']['deploy_user'] }
  end

  describe crontab(node['default']['php']['deploy_user']).commands(
    "cd #{slaughterhouse_root_directory}/slaughterhouse; . #{engine_env_file} && "\
    'php -f engine.php >> '\
    "#{slaughterhouse_log_directory}/slaughterhouse_engine_$(date +\\%Y-\\%m-\\%d-\\%H:\\%M).log 2>&1"
  ) do
    its('hours') { should cmp '*' }
    its('minutes') { should cmp '*' }
  end

  describe crontab(node['default']['php']['deploy_user']).commands("cd #{slaughterhouse_root_directory} && git pull && chgrp -R webdev .") do
    its('hours') { should cmp '*' }
    its('minutes') { should cmp '*/5' }
  end

  # Create ".aws" directory for service user
  describe directory("#{node['default']['php']['deploy_home_dir']}/.aws") do
    it { should exist }
    its('owner') { should eq node['default']['php']['deploy_user'] }
    its('mode') { should cmp '0755' }
  end

  # Create ".aws" directory for service user
  describe file("#{node['default']['php']['deploy_home_dir']}/.aws/credentials") do
    it { should exist }
    its('owner') { should eq node['default']['php']['deploy_user'] }
    its('mode') { should cmp '0640' }
  end

  slaughterhouse_log_backup_s3_path = node['default']['slaughterhouse']['logfile_s3_bucket_path']
  describe crontab(node['default']['php']['deploy_user']).commands(
    "aws s3 sync #{slaughterhouse_log_directory} s3://#{slaughterhouse_log_backup_s3_path}/$(date +\\%Y-\\%m-\\%d)/ --sse"
  ) do
    its('hours') { should cmp '*' }
    its('minutes') { should cmp '*/5' }
  end

  describe apache_conf('slaughterhouse') do
    its('LoadModule') { should include php_module }
  end

  describe file("/etc/#{apache_parent_dir}/sites-enabled/default.conf") do
    it { should_not exist }
  end

  describe file("/etc/#{apache_parent_dir}/sites-enabled/000-default.conf") do
    it { should_not exist }
  end

  node['default']['webapps'].each do |vhost, _vhost_info|
    describe file("/etc/#{apache_parent_dir}/sites-enabled/#{vhost}.conf") do
      it { should exist }
    end
  end
end
