mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-24 02:41:20 +08:00
This change ensures that queued posts that have ended up in the review queue due to matched a watched word display correctly. It also improves the data checking to ensure that any other reviewables with watched words don't break the review queue, either.
137 lines
4.7 KiB
Ruby
Vendored
137 lines
4.7 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
RSpec.describe ReviewableScoreSerializer do
|
|
fab!(:reviewable) { Fabricate(:reviewable_flagged_post) }
|
|
fab!(:admin)
|
|
|
|
describe "#reason" do
|
|
context "with regular links" do
|
|
it "adds a link for watched words" do
|
|
serialized = serialized_score("watched_word")
|
|
link_url = "#{Discourse.base_url}/admin/customize/watched_words"
|
|
watched_words_link =
|
|
"<a href=\"#{link_url}\">#{I18n.t("reviewables.reasons.links.watched_word")}</a>"
|
|
|
|
expect(serialized.reason).to include(watched_words_link)
|
|
end
|
|
|
|
it "adds a link for category settings" do
|
|
category = Fabricate(:category, name: "Reviewable Category", slug: "reviewable-category")
|
|
reviewable.category = category
|
|
serialized = serialized_score("category")
|
|
link_url = "#{Discourse.base_url}/c/#{category.slug}/edit/settings"
|
|
category_link =
|
|
"<a href=\"#{link_url}\">#{I18n.t("reviewables.reasons.links.category")}</a>"
|
|
|
|
expect(serialized.reason).to include(category_link)
|
|
end
|
|
end
|
|
|
|
context "with site setting links" do
|
|
reasons = %w[
|
|
post_count
|
|
trust_level
|
|
new_topics_unless_trust_level
|
|
fast_typer
|
|
auto_silence_regex
|
|
staged
|
|
must_approve_users
|
|
invite_only
|
|
email_spam
|
|
suspect_user
|
|
contains_media
|
|
]
|
|
|
|
reasons.each do |r|
|
|
it "addd a link to a site setting for the #{r} reason" do
|
|
serialized = serialized_score(r)
|
|
setting_name = described_class::REASONS_AND_SETTINGS[r.to_sym]
|
|
link_url =
|
|
"#{Discourse.base_url}/admin/site_settings/category/all_results?filter=#{setting_name}"
|
|
link = "<a href=\"#{link_url}\">#{setting_name.gsub("_", " ")}</a>"
|
|
|
|
expect(serialized.reason).to include(link)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "with custom reasons" do
|
|
it "serializes it without doing any translation" do
|
|
custom = "completely custom flag reason"
|
|
serialized = serialized_score(custom)
|
|
|
|
expect(serialized.reason).to eq(custom)
|
|
end
|
|
end
|
|
|
|
context "with watched words" do
|
|
let(:link) do
|
|
"<a href=\"#{Discourse.base_url}/admin/customize/watched_words\">#{I18n.t("reviewables.reasons.links.watched_word")}</a>"
|
|
end
|
|
it "tries to guess the watched words if they weren't recorded at the time of flagging" do
|
|
reviewable.target =
|
|
Fabricate(:post, raw: "I'm a post with some bad words like 'bad' and 'words'.")
|
|
|
|
score = serialized_score("watched_word")
|
|
|
|
Fabricate(:watched_word, action: WatchedWord.actions[:flag], word: "bad")
|
|
Fabricate(:watched_word, action: WatchedWord.actions[:flag], word: "words")
|
|
|
|
expect(score.reason).to include("bad, words")
|
|
end
|
|
|
|
it "handles guessing the watched words when the post hasn't been created yet" do
|
|
queued_reviewable = Fabricate(:reviewable_queued_post_topic)
|
|
reviewable_score =
|
|
ReviewableScore.new(reviewable: queued_reviewable, reason: "watched_word")
|
|
|
|
Fabricate(:watched_word, action: WatchedWord.actions[:flag], word: "contents")
|
|
Fabricate(:watched_word, action: WatchedWord.actions[:flag], word: "title")
|
|
|
|
result = described_class.new(reviewable_score, scope: Guardian.new(admin), root: nil)
|
|
expect(result.reason).to include("contents, title")
|
|
end
|
|
|
|
it "uses the no-context message if the post has no watched words" do
|
|
reviewable.target = Fabricate(:post, raw: "This post contains no bad words.")
|
|
|
|
score = serialized_score("watched_word")
|
|
|
|
Fabricate(:watched_word, action: WatchedWord.actions[:flag], word: "superbad")
|
|
|
|
expect(score.reason).to eq(
|
|
I18n.t(
|
|
"reviewables.reasons.no_context.watched_word",
|
|
link: link,
|
|
default: "watched_word",
|
|
),
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#setting_name_for_reason" do
|
|
after { DiscoursePluginRegistry.reset_register!(:reviewable_score_links) }
|
|
|
|
describe "when a plugin adds a setting name to linkify" do
|
|
it "gets the setting name from the registry" do
|
|
reason = :plugin_reason
|
|
setting_name = "max_username_length"
|
|
DiscoursePluginRegistry.register_reviewable_score_link(
|
|
{ reason: reason, setting: setting_name },
|
|
Plugin::Instance.new,
|
|
)
|
|
|
|
score = serialized_score(reason)
|
|
|
|
expect(score.setting_name_for_reason(reason)).to eq(setting_name)
|
|
end
|
|
end
|
|
end
|
|
|
|
def serialized_score(reason)
|
|
score = ReviewableScore.new(reviewable: reviewable, reason: reason)
|
|
|
|
described_class.new(score, scope: Guardian.new(admin), root: nil)
|
|
end
|
|
end
|