Fix legacy bulk edit product system spec

This commit is contained in:
Gaetan Craig-Riou
2024-08-12 14:01:51 +10:00
parent 893b541dca
commit 8ec1f61cd7
3 changed files with 124 additions and 109 deletions

View File

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

View File

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

View File

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