From 99d2263cf64eaa69ab7bc2fdeb3c15acf9c5997d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Thu, 5 Feb 2026 14:35:40 +0100 Subject: [PATCH] Raise error when default is nil, add more specs --- config/constants/settings/definition.rb | 4 +++ spec/models/setting_spec.rb | 37 +++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/config/constants/settings/definition.rb b/config/constants/settings/definition.rb index 6aca574ed9c..9ab4a0b1d3c 100644 --- a/config/constants/settings/definition.rb +++ b/config/constants/settings/definition.rb @@ -1329,6 +1329,10 @@ module Settings if persist_on_first_read && !writable raise ArgumentError, "Settings using persist_on_first_read need to be writable" end + + if persist_on_first_read && default.nil? + raise ArgumentError, "Settings using persist_on_first_read need to have a default value" + end end def derive_default(default) diff --git a/spec/models/setting_spec.rb b/spec/models/setting_spec.rb index 9fe743fa87c..5bd7c2dd564 100644 --- a/spec/models/setting_spec.rb +++ b/spec/models/setting_spec.rb @@ -666,6 +666,12 @@ RSpec.describe Setting do it "returns the existing value" do expect(described_class[setting_name]).to eq("existing_value") end + + it "can set the value to persist it and override the default" do + described_class[setting_name] = "another value" + read_value = described_class[setting_name] + expect(read_value).to eq("another value") + end end context "when settings table does not exist" do @@ -682,12 +688,14 @@ RSpec.describe Setting do describe ".persist_default_value", :settings_reset do let(:setting_name) { "auto_init_test" } + let(:format) { :string } + let(:default) { -> { "test_value" } } before do Settings::Definition.add( setting_name, - default: -> { "test_value" }, - format: :string, + default:, + format:, persist_on_first_read: true ) end @@ -718,5 +726,30 @@ RSpec.describe Setting do expect(result).to eq("pre_existing") end end + + context "with a more complex hash value" do + let(:format) { :hash } + let(:default) do + -> { { foo: :bar } } + end + + it "returns the existing value" do + result = described_class.persist_default_value(setting_name) + expect(result).to eq({ foo: :bar }) + end + end + end + + describe ".persist_default_value with nil default", :settings_reset do + it "raises an error if persist_default_value is called without a default value" do + expect do + Settings::Definition.add( + :my_test_setting, + default: nil, + persist_on_first_read: true, + format: :string + ) + end.to raise_error(ArgumentError) + end end end