require "rails_helper"

RSpec.describe TitleHelper do
  describe "#format_label" do
    let(:item) { "organisation" }

    it "returns singular when count is 1" do
      expect(format_label(1, item)).to eq("organisation")
    end

    it "returns plural when count greater than 1" do
      expect(format_label(2, item)).to eq("organisations")
    end
  end

  describe "#format_title" do
    let(:page_title) { "Title" }
    let(:item_label) { "label" }
    let(:search_item)  { nil }
    let(:count) { 1 }
    let(:organisation_name) { nil }

    context "when provider user" do
      let(:user) { FactoryBot.create(:user) }

      context "when any specific path" do
        let(:page_title) { "Users" }
        let(:organisation_name) { nil }

        context "when search is missing" do
          let(:expected_title) { page_title }

          it "returns expected title" do
            expect(format_title(nil, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
          end

          context "when search is present" do
            let(:search_item) { "foobar" }
            let(:expected_title) { "#{page_title} (#{count} #{item_label} matching ‘#{search_item}’)" }

            it "returns expected title" do
              expect(format_title(search_item, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
            end
          end
        end
      end
    end

    context "when coordinator user" do
      let(:user) { FactoryBot.create(:user, :data_coordinator) }

      context "when any specific path" do
        let(:page_title) { "Users" }
        let(:organisation_name) { nil }

        context "when search is missing" do
          let(:expected_title) { page_title }

          it "returns expected title" do
            expect(format_title(nil, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
          end

          context "when search is present" do
            let(:search_item) { "foobar" }
            let(:expected_title) { "#{page_title} (#{count} #{item_label} matching ‘#{search_item}’)" }

            it "returns expected title" do
              expect(format_title(search_item, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
            end
          end
        end
      end
    end

    context "when support user" do
      let(:user) { FactoryBot.create(:user, :support) }

      context "when no organisation is specified" do
        let(:page_title) { "Organisations" }

        context "when search is missing" do
          let(:expected_title) { page_title }

          it "returns expected title" do
            expect(format_title(nil, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
          end
        end

        context "when search is present" do
          let(:search_item) { "foobar" }
          let(:expected_title) { "#{page_title} (#{count} #{item_label} matching ‘#{search_item}’)" }

          it "returns expected title" do
            expect(format_title(search_item, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
          end
        end
      end

      context "when organisation is specified" do
        let(:page_title) { "Organisations" }
        let(:organisation_name) { "Some Name" }

        context "when search is missing" do
          let(:expected_title) { "#{organisation_name} (#{page_title})" }

          it "returns expected title" do
            expect(format_title(nil, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
          end
        end

        context "when search is present" do
          let(:search_item) { "foobar" }
          let(:expected_title) { "#{organisation_name} (#{count} #{item_label} matching ‘#{search_item}’)" }

          it "returns expected title" do
            expect(format_title(search_item, page_title, user, item_label, count, organisation_name)).to eq(expected_title)
          end
        end
      end
    end
  end
end