diff --git a/engines/dfc_provider/app/services/supplied_product_builder.rb b/engines/dfc_provider/app/services/supplied_product_builder.rb index 69a9871c17..d35ca518ac 100644 --- a/engines/dfc_provider/app/services/supplied_product_builder.rb +++ b/engines/dfc_provider/app/services/supplied_product_builder.rb @@ -11,19 +11,13 @@ class SuppliedProductBuilder < DfcBuilder id, name: variant.product_and_full_name, description: variant.description, - productType: product_type, + productType: product_type(variant), quantity: QuantitativeValueBuilder.quantity(variant), spree_product_id: variant.product.id, image_url: variant.product&.image&.url(:product) ) end - # OFN product categories (taxons) are currently not standardised. - # This is just a dummy value for demos. - def self.product_type - DfcLoader.connector.PRODUCT_TYPES.VEGETABLE.NON_LOCAL_VEGETABLE - end - def self.import_variant(supplied_product) product_id = supplied_product.spree_product_id @@ -42,6 +36,7 @@ class SuppliedProductBuilder < DfcBuilder end end + # TODO fix the taxon here def self.import_product(supplied_product) Spree::Product.new( name: supplied_product.name, @@ -62,4 +57,17 @@ class SuppliedProductBuilder < DfcBuilder QuantitativeValueBuilder.apply(supplied_product.quantity, variant.product) variant.unit_value = variant.product.unit_value end + + def self.product_type(variant) + taxon_name = variant.product.primary_taxon&.dfc_name + + return nil if taxon_name.nil? + + root_product_types = DfcLoader.connector.PRODUCT_TYPES.methods(false).sort + search = root_product_types.index(taxon_name.upcase.to_sym) + + return nil if search.nil? + + DfcLoader.connector.PRODUCT_TYPES.public_send(root_product_types[search]) + end end diff --git a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb index 51563b23e7..77fa2ae9e7 100644 --- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb +++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb @@ -7,8 +7,12 @@ describe SuppliedProductBuilder do subject(:builder) { described_class } let(:variant) { - build(:variant, id: 5).tap { |v| v.product.supplier_id = 7 } + build(:variant, id: 5).tap do |v| + v.product.supplier_id = 7 + v.product.primary_taxon = taxon + end } + let(:taxon) { build(:taxon, name: "Drink", dfc_name: "drink") } describe ".supplied_product" do it "assigns a semantic id" do @@ -41,11 +45,33 @@ describe SuppliedProductBuilder do expect(product.name).to eq "Apple - Granny Smith" end - it "assigns a product type" do - product = builder.supplied_product(variant) - vegetable = DfcLoader.connector.PRODUCT_TYPES.VEGETABLE.NON_LOCAL_VEGETABLE + context "product_type mapping" do + it "assigns a product type" do + product = builder.supplied_product(variant) + drink = DfcLoader.connector.PRODUCT_TYPES.DRINK - expect(product.productType).to eq vegetable + expect(product.productType).to eq drink + end + + context "with non existing product type" do + let(:taxon) { build(:taxon, name: "other", dfc_name: "other") } + + it "returns nil" do + product = builder.supplied_product(variant) + + expect(product.productType).to be_nil + end + end + + context "when no taxon set" do + let(:taxon) { nil } + + it "returns nil" do + product = builder.supplied_product(variant) + + expect(product.productType).to be_nil + end + end end it "assigns an image_url type" do