require 'test_plugin_helper'

class OpenscapHostTest < ActiveSupport::TestCase
  setup do
    disable_orchestration
    User.current = users :admin
    ForemanOpenscap::Policy.any_instance.stubs(:ensure_needed_puppetclasses).returns(true)
    ForemanOpenscap::Policy.any_instance.stubs(:find_scap_puppetclass).returns(FactoryBot.create(:puppetclass, :name => 'foreman_scap_client'))
    @policy = FactoryBot.create(:policy)
  end

  test 'Host has policy' do
    host = FactoryBot.create(:host)
    assert_empty(host.policies)

    assert(@policy.assign_hosts([host]), 'Host policies should be assigned')
    assert_includes(host.policies, @policy)
  end

  test 'Host has policies via its hostgroup' do
    host = FactoryBot.create(:host, :with_hostgroup)
    hostgroup = host.hostgroup
    @policy.hostgroup_ids = [hostgroup.id]
    assert @policy.save
    refute_empty(host.combined_policies)
    assert_includes(host.combined_policies, @policy)
  end

  test 'Host has policies via its host group and its parent host groups' do
    host = FactoryBot.create(:host, :with_hostgroup)
    hostgroup = host.hostgroup
    hostgroup.parent = FactoryBot.create(:hostgroup)
    @policy.hostgroup_ids = [hostgroup.parent.id]
    assert @policy.save
    refute_empty(host.combined_policies)
    assert_includes(host.combined_policies, @policy)
  end

  context 'testing scap_status_changed?' do
    setup do
      @host = FactoryBot.create(:compliance_host)
      @report_1 = FactoryBot.create(:arf_report, :policy => @policy, :host_id => @host.id)
      @report_2 = FactoryBot.create(:arf_report, :policy => @policy, :host_id => @host.id)
      @policy_report_1 = FactoryBot.create(:policy_arf_report, :policy_id => @policy.id, :arf_report_id => @report_1.id)
      @policy_report_2 = FactoryBot.create(:policy_arf_report, :policy_id => @policy.id, :arf_report_id => @report_2.id)
    end

    test "reports for policy should return expected reports" do
      reports = @host.reports_for_policy(@policy)
      assert_equal 2, reports.count
      assert reports.include?(@report_1)
      assert reports.include?(@report_2)
    end

    test 'scap_status_changed should detect status change' do
      ForemanOpenscap::ArfReport.any_instance.stubs(:equal?).returns(false)
      assert @host.scap_status_changed?(@policy)
    end

    test 'scap_status_changed should not detect status change when there is none' do
      ForemanOpenscap::ArfReport.any_instance.stubs(:equal?).returns(true)
      refute @host.scap_status_changed?(@policy)
    end

    test 'scap_status_changed should not detect status change when there are reports < 2' do
      openscap_proxy_api = ::ProxyAPI::Openscap.new(:url => 'https://test-proxy.com:9090')
      openscap_proxy_api.stubs(:destroy_report).returns(true)
      ForemanOpenscap::Helper.stubs(:find_name_or_uuid_by_host).returns("abcde")
      ForemanOpenscap::ArfReport.any_instance.stubs(:openscap_proxy_api).returns(openscap_proxy_api)
      @report_2.destroy
      refute @host.scap_status_changed?(@policy)
    end
  end
end