From df9e1ac2b45d2542dbe9b0f58b2ac98deb9c0c30 Mon Sep 17 00:00:00 2001 From: Maikel Linke Date: Thu, 25 May 2023 15:20:58 +1000 Subject: [PATCH] Encapsulate SuppliedProductBuilder And improve EnterpriseBuilder. It was builder products twice. --- .../supplied_products_controller.rb | 2 +- .../dfc_provider/app/services/dfc_builder.rb | 17 +----------- .../app/services/enterprise_builder.rb | 2 +- .../app/services/supplied_product_builder.rb | 18 +++++++++++++ .../spec/services/enterprise_builder_spec.rb | 26 +++++++++++++++++++ .../services/supplied_product_builder_spec.rb | 13 +++++----- 6 files changed, 54 insertions(+), 24 deletions(-) create mode 100644 engines/dfc_provider/app/services/supplied_product_builder.rb create mode 100644 engines/dfc_provider/spec/services/enterprise_builder_spec.rb diff --git a/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb b/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb index 034770bab2..215f634ee0 100644 --- a/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb +++ b/engines/dfc_provider/app/controllers/dfc_provider/supplied_products_controller.rb @@ -7,7 +7,7 @@ module DfcProvider before_action :check_enterprise def show - product = DfcBuilder.supplied_product(variant) + product = SuppliedProductBuilder.supplied_product(variant) render json: DfcLoader.connector.export(product) end diff --git a/engines/dfc_provider/app/services/dfc_builder.rb b/engines/dfc_provider/app/services/dfc_builder.rb index 1e364b8faa..d67630c5a0 100644 --- a/engines/dfc_provider/app/services/dfc_builder.rb +++ b/engines/dfc_provider/app/services/dfc_builder.rb @@ -6,7 +6,7 @@ class DfcBuilder enterprise_id: variant.product.supplier_id, id: variant.id, ) - product = supplied_product(variant) + product = SuppliedProductBuilder.supplied_product(variant) DataFoodConsortium::Connector::CatalogItem.new( id, product: product, @@ -16,21 +16,6 @@ class DfcBuilder ) end - def self.supplied_product(variant) - id = urls.enterprise_supplied_product_url( - enterprise_id: variant.product.supplier_id, - id: variant.id, - ) - - DataFoodConsortium::Connector::SuppliedProduct.new( - id, - name: variant.name_to_display, - description: variant.description, - productType: product_type, - quantity: QuantitativeValueBuilder.quantity(variant), - ) - end - def self.offer(variant) # We don't have an endpoint for offers yet and this URL is only a # placeholder for now. The offer is actually affected by order cycle and diff --git a/engines/dfc_provider/app/services/enterprise_builder.rb b/engines/dfc_provider/app/services/enterprise_builder.rb index 41f8833544..a8327d97da 100644 --- a/engines/dfc_provider/app/services/enterprise_builder.rb +++ b/engines/dfc_provider/app/services/enterprise_builder.rb @@ -3,8 +3,8 @@ class EnterpriseBuilder < DfcBuilder def self.enterprise(enterprise) variants = VariantFetcher.new(enterprise).scope.to_a - supplied_products = variants.map(&method(:supplied_product)) catalog_items = variants.map(&method(:catalog_item)) + supplied_products = catalog_items.map(&:product) DataFoodConsortium::Connector::Enterprise.new( enterprise.name diff --git a/engines/dfc_provider/app/services/supplied_product_builder.rb b/engines/dfc_provider/app/services/supplied_product_builder.rb new file mode 100644 index 0000000000..2c4639042d --- /dev/null +++ b/engines/dfc_provider/app/services/supplied_product_builder.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class SuppliedProductBuilder < DfcBuilder + def self.supplied_product(variant) + id = urls.enterprise_supplied_product_url( + enterprise_id: variant.product.supplier_id, + id: variant.id, + ) + + DataFoodConsortium::Connector::SuppliedProduct.new( + id, + name: variant.name_to_display, + description: variant.description, + productType: product_type, + quantity: QuantitativeValueBuilder.quantity(variant), + ) + end +end diff --git a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb new file mode 100644 index 0000000000..d6c7c2f3c8 --- /dev/null +++ b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require DfcProvider::Engine.root.join("spec/spec_helper") + +describe EnterpriseBuilder do + subject(:builder) { described_class } + let(:enterprise) { variant.product.supplier } + let(:variant) { create(:product, name: "Apple").variants.first } + + describe ".enterprise" do + it "assigns a semantic id" do + result = builder.enterprise(enterprise) + + expect(result.semanticId).to eq( + "http://test.host/api/dfc-v1.7/enterprises/#{enterprise.id}" + ) + end + + it "assignes products" do + result = builder.enterprise(enterprise) + + expect(result.suppliedProducts.count).to eq 1 + expect(result.suppliedProducts[0].name).to eq "Apple" + end + 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 f93235e786..b52aa1e737 100644 --- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb +++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb @@ -2,14 +2,15 @@ require DfcProvider::Engine.root.join("spec/spec_helper") -describe DfcBuilder do +describe SuppliedProductBuilder do + subject(:builder) { described_class } let(:variant) { build(:variant, id: 5).tap { |v| v.product.supplier_id = 7 } } describe ".supplied_product" do it "assigns a semantic id" do - product = DfcBuilder.supplied_product(variant) + product = builder.supplied_product(variant) expect(product.semanticId).to eq( "http://test.host/api/dfc-v1.7/enterprises/7/supplied_products/5" @@ -17,7 +18,7 @@ describe DfcBuilder do end it "assigns a quantity" do - product = DfcBuilder.supplied_product(variant) + product = builder.supplied_product(variant) expect(product.quantity.value).to eq 1.0 expect(product.quantity.unit.semanticId).to eq "dfc-m:Gram" @@ -25,7 +26,7 @@ describe DfcBuilder do it "assigns the product name by default" do variant.product.name = "Apple" - product = DfcBuilder.supplied_product(variant) + product = builder.supplied_product(variant) expect(product.name).to eq "Apple" end @@ -33,13 +34,13 @@ describe DfcBuilder do it "assigns the variant name if present" do variant.product.name = "Apple" variant.display_name = "Granny Smith" - product = DfcBuilder.supplied_product(variant) + product = builder.supplied_product(variant) expect(product.name).to eq "Granny Smith" end it "assigns a product type" do - product = DfcBuilder.supplied_product(variant) + product = builder.supplied_product(variant) vegetable = DfcLoader.connector.PRODUCT_TYPES.VEGETABLE.NON_LOCAL_VEGETABLE expect(product.productType).to eq vegetable