Skip to content

Commit 761b171

Browse files
committed
Fix boolean ingredient to respect default value from elements.yml
This fixes the Boolean ingredient to properly respect default value defined in `elements.yml`. Previously, the default value was completely ignored when set in the ingredient definition. (cherry picked from commit 4a326ef)
1 parent 76da591 commit 761b171

File tree

2 files changed

+118
-1
lines changed

2 files changed

+118
-1
lines changed

app/models/alchemy/ingredients/boolean.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ module Ingredients
66
#
77
class Boolean < Alchemy::Ingredient
88
def value
9-
ActiveRecord::Type::Boolean.new.cast(self[:value])
9+
val = self[:value].nil? ? definition.default : self[:value]
10+
ActiveRecord::Type::Boolean.new.cast(val)
1011
end
1112

1213
# The localized value

spec/models/alchemy/ingredients/boolean_spec.rb

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,122 @@
3434

3535
it { is_expected.to be_nil }
3636
end
37+
38+
context "with no default in definition and no value set" do
39+
let(:boolean_ingredient) do
40+
described_class.new(
41+
element: element,
42+
type: described_class.name,
43+
role: "has_padding"
44+
)
45+
end
46+
47+
before do
48+
definition = Alchemy::IngredientDefinition.new(
49+
role: "has_padding",
50+
type: "Boolean"
51+
)
52+
allow(boolean_ingredient).to receive(:definition).and_return(definition)
53+
end
54+
55+
it "returns nil" do
56+
is_expected.to be_nil
57+
end
58+
end
59+
60+
context "with default: true in definition and no value set" do
61+
let(:boolean_ingredient) do
62+
described_class.new(
63+
element: element,
64+
type: described_class.name,
65+
role: "has_padding"
66+
)
67+
end
68+
69+
before do
70+
definition = Alchemy::IngredientDefinition.new(
71+
role: "has_padding",
72+
type: "Boolean",
73+
default: true
74+
)
75+
allow(boolean_ingredient).to receive(:definition).and_return(definition)
76+
end
77+
78+
it "returns true" do
79+
is_expected.to eq(true)
80+
end
81+
end
82+
83+
context "with default: false in definition and no value set" do
84+
let(:boolean_ingredient) do
85+
described_class.new(
86+
element: element,
87+
type: described_class.name,
88+
role: "has_padding"
89+
)
90+
end
91+
92+
before do
93+
definition = Alchemy::IngredientDefinition.new(
94+
role: "has_padding",
95+
type: "Boolean",
96+
default: false
97+
)
98+
allow(boolean_ingredient).to receive(:definition).and_return(definition)
99+
end
100+
101+
it "returns false" do
102+
is_expected.to eq(false)
103+
end
104+
end
105+
106+
context "with default: true in definition but explicit false value" do
107+
let(:boolean_ingredient) do
108+
described_class.new(
109+
element: element,
110+
type: described_class.name,
111+
role: "has_padding",
112+
value: false
113+
)
114+
end
115+
116+
before do
117+
definition = Alchemy::IngredientDefinition.new(
118+
role: "has_padding",
119+
type: "Boolean",
120+
default: true
121+
)
122+
allow(boolean_ingredient).to receive(:definition).and_return(definition)
123+
end
124+
125+
it "returns false (explicit value overrides default)" do
126+
is_expected.to eq(false)
127+
end
128+
end
129+
130+
context "with default: false in definition but explicit true value" do
131+
let(:boolean_ingredient) do
132+
described_class.new(
133+
element: element,
134+
type: described_class.name,
135+
role: "has_padding",
136+
value: true
137+
)
138+
end
139+
140+
before do
141+
definition = Alchemy::IngredientDefinition.new(
142+
role: "has_padding",
143+
type: "Boolean",
144+
default: false
145+
)
146+
allow(boolean_ingredient).to receive(:definition).and_return(definition)
147+
end
148+
149+
it "returns true (explicit value overrides default)" do
150+
is_expected.to eq(true)
151+
end
152+
end
37153
end
38154

39155
describe "preview_text" do

0 commit comments

Comments
 (0)