Fix DFC supplied product builder

This commit is contained in:
Gaetan Craig-Riou
2024-07-03 14:51:02 +10:00
parent c8bf23bdc2
commit 9b4cd014bf
3 changed files with 48 additions and 50 deletions

View File

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

View File

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

View File

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