From 8ad3109e950ab736f91314f6e7525e64443726ad Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bellet Date: Thu, 18 Mar 2021 09:47:21 +0100 Subject: [PATCH] Pass needed arguments and reorder state machine - Arguments were misordered and `scale` is needed to compute the denominator. - Reorder "state machine" if-else as variant_unit_name is priority and "item" is too. - @andrewpbrett I need your review here ;) - Still need to test imperial system --- .../products/services/unit_prices.js.coffee | 14 +-- .../services/unit_prices_spec.js.coffee | 116 ++++++++++++++++++ 2 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 spec/javascripts/unit/admin/products/services/unit_prices_spec.js.coffee diff --git a/app/assets/javascripts/admin/products/services/unit_prices.js.coffee b/app/assets/javascripts/admin/products/services/unit_prices.js.coffee index 0867d8deb8..bf6655ae37 100644 --- a/app/assets/javascripts/admin/products/services/unit_prices.js.coffee +++ b/app/assets/javascripts/admin/products/services/unit_prices.js.coffee @@ -1,7 +1,7 @@ angular.module("admin.products").factory "UnitPrices", (VariantUnitManager) -> class UnitPrices @price: (price, scale, unit_type, unit_value) -> - price / @denominator(unit_value, variant_unit) + price / @denominator(scale, unit_type, unit_value) @denominator: (scale, unit_type, unit_value) -> unit = @unit(scale, unit_type) @@ -13,13 +13,13 @@ angular.module("admin.products").factory "UnitPrices", (VariantUnitManager) -> unit_value @unit: (scale, unit_type, variant_unit_name = '') -> - if VariantUnitManager.systemOfMeasurement(scale, unit_type) == "imperial" + if variant_unit_name.length > 0 + variant_unit_name + else if unit_type == "items" + "item" + else if VariantUnitManager.systemOfMeasurement(scale, unit_type) == "imperial" "lb" else if unit_type == "weight" "kg" else if unit_type == "volume" - "L" - else if variant_unit_name.length > 0 - variant_unit_name - else - "item" + "L" \ No newline at end of file diff --git a/spec/javascripts/unit/admin/products/services/unit_prices_spec.js.coffee b/spec/javascripts/unit/admin/products/services/unit_prices_spec.js.coffee new file mode 100644 index 0000000000..c21f3a16a4 --- /dev/null +++ b/spec/javascripts/unit/admin/products/services/unit_prices_spec.js.coffee @@ -0,0 +1,116 @@ +describe "UnitPrices service", -> + UnitPrices = null + + beforeEach -> + module "admin.products" + module ($provide)-> + $provide.value "availableUnits", "g,kg,T,mL,L,kL" + null + inject (_UnitPrices_) -> + UnitPrices = _UnitPrices_ + + describe "get correct unit price duo unit/value for weight", -> + unit_type = "weight" + + it "with scale: 1", -> + price = 1 + scale = 1 + unit_value = 1 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 1000 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + it "with scale and unit_value: 1000", -> + price = 1 + scale = 1000 + unit_value = 1000 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 1 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + it "with scale: 1000 and unit_value: 2000", -> + price = 1 + scale = 1000 + unit_value = 2000 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 0.5 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + it "with price: 2", -> + price = 2 + scale = 1 + unit_value = 1 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 2000 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + it "with price: 2, scale and unit_value: 1000", -> + price = 2 + scale = 1000 + unit_value = 1000 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 2 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + it "with price: 2, scale: 1000 and unit_value: 2000", -> + price = 2 + scale = 1000 + unit_value = 2000 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 1 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + it "with price: 2, scale: 1000 and unit_value: 500", -> + price = 2 + scale = 1000 + unit_value = 500 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 4 + expect(UnitPrices.unit(scale, unit_type)).toEqual "kg" + + + describe "get correct unit price duo unit/value for volume", -> + unit_type = "volume" + + it "with scale: 1", -> + price = 1 + scale = 1 + unit_value = 1 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 1 + expect(UnitPrices.unit(scale, unit_type)).toEqual "L" + + it "with price: 2 and unit_value: 0.5", -> + price = 2 + scale = 1 + unit_value = 0.5 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 4 + expect(UnitPrices.unit(scale, unit_type)).toEqual "L" + + it "with price: 2, scale: 0.001 and unit_value: 0.01", -> + price = 2 + scale = 0.001 + unit_value = 0.01 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 200 + expect(UnitPrices.unit(scale, unit_type)).toEqual "L" + + it "with price: 20000, scale: 1000 and unit_value: 10000", -> + price = 20000 + scale = 1000 + unit_value = 10000 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 2 + expect(UnitPrices.unit(scale, unit_type)).toEqual "L" + + describe "get correct unit price duo unit/value for items", -> + unit_type = "items" + scale = null + + it "with price: 1 and unit_value: 1", -> + price = 1 + unit_value = 1 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 1 + expect(UnitPrices.unit(scale, unit_type)).toEqual "item" + + it "with price: 1 and unit_value: 10", -> + price = 1 + unit_value = 10 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 0.1 + expect(UnitPrices.unit(scale, unit_type)).toEqual "item" + + it "with price: 10 and unit_value: 1", -> + price = 10 + unit_value = 1 + expect(UnitPrices.price(price, scale, unit_type, unit_value)).toEqual 10 + expect(UnitPrices.unit(scale, unit_type)).toEqual "item"