require 'test_helper'

class GuidanceTest < ActiveSupport::TestCase

  setup do
    @user_one = User.first
    @user_two = User.order(surname: :desc).first
    @user_three = User.last
    
    @org_type = OrganisationType.first
    
    @organisations = Organisation.all
  end

  # ---------- can_view? ----------
  # ensure that the can_view? function returns true all viewable guidances
  #   should return true for groups owned by funders
  #   should return true for groups owned by DCC
  #   should return true for groups owned by the user's organisation
  #   should not return true for an organisation outwith those above
  test "DCC guidances should be viewable" do
=begin
    guidance_groups(:dcc_guidance_group_1).guidances.each do |guidance|
      assert Guidance.can_view?(@user_one, guidance.id)
    end
=end
  end

  test "Funder guidances should be viewable" do
=begin
    assert Guidance.can_view?(@user_one, guidances(:ahrc_funder_guidance).id)
    assert Guidance.can_view?(@user_one, guidances(:bbsrc_funder_guidance).id)
=end
  end


  test "User's organisation guidances should be viewable" do
=begin
    assert Guidance.can_view?(@user_one, guidances(:aru_institution_guidance).id) , "user_one cannot view aru_institution_guidance"

    assert Guidance.can_view?(@user_two, guidances(:au_institution_guidance_1).id), "user_two cannot view au_..._1"
    assert Guidance.can_view?(@user_two, guidances(:au_institution_guidance_2).id), "user_two cannot view au_..._2"

    assert Guidance.can_view?(@user_three, guidances(:bu_institution_guidance_1).id), "user_three cannot view bu_..._1"
    assert Guidance.can_view?(@user_three, guidances(:bu_institution_guidance_2).id), "user_three cannot view bu_..._2"
=end
  end

  test "No other organisations's guidances should be viewable" do
=begin
    # TOOD: add more fixtures with new types of guidances(i.e. not institution)
    # and add test cases
    assert_not Guidance.can_view?(@user_one, guidances(:au_institution_guidance_1).id)
    assert_not Guidance.can_view?(@user_one, guidances(:au_institution_guidance_2).id)
    assert_not Guidance.can_view?(@user_one, guidances(:bu_institution_guidance_1).id)
    assert_not Guidance.can_view?(@user_one, guidances(:bu_institution_guidance_2).id)

    assert_not Guidance.can_view?(@user_two, guidances(:aru_institution_guidance).id)
    assert_not Guidance.can_view?(@user_two, guidances(:bu_institution_guidance_1).id)
    assert_not Guidance.can_view?(@user_two, guidances(:bu_institution_guidance_2).id)

    assert_not Guidance.can_view?(@user_three, guidances(:aru_institution_guidance).id)
    assert_not Guidance.can_view?(@user_three, guidances(:au_institution_guidance_1).id)
    assert_not Guidance.can_view?(@user_three, guidances(:au_institution_guidance_2).id)
=end
  end

# ---------- all_viewable ----------
  # ensure that the all_viewable function returns all viewable guidances
  #   should return true for groups owned by funders
  #   should return true for groups owned by DCC
  #   should return true for groups owned by the user's organisation
  #   should not return true for an organisation outwith those above
  test "all_viewable returns all DCC guidances" do
=begin
    all_viewable_guidances = Guidance.all_viewable(@user_one)
    @organisations.first.guidance_groups.each do |group|
      group.guidances.each do |guidance|
        assert_includes(all_viewable_guidances, guidance)
      end
    end
=end
  end

  test "all_viewable returns all funder guidances" do
=begin
    all_viewable_guidances = Guidance.all_viewable(@user_one)
    guidance_groups(:funder_guidance_group_1).guidances.each do |guidance|
      assert_includes(all_viewable_guidances, guidance)
    end
    guidance_groups(:funder_guidance_group_2).guidances.each do |guidance|
      assert_includes(all_viewable_guidances, guidance)
    end
=end
  end

  test "all_viewable returns all of a user's organisations's guidances" do
=begin
    all_viewable_guidances_one = Guidance.all_viewable(@user_one)
    @organisations.first.guidance_groups.each do |group|
      group.guidances.each do |guidance|
        assert_includes(all_viewable_guidances_one, guidance)
      end
    end

    all_viewable_guidances_two = Guidance.all_viewable(@user_two)
    @organisations[1].guidance_groups.each do |group|
      group.guidances.each do |guidance|
        assert_includes(all_viewable_guidances_two, guidance)
      end
    end

    all_viewable_guidances_three = Guidance.all_viewable(@user_three)
    @organisations.last.guidance_groups.each do |group|
      group.guidances.each do |guidance|
        assert_includes(all_viewable_guidances_three, guidance)
      end
    end
=end
  end


  test "all_viewable does not return any other organisation's guidance" do
=begin
    # TODO: Add in a suitable test.  should we check for non-institutions?
    all_viewable_guidances = Guidance.all_viewable(@user_one)
    # remove all of the user's organisation
    # remove all of each funder's organisations
    # remove each of the dcc's organisations
    # check if nill
    all_viewable_guidances.delete_if do |guidance|
      guidance.guidance_groups.each do |group|
        if group.organisation.id == organisations(:dcc).id
          true
        elsif group.organisation.organisation_type.id == organisation_types(:funder).id
          true
        elsif group.organisation.id == @user_one.organisations.first.id
          true
        else
          false
        end
      end
    end
    assert_empty(all_viewable_guidances, "there must not be any guidances which are not funders, DCC, or our own organisation")
=end
  end

  # ---------- in_group_belonging_to? ----------
  test "in_group_belonging_to correctly identifies parent orgs" do
=begin
    # test that the association works for all correct usages
    Guidance.all.each do |guidance|
      guidance.guidance_groups.each do |group|
        assert(guidance.in_group_belonging_to?(group.organisation.id), "Guidance: #{guidance.text} should belong to organisation #{group.organisation.name}")
      end
    end
=end
  end

  test "in_group_belonging_to rejects non-parent orgs" do
=begin
    # test that in_group_belonging_to rejects a few interesting organisation-guidance pairs
    assert_not(guidances(:related_policies).in_group_belonging_to?(organisations(:ahrc)), "Organisation ahrc does not own guidance: related policies")
    assert_not(guidances(:ahrc_funder_guidance).in_group_belonging_to?(organisations(:dcc)), "Organisation dcc does not own guidance: ahrc_funder_guidance")
=end
  end

  # ---------- by_organisation ----------
  test "by_organisation correctly returns all guidance belonging to a given org" do
=begin
    Organisation.all.each do |org|
      org_guidance = Guidance.by_organisation(org)
      org.guidance_groups.each do |group|
        group.guidances.each do |guidance|
          assert_includes(org_guidance, guidance, "Guidance #{guidance.text} should belong to organisation: #{org.name}")
        end
      end
    end
=end
  end

  # ---------- get_guidance_group_templates ----------
  ## the main function is completely bugged, so ask to remove it
  # test "get_guidance_group_templates retuns all templates belonging to a guidance group" do
  #   GuidanceGroup.all.each do |group|
  #     group_templates = guidances(:related_policies).get_guidance_group_templates?(group)
  #     group.dmptemplates.each do |template|
  #       assert_includes(group_templates, template, "group #{group.name} should include template #{template.title}")
  #     end
  #   end
  # end

end








