discourse/spec/models/user_option_spec.rb
Martin Brennan 27bdfb6437
Some checks are pending
Licenses / run (push) Waiting to run
Linting / run (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (annotations, core) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (backend, core) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (backend, plugins) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (frontend, plugins) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (frontend, themes) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, chat) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, core) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, plugins) (push) Waiting to run
Tests / ${{ matrix.target }} ${{ matrix.build_type }} (system, themes) (push) Waiting to run
Tests / core frontend (${{ matrix.browser }}) (Chrome) (push) Waiting to run
Tests / core frontend (${{ matrix.browser }}) (Firefox ESR) (push) Waiting to run
Tests / core frontend (${{ matrix.browser }}) (Firefox Evergreen) (push) Waiting to run
FEATURE: Add user preference to disable smart lists (#29434)
Followup 30fdd7738e

Adds a new site setting and corresponding user preference
to disable smart lists. By default they are enabled, because
this is a better experience for most users. A small number of
users would prefer to not have this enabled.

Smart lists automatically append new items to each
list started in the composer when enter is pressed. If
enter is pressed on an empty list item, it is cleared.

This setting will be removed when the new composer is complete.
2024-10-28 14:18:15 +10:00

225 lines
8.2 KiB
Ruby

# frozen_string_literal: true
RSpec.describe UserOption do
describe "#ensure_consistency!" do
it "recreates missing user option records" do
user = Fabricate(:user)
user.user_option.destroy
UserOption.ensure_consistency!
user.reload
expect(user.user_option.email_level).to eq(SiteSetting.default_email_level)
expect(user.user_option.email_messages_level).to eq(SiteSetting.default_email_messages_level)
end
end
describe "defaults" do
fab!(:user)
it "should be redirected to top when there is a reason to" do
user.user_option.expects(:redirected_to_top).returns(reason: "42")
expect(user.user_option.should_be_redirected_to_top).to eq(true)
end
it "should not be redirected to top when there is no reason to" do
user.user_option.expects(:redirected_to_top).returns(nil)
expect(user.user_option.should_be_redirected_to_top).to eq(false)
end
it "should not hide the profile and presence by default" do
expect(user.user_option.hide_profile_and_presence).to eq(false)
end
it "should correctly set digest frequency" do
SiteSetting.default_email_digest_frequency = 1440
user = Fabricate(:user)
expect(user.user_option.email_digests).to eq(true)
expect(user.user_option.digest_after_minutes).to eq(1440)
end
it "should correctly set digest frequency when disabled" do
SiteSetting.default_email_digest_frequency = 0
user = Fabricate(:user)
expect(user.user_option.email_digests).to eq(false)
expect(user.user_option.digest_after_minutes).to eq(0)
end
it "should correctly set sidebar_link_to_filtered_list when `default_sidebar_link_to_filtered_list` site setting is enabled" do
SiteSetting.default_sidebar_link_to_filtered_list = true
user = Fabricate(:user)
expect(user.user_option.sidebar_link_to_filtered_list).to eq(true)
end
it "should correctly set sidebar_link_to_filtered_list when `default_sidebar_link_to_filtered_list` site setting is disabled" do
SiteSetting.default_sidebar_link_to_filtered_list = false
user = Fabricate(:user)
expect(user.user_option.sidebar_link_to_filtered_list).to eq(false)
end
it "should correctly set sidebar_show_count_of_new_items when `default_sidebar_show_count_of_new_items` site setting is enabled" do
SiteSetting.default_sidebar_show_count_of_new_items = true
user = Fabricate(:user)
expect(user.user_option.sidebar_show_count_of_new_items).to eq(true)
end
it "should correctly set sidebar_show_count_of_new_items when `default_sidebar_show_count_of_new_items` site setting is disabled" do
SiteSetting.default_sidebar_show_count_of_new_items = false
user = Fabricate(:user)
expect(user.user_option.sidebar_show_count_of_new_items).to eq(false)
end
end
describe "site settings" do
it "should apply defaults from site settings" do
SiteSetting.default_other_enable_quoting = false
SiteSetting.default_other_enable_smart_lists = false
SiteSetting.default_other_enable_defer = true
SiteSetting.default_other_external_links_in_new_tab = true
SiteSetting.default_other_dynamic_favicon = true
SiteSetting.default_other_skip_new_user_tips = true
user = Fabricate(:user)
expect(user.user_option.enable_quoting).to eq(false)
expect(user.user_option.enable_smart_lists).to eq(false)
expect(user.user_option.enable_defer).to eq(true)
expect(user.user_option.external_links_in_new_tab).to eq(true)
expect(user.user_option.dynamic_favicon).to eq(true)
expect(user.user_option.skip_new_user_tips).to eq(true)
end
end
describe "#mailing_list_mode" do
fab!(:forum_user) { Fabricate(:user) }
fab!(:mailing_list_user) { Fabricate(:user) }
before do
forum_user.user_option.update(mailing_list_mode: false)
mailing_list_user.user_option.update(mailing_list_mode: true)
end
it "should return false when `SiteSetting.disable_mailing_list_mode` is enabled" do
SiteSetting.disable_mailing_list_mode = true
expect(forum_user.user_option.mailing_list_mode).to eq(false)
expect(mailing_list_user.user_option.mailing_list_mode).to eq(false)
end
it "should return the stored value when `SiteSetting.disable_mailing_list_mode` is disabled" do
SiteSetting.disable_mailing_list_mode = false
expect(forum_user.user_option.mailing_list_mode).to eq(false)
expect(mailing_list_user.user_option.mailing_list_mode).to eq(true)
end
end
describe ".redirected_to_top" do
fab!(:user)
it "should have no reason when `SiteSetting.redirect_users_to_top_page` is disabled" do
SiteSetting.redirect_users_to_top_page = false
expect(user.user_option.redirected_to_top).to eq(nil)
end
context "when `SiteSetting.redirect_users_to_top_page` is enabled" do
before { SiteSetting.redirect_users_to_top_page = true }
it "should have no reason when top is not in the `SiteSetting.top_menu`" do
SiteSetting.top_menu = "latest"
expect(user.user_option.redirected_to_top).to eq(nil)
end
context "when top is in the `SiteSetting.top_menu`" do
before { SiteSetting.top_menu = "latest|top" }
it "should have no reason when there are not enough topics" do
SiteSetting.expects(:min_redirected_to_top_period).returns(nil)
expect(user.user_option.redirected_to_top).to eq(nil)
end
context "when there are enough topics" do
before { SiteSetting.expects(:min_redirected_to_top_period).returns(:monthly) }
describe "a new user" do
before do
user.stubs(:trust_level).returns(0)
user.stubs(:last_seen_at).returns(5.minutes.ago)
end
after { Discourse.redis.flushdb }
it "should have a reason for the first visit" do
freeze_time do
delay = SiteSetting.active_user_rate_limit_secs / 2
expect_enqueued_with(
job: :update_top_redirection,
args: {
user_id: user.id,
redirected_at: Time.zone.now.to_s,
},
at: Time.zone.now + delay,
) do
expect(user.user_option.redirected_to_top).to eq(
reason: I18n.t("redirected_to_top_reasons.new_user"),
period: :monthly,
)
end
end
end
it "should not have a reason for next visits" do
user.user_option.expects(:last_redirected_to_top_at).returns(10.minutes.ago)
user.user_option.expects(:update_last_redirected_to_top!).never
expect(user.user_option.redirected_to_top).to eq(nil)
end
end
describe "an older user" do
before { user.stubs(:trust_level).returns(1) }
it "should have a reason when the user hasn't been seen in a month" do
user.last_seen_at = 2.months.ago
user.user_option.expects(:update_last_redirected_to_top!).once
expect(user.user_option.redirected_to_top).to eq(
reason: I18n.t("redirected_to_top_reasons.not_seen_in_a_month"),
period: :monthly,
)
end
end
end
end
end
end
describe ".user_tzinfo" do
fab!(:user)
context "with user with valid timezone given" do
before { user.user_option.update(timezone: "Europe/Paris") }
it "returns the expect timezone" do
expect(UserOption.user_tzinfo(user.id)).to eq(
ActiveSupport::TimeZone.find_tzinfo("Europe/Paris"),
)
end
it "works for Europe/Kyiv" do
user.user_option.update(timezone: "Europe/Kyiv")
expect(UserOption.user_tzinfo(user.id)).to eq(
ActiveSupport::TimeZone.find_tzinfo("Europe/Kyiv"),
)
end
end
context "with user with invalid timezone given" do
before { user.user_option.update(timezone: "Catopia/Catcity") }
it "fallbacks to UTC" do
expect(UserOption.user_tzinfo(user.id)).to eq(ActiveSupport::TimeZone.find_tzinfo("UTC"))
end
end
end
end