diff --git a/app/controllers/admin/dfc_product_imports_controller.rb b/app/controllers/admin/dfc_product_imports_controller.rb index c16031bf20..c166179ba3 100644 --- a/app/controllers/admin/dfc_product_imports_controller.rb +++ b/app/controllers/admin/dfc_product_imports_controller.rb @@ -38,6 +38,11 @@ module Admin end @count = imported.compact.count + rescue Faraday::Error, + Addressable::URI::InvalidURIError, + ActionController::ParameterMissing => e + flash[:error] = e.message + redirect_to admin_product_import_path end private 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 104f088338..89b628150e 100644 --- a/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb +++ b/engines/dfc_provider/spec/services/supplied_product_builder_spec.rb @@ -111,6 +111,31 @@ RSpec.describe SuppliedProductBuilder do end end + describe ".update_product" do + let(:subject) { builder.update_product(product, variant) } + let(:product) { + DfcIo.import(product_json).find do |subject| + subject.is_a? DataFoodConsortium::Connector::SuppliedProduct + end + } + let(:product_json) { ExampleJson.read("product.GET") } + + it "updates a variant" do + variant # Create test data first + + expect { subject }.not_to change { + Spree::Variant.count + } + + expect(subject).to eq variant + expect(subject.display_name).to eq "Fillet Steak - 201g x 1 Steak" + expect(subject.variant_unit).to eq "items" + expect(subject.unit_value).to eq 1 + expect(subject.on_demand).to eq false + expect(subject.on_hand).to eq 11 + end + end + describe ".import_product" do let(:supplied_product) do DfcProvider::SuppliedProduct.new( diff --git a/spec/system/admin/dfc_product_import_spec.rb b/spec/system/admin/dfc_product_import_spec.rb index af01620894..c81197a768 100644 --- a/spec/system/admin/dfc_product_import_spec.rb +++ b/spec/system/admin/dfc_product_import_spec.rb @@ -66,7 +66,9 @@ RSpec.describe "DFC Product Import" do }.to change { enterprise.supplied_products.count } .and change { linked_variant.display_name } .and change { linked_variant.unit_value } - .and change { linked_variant.price } + .and change { linked_variant.price }.to(2.09) + .and change { linked_variant.on_demand }.to(true) + .and change { linked_variant.on_hand }.by(0) expect(page).to have_content "Importing a DFC product catalog" @@ -74,4 +76,31 @@ RSpec.describe "DFC Product Import" do expect(product.variants[0].semantic_links).to be_present expect(product.image).to be_present end + + it "fails gracefully" do + user.oidc_account.update!( + uid: "anonymous@example.net", + updated_at: 1.minute.ago, + ) + url = "https://example.net/unauthorized" + stub_request(:get, url).to_return(status: [401, "Unauthorized"]) + + visit admin_product_import_path + select enterprise.name, from: "Enterprise" + fill_in "catalog_url", with: url + + expect { click_button "Import" }.not_to change { Spree::Variant.count } + + expect(page).to have_content "the server responded with status 401" + + select enterprise.name, from: "Enterprise" + fill_in "catalog_url", with: "badurl" + click_button "Import" + expect(page).to have_content "Absolute URI missing hierarchical segment: 'http://:80'" + + select enterprise.name, from: "Enterprise" + fill_in "catalog_url", with: "" + click_button "Import" + expect(page).to have_content "param is missing or the value is empty: catalog_url" + end end