mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 14:43:38 +08:00
6e161d3e75
The most common thing that we do with fab! is: fab!(:thing) { Fabricate(:thing) } This commit adds a shorthand for this which is just simply: fab!(:thing) i.e. If you omit the block, then, by default, you'll get a `Fabricate`d object using the fabricator of the same name.
223 lines
8.1 KiB
Ruby
223 lines
8.1 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_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_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
|