mirror of
https://github.com/discourse/discourse.git
synced 2026-08-08 17:53:55 +08:00
* Prevent unnecessary Hash#merge in DefaultsProvider#all_clean, Fixes an unnecessary merge which can sometimes cause performance overhead when calling SiteSetting.defaults_provider.all_clean. We don't need to merge the defaults when locale provided is the same as the default locale * Do not check can_lazy_load_categories? in loop, This is a small perf optimization, we don't need to check can_lazy_load_categories? for every category in the site, which looks at the user's groups and upcoming changes every time, we just need to do it once.
292 lines
9.2 KiB
Ruby
Vendored
292 lines
9.2 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
RSpec.describe SiteSettings::DefaultsProvider do
|
|
let(:provider_local) { SiteSettings::LocalProcessProvider.new }
|
|
|
|
before { MessageBus.off }
|
|
|
|
after { MessageBus.on }
|
|
|
|
let(:settings) { new_settings(provider_local) }
|
|
|
|
describe ".db_all" do
|
|
it "can collect values from db" do
|
|
settings.provider.save("try_a", 1, SiteSetting.types[:integer])
|
|
settings.provider.save("try_b", 2, SiteSetting.types[:integer])
|
|
expect(settings.defaults.db_all.count).to eq 2
|
|
end
|
|
end
|
|
|
|
describe "expose default cache according to locale" do
|
|
before do
|
|
settings.setting(:test_override, "default", locale_default: { zh_CN: "cn" })
|
|
settings.setting(:test_boolean_override, true, locale_default: { zh_CN: false })
|
|
settings.setting(:test_default, "test", regex: '^\S+$')
|
|
settings.refresh!
|
|
end
|
|
|
|
describe ".all" do
|
|
it "returns all values according to locale" do
|
|
expect(settings.defaults.all).to eq(
|
|
test_override: "default",
|
|
test_default: "test",
|
|
test_boolean_override: true,
|
|
)
|
|
expect(settings.defaults.all("zh_CN")).to eq(
|
|
test_override: "cn",
|
|
test_default: "test",
|
|
test_boolean_override: false,
|
|
)
|
|
end
|
|
end
|
|
|
|
describe ".get" do
|
|
it "returns the default value to a site setting" do
|
|
expect(settings.defaults.get(:test_override)).to eq "default"
|
|
end
|
|
|
|
it "accepts a string as the parameters" do
|
|
expect(settings.defaults.get("test_override")).to eq "default"
|
|
end
|
|
|
|
it "returns the locale_default value if it exists" do
|
|
expect(settings.defaults.get(:test_override, :zh_CN)).to eq "cn"
|
|
expect(settings.defaults.get(:test_override, :de)).to eq "default"
|
|
expect(settings.defaults.get(:test_default, :zh_CN)).to eq "test"
|
|
end
|
|
|
|
it "returns the correct locale_default for boolean site settings" do
|
|
expect(settings.defaults.get(:test_boolean_override, :zh_CN)).to eq false
|
|
end
|
|
|
|
it "does not merge with locale default if locale matches default locale" do
|
|
Hash.any_instance.expects(:merge).never
|
|
expect(settings.defaults.get(:test_default, :en)).to eq "test"
|
|
end
|
|
end
|
|
|
|
describe ".all_clean" do
|
|
it "returns all values according to locale" do
|
|
expect(settings.defaults.all_clean).to eq(
|
|
test_override: "default",
|
|
test_default: "test",
|
|
test_boolean_override: true,
|
|
)
|
|
expect(settings.defaults.all_clean("zh_CN")).to eq(
|
|
test_override: "cn",
|
|
test_default: "test",
|
|
test_boolean_override: false,
|
|
)
|
|
end
|
|
|
|
it "does not merge with DEFAULT_LOCALE if locale matches default locale" do
|
|
Hash.any_instance.expects(:merge).never
|
|
expect(settings.defaults.all_clean("en")).to eq(
|
|
test_override: "default",
|
|
test_default: "test",
|
|
test_boolean_override: true,
|
|
)
|
|
end
|
|
end
|
|
|
|
describe ".set_regardless_of_locale" do
|
|
let(:val) { "env_overridden" }
|
|
|
|
it "sets the default value to a site setting regardless the locale" do
|
|
settings.defaults.set_regardless_of_locale(:test_override, val)
|
|
expect(settings.defaults.get(:test_override)).to eq val
|
|
expect(settings.defaults.get(:test_override, "zh_CN")).to eq val
|
|
end
|
|
|
|
it "handles the string" do
|
|
settings.defaults.set_regardless_of_locale("test_override", val)
|
|
expect(settings.defaults.get(:test_override)).to eq val
|
|
end
|
|
|
|
it "converts the data type" do
|
|
settings.defaults.set_regardless_of_locale(:test_override, 1)
|
|
expect(settings.defaults.get(:test_override)).to eq "1"
|
|
end
|
|
|
|
it "raises when the setting does not exists" do
|
|
expect { settings.defaults.set_regardless_of_locale(:not_exist, 1) }.to raise_error(
|
|
ArgumentError,
|
|
)
|
|
end
|
|
|
|
it "raises when the value is not valid" do
|
|
expect {
|
|
settings.defaults.set_regardless_of_locale(:test_default, "regex will fail")
|
|
}.to raise_error(Discourse::InvalidParameters)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe ".load_setting" do
|
|
it "adds a setting to the cache correctly" do
|
|
settings.defaults.load_setting("new_a", 1, zh_CN: 7)
|
|
expect(settings.defaults[:new_a]).to eq 1
|
|
expect(settings.defaults.get(:new_a, "zh_CN")).to eq 7
|
|
end
|
|
end
|
|
|
|
describe ".has_setting?" do
|
|
before do
|
|
settings.setting(:r, 1)
|
|
settings.setting(:question?, 1)
|
|
end
|
|
|
|
it "returns true when it's present in the cache" do
|
|
expect(settings.defaults.has_setting?(:r)).to be_truthy
|
|
end
|
|
|
|
it '"responds when the arg is string' do
|
|
expect(settings.defaults.has_setting?("r")).to be_truthy
|
|
end
|
|
|
|
it "default_locale always exists" do
|
|
expect(settings.defaults.has_setting?(:default_locale)).to be_truthy
|
|
end
|
|
|
|
it "returns false when the key is not exist" do
|
|
expect(settings.defaults.has_setting?("no_key")).to be_falsey
|
|
end
|
|
|
|
it "checks name with question mark" do
|
|
expect(settings.defaults.has_setting?(:question)).to be_truthy
|
|
expect(settings.defaults.has_setting?("question")).to be_truthy
|
|
end
|
|
end
|
|
|
|
describe "plugin modifier" do
|
|
before { settings.setting(:my_setting, "defaultval") }
|
|
|
|
class TestFilterPlugInstance < Plugin::Instance
|
|
end
|
|
|
|
let(:plugin_instance) { TestFilterPlugInstance.new }
|
|
|
|
it "can change defaults" do
|
|
expect(settings.defaults.get(:my_setting)).to eq "defaultval"
|
|
expect(settings.defaults.all[:my_setting]).to eq "defaultval"
|
|
|
|
plugin_instance.register_modifier(:site_setting_defaults) do |defaults|
|
|
defaults.merge({ my_setting: "overridden default" })
|
|
end
|
|
|
|
expect(settings.defaults.get(:my_setting)).to eq "overridden default"
|
|
expect(settings.defaults.all[:my_setting]).to eq "overridden default"
|
|
ensure
|
|
DiscoursePluginRegistry.reset!
|
|
end
|
|
end
|
|
|
|
describe "upcoming change default overrides" do
|
|
before do
|
|
settings.setting(:suggested_topics_max_days_old, 365)
|
|
settings.instance_variable_set(
|
|
:@upcoming_change_default_overrides,
|
|
{
|
|
suggested_topics_max_days_old: {
|
|
new_default: 1000,
|
|
upcoming_change: :increase_suggested_topics_max_days_old_default,
|
|
},
|
|
},
|
|
)
|
|
end
|
|
|
|
describe ".all" do
|
|
context "when the upcoming change override is active" do
|
|
before do
|
|
settings.defaults.activate_upcoming_change_override(
|
|
:increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
it "uses upcoming change default overrides by default" do
|
|
expect(settings.defaults.all[:suggested_topics_max_days_old]).to eq(1000)
|
|
end
|
|
|
|
context "when include_upcoming_changes_overrides is false" do
|
|
it "does not use upcoming change default overrides" do
|
|
expect(
|
|
settings.defaults.all(include_upcoming_changes_overrides: false)[
|
|
:suggested_topics_max_days_old
|
|
],
|
|
).to eq(365)
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when the upcoming change override is not active" do
|
|
before do
|
|
settings.defaults.deactivate_upcoming_change_override(
|
|
:increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
it "does not use upcoming change default overrides" do
|
|
expect(settings.defaults.all[:suggested_topics_max_days_old]).to eq(365)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe ".get" do
|
|
context "when the upcoming change override is active" do
|
|
before do
|
|
settings.defaults.activate_upcoming_change_override(
|
|
:increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
it "returns the upcoming change default override" do
|
|
expect(settings.defaults.get(:suggested_topics_max_days_old)).to eq(1000)
|
|
end
|
|
end
|
|
|
|
context "when the upcoming change override is not active" do
|
|
before do
|
|
settings.defaults.deactivate_upcoming_change_override(
|
|
:increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
it "returns the original default" do
|
|
expect(settings.defaults.get(:suggested_topics_max_days_old)).to eq(365)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe ".upcoming_change_override_metadata" do
|
|
before do
|
|
settings.defaults.activate_upcoming_change_override(
|
|
:increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
it "returns the upcoming change override metadata" do
|
|
expect(
|
|
settings.defaults.upcoming_change_override_metadata(:suggested_topics_max_days_old),
|
|
).to eq(
|
|
old_default: "365",
|
|
new_default: "1000",
|
|
change_setting_name: :increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
context "when the upcoming change override is not active" do
|
|
before do
|
|
settings.defaults.deactivate_upcoming_change_override(
|
|
:increase_suggested_topics_max_days_old_default,
|
|
)
|
|
end
|
|
|
|
it "returns nil" do
|
|
expect(
|
|
settings.defaults.upcoming_change_override_metadata(:suggested_topics_max_days_old),
|
|
).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|