Skip to content

Commit f3fc374

Browse files
xfalcoxclaude
andcommitted
DEV: Add tests for embed mode functionality
Request specs: - Verify X-Frame-Options header is kept without embed_mode param - Verify X-Frame-Options header is kept with invalid referer - Verify X-Frame-Options header is stripped with valid embeddable host - Verify X-Frame-Options header is stripped with embed_any_origin setting System specs: - Verify embed-mode class is applied to body with embed_mode=true - Verify embed-mode class is not applied without the param - Verify suggested topics are hidden in embed mode - Verify topic content loads without JS errors 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 7ef74a2 commit f3fc374

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

spec/requests/application_controller_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,40 @@
662662
end
663663
end
664664

665+
describe "allow_embed_mode" do
666+
fab!(:topic)
667+
668+
it "keeps X-Frame-Options when embed_mode param is missing" do
669+
get("/t/#{topic.slug}/#{topic.id}")
670+
expect(response.headers["X-Frame-Options"]).to eq("SAMEORIGIN")
671+
end
672+
673+
it "keeps X-Frame-Options when embed_mode is present but referer is invalid" do
674+
get("/t/#{topic.slug}/#{topic.id}", params: { embed_mode: "true" })
675+
expect(response.headers["X-Frame-Options"]).to eq("SAMEORIGIN")
676+
end
677+
678+
it "strips X-Frame-Options when embed_mode is present and referer matches embeddable host" do
679+
Fabricate(:embeddable_host, host: "example.com")
680+
get(
681+
"/t/#{topic.slug}/#{topic.id}",
682+
params: {
683+
embed_mode: "true",
684+
},
685+
headers: {
686+
"HTTP_REFERER" => "https://example.com/page",
687+
},
688+
)
689+
expect(response.headers).not_to include("X-Frame-Options")
690+
end
691+
692+
it "strips X-Frame-Options when embed_mode is present and embed_any_origin is enabled" do
693+
SiteSetting.embed_any_origin = true
694+
get("/t/#{topic.slug}/#{topic.id}", params: { embed_mode: "true" })
695+
expect(response.headers).not_to include("X-Frame-Options")
696+
end
697+
end
698+
665699
describe "setting `Cross-Origin-Opener-Policy` header" do
666700
describe "when `cross_origin_opener_policy_header` site setting is set to `same-origin`" do
667701
before { SiteSetting.cross_origin_opener_policy_header = "same-origin" }

spec/system/embed_mode_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
describe "Embed mode", type: :system do
4+
fab!(:topic)
5+
fab!(:post) { Fabricate(:post, topic: topic) }
6+
7+
let(:topic_page) { PageObjects::Pages::Topic.new }
8+
9+
it "applies embed-mode class to body when embed_mode=true" do
10+
visit("/t/#{topic.slug}/#{topic.id}?embed_mode=true")
11+
12+
expect(page).to have_css("body.embed-mode")
13+
end
14+
15+
it "does not apply embed-mode class without the param" do
16+
visit("/t/#{topic.slug}/#{topic.id}")
17+
18+
expect(page).to have_no_css("body.embed-mode")
19+
end
20+
21+
it "hides suggested topics in embed mode" do
22+
Fabricate(:post) # create another topic for suggestions
23+
visit("/t/#{topic.slug}/#{topic.id}?embed_mode=true")
24+
25+
expect(page).to have_css("body.embed-mode")
26+
expect(page).to have_no_css(".suggested-topics")
27+
end
28+
29+
it "loads topic content without JS errors" do
30+
visit("/t/#{topic.slug}/#{topic.id}?embed_mode=true")
31+
32+
expect(page).to have_css("body.embed-mode")
33+
expect(topic_page).to have_topic_title(topic.title)
34+
expect(page).to have_css("#post_1")
35+
end
36+
end

0 commit comments

Comments
 (0)