From 7dc552c9cc2b7f5ad38ab680962e40670fc23327 Mon Sep 17 00:00:00 2001 From: Angus McLeod Date: Wed, 27 Mar 2024 13:57:43 +0100 Subject: [PATCH] DEV: Add `import_embed_unlisted` site setting (#26222) --- app/models/topic_embed.rb | 1 + config/locales/server.en.yml | 1 + config/site_settings.yml | 3 +- lib/post_jobs_enqueuer.rb | 2 +- spec/lib/post_creator_spec.rb | 17 +++++++++ spec/models/topic_embed_spec.rb | 68 +++++++++++++++++++++++---------- 6 files changed, 69 insertions(+), 23 deletions(-) diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index 671e9f0fe82..89ef3a4c402 100644 --- a/app/models/topic_embed.rb +++ b/app/models/topic_embed.rb @@ -79,6 +79,7 @@ class TopicEmbed < ActiveRecord::Base embed_url: url, embed_content_sha1: content_sha1, } + create_args[:visible] = false if SiteSetting.import_embed_unlisted? post = PostCreator.create(user, create_args) post.topic.topic_embed.update!(embed_content_cache: original_contents) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index cbae02e8f2b..63939fbd8c9 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2381,6 +2381,7 @@ en: embed_set_canonical_url: "Set the canonical URL for embedded topics to the embedded content's URL." embed_truncate: "Shorten the contents of posts that are embedded from external sources. This setting ensures that only the initial part of content is displayed when a post from an external URL is embedded on your site. If you prefer to display full content from the external posts, you can disable this setting." embed_unlisted: "Embedded topics will be unlisted until a user replies." + import_embed_unlisted: "Imported embedded topics will be unlisted until a user replies (even when the `embed unlisted` site setting is unchecked)." embed_support_markdown: "Support Markdown formatting for embedded posts." allowed_embed_selectors: "A comma separated list of CSS elements that are allowed in embeds." allowed_href_schemes: "Schemes allowed in links in addition to http and https." diff --git a/config/site_settings.yml b/config/site_settings.yml index 70c05c6c0c5..d76b69c6e2d 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1104,7 +1104,8 @@ posting: embed_any_origin: false embed_topics_list: false embed_set_canonical_url: false - embed_unlisted: true + embed_unlisted: false + import_embed_unlisted: true embed_truncate: true embed_support_markdown: false allowed_embed_selectors: "" diff --git a/lib/post_jobs_enqueuer.rb b/lib/post_jobs_enqueuer.rb index 1fae8781fcf..cbe5eccbf34 100644 --- a/lib/post_jobs_enqueuer.rb +++ b/lib/post_jobs_enqueuer.rb @@ -43,7 +43,7 @@ class PostJobsEnqueuer def make_visible return if @topic.private_message? - return unless SiteSetting.embed_unlisted? + return unless SiteSetting.embed_unlisted? || SiteSetting.import_embed_unlisted? return if @post.post_number == 1 return if @topic.visible? return if @post.post_type != Post.types[:regular] diff --git a/spec/lib/post_creator_spec.rb b/spec/lib/post_creator_spec.rb index d8812785aa1..2665d8c2d6e 100644 --- a/spec/lib/post_creator_spec.rb +++ b/spec/lib/post_creator_spec.rb @@ -1487,6 +1487,23 @@ RSpec.describe PostCreator do expect(creator.errors).to be_blank expect(TopicEmbed.where(content_sha1: content_sha1).exists?).to eq(true) end + + context "when embed_unlisted is true" do + before { SiteSetting.embed_unlisted = true } + + it "unlists the topic" do + creator = + PostCreator.new( + user, + embed_url: embed_url, + title: "Reviews of Science Ovens", + raw: "Did you know that you can use microwaves to cook your dinner? Science!", + ) + post = creator.create + expect(creator.errors).to be_blank + expect(post.topic).not_to be_visible + end + end end describe "read credit for creator" do diff --git a/spec/models/topic_embed_spec.rb b/spec/models/topic_embed_spec.rb index 7e23ee5fae4..f571a7c0f31 100644 --- a/spec/models/topic_embed_spec.rb +++ b/spec/models/topic_embed_spec.rb @@ -129,29 +129,55 @@ RSpec.describe TopicEmbed do expect(post.cooked).to match(/#{cased_url}/) end - it "will make the topic unlisted if `embed_unlisted` is set until someone replies" do - Jobs.run_immediately! - SiteSetting.embed_unlisted = true - imported_post = - TopicEmbed.import(user, "http://eviltrout.com/abcd", title, "some random content") - expect(imported_post.topic).not_to be_visible - pc = - PostCreator.new( - Fabricate(:user), - raw: "this is a reply that will make the topic visible", - topic_id: imported_post.topic_id, - reply_to_post_number: 1, - ) - pc.create - expect(imported_post.topic.reload).to be_visible + shared_examples "topic is unlisted" do + it "unlists the topic until someone replies" do + Jobs.run_immediately! + imported_post = + TopicEmbed.import(user, "http://eviltrout.com/abcd", title, "some random content") + expect(imported_post.topic).not_to be_visible + pc = + PostCreator.new( + Fabricate(:user), + raw: "this is a reply that will make the topic visible", + topic_id: imported_post.topic_id, + reply_to_post_number: 1, + ) + pc.create + expect(imported_post.topic.reload).to be_visible + end end - it "won't be invisible if `embed_unlisted` is set to false" do - Jobs.run_immediately! - SiteSetting.embed_unlisted = false - imported_post = - TopicEmbed.import(user, "http://eviltrout.com/abcd", title, "some random content") - expect(imported_post.topic).to be_visible + context "when import embed unlisted is true" do + before { SiteSetting.import_embed_unlisted = true } + + include_examples "topic is unlisted" + + context "when embed unlisted is false" do + before { SiteSetting.embed_unlisted = false } + + include_examples "topic is unlisted" + end + end + + context "when import embed unlisted is false" do + before { SiteSetting.import_embed_unlisted = false } + + context "when embed unlisted is false" do + before { SiteSetting.embed_unlisted = false } + + it "lists the topic" do + Jobs.run_immediately! + imported_post = + TopicEmbed.import(user, "http://eviltrout.com/abcd", title, "some random content") + expect(imported_post.topic).to be_visible + end + end + + context "when embed unlisted is true" do + before { SiteSetting.embed_unlisted = true } + + include_examples "topic is unlisted" + end end it "creates the topic in the category passed as a parameter" do