discourse/spec/lib/pretty_text/helpers_spec.rb
Bianca Nenciu 1403217ca4
FEATURE: Async load of category and chat hashtags (#25526)
This commit includes several changes to make hashtags work when "lazy
load categories" is enabled. The previous hashtag implementation use the
category colors CSS variables, but these are not defined when the site
setting is enabled because categories are no longer preloaded.

This commit implements two fundamental changes:

1. load colors together with the other hashtag information

2. load cooked hashtag data asynchronously

The first change is implemented by adding "colors" to the HashtagItem
model. It is a list because two colors are returned for subcategories:
the color of the parent category and subcategory.

The second change is implemented on the server-side in a new route
/hashtags/by-ids and on the client side by loading previously unseen
hashtags, generating the CSS on the fly and injecting it into the page.

There have been minimal changes outside of these two fundamental ones,
but a refactoring will be coming soon to reuse as much of the code
and maybe favor use of `style` rather than injecting CSS into the page,
which can lead to page rerenders and indefinite grow of the styles.
2024-02-12 12:07:14 +02:00

159 lines
4.8 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 ".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)
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",
colors: nil,
icon: "tag",
id: tag.id,
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",
colors: [category.color],
icon: "folder",
id: category.id,
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",
colors: [category.color],
icon: "folder",
id: category.id,
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",
colors: nil,
icon: "tag",
id: tag.id,
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",
colors: [category.color],
icon: "folder",
id: category.id,
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,
colors: [private_category.color],
icon: "folder",
id: private_category.id,
slug: "secretcategory",
ref: "secretcategory",
type: "category",
},
)
end
it "does not return any results for disabled types" do
SiteSetting.tagging_enabled = false
expect(
PrettyText::Helpers.hashtag_lookup("somecooltag::tag", user.id, %w[category tag]),
).to eq(nil)
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