diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb index 1b2b085de1..8f61819708 100644 --- a/app/models/spree/variant.rb +++ b/app/models/spree/variant.rb @@ -79,6 +79,8 @@ module Spree after_create :create_stock_items after_create :set_position + before_save :convert_variant_weight_to_decimal + around_destroy :destruction # default variant scope only lists non-deleted variants @@ -243,5 +245,9 @@ module Spree self.unit_value = 1.0 end + + def convert_variant_weight_to_decimal + self.weight = weight.to_d + end end end diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index 548f82e1d8..73a1f79660 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -525,6 +525,38 @@ module Spree expect(product.master).to be_valid end end + + context "when the product's unit is non-weight" do + before do + product.update_attribute :variant_unit, 'volume' + product.reload + variant.reload + end + + it "sets weight to decimal before save if it's integer" do + variant.weight = 1 + variant.save! + expect(variant.weight).to eq 1.0 + end + + it "sets weight to 0.0 before save if it's nil" do + variant.weight = nil + variant.save! + expect(variant.weight).to eq 0.0 + end + + it "sets weight to 0.0 if input is a non numerical string" do + variant.weight = "BANANAS!" + variant.save! + expect(variant.weight).to eq 0.0 + end + + it "sets weight to correct decimal value if input is numerical string" do + variant.weight = "2" + variant.save! + expect(variant.weight).to eq 2.0 + end + end end describe "unit value/description" do