mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-26 20:56:48 +00:00
The `feature` and `scenario` names are aliases only available in feature specs and not needed. It's confusing to have different names and we can easily move feature specs to system specs when using standard names.
230 lines
8.6 KiB
Ruby
230 lines
8.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
describe '
|
|
As an admin
|
|
I want to manage product variants
|
|
' do
|
|
include AuthenticationHelper
|
|
include WebHelper
|
|
|
|
describe "new variant", js: true do
|
|
it "creating a new variant" do
|
|
# Given a product with a unit-related option type
|
|
product = create(:simple_product, variant_unit: "weight", variant_unit_scale: "1")
|
|
|
|
# When I create a variant on the product
|
|
login_as_admin_and_visit spree.admin_product_variants_path product
|
|
click_link 'New Variant'
|
|
|
|
fill_in 'unit_value_human', with: '1'
|
|
fill_in 'variant_unit_description', with: 'foo'
|
|
click_button 'Create'
|
|
|
|
# Then the variant should have been created
|
|
expect(page).to have_content "Variant \"#{product.name}\" has been successfully created!"
|
|
end
|
|
|
|
it "creating a new variant from product variant page with filter" do
|
|
# Given a product with a unit-related option type
|
|
product = create(:simple_product, variant_unit: "weight", variant_unit_scale: "1")
|
|
filter = { producerFilter: 2 }
|
|
|
|
# When I create a variant on the product
|
|
login_as_admin_and_visit spree.admin_product_variants_path(product, filter)
|
|
|
|
click_link 'New Variant'
|
|
|
|
uri = URI.parse(current_url)
|
|
expect("#{uri.path}?#{uri.query}").to eq spree.new_admin_product_variant_path(product, filter)
|
|
|
|
# Cancel link should include product filter
|
|
expected_cancel_url = Regexp.new(
|
|
Regexp.escape(spree.admin_product_variants_path(product, filter))
|
|
)
|
|
expect(page).to have_link(I18n.t('actions.cancel'), href: expected_cancel_url)
|
|
end
|
|
end
|
|
|
|
describe "viewing product variant" do
|
|
it "when the product page has a product filter" do
|
|
# Given a product with a unit-related option type
|
|
product = create(:simple_product, variant_unit: "weight", variant_unit_scale: "1")
|
|
filter = { producerFilter: 2 }
|
|
|
|
# When I create a variant on the product
|
|
login_as_admin_and_visit spree.admin_product_variants_path(product, filter)
|
|
|
|
visit spree.admin_product_variants_path(product, filter)
|
|
|
|
expected_new_url = Regexp.new(
|
|
Regexp.escape(spree.new_admin_product_variant_path(product, filter))
|
|
)
|
|
expect(page).to have_link("New Variant", href: expected_new_url)
|
|
|
|
expected_show_delete_url = Regexp.new(
|
|
Regexp.escape(spree.admin_product_variants_path(product, { deleted: 'on' }.merge(filter)))
|
|
)
|
|
expect(page).to have_link("Show Deleted", href: expected_show_delete_url)
|
|
|
|
# Variant link should include product filter
|
|
variant = product.variants.first
|
|
|
|
expected_edit_url = Regexp.new(
|
|
Regexp.escape(spree.edit_admin_product_variant_path(product, variant, filter))
|
|
)
|
|
expect(page).to have_link(I18n.t(:edit), href: expected_edit_url)
|
|
|
|
expected_delete_url = Regexp.new(
|
|
Regexp.escape(spree.admin_product_variant_path(product, variant, filter))
|
|
)
|
|
expect(page).to have_link(I18n.t(:delete), href: expected_delete_url)
|
|
end
|
|
end
|
|
|
|
describe "editing unit value and description for a variant", js: true do
|
|
it "when the product variant page has product filter" do
|
|
product = create(:simple_product, variant_unit: "weight", variant_unit_scale: "1")
|
|
filter = { producerFilter: 2 }
|
|
|
|
# When I create a variant on the product
|
|
login_as_admin_and_visit spree.admin_product_variants_path(product, filter)
|
|
page.find('table.index .icon-edit').click
|
|
|
|
# Cancel link should include product filter
|
|
expected_cancel_url = Regexp.new(
|
|
Regexp.escape(spree.admin_product_variants_path(product, filter))
|
|
)
|
|
expect(page).to have_link(I18n.t('actions.cancel'), href: expected_cancel_url)
|
|
end
|
|
|
|
it "when variant_unit is weight" do
|
|
# Given a product with unit-related option types, with a variant
|
|
product = create(:simple_product, variant_unit: "weight", variant_unit_scale: "1")
|
|
variant = product.variants.first
|
|
variant.update( unit_value: 1, unit_description: 'foo' )
|
|
|
|
# And the product has option types for the unit-related and non-unit-related option values
|
|
product.option_types << variant.option_values.first.option_type
|
|
|
|
# When I view the variant
|
|
login_as_admin_and_visit spree.admin_product_variants_path product
|
|
page.find('table.index .icon-edit').click
|
|
|
|
# Then I should not see a traditional option value field for the unit-related option value
|
|
expect(page).to have_no_selector "div[data-hook='presentation'] input"
|
|
|
|
# And I should see unit value and description fields for the unit-related option value
|
|
expect(page).to have_field "unit_value_human", with: "1"
|
|
expect(page).to have_field "variant_unit_description", with: "foo"
|
|
|
|
# When I update the fields and save the variant
|
|
fill_in "unit_value_human", with: "123"
|
|
fill_in "variant_unit_description", with: "bar"
|
|
click_button 'Update'
|
|
expect(page).to have_content %(Variant "#{product.name}" has been successfully updated!)
|
|
|
|
# Then the unit value and description should have been saved
|
|
expect(variant.reload.unit_value).to eq(123)
|
|
expect(variant.unit_description).to eq('bar')
|
|
end
|
|
|
|
it "can update unit_description when variant_unit is items" do
|
|
product = create(:simple_product, variant_unit: "items", variant_unit_name: "bunches")
|
|
variant = product.variants.first
|
|
variant.update(unit_description: 'foo')
|
|
|
|
login_as_admin_and_visit spree.edit_admin_product_variant_path(product, variant)
|
|
|
|
expect(page).to_not have_field "unit_value_human"
|
|
expect(page).to have_field "variant_unit_description", with: "foo"
|
|
|
|
fill_in "variant_unit_description", with: "bar"
|
|
click_button 'Update'
|
|
expect(page).to have_content %(Variant "#{product.name}" has been successfully updated!)
|
|
expect(variant.reload.unit_description).to eq('bar')
|
|
end
|
|
end
|
|
|
|
describe "editing on hand and on demand values", js: true do
|
|
let(:product) { create(:simple_product) }
|
|
let(:variant) { product.variants.first }
|
|
|
|
before do
|
|
login_to_admin_section
|
|
end
|
|
|
|
it "allows changing the on_hand value" do
|
|
visit spree.edit_admin_product_variant_path(product, variant)
|
|
|
|
expect(page).to have_field "variant_on_hand", with: variant.on_hand
|
|
expect(page).to have_unchecked_field "variant_on_demand"
|
|
|
|
fill_in "variant_on_hand", with: "123"
|
|
click_button 'Update'
|
|
expect(page).to have_content %(Variant "#{product.name}" has been successfully updated!)
|
|
end
|
|
|
|
it "allows changing the on_demand value" do
|
|
visit spree.edit_admin_product_variant_path(product, variant)
|
|
check "variant_on_demand"
|
|
|
|
# on_hand reflects the change in on_demand
|
|
expect(page).to have_field "variant_on_hand", with: "Infinity", disabled: true
|
|
|
|
click_button 'Update'
|
|
expect(page).to have_content %(Variant "#{product.name}" has been successfully updated!)
|
|
end
|
|
|
|
it "memorizes on_hand value previously entered if enabling and disabling on_demand" do
|
|
visit spree.edit_admin_product_variant_path(product, variant)
|
|
fill_in "variant_on_hand", with: "123"
|
|
check "variant_on_demand"
|
|
uncheck "variant_on_demand"
|
|
|
|
# on_hand shows the memorized value, not the original DB value
|
|
expect(page).to have_field "variant_on_hand", with: "123"
|
|
end
|
|
end
|
|
|
|
it "soft-deletes variants", js: true do
|
|
product = create(:simple_product)
|
|
variant = create(:variant, product: product)
|
|
|
|
login_as_admin_and_visit spree.admin_product_variants_path product
|
|
|
|
within "tr#spree_variant_#{variant.id}" do
|
|
accept_alert do
|
|
page.find('a.delete-resource').click
|
|
end
|
|
end
|
|
|
|
expect(page).not_to have_selector "tr#spree_variant_#{variant.id}"
|
|
expect(variant.reload.deleted_at).not_to be_nil
|
|
end
|
|
|
|
it "editing display name for a variant", js: true do
|
|
product = create(:simple_product)
|
|
variant = product.variants.first
|
|
|
|
# When I view the variant
|
|
login_as_admin_and_visit spree.admin_product_variants_path product
|
|
page.find('table.index .icon-edit').click
|
|
|
|
# It should allow the display name to be changed
|
|
expect(page).to have_field "variant_display_name"
|
|
expect(page).to have_field "variant_display_as"
|
|
|
|
# When I update the fields and save the variant
|
|
fill_in "variant_display_name", with: "Display Name"
|
|
fill_in "variant_display_as", with: "Display As This"
|
|
click_button 'Update'
|
|
expect(page).to have_content %(Variant "#{product.name}" has been successfully updated!)
|
|
|
|
# Then the displayed values should have been saved
|
|
expect(variant.reload.display_name).to eq("Display Name")
|
|
expect(variant.display_as).to eq("Display As This")
|
|
end
|
|
end
|