mirror of
https://github.com/discourse/discourse.git
synced 2024-12-11 23:33:56 +08:00
967010e545
This feature will allow sites to define which emoji are not allowed. Emoji in this list should be excluded from the set we show in the core emoji picker used in the composer for posts when emoji are enabled. And they should not be allowed to be chosen to be added to messages or as reactions in chat. This feature prevents denied emoji from appearing in the following scenarios: - topic title and page title - private messages (topic title and body) - inserting emojis into a chat - reacting to chat messages - using the emoji picker (composer, user status etc) - using search within emoji picker It also takes into account the various ways that emojis can be accessed, such as: - emoji autocomplete suggestions - emoji favourites (auto populates when adding to emoji deny list for example) - emoji inline translations - emoji skintones (ie. for certain hand gestures)
157 lines
5.3 KiB
Ruby
157 lines
5.3 KiB
Ruby
# frozen_string_literal: true
|
||
|
||
RSpec.describe Emoji do
|
||
it "returns the correct codepoints" do
|
||
expect(Emoji.replacement_code("1f47d").codepoints).to eq([128_125])
|
||
end
|
||
|
||
it "handles multiple codepoints" do
|
||
expect(Emoji.replacement_code("1f1e9-1f1ea").codepoints).to eq([127_465, 127_466])
|
||
end
|
||
|
||
describe ".load_custom" do
|
||
describe "when a custom emoji has an invalid upload_id" do
|
||
it "should return the custom emoji without a URL" do
|
||
CustomEmoji.create!(name: "test", upload_id: 9999)
|
||
|
||
emoji = Emoji.load_custom.first
|
||
|
||
expect(emoji.name).to eq("test")
|
||
expect(emoji.url).to eq(nil)
|
||
end
|
||
end
|
||
end
|
||
|
||
describe ".lookup_unicode" do
|
||
before do
|
||
SiteSetting.emoji_deny_list = "peach"
|
||
Emoji.clear_cache
|
||
end
|
||
|
||
it "should return the emoji" do
|
||
expect(Emoji.lookup_unicode("blonde_man")).to eq("👱")
|
||
end
|
||
|
||
it "should return an aliased emoji" do
|
||
expect(Emoji.lookup_unicode("anger_right")).to eq("🗯")
|
||
end
|
||
|
||
it "should return a skin toned emoji" do
|
||
expect(Emoji.lookup_unicode("blonde_woman:t6")).to eq("👱🏿♀️")
|
||
end
|
||
|
||
it "should not return a fu emoji when emoji is in emoji deny list site setting" do
|
||
expect(Emoji.lookup_unicode("peach")).not_to eq("🍑")
|
||
end
|
||
end
|
||
|
||
describe ".url_for" do
|
||
expected_url = "/images/emoji/twitter/blonde_woman.png?v=#{Emoji::EMOJI_VERSION}"
|
||
expected_toned_url = "/images/emoji/twitter/blonde_woman/6.png?v=#{Emoji::EMOJI_VERSION}"
|
||
|
||
it "should return url with filename" do
|
||
expect(Emoji.url_for("blonde_woman")).to eq(expected_url)
|
||
end
|
||
|
||
it "should return url with skin toned filename" do
|
||
expect(Emoji.url_for("blonde_woman/6")).to eq(expected_toned_url)
|
||
end
|
||
|
||
it "should return url with code" do
|
||
expect(Emoji.url_for(":blonde_woman:")).to eq(expected_url)
|
||
end
|
||
|
||
it "should return url with skin toned code" do
|
||
expect(Emoji.url_for(":blonde_woman:t6:")).to eq(expected_toned_url)
|
||
expect(Emoji.url_for("blonde_woman:t6")).to eq(expected_toned_url)
|
||
end
|
||
end
|
||
|
||
describe ".exists?" do
|
||
it "finds existing emoji" do
|
||
expect(Emoji.exists?(":blonde_woman:")).to be(true)
|
||
expect(Emoji.exists?("blonde_woman")).to be(true)
|
||
end
|
||
|
||
it "finds existing skin toned emoji" do
|
||
expect(Emoji.exists?(":blonde_woman:t1:")).to be(true)
|
||
expect(Emoji.exists?("blonde_woman:t6")).to be(true)
|
||
end
|
||
|
||
it "finds existing custom emoji" do
|
||
CustomEmoji.create!(name: "test", upload_id: 9999)
|
||
Emoji.clear_cache
|
||
expect(Emoji.exists?(":test:")).to be(true)
|
||
expect(Emoji.exists?("test")).to be(true)
|
||
end
|
||
|
||
it "finds a custom emoji with a name with :t1 in the middle" do
|
||
CustomEmoji.create!(name: "test:t1:foo", upload_id: 9999)
|
||
Emoji.clear_cache
|
||
expect(Emoji.exists?(":test:t1:foo:")).to be(true)
|
||
expect(Emoji.exists?("test:t1:foo")).to be(true)
|
||
end
|
||
|
||
it "doesn’t find non-existing emoji" do
|
||
expect(Emoji.exists?(":foo-bar:")).to be(false)
|
||
expect(Emoji.exists?(":blonde_woman:t7:")).to be(false)
|
||
expect(Emoji.exists?("blonde_woman:t0")).to be(false)
|
||
expect(Emoji.exists?("blonde_woman:t")).to be(false)
|
||
end
|
||
end
|
||
|
||
describe ".codes_to_img" do
|
||
before { Plugin::CustomEmoji.clear_cache }
|
||
after { Plugin::CustomEmoji.clear_cache }
|
||
|
||
it "replaces emoji codes by images" do
|
||
Plugin::CustomEmoji.register("xxxxxx", "/public/xxxxxx.png")
|
||
|
||
str = "This is a good day :xxxxxx: :woman: :man:t4:"
|
||
replaced_str = described_class.codes_to_img(str)
|
||
|
||
expect(replaced_str).to eq(
|
||
"This is a good day <img src=\"/public/xxxxxx.png\" title=\"xxxxxx\" class=\"emoji\" alt=\"xxxxxx\" loading=\"lazy\" width=\"20\" height=\"20\"> <img src=\"/images/emoji/twitter/woman.png?v=#{Emoji::EMOJI_VERSION}\" title=\"woman\" class=\"emoji\" alt=\"woman\" loading=\"lazy\" width=\"20\" height=\"20\"> <img src=\"/images/emoji/twitter/man/4.png?v=#{Emoji::EMOJI_VERSION}\" title=\"man:t4\" class=\"emoji\" alt=\"man:t4\" loading=\"lazy\" width=\"20\" height=\"20\">",
|
||
)
|
||
end
|
||
|
||
it "doesn't replace if code doesn't exist" do
|
||
str = "This is a good day :woman: :foo: :bar:t4: :man:t8:"
|
||
replaced_str = described_class.codes_to_img(str)
|
||
|
||
expect(replaced_str).to eq(
|
||
"This is a good day <img src=\"/images/emoji/twitter/woman.png?v=#{Emoji::EMOJI_VERSION}\" title=\"woman\" class=\"emoji\" alt=\"woman\" loading=\"lazy\" width=\"20\" height=\"20\"> :foo: :bar:t4: :man:t8:",
|
||
)
|
||
end
|
||
end
|
||
|
||
describe ".groups" do
|
||
it "returns an optimized emoji name -> group name datastructure" do
|
||
expect(Emoji.groups["scotland"]).to eq("flags")
|
||
end
|
||
end
|
||
|
||
describe ".load_standard" do
|
||
it "removes nil emojis" do
|
||
expect(Emoji.load_standard.any? { |element| element.nil? }).to be false
|
||
end
|
||
end
|
||
|
||
describe "#create_from_db_item" do
|
||
it "sets the group of the emoji" do
|
||
emoji = Emoji.create_from_db_item("name" => "scotland")
|
||
expect(emoji.group).to eq("flags")
|
||
end
|
||
|
||
it "sets the group of the emoji" do
|
||
emoji = Emoji.create_from_db_item("name" => "scotland")
|
||
expect(emoji.group).to eq("flags")
|
||
end
|
||
|
||
it "doesn’t create emoji when group is unknown" do
|
||
emoji = Emoji.create_from_db_item("name" => "white_hair")
|
||
expect(emoji).to be_nil
|
||
end
|
||
end
|
||
end
|