Skip to content

Commit

Permalink
Ensure product category error message is shown when creating new prod…
Browse files Browse the repository at this point in the history
…uct [OFN-12591]
  • Loading branch information
wandji20 committed Aug 1, 2024
1 parent 1288592 commit 287f65e
Show file tree
Hide file tree
Showing 11 changed files with 48 additions and 23 deletions.
2 changes: 1 addition & 1 deletion app/controllers/spree/admin/products_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def create
# Re-fill the form with deleted params on product
@on_hand = request.params[:product][:on_hand]
@on_demand = request.params[:product][:on_demand]
render :new
render :new, status: :unprocessable_entity
end
end
end
Expand Down
4 changes: 3 additions & 1 deletion app/models/product_import/entry_processor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ def save_existing_inventory_item(entry)
end
end

# rubocop:disable Metrics/AbcSize
def save_new_product(entry)
@already_created ||= {}
# If we've already added a new product with these attributes
Expand All @@ -162,7 +163,7 @@ def save_new_product(entry)
return
end

product = Spree::Product.new
product = Spree::Product.new(supplier_id: entry.enterprise_id)
product.assign_attributes(
entry.assignable_attributes.except('id', 'on_hand', 'on_demand', 'display_name')
)
Expand All @@ -177,6 +178,7 @@ def save_new_product(entry)

@already_created.deep_merge! entry.enterprise_id => { entry.name => product.id }
end
# rubocop:enable Metrics/AbcSize

def save_variant(entry)
variant = entry.product_object
Expand Down
2 changes: 1 addition & 1 deletion app/models/product_import/entry_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ def product_validation(entry)
end

def mark_as_new_product(entry)
new_product = Spree::Product.new
new_product = Spree::Product.new(supplier_id: entry.enterprise_id)
new_product.assign_attributes(
entry.assignable_attributes.except('id', 'on_hand', 'on_demand', 'display_name')
)
Expand Down
16 changes: 16 additions & 0 deletions app/models/spree/product.rb
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ class Product < ApplicationRecord
attr_accessor :price, :display_as, :unit_value, :unit_description, :tax_category_id,
:shipping_category_id, :primary_taxon_id, :supplier_id

after_validation :validate_variant_attrs, on: :create
after_create :ensure_standard_variant
after_update :touch_supplier, if: :saved_change_to_primary_taxon_id?
around_destroy :destruction
Expand Down Expand Up @@ -289,6 +290,21 @@ def description=(html)

private

def validate_variant_attrs
# Avoid running validation when we can't set variant attrs
# eg clone product. Will raise error if clonning a product with no variant
return if variants.first&.valid?

unless Spree::Taxon.find_by(id: primary_taxon_id)
errors.add(:primary_taxon_id,
I18n.t('activerecord.errors.models.spree/product.must_exist'))
end
return if Enterprise.find_by(id: supplier_id)

errors.add(:supplier_id,
I18n.t('activerecord.errors.models.spree/product.must_exist'))
end

def update_units
return unless saved_change_to_variant_unit? || saved_change_to_variant_unit_name?

Expand Down
2 changes: 1 addition & 1 deletion app/views/spree/admin/products/new.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
= f.label :supplier, t(".supplier")
%span.required *
= f.select :supplier_id, options_from_collection_for_select(@producers, :id, :name, @product.supplier_id), { include_blank: t("spree.admin.products.new.supplier_select_placeholder") }, { "data-controller": "tom-select", class: "primary" }
= f.error_message_on :supplier
= f.error_message_on :supplier_id
.eight.columns.omega
= f.field_container :name do
= f.label :name, t(".product_name")
Expand Down
4 changes: 3 additions & 1 deletion config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ en:
spree/product:
name: "Product Name"
price: "Price"
primary_taxon: "Product Category"
primary_taxon_id: "Product Category"
shipping_category_id: "Shipping Category"
variant_unit: "Variant Unit"
variant_unit_name: "Variant Unit Name"
Expand Down Expand Up @@ -120,6 +120,8 @@ en:
attributes:
base:
card_expired: "has expired"
spree/product:
must_exist: 'must exist'
order_cycle:
attributes:
orders_close_at:
Expand Down
11 changes: 5 additions & 6 deletions engines/dfc_provider/app/services/supplied_product_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@ def self.import_variant(supplied_product, supplier)
apply(supplied_product, variant)
end
else
product = import_product(supplied_product)
product.ensure_standard_variant
product.variants.first.supplier = supplier
product = import_product(supplied_product, supplier)
product.variants.first
end.tap do |variant|
link = supplied_product.semanticId
Expand All @@ -62,15 +60,16 @@ def self.referenced_spree_product(supplied_product, supplier)
end
end

def self.import_product(supplied_product)
def self.import_product(supplied_product, supplier)
Spree::Product.new(
name: supplied_product.name,
description: supplied_product.description,
price: 0 # will be in DFC Offer
price: 0, # will be in DFC Offer
supplier_id: supplier.id,
primary_taxon_id: taxon(supplied_product).id
).tap do |product|
QuantitativeValueBuilder.apply(supplied_product.quantity, product)
product.ensure_standard_variant
product.variants.first.primary_taxon = taxon(supplied_product)
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@
}

it "creates a new Spree::Product" do
product = builder.import_product(supplied_product)
product = builder.import_product(supplied_product, supplier)

expect(product).to be_a(Spree::Product)
expect(product.name).to eq("Tomato")
Expand All @@ -117,7 +117,7 @@

describe "taxon" do
it "assigns the taxon matching the DFC product type" do
product = builder.import_product(supplied_product)
product = builder.import_product(supplied_product, supplier)

expect(product.variants.first.primary_taxon).to eq(taxon)
end
Expand Down
5 changes: 4 additions & 1 deletion spec/controllers/api/v0/products_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,10 @@
expect(response.status).to eq(422)
expect(json_response["error"]).to eq("Invalid resource. Please fix errors and try again.")
errors = json_response["errors"]
expect(errors.keys).to match_array(["name", "variant_unit", "price"])
expect(errors.keys).to match_array([
"name", "variant_unit", "price",
"primary_taxon_id", "supplier_id"
])
end

it "can update a product" do
Expand Down
12 changes: 11 additions & 1 deletion spec/controllers/spree/admin/products_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,17 @@

spree_put :create, product: product_attrs_with_image

expect(response.status).to eq 200
expect(response.status).to eq 422
end
end

describe "when variant attributes are missing" do
it 'renders 422 error' do
spree_post :create, product: product_attrs.merge!(
{ supplier_id: nil, primary_taxon_id: nil }
),
button: 'create'
expect(response.status).to eq 422
end
end
end
Expand Down
9 changes: 1 addition & 8 deletions spec/system/admin/products_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -170,14 +170,7 @@
expect(page).to have_content "Unit value is not a number"
end

it "creating product with empty product category" do
pending("#12591")

login_as_admin
visit spree.admin_products_path

click_link 'New Product'

it "creating product with empty product category fails" do
fill_in 'product_name', with: 'Hot Cakes'
select 'New supplier', from: 'product_supplier_id'
select "Weight (kg)", from: 'product_variant_unit_with_scale'
Expand Down

0 comments on commit 287f65e

Please sign in to comment.