mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-02 02:11:33 +00:00
Fix legacy bulk edit product system spec
This commit is contained in:
@@ -19,7 +19,7 @@ angular.module("ofn.admin").factory "BulkProducts", (ProductResource, dataFetche
|
||||
for server_product in serverProducts
|
||||
product = @findProductInList(server_product.id, @products)
|
||||
product.variants = server_product.variants
|
||||
@loadVariantUnitValues product
|
||||
@loadVariantUnitValues product.variants
|
||||
|
||||
find: (id) ->
|
||||
@findProductInList id, @products
|
||||
@@ -38,34 +38,32 @@ angular.module("ofn.admin").factory "BulkProducts", (ProductResource, dataFetche
|
||||
@products.splice(index + 1, 0, newProduct)
|
||||
|
||||
unpackProduct: (product) ->
|
||||
#$scope.matchProducer product
|
||||
@loadVariantUnit product
|
||||
|
||||
loadVariantUnit: (product) ->
|
||||
product.variant_unit_with_scale =
|
||||
if product.variant_unit && product.variant_unit_scale && product.variant_unit != 'items'
|
||||
"#{product.variant_unit}_#{product.variant_unit_scale}"
|
||||
else if product.variant_unit
|
||||
product.variant_unit
|
||||
@loadVariantUnitValues product.variants if product.variants
|
||||
|
||||
loadVariantUnitValues: (variants) ->
|
||||
for variant in variants
|
||||
@loadVariantUnitValue variant
|
||||
|
||||
loadVariantUnitValue: (variant) ->
|
||||
variant.variant_unit_with_scale =
|
||||
if variant.variant_unit && variant.variant_unit_scale && variant.variant_unit != 'items'
|
||||
"#{variant.variant_unit}_#{variant.variant_unit_scale}"
|
||||
else if variant.variant_unit
|
||||
variant.variant_unit
|
||||
else
|
||||
null
|
||||
|
||||
@loadVariantUnitValues product if product.variants
|
||||
@loadVariantUnitValue product, product.master if product.master
|
||||
|
||||
loadVariantUnitValues: (product) ->
|
||||
for variant in product.variants
|
||||
@loadVariantUnitValue product, variant
|
||||
|
||||
loadVariantUnitValue: (product, variant) ->
|
||||
unit_value = @variantUnitValue product, variant
|
||||
unit_value = @variantUnitValue variant
|
||||
unit_value = if unit_value? then unit_value else ''
|
||||
variant.unit_value_with_description = "#{unit_value} #{variant.unit_description || ''}".trim()
|
||||
|
||||
variantUnitValue: (product, variant) ->
|
||||
variantUnitValue: (variant) ->
|
||||
if variant.unit_value?
|
||||
if product.variant_unit_scale
|
||||
variant_unit_value = @divideAsInteger variant.unit_value, product.variant_unit_scale
|
||||
if variant.variant_unit_scale
|
||||
variant_unit_value = @divideAsInteger variant.unit_value, variant.variant_unit_scale
|
||||
parseFloat(window.bigDecimal.round(variant_unit_value, 2))
|
||||
else
|
||||
variant.unit_value
|
||||
|
||||
@@ -53,126 +53,128 @@ describe "BulkProducts service", ->
|
||||
|
||||
describe "loading variant unit", ->
|
||||
describe "setting product variant_unit_with_scale field", ->
|
||||
it "sets by combining variant_unit and variant_unit_scale", ->
|
||||
it "HERE 2 sets by combining variant_unit and variant_unit_scale", ->
|
||||
product =
|
||||
variant_unit: "volume"
|
||||
variant_unit_scale: .001
|
||||
variants:[
|
||||
id: 10
|
||||
variant_unit: "volume"
|
||||
variant_unit_scale: .001
|
||||
]
|
||||
BulkProducts.loadVariantUnit product
|
||||
expect(product.variant_unit_with_scale).toEqual "volume_0.001"
|
||||
expect(product.variants[0].variant_unit_with_scale).toEqual "volume_0.001"
|
||||
|
||||
it "sets to null when variant_unit is null", ->
|
||||
product = {variant_unit: null, variant_unit_scale: 1000}
|
||||
product =
|
||||
variants: [
|
||||
{variant_unit: null, variant_unit_scale: 1000}
|
||||
]
|
||||
BulkProducts.loadVariantUnit product
|
||||
expect(product.variant_unit_with_scale).toBeNull()
|
||||
|
||||
expect(product.variants[0].variant_unit_with_scale).toBeNull()
|
||||
|
||||
it "sets to variant_unit when variant_unit_scale is null", ->
|
||||
product = {variant_unit: 'items', variant_unit_scale: null, variant_unit_name: 'foo'}
|
||||
product =
|
||||
variants: [
|
||||
{variant_unit: 'items', variant_unit_scale: null, variant_unit_name: 'foo'}
|
||||
]
|
||||
BulkProducts.loadVariantUnit product
|
||||
expect(product.variant_unit_with_scale).toEqual "items"
|
||||
expect(product.variants[0].variant_unit_with_scale).toEqual "items"
|
||||
|
||||
it "sets to variant_unit when variant_unit is 'items'", ->
|
||||
product = {variant_unit: 'items', variant_unit_scale: 1000, variant_unit_name: 'foo'}
|
||||
product =
|
||||
variants: [
|
||||
{variant_unit: 'items', variant_unit_scale: 1000, variant_unit_name: 'foo'}
|
||||
]
|
||||
BulkProducts.loadVariantUnit product
|
||||
expect(product.variant_unit_with_scale).toEqual "items"
|
||||
|
||||
it "loads data for variants (incl. master)", ->
|
||||
spyOn BulkProducts, "loadVariantUnitValues"
|
||||
spyOn BulkProducts, "loadVariantUnitValue"
|
||||
|
||||
product =
|
||||
variant_unit_scale: 1.0
|
||||
master: {id: 1, unit_value: 1, unit_description: '(one)'}
|
||||
variants: [{id: 2, unit_value: 2, unit_description: '(two)'}]
|
||||
BulkProducts.loadVariantUnit product
|
||||
|
||||
expect(BulkProducts.loadVariantUnitValues).toHaveBeenCalledWith product
|
||||
expect(BulkProducts.loadVariantUnitValue).toHaveBeenCalledWith product, product.master
|
||||
expect(product.variants[0].variant_unit_with_scale).toEqual "items"
|
||||
|
||||
it "loads data for variants (excl. master)", ->
|
||||
spyOn BulkProducts, "loadVariantUnitValue"
|
||||
|
||||
product =
|
||||
variant_unit_scale: 1.0
|
||||
master: {id: 1, unit_value: 1, unit_description: '(one)'}
|
||||
variants: [{id: 2, unit_value: 2, unit_description: '(two)'}]
|
||||
BulkProducts.loadVariantUnitValues product
|
||||
variants: [
|
||||
{id: 2, variant_unit_scale: 1.0, unit_value: 2, unit_description: '(two)'}
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
|
||||
expect(BulkProducts.loadVariantUnitValue).toHaveBeenCalledWith product, product.variants[0]
|
||||
expect(BulkProducts.loadVariantUnitValue).not.toHaveBeenCalledWith product, product.master
|
||||
expect(BulkProducts.loadVariantUnitValue).toHaveBeenCalledWith product.variants[0]
|
||||
|
||||
describe "setting variant unit_value_with_description", ->
|
||||
it "sets by combining unit_value and unit_description", ->
|
||||
product =
|
||||
variant_unit_scale: 1.0
|
||||
variants: [{id: 1, unit_value: 1, unit_description: '(bottle)'}]
|
||||
BulkProducts.loadVariantUnitValues product, product.variants[0]
|
||||
variants: [
|
||||
{id: 1, variant_unit_scale: 1.0, unit_value: 1, unit_description: '(bottle)'}
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
expect(product.variants[0]).toEqual
|
||||
id: 1
|
||||
variant_unit_scale: 1.0,
|
||||
variant_unit_with_scale: null,
|
||||
unit_value: 1
|
||||
unit_description: '(bottle)'
|
||||
unit_value_with_description: '1 (bottle)'
|
||||
|
||||
it "uses unit_value when description is missing", ->
|
||||
product =
|
||||
variant_unit_scale: 1.0
|
||||
variants: [{id: 1, unit_value: 1}]
|
||||
BulkProducts.loadVariantUnitValues product, product.variants[0]
|
||||
variants: [
|
||||
{id: 1, variant_unit_scale: 1.0, unit_value: 1}
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
expect(product.variants[0].unit_value_with_description).toEqual '1'
|
||||
|
||||
it "uses unit_description when value is missing", ->
|
||||
product =
|
||||
variant_unit_scale: 1.0
|
||||
variants: [{id: 1, unit_description: 'Small'}]
|
||||
BulkProducts.loadVariantUnitValues product, product.variants[0]
|
||||
variants: [
|
||||
{id: 1, variant_unit_scale: 1.0, unit_description: 'Small'}
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
expect(product.variants[0].unit_value_with_description).toEqual 'Small'
|
||||
|
||||
it "converts values from base value to chosen unit", ->
|
||||
product =
|
||||
variant_unit_scale: 1000.0
|
||||
variants: [{id: 1, unit_value: 2500}]
|
||||
BulkProducts.loadVariantUnitValues product, product.variants[0]
|
||||
variants: [
|
||||
id: 1, variant_unit_scale: 1000.0, unit_value: 2500
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
expect(product.variants[0].unit_value_with_description).toEqual '2.5'
|
||||
|
||||
it "converts values from base value to chosen unit without breaking precision", ->
|
||||
product =
|
||||
variant_unit_scale: 0.001
|
||||
variants: [{id: 1, unit_value: 0.35}]
|
||||
BulkProducts.loadVariantUnitValues product, product.variants[0]
|
||||
variants: [
|
||||
{id: 1,variant_unit_scale: 0.001, unit_value: 0.35}
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
expect(product.variants[0].unit_value_with_description).toEqual '350'
|
||||
|
||||
it "displays a unit_value of zero", ->
|
||||
product =
|
||||
variant_unit_scale: 1.0
|
||||
variants: [{id: 1, unit_value: 0}]
|
||||
BulkProducts.loadVariantUnitValues product, product.variants[0]
|
||||
variants: [
|
||||
{id: 1, variant_unit_scale: 1.0, unit_value: 0}
|
||||
]
|
||||
BulkProducts.loadVariantUnitValues product.variants
|
||||
expect(product.variants[0].unit_value_with_description).toEqual '0'
|
||||
|
||||
|
||||
describe "calculating the scaled unit value for a variant", ->
|
||||
it "returns the scaled value when variant has a unit_value", ->
|
||||
product = {variant_unit_scale: 0.001}
|
||||
variant = {unit_value: 5}
|
||||
expect(BulkProducts.variantUnitValue(product, variant)).toEqual 5000
|
||||
variant = {variant_unit_scale: 0.001, unit_value: 5}
|
||||
expect(BulkProducts.variantUnitValue(variant)).toEqual 5000
|
||||
|
||||
it "returns the scaled value rounded off upto 2 decimal points", ->
|
||||
product = {variant_unit_scale: 28.35}
|
||||
variant = {unit_value: 1234.5}
|
||||
expect(BulkProducts.variantUnitValue(product, variant)).toEqual 43.54
|
||||
variant = {variant_unit_scale: 28.35, unit_value: 1234.5}
|
||||
expect(BulkProducts.variantUnitValue(variant)).toEqual 43.54
|
||||
|
||||
it "returns the unscaled value when the product has no scale", ->
|
||||
product = {}
|
||||
variant = {unit_value: 5}
|
||||
expect(BulkProducts.variantUnitValue(product, variant)).toEqual 5
|
||||
expect(BulkProducts.variantUnitValue(variant)).toEqual 5
|
||||
|
||||
it "returns zero when the value is zero", ->
|
||||
product = {}
|
||||
variant = {unit_value: 0}
|
||||
expect(BulkProducts.variantUnitValue(product, variant)).toEqual 0
|
||||
expect(BulkProducts.variantUnitValue(variant)).toEqual 0
|
||||
|
||||
it "returns null when the variant has no unit_value", ->
|
||||
product = {}
|
||||
variant = {}
|
||||
expect(BulkProducts.variantUnitValue(product, variant)).toEqual null
|
||||
expect(BulkProducts.variantUnitValue(variant)).toEqual null
|
||||
|
||||
|
||||
describe "fetching a product by id", ->
|
||||
|
||||
@@ -72,19 +72,21 @@ RSpec.describe '
|
||||
end
|
||||
|
||||
it "displays a select box for the unit of measure for the product's variants" do
|
||||
p = FactoryBot.create(:product, variant_unit: 'weight', variant_unit_scale: 1,
|
||||
variant_unit_name: '')
|
||||
create(:product, variant_unit: 'weight', variant_unit_scale: 1,
|
||||
variant_unit_name: '')
|
||||
|
||||
visit spree.admin_products_path
|
||||
click_expand_all
|
||||
|
||||
expect(page).to have_select "variant_unit_with_scale", selected: "Weight (g)"
|
||||
end
|
||||
|
||||
it "displays a text field for the item name when unit is set to 'Items'" do
|
||||
p = FactoryBot.create(:product, variant_unit: 'items', variant_unit_scale: nil,
|
||||
variant_unit_name: 'packet')
|
||||
create(:product, variant_unit: 'items', variant_unit_scale: nil,
|
||||
variant_unit_name: 'packet')
|
||||
|
||||
visit spree.admin_products_path
|
||||
click_expand_all
|
||||
|
||||
expect(page).to have_select "variant_unit_with_scale", selected: "Items"
|
||||
expect(page).to have_field "variant_unit_name", with: "packet"
|
||||
@@ -145,17 +147,15 @@ RSpec.describe '
|
||||
end
|
||||
|
||||
it "displays a unit value field (for each variant) for each product" do
|
||||
p1 = FactoryBot.create(:product, price: 2.0, variant_unit: "weight",
|
||||
variant_unit_scale: "1000")
|
||||
v1 = FactoryBot.create(:variant, product: p1, price: 12.75,
|
||||
unit_value: 1200, unit_description: "(small bag)",
|
||||
display_as: "bag")
|
||||
v2 = FactoryBot.create(:variant, product: p1, price: 2.50,
|
||||
unit_value: 4800, unit_description: "(large bag)",
|
||||
display_as: "bin")
|
||||
p1 = create(:product, price: 2.0, variant_unit: "weight", variant_unit_scale: "1000")
|
||||
v1 = create(:variant, product: p1, price: 12.75, unit_value: 1200, variant_unit_scale: "1000",
|
||||
unit_description: "(small bag)", display_as: "bag")
|
||||
v2 = create(:variant, product: p1, price: 2.50, unit_value: 4800, variant_unit_scale: "1000",
|
||||
unit_description: "(large bag)", display_as: "bin")
|
||||
|
||||
visit spree.admin_products_path
|
||||
expect(page).to have_selector "a.view-variants", count: 1
|
||||
|
||||
all("a.view-variants").each(&:click)
|
||||
|
||||
expect(page).to have_field "variant_unit_value_with_description", with: "1.2 (small bag)"
|
||||
@@ -220,7 +220,7 @@ RSpec.describe '
|
||||
let!(:new_supplier) { create(:supplier_enterprise) }
|
||||
let!(:product) {
|
||||
create(:product, variant_unit: 'weight', variant_unit_scale: 1000, supplier_id: supplier.id)
|
||||
}
|
||||
} # Weight (kg)
|
||||
|
||||
before do
|
||||
login_as_admin
|
||||
@@ -249,6 +249,7 @@ RSpec.describe '
|
||||
|
||||
# When I fill out variant details and hit update
|
||||
select new_supplier.name, from: 'producer_id'
|
||||
tomselect_select "Weight (kg)", from: "variant_unit_with_scale"
|
||||
fill_in "variant_display_name", with: "Case of 12 Bottles"
|
||||
fill_in "variant_unit_value_with_description", with: "3 (12x250 mL bottles)"
|
||||
fill_in "variant_display_as", with: "Case"
|
||||
@@ -290,6 +291,7 @@ RSpec.describe '
|
||||
|
||||
within "tr#v_-1" do
|
||||
select supplier.name, from: 'producer_id'
|
||||
tomselect_select "Weight (kg)", from: "variant_unit_with_scale"
|
||||
fill_in "variant_unit_value_with_description", with: "120"
|
||||
fill_in "variant_price", with: "6.66"
|
||||
end
|
||||
@@ -304,6 +306,7 @@ RSpec.describe '
|
||||
end
|
||||
|
||||
within "tr#v_-1" do
|
||||
tomselect_select "Weight (g)", from: "variant_unit_with_scale"
|
||||
fill_in "variant_unit_value_with_description", with: "120g"
|
||||
fill_in "variant_price", with: "6.66"
|
||||
fill_in "variant_on_hand", with: "222"
|
||||
@@ -322,6 +325,7 @@ RSpec.describe '
|
||||
end
|
||||
|
||||
within "tr#v_-1" do
|
||||
tomselect_select "Weight (g)", from: "variant_unit_with_scale"
|
||||
fill_in "variant_unit_value_with_description", with: "120g"
|
||||
fill_in "variant_price", with: "6.66"
|
||||
check "variant_on_demand"
|
||||
@@ -335,12 +339,13 @@ RSpec.describe '
|
||||
end
|
||||
|
||||
it "updating product attributes" do
|
||||
s1 = FactoryBot.create(:supplier_enterprise)
|
||||
s2 = FactoryBot.create(:supplier_enterprise)
|
||||
t1 = FactoryBot.create(:taxon)
|
||||
t2 = FactoryBot.create(:taxon)
|
||||
p = FactoryBot.create(:product, supplier_id: s1.id, variant_unit: 'volume',
|
||||
variant_unit_scale: 1, primary_taxon: t2, sku: "OLD SKU")
|
||||
s1 = create(:supplier_enterprise)
|
||||
create(:supplier_enterprise)
|
||||
create(:taxon)
|
||||
t2 = create(:taxon)
|
||||
p = create(:product, supplier_id: s1.id, variant_unit: 'volume', variant_unit_scale: 1,
|
||||
primary_taxon: t2, sku: "OLD SKU")
|
||||
variant = p.variants.first
|
||||
|
||||
login_as_admin
|
||||
visit spree.admin_products_path
|
||||
@@ -348,34 +353,43 @@ RSpec.describe '
|
||||
toggle_columns /^Category?/i, "Inherits Properties?", "SKU"
|
||||
|
||||
within "tr#p_#{p.id}" do
|
||||
page.find('a.view-variants').click
|
||||
|
||||
expect(page).to have_field "product_name", with: p.name
|
||||
expect(page).to have_select "variant_unit_with_scale", selected: "Volume (L)"
|
||||
expect(page).to have_checked_field "inherits_properties"
|
||||
expect(page).to have_field "product_sku", with: p.sku
|
||||
|
||||
fill_in "product_name", with: "Big Bag Of Potatoes"
|
||||
select "Weight (kg)", from: "variant_unit_with_scale"
|
||||
uncheck "inherits_properties"
|
||||
fill_in "product_sku", with: "NEW SKU"
|
||||
end
|
||||
within "tr#v_#{variant.id}" do
|
||||
expect(page).to have_select "variant_unit_with_scale", selected: "Volume (L)"
|
||||
|
||||
tomselect_select "Weight (kg)", from: "variant_unit_with_scale"
|
||||
end
|
||||
|
||||
click_button 'Save Changes', match: :first
|
||||
expect(page.find("#status-message")).to have_content "Changes saved."
|
||||
|
||||
p.reload
|
||||
expect(p.name).to eq "Big Bag Of Potatoes"
|
||||
expect(p.variant_unit).to eq "weight"
|
||||
expect(p.variant_unit_scale).to eq 1000 # Kg
|
||||
expect(p.inherits_properties).to be false
|
||||
expect(p.sku).to eq "NEW SKU"
|
||||
|
||||
variant.reload
|
||||
expect(variant.variant_unit).to eq "weight"
|
||||
expect(variant.variant_unit_scale).to eq 1000 # Kg
|
||||
end
|
||||
|
||||
it "updating a product with a variant unit of 'items'" do
|
||||
p = FactoryBot.create(:product, variant_unit: 'weight', variant_unit_scale: 1000)
|
||||
p = create(:product, variant_unit: 'weight', variant_unit_scale: 1000)
|
||||
|
||||
login_as_admin
|
||||
visit spree.admin_products_path
|
||||
|
||||
page.find('a.view-variants').click
|
||||
|
||||
expect(page).to have_select "variant_unit_with_scale", selected: "Weight (kg)"
|
||||
|
||||
select "Items", from: "variant_unit_with_scale"
|
||||
@@ -384,10 +398,10 @@ RSpec.describe '
|
||||
click_button 'Save Changes', match: :first
|
||||
expect(page.find("#status-message")).to have_content "Changes saved."
|
||||
|
||||
p.reload
|
||||
expect(p.variant_unit).to eq "items"
|
||||
expect(p.variant_unit_scale).to be_nil
|
||||
expect(p.variant_unit_name).to eq "loaf"
|
||||
variant = p.variants.first
|
||||
expect(variant.variant_unit).to eq "items"
|
||||
expect(variant.variant_unit_scale).to be_nil
|
||||
expect(variant.variant_unit_name).to eq "loaf"
|
||||
end
|
||||
|
||||
it "updating a product with variants" do
|
||||
@@ -853,14 +867,15 @@ RSpec.describe '
|
||||
expect(page).to have_field "product_name", with: p.name
|
||||
|
||||
fill_in "product_name", with: "Big Bag Of Potatoes"
|
||||
select "Weight (kg)", from: "variant_unit_with_scale"
|
||||
|
||||
find("a.view-variants").click
|
||||
end
|
||||
|
||||
within "#v_#{v.id}" do
|
||||
expect(page).to have_select "producer_id", selected: supplier_permitted.name
|
||||
|
||||
select supplier_managed2.name, from: 'producer_id'
|
||||
select "Weight (kg)", from: "variant_unit_with_scale"
|
||||
fill_in "variant_price", with: "20"
|
||||
fill_in "variant_on_hand", with: "18"
|
||||
fill_in "variant_display_as", with: "Big Bag"
|
||||
@@ -872,8 +887,8 @@ RSpec.describe '
|
||||
p.reload
|
||||
v.reload
|
||||
expect(p.name).to eq "Big Bag Of Potatoes"
|
||||
expect(p.variant_unit).to eq "weight"
|
||||
expect(p.variant_unit_scale).to eq 1000 # Kg
|
||||
expect(v.variant_unit).to eq "weight"
|
||||
expect(v.variant_unit_scale).to eq 1000 # Kg
|
||||
expect(v.supplier).to eq supplier_managed2
|
||||
expect(v.display_as).to eq "Big Bag"
|
||||
expect(v.price).to eq 20.0
|
||||
|
||||
Reference in New Issue
Block a user