discourse/spec/lib/site_settings/deprecated_settings_spec.rb
Alan Guo Xiang Tan ed6c9d1545
DEV: Call Discourse.redis.flushdb after the end of each test (#29117)
There have been too many flaky tests as a result of leaking state in
Redis so it is easier to resolve them by ensuring we flush Redis'
database.

Locally on my machine, calling `Discourse.redis.flushdb` takes around
0.1ms which means this change will have very little impact on test
runtimes.
2024-10-09 07:19:31 +08:00

237 lines
8.9 KiB
Ruby

# frozen_string_literal: true
RSpec.xdescribe SiteSettings::DeprecatedSettings do
def deprecate_override!(settings, tl_group_overrides = [])
@original_settings = SiteSettings::DeprecatedSettings::SETTINGS.dup
SiteSettings::DeprecatedSettings::SETTINGS.clear
SiteSettings::DeprecatedSettings::SETTINGS.push(settings)
if tl_group_overrides.any?
@original_override_tl_group = SiteSettings::DeprecatedSettings::OVERRIDE_TL_GROUP_SETTINGS.dup
SiteSettings::DeprecatedSettings::OVERRIDE_TL_GROUP_SETTINGS.clear
SiteSettings::DeprecatedSettings::OVERRIDE_TL_GROUP_SETTINGS.push(*tl_group_overrides)
end
SiteSetting.setup_deprecated_methods
end
after do
if defined?(@original_settings)
SiteSettings::DeprecatedSettings::SETTINGS.clear
SiteSettings::DeprecatedSettings::SETTINGS.concat(@original_settings)
end
if defined?(@original_override_tl_group)
SiteSettings::DeprecatedSettings::OVERRIDE_TL_GROUP_SETTINGS.clear
SiteSettings::DeprecatedSettings::OVERRIDE_TL_GROUP_SETTINGS.concat(
@original_override_tl_group,
)
end
SiteSetting.setup_deprecated_methods
end
describe "when not overriding deprecated settings" do
let(:override) { false }
# NOTE: This fixture has some completely made up settings (e.g. min_trust_level_to_allow_invite_tl_and_staff)
let(:deprecated_test) { "#{Rails.root}/spec/fixtures/site_settings/deprecated_test.yml" }
before do
SiteSetting.force_https = true
SiteSetting.load_settings(deprecated_test)
end
it "should not act as a proxy to the new methods" do
deprecate_override!(["use_https", "force_https", override, "0.0.1"])
SiteSetting.use_https = false
expect(SiteSetting.force_https).to eq(true)
expect(SiteSetting.force_https?).to eq(true)
end
it "should log warnings when deprecated settings are called" do
deprecate_override!(["use_https", "force_https", override, "0.0.1"])
logger =
track_log_messages do
expect(SiteSetting.use_https).to eq(true)
expect(SiteSetting.use_https?).to eq(true)
end
expect(logger.warnings.count).to eq(3)
logger = track_log_messages { SiteSetting.use_https(warn: false) }
expect(logger.warnings.count).to eq(0)
end
end
describe "when overriding deprecated settings" do
let(:override) { true }
let(:deprecated_test) { "#{Rails.root}/spec/fixtures/site_settings/deprecated_test.yml" }
before do
SiteSetting.force_https = true
SiteSetting.load_settings(deprecated_test)
end
it "should act as a proxy to the new methods" do
deprecate_override!(["use_https", "force_https", override, "0.0.1"])
SiteSetting.use_https = false
expect(SiteSetting.force_https).to eq(false)
expect(SiteSetting.force_https?).to eq(false)
end
xit "should log warnings when deprecated settings are called" do
deprecate_override!(["use_https", "force_https", override, "0.0.1"])
logger =
track_log_messages do
expect(SiteSetting.use_https).to eq(true)
expect(SiteSetting.use_https?).to eq(true)
end
expect(logger.warnings.count).to eq(2)
logger = track_log_messages { SiteSetting.use_https(warn: false) }
expect(logger.warnings.count).to eq(0)
end
end
describe "when overriding a trust level setting with a group setting" do
let(:override) { false }
let(:deprecated_test) { "#{Rails.root}/spec/fixtures/site_settings/deprecated_test.yml" }
before { SiteSetting.load_settings(deprecated_test) }
context "when getting an old TrustLevelSetting" do
before do
deprecate_override!(
["min_trust_level_to_allow_invite", "invite_allowed_groups", override, "0.0.1"],
)
end
it "uses the minimum trust level from the trust level auto groups in the new group setting" do
SiteSetting.invite_allowed_groups =
"#{Group::AUTO_GROUPS[:trust_level_3]}|#{Group::AUTO_GROUPS[:trust_level_4]}"
expect(SiteSetting.min_trust_level_to_allow_invite).to eq(TrustLevel[3])
end
it "returns TL4 if there are no trust level auto groups in the new group setting" do
SiteSetting.invite_allowed_groups = Fabricate(:group).id.to_s
expect(SiteSetting.min_trust_level_to_allow_invite).to eq(TrustLevel[4])
end
it "returns TL4 if there are only staff and admin auto groups in the new group setting" do
SiteSetting.invite_allowed_groups =
"#{Group::AUTO_GROUPS[:admins]}|#{Group::AUTO_GROUPS[:staff]}"
expect(SiteSetting.min_trust_level_to_allow_invite).to eq(TrustLevel[4])
end
it "returns TL4 if there are no automated invite_allowed_groups" do
SiteSetting.invite_allowed_groups = Fabricate(:group).id.to_s
expect(SiteSetting.min_trust_level_to_allow_invite).to eq(TrustLevel[4])
end
end
context "when getting an old TrustLevelAndStaffSetting" do
before do
deprecate_override!(
[
"min_trust_level_to_allow_invite_tl_and_staff",
"invite_allowed_groups",
override,
"0.0.1",
],
["min_trust_level_to_allow_invite_tl_and_staff"],
)
end
it "returns moderator if there is only the moderators auto group in the new group setting" do
SiteSetting.invite_allowed_groups = "#{Group::AUTO_GROUPS[:moderators]}"
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq("moderator")
end
it "returns staff if there are staff and admin auto groups in the new group setting" do
SiteSetting.invite_allowed_groups =
"#{Group::AUTO_GROUPS[:admins]}|#{Group::AUTO_GROUPS[:staff]}"
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq("staff")
end
it "returns admin if there is only the admin auto group in the new group setting" do
SiteSetting.invite_allowed_groups = "#{Group::AUTO_GROUPS[:admins]}"
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq("admin")
end
it "returns the min trust level if the admin auto group as well as lower TL auto groups in the new group setting" do
SiteSetting.invite_allowed_groups =
"#{Group::AUTO_GROUPS[:admins]}|#{Group::AUTO_GROUPS[:trust_level_3]}"
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq(TrustLevel[3])
end
it "returns admin if there are no automated invite_allowed_groups" do
SiteSetting.invite_allowed_groups = Fabricate(:group).id.to_s
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq("admin")
end
end
context "when setting an old TrustLevelSetting" do
before do
deprecate_override!(
["min_trust_level_to_allow_invite", "invite_allowed_groups", override, "0.0.1"],
["min_trust_level_to_allow_invite"],
)
end
it "converts the provided trust level to the appropriate auto group" do
SiteSetting.min_trust_level_to_allow_invite = TrustLevel[4]
expect(SiteSetting.min_trust_level_to_allow_invite).to eq(TrustLevel[4])
expect(SiteSetting.invite_allowed_groups).to eq(Group::AUTO_GROUPS[:trust_level_4].to_s)
end
it "raises error with an invalid trust level" do
expect { SiteSetting.min_trust_level_to_allow_invite = 66 }.to raise_error(
Discourse::InvalidParameters,
)
end
end
context "when setting an old TrustLevelAndStaffSetting" do
before do
deprecate_override!(
[
"min_trust_level_to_allow_invite_tl_and_staff",
"invite_allowed_groups",
override,
"0.0.1",
],
["min_trust_level_to_allow_invite_tl_and_staff"],
)
end
it "converts the provided trust level to the appropriate auto group" do
SiteSetting.min_trust_level_to_allow_invite_tl_and_staff = "admin"
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq("admin")
expect(SiteSetting.invite_allowed_groups).to eq(Group::AUTO_GROUPS[:admins].to_s)
SiteSetting.min_trust_level_to_allow_invite_tl_and_staff = "staff"
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq("staff")
expect(SiteSetting.invite_allowed_groups).to eq(Group::AUTO_GROUPS[:staff].to_s)
SiteSetting.min_trust_level_to_allow_invite_tl_and_staff = TrustLevel[3]
expect(SiteSetting.min_trust_level_to_allow_invite_tl_and_staff).to eq(TrustLevel[3])
expect(SiteSetting.invite_allowed_groups).to eq(
"#{Group::AUTO_GROUPS[:admins]}|#{Group::AUTO_GROUPS[:staff]}|#{Group::AUTO_GROUPS[:trust_level_3]}",
)
end
it "raises error with an invalid trust level" do
expect { SiteSetting.min_trust_level_to_allow_invite_tl_and_staff = 66 }.to raise_error(
Discourse::InvalidParameters,
)
end
end
end
end