mirror of
https://github.com/discourse/discourse.git
synced 2026-08-11 02:59:07 +08:00
Adds the ability to automatically generate Open Graph images for topics that don't have their own image. When enabled via the generate_topic_og_image site setting, a background job creates a branded 1200×630 PNG for each new topic OP. Key changes: - TopicOgImageGenerator builds an SVG and converts it to PNG via ImageMagick - Images generated via GenerateTopicOgImage Sidekiq job - Generated images handled via og_image_upload_id column on the topics table - TopicView#image_url falls back to the generated OG image when no topic image is available This includes a preview for admins so they can see if they like this feature or not: https://github.com/user-attachments/assets/62d17704-4ee5-4859-ac37-b127fe27b85c And it also respects the site's default theme: <img width="1200" height="630" alt="image" src="https://github.com/user-attachments/assets/678f5c5d-e593-4385-b800-141196dfc221" /> --------- Co-authored-by: discourse-patch-triage[bot] <272280883+discourse-patch-triage[bot]@users.noreply.github.com> Co-authored-by: Gabriel Grubba <gabriel@discourse.org>
96 lines
3.3 KiB
Ruby
Vendored
96 lines
3.3 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
RSpec.describe Admin::Config::LogoController do
|
|
fab!(:admin)
|
|
fab!(:moderator)
|
|
fab!(:user)
|
|
fab!(:topic)
|
|
|
|
describe "#og_image_preview" do
|
|
before do
|
|
TopicOgImageGenerator.any_instance.stubs(:generate_bytes).returns("\x89PNG\r\n\x1A\n".b)
|
|
end
|
|
|
|
context "when logged in as an admin" do
|
|
before { sign_in(admin) }
|
|
|
|
it "returns a base64 data URI for the given topic" do
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(200)
|
|
json = response.parsed_body
|
|
expect(json["url"]).to start_with("data:image/png;base64,")
|
|
expect(json["topic_id"]).to eq(topic.id)
|
|
expect(json["topic_title"]).to eq(topic.title)
|
|
end
|
|
|
|
it "returns 400 when topic_id is missing" do
|
|
get "/admin/config/logo/og-image-preview.json"
|
|
expect(response.status).to eq(400)
|
|
end
|
|
|
|
it "returns 404 for a non-existent topic" do
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: 0 }
|
|
expect(response.status).to eq(404)
|
|
end
|
|
|
|
it "returns 422 when generation fails" do
|
|
TopicOgImageGenerator.any_instance.stubs(:generate_bytes).returns(nil)
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(422)
|
|
end
|
|
|
|
it "returns 422 when login_required is enabled" do
|
|
SiteSetting.login_required = true
|
|
TopicOgImageGenerator.any_instance.expects(:generate_bytes).never
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(422)
|
|
end
|
|
|
|
it "returns 422 for personal messages without attempting to generate" do
|
|
pm = Fabricate(:private_message_topic)
|
|
TopicOgImageGenerator.any_instance.expects(:generate_bytes).never
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: pm.id }
|
|
expect(response.status).to eq(422)
|
|
end
|
|
|
|
it "returns 422 for topics in a read-restricted category" do
|
|
private_category = Fabricate(:private_category, group: Fabricate(:group))
|
|
topic.update!(category: private_category)
|
|
TopicOgImageGenerator.any_instance.expects(:generate_bytes).never
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(422)
|
|
end
|
|
|
|
it "does not persist an Upload" do
|
|
expect {
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
}.not_to change { Upload.count }
|
|
end
|
|
end
|
|
|
|
context "when logged in as a moderator" do
|
|
before { sign_in(moderator) }
|
|
|
|
it "denies access" do
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(403)
|
|
end
|
|
end
|
|
|
|
context "when logged in as a regular user" do
|
|
before { sign_in(user) }
|
|
|
|
it "denies access" do
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(404)
|
|
end
|
|
end
|
|
|
|
context "when not logged in" do
|
|
it "denies access" do
|
|
get "/admin/config/logo/og-image-preview.json", params: { topic_id: topic.id }
|
|
expect(response.status).to eq(404)
|
|
end
|
|
end
|
|
end
|
|
end
|