discourse/spec/lib/pretty_text/helpers_spec.rb
Martin Brennan af9907bb50
FIX: Duplicate hashtag lookup results based on permissions (#19337)
When looking up hashtags which were conflicting (e.g.
management::tag and management) where the user did
not have permission for one of them, we ended up returning
the one they did have permission to (e.g. the tag) twice
because of the way the lookup fallback code worked. This
fixes the issue, and another related one where the
::type was not added to the found item's .ref, and
so the hashtag replacement on the client was not working
correctly.
2022-12-08 10:03:31 +10:00

153 lines
5.1 KiB
Ruby

# 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, %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, %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, %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, %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, %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, %w[category tag])).to eq(nil)
GroupUser.create(group: group, user: user)
expect(PrettyText::Helpers.hashtag_lookup("secretcategory", user, %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, %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