discourse/spec/system/homepage_spec.rb
David Taylor a267c0727d
Revert "DEV: Defer button actions with layout change to the next frame paint ()" ()
This is causing issues with some buttons on iOS. Reverting while we investigate.

This reverts commit 352d6f9dfbc1bb9503902640acd340ccdc1c979c.
2024-07-22 17:35:23 +01:00

211 lines
6.5 KiB
Ruby

# frozen_string_literal: true
describe "Homepage", type: :system do
fab!(:admin)
fab!(:user)
fab!(:topics) { Fabricate.times(5, :post).map(&:topic) }
let(:discovery) { PageObjects::Pages::Discovery.new }
fab!(:theme)
before do
# A workaround to avoid the global notice from interfering with the tests
# It is coming from the ensure_login_hint.rb initializer and it gets
# evaluated before the tests run (and it wrongly counts 0 admins defined)
SiteSetting.global_notice = nil
end
it "shows a list of topics by default" do
visit "/"
expect(discovery.topic_list).to have_topics(count: 5)
end
it "allows users to pick their homepage" do
sign_in user
visit "/"
expect(page).to have_css(".navigation-container .latest.active", text: "Latest")
visit "u/#{user.username}/preferences/interface"
homepage_picker = PageObjects::Components::SelectKit.new("#home-selector")
homepage_picker.expand
homepage_picker.select_row_by_name("Top")
page.find(".btn-primary.save-changes").click
# Wait for the save to complete
find(".btn-primary.save-changes:not([disabled])", wait: 5)
visit "/"
expect(page).to have_css(".navigation-container .top.active", text: "Top")
expect(page).to have_css(".top-lists")
end
it "defaults to first top_menu item as anonymous homepage" do
SiteSetting.top_menu = "categories|latest|new|unread"
visit "/"
expect(page).to have_css(".navigation-container .categories.active", text: "Categories")
sign_in user
visit "/"
expect(page).to have_css(".navigation-container .categories.active", text: "Categories")
end
shared_examples "a custom homepage" do
it "shows the custom homepage component" do
visit "/"
expect(page).to have_css(".new-home", text: "Hi friends!")
expect(page).to have_no_css(".list-container")
find("#sidebar-section-content-community li:first-child").click
expect(page).to have_css(".list-container")
find("#site-logo").click
expect(page).to have_no_css(".list-container")
# ensure clicking on logo brings user back to the custom homepage
expect(page).to have_css(".new-home", text: "Hi friends!")
end
it "respects the user's homepage choice" do
visit "/"
expect(page).not_to have_css(".list-container")
expect(page).to have_css(".new-home", text: "Hi friends!")
sign_in user
visit ""
expect(page).to have_css(".new-home", text: "Hi friends!")
visit "/u/#{user.username}/preferences/interface"
homepage_picker = PageObjects::Components::SelectKit.new("#home-selector")
homepage_picker.expand
# user overrides theme custom homepage
homepage_picker.select_row_by_name("Top")
page.find(".btn-primary.save-changes").click
# Wait for the save to complete
find(".btn-primary.save-changes:not([disabled])", wait: 5)
expect(user.user_option.homepage_id).to eq(UserOption::HOMEPAGES.key("top"))
find("#site-logo").click
expect(page).to have_css(".navigation-container .top.active", text: "Top")
expect(page).to have_css(".top-lists")
visit "/u/#{user.username}/preferences/interface"
homepage_picker = PageObjects::Components::SelectKit.new("#home-selector")
homepage_picker.expand
# user selects theme custom homepage again
homepage_picker.select_row_by_name("(default)")
page.find(".btn-primary.save-changes").click
# Wait for the save to complete
find(".btn-primary.save-changes:not([disabled])", wait: 5)
expect(user.reload.user_option.homepage_id).to_not eq(UserOption::HOMEPAGES.key("top"))
find("#site-logo").click
expect(page).to have_current_path("/")
expect(page).to have_css(".new-home", text: "Hi friends!")
end
end
context "when default theme uses a custom_homepage modifier" do
before do
theme.theme_modifier_set.custom_homepage = true
theme.theme_modifier_set.save!
theme.set_default!
end
it "shows empty state to regular users" do
sign_in user
visit "/"
expect(page).to have_no_css(".list-container")
expect(page).to have_no_css(".alert-info")
end
it "shows empty state and notice to admins" do
sign_in admin
visit "/"
expect(page).to have_no_css(".list-container")
expect(page).to have_css(".alert-info")
end
context "when the theme adds content to the [custom-homepage] connector" do
let!(:basic_html_field) do
Fabricate(
:theme_field,
theme: theme,
type_id: ThemeField.types[:html],
target_id: Theme.targets[:common],
name: "head_tag",
value: <<~HTML,
<script type="text/x-handlebars" data-template-name="/connectors/custom-homepage/new-home">
<div class="new-home">Hi friends!</div>
</script>
HTML
)
end
include_examples "a custom homepage"
end
context "when a theme component adds content to the [custom-homepage] connector" do
let!(:component) { Fabricate(:theme, component: true) }
let!(:component_html_field) do
Fabricate(
:theme_field,
theme: component,
type_id: ThemeField.types[:html],
target_id: Theme.targets[:common],
name: "head_tag",
value: <<~HTML,
<script type="text/x-handlebars" data-template-name="/connectors/custom-homepage/new-home">
<div class="new-home">Hi friends!</div>
</script>
HTML
)
end
before { theme.add_relative_theme!(:child, component) }
include_examples "a custom homepage"
end
end
context "when a theme component uses the custom_homepage modifier" do
let!(:component) { Fabricate(:theme, component: true) }
let!(:component_html_field) do
Fabricate(
:theme_field,
theme: component,
type_id: ThemeField.types[:html],
target_id: Theme.targets[:common],
name: "head_tag",
value: <<~HTML,
<script type="text/x-handlebars" data-template-name="/connectors/custom-homepage/new-home">
<div class="new-home">Hi friends!</div>
</script>
HTML
)
end
before do
component.theme_modifier_set.custom_homepage = true
component.theme_modifier_set.save!
theme.add_relative_theme!(:child, component)
theme.set_default!
end
include_examples "a custom homepage"
end
end