diff --git a/core/app/models/spree/calculator/flat_rate.rb b/core/app/models/spree/calculator/flat_rate.rb index 20b5b501468..e9ded29f05c 100644 --- a/core/app/models/spree/calculator/flat_rate.rb +++ b/core/app/models/spree/calculator/flat_rate.rb @@ -9,9 +9,9 @@ class Calculator::FlatRate < Calculator def compute(object = nil) if object && preferred_currency.casecmp(object.currency).zero? - preferred_amount + BigDecimal(preferred_amount.to_s) else - 0 + BigDecimal("0") end end end diff --git a/core/spec/models/spree/calculator/flat_rate_spec.rb b/core/spec/models/spree/calculator/flat_rate_spec.rb index f4955f0ec3c..9828526b0b8 100644 --- a/core/spec/models/spree/calculator/flat_rate_spec.rb +++ b/core/spec/models/spree/calculator/flat_rate_spec.rb @@ -48,5 +48,32 @@ calculator.preferred_currency = "GBP" expect(calculator.compute.round(2)).to eq(0.0) end + context "return type" do + it "always returns a BigDecimal when currency matches" do + calculator.preferred_amount = 25.0 + calculator.preferred_currency = "USD" + allow(order).to receive_messages currency: "USD" + expect(calculator.compute(order)).to be_a(BigDecimal) + end + + it "always returns a BigDecimal when currency does not match" do + calculator.preferred_amount = 100.0 + calculator.preferred_currency = "GBP" + allow(order).to receive_messages currency: "USD" + expect(calculator.compute(order)).to be_a(BigDecimal) + end + + it "always returns a BigDecimal when there is no object" do + calculator.preferred_amount = 100.0 + expect(calculator.compute).to be_a(BigDecimal) + end + + it "always returns a BigDecimal when amount is zero" do + calculator.preferred_amount = 0 + calculator.preferred_currency = "USD" + allow(order).to receive_messages currency: "USD" + expect(calculator.compute(order)).to be_a(BigDecimal) + end + end end end