Product requires variant_unit and master requires unit_value and/or unit_desc

This commit is contained in:
Rob Harrington
2014-10-02 16:13:03 +10:00
parent dfb513cce7
commit 0a7b01ff07
5 changed files with 35 additions and 149 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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')

View File

@@ -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') }