From 848144d3780d3036604d438cc5d29c51e1149403 Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Wed, 22 May 2024 14:34:51 +1000 Subject: [PATCH] Fix DFC engine --- .../dfc_provider/supplied_products_controller.rb | 6 +++++- engines/dfc_provider/app/services/dfc_builder.rb | 2 +- engines/dfc_provider/app/services/offer_builder.rb | 2 +- .../app/services/supplied_product_builder.rb | 7 ++++--- .../dfc_provider/spec/requests/catalog_items_spec.rb | 4 ++-- .../dfc_provider/spec/requests/enterprises_spec.rb | 6 ++++-- engines/dfc_provider/spec/requests/offers_spec.rb | 4 ++-- .../spec/requests/supplied_products_spec.rb | 6 ++++-- .../spec/services/catalog_item_builder_spec.rb | 4 ++-- .../spec/services/enterprise_builder_spec.rb | 4 ++-- .../spec/services/supplied_product_builder_spec.rb | 12 ++++++------ spec/system/admin/dfc_product_import_spec.rb | 2 +- 12 files changed, 34 insertions(+), 25 deletions(-) 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 57d25c1929..3e5b26ec8d 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 @@ -20,8 +20,12 @@ module DfcProvider ) product = variant.product + if variant.new_record? + variant.supplier = current_enterprise + variant.save! + end + product.save! if product.new_record? - variant.save! if variant.new_record? supplied_product = SuppliedProductBuilder.supplied_product(variant) render json: DfcIo.export(supplied_product) diff --git a/engines/dfc_provider/app/services/dfc_builder.rb b/engines/dfc_provider/app/services/dfc_builder.rb index 5411d8ab28..4f55e301fb 100644 --- a/engines/dfc_provider/app/services/dfc_builder.rb +++ b/engines/dfc_provider/app/services/dfc_builder.rb @@ -3,7 +3,7 @@ class DfcBuilder def self.catalog_item(variant) id = urls.enterprise_catalog_item_url( - enterprise_id: variant.product.supplier_id, + enterprise_id: variant.supplier_id, id: variant.id, ) product = SuppliedProductBuilder.supplied_product(variant) diff --git a/engines/dfc_provider/app/services/offer_builder.rb b/engines/dfc_provider/app/services/offer_builder.rb index b499c1d945..0c3a8b276c 100644 --- a/engines/dfc_provider/app/services/offer_builder.rb +++ b/engines/dfc_provider/app/services/offer_builder.rb @@ -3,7 +3,7 @@ class OfferBuilder < DfcBuilder def self.build(variant) id = urls.enterprise_offer_url( - enterprise_id: variant.product.supplier_id, + enterprise_id: variant.supplier_id, id: variant.id, ) diff --git a/engines/dfc_provider/app/services/supplied_product_builder.rb b/engines/dfc_provider/app/services/supplied_product_builder.rb index bdf069bdfb..9c1e83e8f5 100644 --- a/engines/dfc_provider/app/services/supplied_product_builder.rb +++ b/engines/dfc_provider/app/services/supplied_product_builder.rb @@ -3,11 +3,11 @@ class SuppliedProductBuilder < DfcBuilder def self.supplied_product(variant) id = urls.enterprise_supplied_product_url( - enterprise_id: variant.product.supplier_id, + enterprise_id: variant.supplier_id, id: variant.id, ) product_uri = urls.enterprise_url( - variant.product.supplier_id, + variant.supplier_id, spree_product_id: variant.product_id ) @@ -29,14 +29,15 @@ class SuppliedProductBuilder < DfcBuilder if product Spree::Variant.new( product:, + supplier:, price: 0, ).tap do |variant| apply(supplied_product, variant) end else product = import_product(supplied_product) - product.supplier = supplier product.ensure_standard_variant + product.variants.first.supplier = supplier product.variants.first end.tap do |variant| link = supplied_product.semanticId diff --git a/engines/dfc_provider/spec/requests/catalog_items_spec.rb b/engines/dfc_provider/spec/requests/catalog_items_spec.rb index 1405a5b0a5..03e1ba468a 100644 --- a/engines/dfc_provider/spec/requests/catalog_items_spec.rb +++ b/engines/dfc_provider/spec/requests/catalog_items_spec.rb @@ -15,7 +15,7 @@ RSpec.describe "CatalogItems", type: :request, swagger_doc: "dfc.yaml", let(:product) { create( :base_product, - id: 90_000, supplier: enterprise, name: "Apple", description: "Red", + id: 90_000, name: "Apple", description: "Red", variants: [variant], primary_taxon: non_local_vegetable ) @@ -27,7 +27,7 @@ RSpec.describe "CatalogItems", type: :request, swagger_doc: "dfc.yaml", dfc_id: "https://github.com/datafoodconsortium/taxonomies/releases/latest/download/productTypes.rdf#non-local-vegetable" ) } - let(:variant) { build(:base_variant, id: 10_001, unit_value: 1, sku: "AR") } + let(:variant) { build(:base_variant, id: 10_001, unit_value: 1, sku: "AR", supplier: enterprise) } before { login_as user } diff --git a/engines/dfc_provider/spec/requests/enterprises_spec.rb b/engines/dfc_provider/spec/requests/enterprises_spec.rb index 9785361aa6..13c9f249be 100644 --- a/engines/dfc_provider/spec/requests/enterprises_spec.rb +++ b/engines/dfc_provider/spec/requests/enterprises_spec.rb @@ -27,7 +27,7 @@ RSpec.describe "Enterprises", type: :request, swagger_doc: "dfc.yaml", rswag_aut let!(:product) { create( :product_with_image, - id: 90_000, supplier: enterprise, name: "Apple", description: "Round", + id: 90_000, name: "Apple", description: "Round", variants: [variant], primary_taxon: non_local_vegetable ) @@ -39,7 +39,9 @@ RSpec.describe "Enterprises", type: :request, swagger_doc: "dfc.yaml", rswag_aut dfc_id: "https://github.com/datafoodconsortium/taxonomies/releases/latest/download/productTypes.rdf#non-local-vegetable" ) } - let(:variant) { build(:base_variant, id: 10_001, unit_value: 1, sku: "APP") } + let(:variant) { + build(:base_variant, id: 10_001, unit_value: 1, sku: "APP", supplier: enterprise) + } before { login_as user } diff --git a/engines/dfc_provider/spec/requests/offers_spec.rb b/engines/dfc_provider/spec/requests/offers_spec.rb index f309613c0c..dd5274e1b9 100644 --- a/engines/dfc_provider/spec/requests/offers_spec.rb +++ b/engines/dfc_provider/spec/requests/offers_spec.rb @@ -9,11 +9,11 @@ RSpec.describe "Offers", type: :request, swagger_doc: "dfc.yaml", rswag_autodoc: create( :product, id: 90_000, - supplier: enterprise, name: "Pesto", description: "Basil Pesto", + name: "Pesto", description: "Basil Pesto", variants: [variant], ) } - let(:variant) { build(:base_variant, id: 10_001, unit_value: 1) } + let(:variant) { build(:base_variant, id: 10_001, unit_value: 1, supplier: enterprise) } before { login_as user } diff --git a/engines/dfc_provider/spec/requests/supplied_products_spec.rb b/engines/dfc_provider/spec/requests/supplied_products_spec.rb index e72e13017f..cb707b3fdb 100644 --- a/engines/dfc_provider/spec/requests/supplied_products_spec.rb +++ b/engines/dfc_provider/spec/requests/supplied_products_spec.rb @@ -9,11 +9,13 @@ RSpec.describe "SuppliedProducts", type: :request, swagger_doc: "dfc.yaml", rswa create( :product_with_image, id: 90_000, - supplier: enterprise, name: "Pesto", description: "Basil Pesto", + name: "Pesto", description: "Basil Pesto", variants: [variant] ) } - let(:variant) { build(:base_variant, id: 10_001, unit_value: 1, primary_taxon: taxon) } + let(:variant) { + build(:base_variant, id: 10_001, unit_value: 1, primary_taxon: taxon, supplier: enterprise) + } let(:taxon) { build( :taxon, diff --git a/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb b/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb index 7c1b4d2c0f..6f7d5d42a6 100644 --- a/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb +++ b/engines/dfc_provider/spec/services/catalog_item_builder_spec.rb @@ -8,7 +8,7 @@ RSpec.describe DfcBuilder do describe ".catalog_item" do it "assigns a semantic id" do variant.id = 5 - variant.product.supplier_id = 7 + variant.supplier_id = 7 item = DfcBuilder.catalog_item(variant) @@ -19,7 +19,7 @@ RSpec.describe DfcBuilder do it "refers to a supplied product" do variant.id = 5 - variant.product.supplier_id = 7 + variant.supplier_id = 7 item = DfcBuilder.catalog_item(variant) diff --git a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb index cc26fe767b..05fa5ae17d 100644 --- a/engines/dfc_provider/spec/services/enterprise_builder_spec.rb +++ b/engines/dfc_provider/spec/services/enterprise_builder_spec.rb @@ -5,7 +5,7 @@ require_relative "../spec_helper" RSpec.describe EnterpriseBuilder do subject(:builder) { described_class } let(:enterprise) { - build( + create( :enterprise, id: 10_000, name: "Fabi's Farm", description: "The place where stuff grows", abn: "123 456 789 0", @@ -13,7 +13,7 @@ RSpec.describe EnterpriseBuilder do ) } let(:variant) { - create(:product, supplier: enterprise, name: "Apple").variants.first + create(:product, supplier_id: enterprise.id, name: "Apple").variants.first } describe ".enterprise" do 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 3e582a7aa4..c39aab031e 100644 --- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb +++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb @@ -7,13 +7,13 @@ RSpec.describe SuppliedProductBuilder do subject(:builder) { described_class } let(:variant) { - build(:variant, id: 5, product: spree_product, primary_taxon: taxon) + create(:variant, id: 5, product: spree_product, primary_taxon: taxon, supplier:) } let(:spree_product) { - create(:product, id: 6, supplier:) + create(:product, id: 6) } let(:supplier) { - build(:supplier_enterprise, id: 7) + create(:supplier_enterprise, id: 7) } let(:taxon) { build( @@ -43,7 +43,7 @@ RSpec.describe SuppliedProductBuilder do variant.product.name = "Apple" product = builder.supplied_product(variant) - expect(product.name).to eq "Apple" + expect(product.name).to match /Apple/ end it "assigns the variant name if present" do @@ -51,7 +51,7 @@ RSpec.describe SuppliedProductBuilder do variant.display_name = "Granny Smith" product = builder.supplied_product(variant) - expect(product.name).to eq "Apple - Granny Smith" + expect(product.name).to match /Apple - Granny Smith/ end context "product_type mapping" do @@ -244,7 +244,7 @@ RSpec.describe SuppliedProductBuilder do it "doesn't return a product of another enterprise" do variant.save! - create(:product, id: 8, supplier: create(:enterprise)) + create(:product, id: 8, supplier_id: create(:enterprise).id) supplied_product.spree_product_uri = "http://test.host/api/dfc/enterprises/7?spree_product_id=8" diff --git a/spec/system/admin/dfc_product_import_spec.rb b/spec/system/admin/dfc_product_import_spec.rb index f02f4b5565..dff70ff168 100644 --- a/spec/system/admin/dfc_product_import_spec.rb +++ b/spec/system/admin/dfc_product_import_spec.rb @@ -8,7 +8,7 @@ RSpec.describe "DFC Product Import" do let(:user) { create(:oidc_user, owned_enterprises: [enterprise]) } let(:enterprise) { create(:supplier_enterprise) } - let(:source_product) { create(:product, supplier: enterprise) } + let(:source_product) { create(:product, supplier_id: enterprise.id) } before do login_as user