mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-09 23:06:06 +00:00
Product requires variant_unit and master requires unit_value and/or unit_desc
This commit is contained in:
@@ -25,14 +25,14 @@ Spree::Product.class_eval do
|
||||
validates_presence_of :supplier
|
||||
validates :primary_taxon, presence: { message: "^Product Category can't be blank" }
|
||||
validates :tax_category_id, presence: { message: "^Tax Category can't be blank" }, if: "Spree::Config.products_require_tax_category"
|
||||
|
||||
validates_presence_of :variant_unit, if: :has_variants?
|
||||
|
||||
validates_presence_of :variant_unit
|
||||
validates_presence_of :variant_unit_scale,
|
||||
if: -> p { %w(weight volume).include? p.variant_unit }
|
||||
validates_presence_of :variant_unit_name,
|
||||
if: -> p { p.variant_unit == 'items' }
|
||||
|
||||
after_create :ensure_one_standard_variant
|
||||
#after_create :ensure_one_standard_variant
|
||||
after_initialize :set_available_on_to_now, :if => :new_record?
|
||||
after_save :update_units
|
||||
after_touch :touch_distributors
|
||||
|
||||
@@ -12,12 +12,10 @@ Spree::Variant.class_eval do
|
||||
accepts_nested_attributes_for :images
|
||||
|
||||
validates_presence_of :unit_value,
|
||||
if: -> v { %w(weight volume).include? v.product.andand.variant_unit },
|
||||
unless: :is_master
|
||||
if: -> v { %w(weight volume).include? v.product.andand.variant_unit }
|
||||
|
||||
validates_presence_of :unit_description,
|
||||
if: -> v { v.product.andand.variant_unit.present? && v.unit_value.nil? },
|
||||
unless: :is_master
|
||||
if: -> v { v.product.andand.variant_unit.present? && v.unit_value.nil? }
|
||||
|
||||
before_validation :update_weight_from_unit_value, if: -> v { v.product.present? }
|
||||
after_save :update_units
|
||||
|
||||
@@ -214,6 +214,10 @@ end
|
||||
|
||||
|
||||
FactoryGirl.modify do
|
||||
factory :base_product do
|
||||
unit_value 1
|
||||
unit_description ''
|
||||
end
|
||||
factory :product do
|
||||
primary_taxon { Spree::Taxon.first || FactoryGirl.create(:taxon) }
|
||||
end
|
||||
|
||||
@@ -85,23 +85,24 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
context "saving a new product" do
|
||||
let!(:product){ Spree::Product.new }
|
||||
|
||||
before do
|
||||
product.primary_taxon = create(:taxon)
|
||||
product.supplier = create(:supplier_enterprise)
|
||||
product.name = "Product1"
|
||||
product.on_hand = 3
|
||||
product.price = 4.27
|
||||
product.save!
|
||||
end
|
||||
|
||||
it "copies the properties on master variant to the first standard variant" do
|
||||
standard_variant = product.variants(:reload).first
|
||||
expect(standard_variant.price).to eq product.master.price
|
||||
end
|
||||
end
|
||||
# context "saving a new product" do
|
||||
# let!(:product){ Spree::Product.new }
|
||||
#
|
||||
# before do
|
||||
# product.primary_taxon = create(:taxon)
|
||||
# product.supplier = create(:supplier_enterprise)
|
||||
# product.name = "Product1"
|
||||
# product.variant_unit = "weight"
|
||||
# product.on_hand = 3
|
||||
# product.price = 4.27
|
||||
# product.save!
|
||||
# end
|
||||
#
|
||||
# it "copies the properties on master variant to the first standard variant" do
|
||||
# standard_variant = product.variants(:reload).first
|
||||
# expect(standard_variant.price).to eq product.master.price
|
||||
# end
|
||||
# end
|
||||
|
||||
context "when the unit is items" do
|
||||
it "is valid when unit name is set and unit scale is not" do
|
||||
@@ -128,7 +129,7 @@ module Spree
|
||||
product.variant_unit_name = nil
|
||||
product.variant_unit_scale = nil
|
||||
|
||||
product.should be_valid
|
||||
expect(product).to be_invalid
|
||||
end
|
||||
|
||||
it "requires a unit scale when variant unit is weight" do
|
||||
@@ -412,63 +413,6 @@ module Spree
|
||||
|
||||
|
||||
describe "variant units" do
|
||||
context "when the product initially has no variant unit" do
|
||||
let!(:p) { create(:simple_product,
|
||||
variant_unit: nil,
|
||||
variant_unit_scale: nil,
|
||||
variant_unit_name: nil) }
|
||||
|
||||
context "when the required option type does not exist" do
|
||||
it "creates the option type and assigns it to the product" do
|
||||
expect {
|
||||
p.update_attributes!(variant_unit: 'weight', variant_unit_scale: 1000)
|
||||
}.to change(Spree::OptionType, :count).by(1)
|
||||
|
||||
ot = Spree::OptionType.last
|
||||
ot.name.should == 'unit_weight'
|
||||
ot.presentation.should == 'Weight'
|
||||
|
||||
p.option_types.should == [ot]
|
||||
end
|
||||
|
||||
it "does the same with volume" do
|
||||
expect {
|
||||
p.update_attributes!(variant_unit: 'volume', variant_unit_scale: 1000)
|
||||
}.to change(Spree::OptionType, :count).by(1)
|
||||
|
||||
ot = Spree::OptionType.last
|
||||
ot.name.should == 'unit_volume'
|
||||
ot.presentation.should == 'Volume'
|
||||
|
||||
p.option_types.should == [ot]
|
||||
end
|
||||
|
||||
it "does the same with items" do
|
||||
expect {
|
||||
p.update_attributes!(variant_unit: 'items', variant_unit_name: 'packet')
|
||||
}.to change(Spree::OptionType, :count).by(1)
|
||||
|
||||
ot = Spree::OptionType.last
|
||||
ot.name.should == 'unit_items'
|
||||
ot.presentation.should == 'Items'
|
||||
|
||||
p.option_types.should == [ot]
|
||||
end
|
||||
end
|
||||
|
||||
context "when the required option type already exists" do
|
||||
let!(:ot) { create(:option_type, name: 'unit_weight', presentation: 'Weight') }
|
||||
|
||||
it "looks up the option type and assigns it to the product" do
|
||||
expect {
|
||||
p.update_attributes!(variant_unit: 'weight', variant_unit_scale: 1000)
|
||||
}.to change(Spree::OptionType, :count).by(0)
|
||||
|
||||
p.option_types.should == [ot]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when the product already has a variant unit set (and all required option types exist)" do
|
||||
let!(:p) { create(:simple_product,
|
||||
variant_unit: 'weight',
|
||||
@@ -482,11 +426,6 @@ module Spree
|
||||
p.option_types.should == [ot_volume]
|
||||
end
|
||||
|
||||
it "leaves option type unassigned if none is provided" do
|
||||
p.update_attributes!(variant_unit: nil, variant_unit_scale: nil)
|
||||
p.option_types.should == []
|
||||
end
|
||||
|
||||
it "does not remove and re-add the option type if it is not changed" do
|
||||
p.option_types.should_receive(:delete).never
|
||||
p.update_attributes!(name: 'foo')
|
||||
@@ -523,13 +462,6 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
describe "returning the variant unit option type" do
|
||||
it "returns nil when variant_unit is not set" do
|
||||
p = create(:simple_product, variant_unit: nil)
|
||||
p.variant_unit_option_type.should be_nil
|
||||
end
|
||||
end
|
||||
|
||||
it "finds all variant unit option types" do
|
||||
ot1 = create(:option_type, name: 'unit_weight', presentation: 'Weight')
|
||||
ot2 = create(:option_type, name: 'unit_volume', presentation: 'Volume')
|
||||
|
||||
@@ -240,12 +240,14 @@ module Spree
|
||||
end
|
||||
|
||||
context "when the product does not have variants" do
|
||||
let(:product) { create(:simple_product, variant_unit: nil) }
|
||||
let(:product) { create(:simple_product) }
|
||||
let(:variant) { product.master }
|
||||
|
||||
it "does not require unit value or unit description when the product's unit is empty" do
|
||||
it "requires unit value and/or unit description" do
|
||||
variant.unit_value = nil
|
||||
variant.unit_description = nil
|
||||
variant.should be_invalid
|
||||
variant.unit_value = 1
|
||||
variant.should be_valid
|
||||
end
|
||||
end
|
||||
@@ -283,7 +285,7 @@ module Spree
|
||||
|
||||
describe "setting the variant's weight from the unit value" do
|
||||
it "sets the variant's weight when unit is weight" do
|
||||
p = create(:simple_product, variant_unit: nil, variant_unit_scale: nil)
|
||||
p = create(:simple_product, variant_unit: 'volume')
|
||||
v = create(:variant, product: p, weight: nil)
|
||||
|
||||
p.update_attributes! variant_unit: 'weight', variant_unit_scale: 1
|
||||
@@ -293,7 +295,7 @@ module Spree
|
||||
end
|
||||
|
||||
it "does nothing when unit is not weight" do
|
||||
p = create(:simple_product, variant_unit: nil, variant_unit_scale: nil)
|
||||
p = create(:simple_product, variant_unit: 'volume')
|
||||
v = create(:variant, product: p, weight: 123)
|
||||
|
||||
p.update_attributes! variant_unit: 'volume', variant_unit_scale: 1
|
||||
@@ -303,7 +305,7 @@ module Spree
|
||||
end
|
||||
|
||||
it "does nothing when unit_value is not set" do
|
||||
p = create(:simple_product, variant_unit: nil, variant_unit_scale: nil)
|
||||
p = create(:simple_product, variant_unit: 'volume')
|
||||
v = create(:variant, product: p, weight: 123)
|
||||
|
||||
p.update_attributes! variant_unit: 'weight', variant_unit_scale: 1
|
||||
@@ -316,56 +318,6 @@ module Spree
|
||||
end
|
||||
end
|
||||
|
||||
context "when the variant initially has no value" do
|
||||
context "when the required option value does not exist" do
|
||||
let!(:p) { create(:simple_product, variant_unit: nil, variant_unit_scale: nil) }
|
||||
let!(:v) { create(:variant, product: p, unit_value: nil, unit_description: nil) }
|
||||
|
||||
before do
|
||||
p.update_attributes!(variant_unit: 'weight', variant_unit_scale: 1)
|
||||
@ot = Spree::OptionType.find_by_name 'unit_weight'
|
||||
end
|
||||
|
||||
it "creates the option value and assigns it to the variant" do
|
||||
expect {
|
||||
v.update_attributes!(unit_value: 10, unit_description: 'foo')
|
||||
}.to change(Spree::OptionValue, :count).by(1)
|
||||
|
||||
ov = Spree::OptionValue.last
|
||||
ov.option_type.should == @ot
|
||||
ov.name.should == '10g foo'
|
||||
ov.presentation.should == '10g foo'
|
||||
|
||||
v.option_values.should include ov
|
||||
end
|
||||
end
|
||||
|
||||
context "when the required option value already exists" do
|
||||
let!(:p_orig) { create(:simple_product, variant_unit: 'weight', variant_unit_scale: 1) }
|
||||
let!(:v_orig) { create(:variant, product: p_orig, unit_value: 10, unit_description: 'foo') }
|
||||
|
||||
let!(:p) { create(:simple_product, variant_unit: nil, variant_unit_scale: nil) }
|
||||
let!(:v) { create(:variant, product: p, unit_value: nil, unit_description: nil) }
|
||||
|
||||
before do
|
||||
p.update_attributes!(variant_unit: 'weight', variant_unit_scale: 1)
|
||||
@ot = Spree::OptionType.find_by_name 'unit_weight'
|
||||
end
|
||||
|
||||
it "looks up the option value and assigns it to the variant" do
|
||||
expect {
|
||||
v.update_attributes!(unit_value: 10, unit_description: 'foo')
|
||||
}.to change(Spree::OptionValue, :count).by(0)
|
||||
|
||||
ov = v.option_values.last
|
||||
ov.option_type.should == @ot
|
||||
ov.name.should == '10g foo'
|
||||
ov.presentation.should == '10g foo'
|
||||
|
||||
v_orig.option_values.should include ov
|
||||
end
|
||||
end
|
||||
end
|
||||
context "when the variant already has a value set (and all required option values exist)" do
|
||||
let!(:p0) { create(:simple_product, variant_unit: 'weight', variant_unit_scale: 1) }
|
||||
let!(:v0) { create(:variant, product: p0, unit_value: 10, unit_description: 'foo') }
|
||||
|
||||
Reference in New Issue
Block a user