# frozen_string_literal: true

RSpec.describe PrettyText::Helpers do
  describe ".lookup_upload_urls" do
    let(:upload) { Fabricate(:upload) }

    it "should return cdn url if available" do
      short_url = upload.short_url
      result = PrettyText::Helpers.lookup_upload_urls([short_url])
      expect(result[short_url][:url]).to eq(upload.url)

      set_cdn_url "https://awesome.com"

      result = PrettyText::Helpers.lookup_upload_urls([short_url])
      expect(result[short_url][:url]).to eq("https://awesome.com#{upload.url}")
    end
  end

  describe ".category_tag_hashtag_lookup" do
    fab!(:tag) { Fabricate(:tag, name: "somecooltag") }
    fab!(:category) do
      Fabricate(:category, name: "Some Awesome Category", slug: "someawesomecategory")
    end

    it "handles tags based on slug with TAG_HASHTAG_POSTFIX" do
      expect(
        PrettyText::Helpers.category_tag_hashtag_lookup(
          +"somecooltag#{PrettyText::Helpers::TAG_HASHTAG_POSTFIX}",
        ),
      ).to eq([tag.url, "somecooltag"])
    end

    it "handles categories based on slug" do
      expect(PrettyText::Helpers.category_tag_hashtag_lookup("someawesomecategory")).to eq(
        [category.url, "someawesomecategory"],
      )
    end

    it "handles tags based on slug without TAG_HASHTAG_POSTFIX" do
      expect(PrettyText::Helpers.category_tag_hashtag_lookup(+"somecooltag")).to eq(
        [tag.url, "somecooltag"],
      )
    end

    it "returns nil when no tag or category that matches exists" do
      expect(PrettyText::Helpers.category_tag_hashtag_lookup("blah")).to eq(nil)
    end
  end

  describe ".hashtag_lookup" do
    fab!(:tag) { Fabricate(:tag, name: "somecooltag", description: "Coolest things ever") }
    fab!(:category) do
      Fabricate(
        :category,
        name: "Some Awesome Category",
        slug: "someawesomecategory",
        description: "Really great stuff here",
      )
    end
    fab!(:user) { Fabricate(:user) }

    it "handles tags and categories based on slug with type suffix" do
      expect(
        PrettyText::Helpers.hashtag_lookup("somecooltag::tag", user.id, %w[category tag]),
      ).to eq(
        {
          relative_url: tag.url,
          text: "somecooltag",
          description: "Coolest things ever",
          icon: "tag",
          slug: "somecooltag",
          ref: "somecooltag::tag",
          type: "tag",
        },
      )
      expect(
        PrettyText::Helpers.hashtag_lookup(
          "someawesomecategory::category",
          user.id,
          %w[category tag],
        ),
      ).to eq(
        {
          relative_url: category.url,
          text: "Some Awesome Category",
          description: "Really great stuff here",
          icon: "folder",
          slug: "someawesomecategory",
          ref: "someawesomecategory::category",
          type: "category",
        },
      )
    end

    it "handles categories based on slug" do
      expect(
        PrettyText::Helpers.hashtag_lookup("someawesomecategory", user.id, %w[category tag]),
      ).to eq(
        {
          relative_url: category.url,
          text: "Some Awesome Category",
          description: "Really great stuff here",
          icon: "folder",
          slug: "someawesomecategory",
          ref: "someawesomecategory",
          type: "category",
        },
      )
    end

    it "handles tags and categories based on slug without type suffix" do
      expect(PrettyText::Helpers.hashtag_lookup("somecooltag", user.id, %w[category tag])).to eq(
        {
          relative_url: tag.url,
          text: "somecooltag",
          description: "Coolest things ever",
          icon: "tag",
          slug: "somecooltag",
          ref: "somecooltag",
          type: "tag",
        },
      )
      expect(
        PrettyText::Helpers.hashtag_lookup("someawesomecategory", user.id, %w[category tag]),
      ).to eq(
        {
          relative_url: category.url,
          text: "Some Awesome Category",
          description: "Really great stuff here",
          icon: "folder",
          slug: "someawesomecategory",
          ref: "someawesomecategory",
          type: "category",
        },
      )
    end

    it "does not include categories the cooking user does not have access to" do
      group = Fabricate(:group)
      private_category =
        Fabricate(:private_category, slug: "secretcategory", name: "Manager Hideout", group: group)
      expect(PrettyText::Helpers.hashtag_lookup("secretcategory", user.id, %w[category tag])).to eq(
        nil,
      )

      GroupUser.create(group: group, user: user)
      expect(PrettyText::Helpers.hashtag_lookup("secretcategory", user.id, %w[category tag])).to eq(
        {
          relative_url: private_category.url,
          text: "Manager Hideout",
          description: nil,
          icon: "folder",
          slug: "secretcategory",
          ref: "secretcategory",
          type: "category",
        },
      )
    end

    it "returns nil when no tag or category that matches exists" do
      expect(PrettyText::Helpers.hashtag_lookup("blah", user.id, %w[category tag])).to eq(nil)
    end

    it "uses the system user if the cooking_user is nil" do
      guardian_system = Guardian.new(Discourse.system_user)
      Guardian.expects(:new).with(Discourse.system_user).returns(guardian_system)
      PrettyText::Helpers.hashtag_lookup("somecooltag", nil, %w[category tag])
    end
  end
end