mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-26 01:33:22 +00:00
Fix DFC supplied product builder
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
class QuantitativeValueBuilder < DfcBuilder
|
||||
def self.quantity(variant)
|
||||
DataFoodConsortium::Connector::QuantitativeValue.new(
|
||||
unit: unit(variant.product.variant_unit),
|
||||
unit: unit(variant.variant_unit),
|
||||
value: variant.unit_value,
|
||||
)
|
||||
end
|
||||
@@ -27,7 +27,7 @@ class QuantitativeValueBuilder < DfcBuilder
|
||||
end
|
||||
end
|
||||
|
||||
def self.apply(quantity, product)
|
||||
def self.apply(quantity, variant)
|
||||
measure, unit_name, unit_scale = map_unit(quantity.unit)
|
||||
value = quantity.value.to_f * unit_scale
|
||||
|
||||
@@ -37,10 +37,10 @@ class QuantitativeValueBuilder < DfcBuilder
|
||||
value = 1
|
||||
end
|
||||
|
||||
product.variant_unit = measure
|
||||
product.variant_unit_name = unit_name if measure == "items"
|
||||
product.variant_unit_scale = unit_scale
|
||||
product.unit_value = value
|
||||
variant.variant_unit = measure
|
||||
variant.variant_unit_name = unit_name if measure == "items"
|
||||
variant.variant_unit_scale = unit_scale
|
||||
variant.unit_value = value
|
||||
end
|
||||
|
||||
# Map DFC units to OFN fields:
|
||||
|
||||
@@ -96,8 +96,7 @@ class SuppliedProductBuilder < DfcBuilder
|
||||
|
||||
variant.display_name = supplied_product.name
|
||||
variant.primary_taxon = taxon(supplied_product)
|
||||
QuantitativeValueBuilder.apply(supplied_product.quantity, variant.product)
|
||||
variant.unit_value = variant.product.unit_value
|
||||
QuantitativeValueBuilder.apply(supplied_product.quantity, variant)
|
||||
|
||||
catalog_item = supplied_product&.catalogItems&.first
|
||||
offer = catalog_item&.offers&.first
|
||||
|
||||
@@ -4,12 +4,11 @@ require_relative "../spec_helper"
|
||||
|
||||
RSpec.describe QuantitativeValueBuilder do
|
||||
subject(:builder) { described_class }
|
||||
let(:variant) { build(:variant, product:) }
|
||||
let(:product) { build(:product, name: "Apple") }
|
||||
let(:variant) { build(:variant) }
|
||||
|
||||
describe ".quantity" do
|
||||
it "recognises items" do
|
||||
product.variant_unit = "item"
|
||||
variant.variant_unit = "item"
|
||||
variant.unit_value = 1
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
@@ -18,7 +17,7 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
end
|
||||
|
||||
it "recognises volume" do
|
||||
product.variant_unit = "volume"
|
||||
variant.variant_unit = "volume"
|
||||
variant.unit_value = 2
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
@@ -27,7 +26,7 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
end
|
||||
|
||||
it "recognises weight" do
|
||||
product.variant_unit = "weight"
|
||||
variant.variant_unit = "weight"
|
||||
variant.unit_value = 1000 # 1kg
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
@@ -36,7 +35,7 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
end
|
||||
|
||||
it "falls back to items" do
|
||||
product.variant_unit = nil
|
||||
variant.variant_unit = nil
|
||||
quantity = builder.quantity(variant)
|
||||
|
||||
expect(quantity.value).to eq 1.0
|
||||
@@ -46,7 +45,7 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
|
||||
describe ".apply" do
|
||||
let(:quantity_unit) { DfcLoader.connector.MEASURES }
|
||||
let(:product) { Spree::Product.new }
|
||||
let(:variant) { Spree::Variant.new }
|
||||
|
||||
it "uses items for anything unknown" do
|
||||
quantity = DataFoodConsortium::Connector::QuantitativeValue.new(
|
||||
@@ -54,12 +53,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: 3,
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "items"
|
||||
expect(product.variant_unit_name).to eq "Jar"
|
||||
expect(product.variant_unit_scale).to eq 1
|
||||
expect(product.unit_value).to eq 3
|
||||
expect(variant.variant_unit).to eq "items"
|
||||
expect(variant.variant_unit_name).to eq "Jar"
|
||||
expect(variant.variant_unit_scale).to eq 1
|
||||
expect(variant.unit_value).to eq 3
|
||||
end
|
||||
|
||||
it "knows metric units" do
|
||||
@@ -68,12 +67,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: 2,
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "volume"
|
||||
expect(product.variant_unit_name).to eq nil
|
||||
expect(product.variant_unit_scale).to eq 1
|
||||
expect(product.unit_value).to eq 2
|
||||
expect(variant.variant_unit).to eq "volume"
|
||||
expect(variant.variant_unit_name).to eq nil
|
||||
expect(variant.variant_unit_scale).to eq 1
|
||||
expect(variant.unit_value).to eq 2
|
||||
end
|
||||
|
||||
it "knows metric units with a scale in OFN" do
|
||||
@@ -82,12 +81,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: 4,
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "weight"
|
||||
expect(product.variant_unit_name).to eq nil
|
||||
expect(product.variant_unit_scale).to eq 1_000
|
||||
expect(product.unit_value).to eq 4_000
|
||||
expect(variant.variant_unit).to eq "weight"
|
||||
expect(variant.variant_unit_name).to eq nil
|
||||
expect(variant.variant_unit_scale).to eq 1_000
|
||||
expect(variant.unit_value).to eq 4_000
|
||||
end
|
||||
|
||||
it "knows metric units with a small scale" do
|
||||
@@ -96,12 +95,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: 5,
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "weight"
|
||||
expect(product.variant_unit_name).to eq nil
|
||||
expect(product.variant_unit_scale).to eq 0.001
|
||||
expect(product.unit_value).to eq 0.005
|
||||
expect(variant.variant_unit).to eq "weight"
|
||||
expect(variant.variant_unit_name).to eq nil
|
||||
expect(variant.variant_unit_scale).to eq 0.001
|
||||
expect(variant.unit_value).to eq 0.005
|
||||
end
|
||||
|
||||
it "interpretes values given as a string" do
|
||||
@@ -110,12 +109,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: "0.4",
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "weight"
|
||||
expect(product.variant_unit_name).to eq nil
|
||||
expect(product.variant_unit_scale).to eq 1_000
|
||||
expect(product.unit_value).to eq 400
|
||||
expect(variant.variant_unit).to eq "weight"
|
||||
expect(variant.variant_unit_name).to eq nil
|
||||
expect(variant.variant_unit_scale).to eq 1_000
|
||||
expect(variant.unit_value).to eq 400
|
||||
end
|
||||
|
||||
it "knows imperial units" do
|
||||
@@ -124,12 +123,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: 10,
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "weight"
|
||||
expect(product.variant_unit_name).to eq nil
|
||||
expect(product.variant_unit_scale).to eq 453.59237
|
||||
expect(product.unit_value).to eq 4_535.9237
|
||||
expect(variant.variant_unit).to eq "weight"
|
||||
expect(variant.variant_unit_name).to eq nil
|
||||
expect(variant.variant_unit_scale).to eq 453.59237
|
||||
expect(variant.unit_value).to eq 4_535.9237
|
||||
end
|
||||
|
||||
it "knows customary units" do
|
||||
@@ -138,12 +137,12 @@ RSpec.describe QuantitativeValueBuilder do
|
||||
value: 2,
|
||||
)
|
||||
|
||||
builder.apply(quantity, product)
|
||||
builder.apply(quantity, variant)
|
||||
|
||||
expect(product.variant_unit).to eq "items"
|
||||
expect(product.variant_unit_name).to eq "dozen"
|
||||
expect(product.variant_unit_scale).to eq 12
|
||||
expect(product.unit_value).to eq 24
|
||||
expect(variant.variant_unit).to eq "items"
|
||||
expect(variant.variant_unit_name).to eq "dozen"
|
||||
expect(variant.variant_unit_scale).to eq 12
|
||||
expect(variant.unit_value).to eq 24
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user