2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-03-04 01:15:08 +08:00
discourse/spec/system/welcome_banner_spec.rb
Kris 1ecbca5485
FEATURE: welcome banner shouldn't say "welcome back" to new users (#35777)
Minor, but this has been annoying me... the welcome banner currently
says "Welcome back, username!" even if it's your first time on the site.
We can check `previous_visit_at` to see if someone has visited before,
and if they haven't we should just say "Welcome username!"

---------

Co-authored-by: Martin Brennan <martin@discourse.org>
2025-11-05 09:12:52 +10:00

321 lines
9 KiB
Ruby

# frozen_string_literal: true
describe "Welcome banner", type: :system do
fab!(:current_user) { Fabricate(:user, seen_before: true) }
let(:banner) { PageObjects::Components::WelcomeBanner.new }
let(:search_page) { PageObjects::Pages::Search.new }
context "when enabled" do
before do
Fabricate(:theme_site_setting_with_service, name: "enable_welcome_banner", value: true)
end
after do
TranslationOverride.delete_all
I18n.reload!
end
it "shows for logged in and anonymous users" do
visit "/"
expect(banner).to be_visible
expect(banner).to have_anonymous_title
sign_in(current_user)
visit "/"
expect(banner).to have_logged_in_title(current_user.username)
end
context "for new users who have not visited before" do
fab!(:current_user, :user)
it "shows a new user title" do
sign_in(current_user)
visit "/"
expect(banner).to have_new_user_title(current_user.username)
end
end
context "with subheader translations" do
it "shows subheader for logged in and anonymous members" do
visit "/"
expect(banner).to be_visible
expect(banner).to have_no_subheader
TranslationOverride.upsert!(
"en",
"js.welcome_banner.subheader.anonymous_members",
"Something about us.",
)
visit "/"
expect(banner).to have_anonymous_subheader
TranslationOverride.upsert!(
"en",
"js.welcome_banner.subheader.logged_in_members",
"We are so cool!",
)
sign_in(current_user)
visit "/"
expect(banner).to have_logged_in_subheader
end
end
context "with empty subheader translations (default)" do
context "with `non-en` default locale and `en` interface locale" do
before do
SiteSetting.default_locale = "uk"
SiteSetting.allow_user_locale = true
end
it "hides subheader if active locale key is missing and fallback `en` translation is an empty string" do
TranslationOverride.upsert!(
"uk",
"js.welcome_banner.subheader.logged_in_members",
"Ласкаво просимо",
)
sign_in(current_user)
visit "/"
expect(banner).to have_logged_in_subheader
TranslationOverride.upsert!("en", "js.welcome_banner.subheader.logged_in_members", "")
current_user.update!(locale: "en")
sign_in(current_user)
visit "/"
expect(banner).to have_no_subheader
end
end
end
it "only displays on top_menu routes" do
sign_in(current_user)
SiteSetting.remove_override!(:top_menu)
topic = Fabricate(:topic)
visit "/"
expect(banner).to be_visible
visit "/latest"
expect(banner).to be_visible
visit "/new"
expect(banner).to be_visible
visit "/unread"
expect(banner).to be_visible
visit "/hot"
expect(banner).to be_visible
visit "/tags"
expect(banner).to be_hidden
visit topic.relative_url
expect(banner).to be_hidden
end
context "when using search_field search_experience" do
before do
Fabricate(
:theme_site_setting_with_service,
name: "search_experience",
value: "search_field",
)
end
it "hides welcome banner and shows header search on scroll, and vice-versa" do
Fabricate(:topic)
sign_in(current_user)
visit "/"
expect(banner).to be_visible
expect(search_page).to have_no_search_field
fake_scroll_down_long
expect(banner).to be_invisible
expect(search_page).to have_search_field
page.scroll_to(0, 0)
expect(banner).to be_visible
expect(search_page).to have_no_search_field
end
end
context "when using search_icon search_experience" do
before do
Fabricate(:theme_site_setting_with_service, name: "search_experience", value: "search_icon")
end
it "hides welcome banner and shows header search on scroll, and vice-versa" do
Fabricate(:topic)
sign_in(current_user)
visit "/"
expect(banner).to be_visible
expect(search_page).to have_no_search_icon
fake_scroll_down_long
expect(banner).to be_invisible
expect(search_page).to have_search_icon
page.scroll_to(0, 0)
expect(banner).to be_visible
expect(search_page).to have_no_search_icon
end
end
context "for background image setting" do
fab!(:current_user, :admin)
fab!(:bg_img) { Fabricate(:image_upload, color: "cyan") }
before { SiteSetting.welcome_banner_page_visibility = "all_pages" }
it "shows banner without background image" do
sign_in(current_user)
visit "/"
expect(banner).to be_visible
expect(banner).to have_no_bg_img
end
it "sets a background image with uploaded image" do
SiteSetting.welcome_banner_image = bg_img
sign_in(current_user)
visit "/"
expect(banner).to have_bg_img(bg_img.url)
end
context "for text color setting" do
let(:red) { "#ff0000" }
before { SiteSetting.welcome_banner_text_color = red }
it "doesn't set text color without background image" do
visit "/"
expect(banner).to have_no_custom_text_color(red)
end
it "applies text color if background image is set" do
SiteSetting.welcome_banner_image = bg_img
visit "/"
expect(banner).to have_custom_text_color(red)
end
end
end
context "with interface location setting" do
it "shows above topic content" do
SiteSetting.welcome_banner_location = "above_topic_content"
visit "/"
expect(banner).to be_above_topic_content
end
it "shows below site header" do
SiteSetting.welcome_banner_location = "below_site_header"
visit "/"
expect(banner).to be_below_site_header
end
end
context "with interface page visibility setting" do
before { current_user.update!(admin: true) }
context "when show on all pages" do
fab!(:invite)
let(:inactive_user_email_token) do
Fabricate(:email_token, user: Fabricate(:user, active: false))
end
let(:password_reset_email_token) do
current_user.email_tokens.create!(
email: current_user.email,
scope: EmailToken.scopes[:password_reset],
)
end
before { SiteSetting.welcome_banner_page_visibility = "all_pages" }
it "should show on" do
sign_in(current_user)
visit "/"
expect(banner).to be_visible
visit "/u/#{current_user.username}/preferences/emails"
expect(banner).to be_visible
visit "/my/messages"
expect(banner).to be_visible
end
it "should NOT show on" do
visit "/login"
expect(banner).to be_hidden
visit "/signup"
expect(banner).to be_hidden
visit "/invites/#{invite.invite_key}"
expect(banner).to be_hidden
visit "/u/activate-account/#{inactive_user_email_token}"
expect(banner).to be_hidden
sign_in(current_user)
visit "/u/password-reset/#{password_reset_email_token}"
expect(banner).to be_hidden
visit "/admin"
expect(banner).to be_hidden
visit "/admin/config/site-admin"
expect(banner).to be_hidden
visit "/admin/customize"
expect(banner).to be_hidden
end
end
it "should show on discovery routes only" do
sign_in(current_user)
SiteSetting.welcome_banner_page_visibility = "discovery"
visit "/filter?q=tag%3Ain-progress"
expect(banner).to be_visible
visit "/upcoming-events?view=month"
expect(banner).to be_hidden
end
it "should show on top menu pages only" do
sign_in(current_user)
SiteSetting.welcome_banner_page_visibility = "top_menu_pages"
SiteSetting
.top_menu
.split("|")
.each do |route|
visit "/#{route}"
expect(banner).to be_visible
end
visit "/my/posts"
expect(banner).to be_hidden
end
it "should show on homepage only" do
SiteSetting.welcome_banner_page_visibility = "homepage"
visit "/"
expect(banner).to be_visible
sign_in(current_user)
visit "/new"
expect(banner).to be_hidden
end
end
end
context "when disabled" do
before do
Fabricate(:theme_site_setting_with_service, name: "enable_welcome_banner", value: false)
end
it "does not show the welcome banner for logged in and anonymous users" do
visit "/"
expect(banner).to be_hidden
sign_in(current_user)
visit "/"
expect(banner).to be_hidden
end
end
end