require 'rails_helper'

RSpec.describe Guidance, type: :model do

  context "validations" do

    it { is_expected.to validate_presence_of(:text) }

    it { is_expected.to validate_presence_of(:guidance_group) }

    context "if published" do

      before { subject.expects(:published?).returns(true) }
      it { is_expected.to validate_presence_of(:themes) }

    end

    it { is_expected.to allow_value(true).for(:published) }

    it { is_expected.to allow_value(false).for(:published) }

  end

  context "associations" do

    it { is_expected.to belong_to :guidance_group }

    it do
      is_expected.to have_and_belong_to_many(:themes)
                       .join_table("themes_in_guidance")
    end
  end


  describe ".can_view?" do

    let!(:user) { create(:user) }

    subject { Guidance.can_view?(user, @guidance.id) }

    context "when guidance_id is invalid" do

      before do
        @guidance = Guidance.new(guidance_group: create(:guidance_group))
      end

      it { is_expected.to eql(false) }

    end

    context "when guidance's group is nil" do

      before do
        @guidance = Guidance.new
      end

      it { is_expected.to eql(false) }

    end

    context "when owned by a curation center" do

      before do
        @org = create(:org,
                abbreviation: Rails.configuration
                                   .branding.dig(:organisation, :abbreviation))
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(true) }

    end

    context "when owned by a institution org" do

      before do
        @org            = create(:org, :institution)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(false) }

    end

    context "when owned by a funder org" do

      before do
        @org            = create(:org, :funder)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(true) }

    end

    context "when owned by a organisation org" do

      before do
        @org            = create(:org, :organisation)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(false) }

    end

    context "when owned by a research_institute org" do

      before do
        @org            = create(:org, :research_institute)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(false) }

    end

    context "when owned by a project org" do

      before do
        @org            = create(:org, :project)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(false) }

    end

    context "when owned by a school org" do

      before do
        @org            = create(:org, :school)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(false) }

    end

    context "when owned by an Org which the user is a member" do

      before do
        @org            = user.org
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it { is_expected.to eql(true) }

    end

  end

  describe ".all_viewable" do

    let!(:user) { create(:user) }

    subject { Guidance.all_viewable(user) }

    context "when is owned by managing curation center" do

      before do
        @org = create(:org,
                abbreviation: Rails.configuration
                                   .branding.dig(:organisation, :abbreviation))
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "includes guidance" do
        expect(subject).to include(@guidance)
      end

    end

    context "when is owned by institution Org" do

      before do
        @org = create(:org, :institution)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "excludes guidance" do
        expect(subject).not_to include(@guidance)
      end

    end

    context "when is owned by funder Org" do

      before do
        @org = create(:org, :funder)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "includes guidance" do
        expect(subject).to include(@guidance)
      end

    end

    context "when is owned by organisation Org" do

      before do
        @org = create(:org, :organisation)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "excludes guidance" do
        expect(subject).not_to include(@guidance)
      end

    end

    context "when is owned by research_institute Org" do

      before do
        @org = create(:org, :research_institute)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "excludes guidance" do
        expect(subject).not_to include(@guidance)
      end

    end

    context "when is owned by project Org" do

      before do
        @org = create(:org, :project)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "excludes guidance" do
        expect(subject).not_to include(@guidance)
      end

    end

    context "when is owned by school Org" do

      before do
        @org = create(:org, :school)
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "excludes guidance" do
        expect(subject).not_to include(@guidance)
      end

    end

    context "when is owned by User's Org'" do

      before do
        @org = user.org
        @guidance_group = create(:guidance_group, org: @org)
        @guidance       = create(:guidance, guidance_group: @guidance_group)
      end

      it "includes guidance" do
        expect(subject).to include(@guidance)
      end

    end
  end

  describe "#in_group_belonging_to?" do

    let!(:org) { create(:org) }

    subject { guidance.in_group_belonging_to?(org.id) }

    context "when guidance_group is nil" do

      let!(:guidance) { Guidance.new }

      it { is_expected.to eql(false) }

    end

    context "when guidance group belongs to given Org" do

      let!(:guidance_group) { create(:guidance_group, org: org) }

      let!(:guidance) { create(:guidance, guidance_group: guidance_group) }

      it { is_expected.to eql(true) }

    end

    context "when guidance group doesn't belong to given Org" do

      let!(:guidance_group) { create(:guidance_group) }

      let!(:guidance) { create(:guidance, guidance_group: guidance_group) }

      it { is_expected.to eql(false) }

    end
  end

end
