0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-11 02:59:07 +08:00
discourse/spec/requests/admin/config/logo_controller_spec.rb
Penar Musaraj 2d895de297
FEATURE: generated OpenGraph images for topics (#39194)
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>
2026-06-26 10:37:10 -04:00

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