mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-30 21:27:17 +00:00
The Vouchers tab pushed the White Label tab further down and it was hidden by the savebar. The CSS adjustment in this commit makes sure that users can always see all menu items. The automatic scrolling by Capybara fails because of the savebar but scrolling to the bottom works.
1146 lines
42 KiB
Ruby
1146 lines
42 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "system_helper"
|
|
|
|
describe '
|
|
As an administrator
|
|
I want to manage enterprises
|
|
' do
|
|
include WebHelper
|
|
include AuthenticationHelper
|
|
include ShopWorkflow
|
|
include UIComponentHelper
|
|
include FileHelper
|
|
|
|
it "viewing an enterprise" do
|
|
e = create(:enterprise)
|
|
|
|
login_to_admin_section
|
|
click_link 'Enterprises'
|
|
click_link e.name
|
|
|
|
expect(page).to have_content e.name
|
|
end
|
|
|
|
it "creating a new enterprise" do
|
|
admin = create(:admin_user)
|
|
eg1 = create(:enterprise_group, name: 'eg1')
|
|
eg2 = create(:enterprise_group, name: 'eg2')
|
|
payment_method = create(:payment_method)
|
|
shipping_method = create(:shipping_method)
|
|
enterprise_fee = create(:enterprise_fee)
|
|
|
|
# Navigating
|
|
login_as admin
|
|
visit '/admin/enterprises'
|
|
click_link 'New Enterprise'
|
|
|
|
# Checking shipping and payment method sidebars work
|
|
choose "Any"
|
|
uncheck 'enterprise_is_primary_producer'
|
|
|
|
expect(page).not_to have_checked_field "enterprise_payment_method_ids_#{payment_method.id}"
|
|
expect(page).not_to have_checked_field "enterprise_shipping_method_ids_#{shipping_method.id}"
|
|
|
|
# Filling in details
|
|
fill_in 'enterprise_name', with: 'Eaterprises'
|
|
|
|
select2_select admin.email, from: 'enterprise_owner_id'
|
|
|
|
fill_in 'enterprise_contact_name', with: 'Kirsten or Ren'
|
|
fill_in 'enterprise_phone', with: '0413 897 321'
|
|
fill_in 'enterprise_email_address', with: 'info@eaterprises.com.au'
|
|
fill_in 'enterprise_website', with: 'http://eaterprises.com.au'
|
|
|
|
fill_in 'enterprise_address_attributes_address1', with: '35 Ballantyne St'
|
|
fill_in 'enterprise_address_attributes_city', with: 'Thornbury'
|
|
fill_in 'enterprise_address_attributes_zipcode', with: '3072'
|
|
fill_in 'enterprise_address_attributes_latitude', with: '-37.4713077'
|
|
fill_in 'enterprise_address_attributes_longitude', with: '144.7851531'
|
|
# default country (Australia in this test) should be selected by default
|
|
page.find("#enterprise_address_attributes_country_id-ts-control").click
|
|
page.find(".option", text: "Australia").click
|
|
|
|
click_button 'Create'
|
|
expect(flash_message).to eq('Enterprise "Eaterprises" has been successfully created!')
|
|
|
|
# `Visible in search` radio button should be set to `Hide all references` by default
|
|
expect(page).to have_checked_field "enterprise_visible_only_through_links"
|
|
end
|
|
|
|
it "editing an existing enterprise" do
|
|
@enterprise = create(:enterprise)
|
|
e2 = create(:enterprise)
|
|
eg1 = create(:enterprise_group, name: 'eg1')
|
|
eg2 = create(:enterprise_group, name: 'eg2')
|
|
payment_method = create(:payment_method, distributors: [e2])
|
|
shipping_method = create(:shipping_method, distributors: [e2])
|
|
enterprise_fee = create(:enterprise_fee, enterprise: @enterprise )
|
|
user = create(:user)
|
|
|
|
admin = login_as_admin
|
|
|
|
visit '/admin/enterprises'
|
|
within "tr.enterprise-#{@enterprise.id}" do
|
|
first("a", text: 'Settings').click
|
|
end
|
|
|
|
fill_in 'enterprise_name', with: 'Eaterprises'
|
|
fill_in 'enterprise_permalink', with: 'eaterprises-permalink'
|
|
expect(page).to have_selector '.available'
|
|
choose 'Own'
|
|
|
|
# Require login to view shopfront or for checkout
|
|
accept_alert do
|
|
within(".side_menu") { click_link "Shop Preferences" }
|
|
end
|
|
expect(page).to have_checked_field "enterprise_require_login_false"
|
|
expect(page).to have_checked_field "enterprise_allow_guest_orders_true"
|
|
find(:xpath, '//*[@id="enterprise_require_login_true"]').trigger("click")
|
|
expect(page).to have_no_checked_field "enterprise_require_login_false"
|
|
# expect(page).to have_checked_field "enterprise_enable_subscriptions_false"
|
|
|
|
accept_alert do
|
|
scroll_to(:bottom)
|
|
within(".side_menu") { click_link "Users" }
|
|
end
|
|
select2_select user.email, from: 'enterprise_owner_id'
|
|
expect(page).to have_no_selector '.select2-drop-mask' # Ensure select2 has finished
|
|
|
|
accept_alert do
|
|
click_link "About"
|
|
end
|
|
fill_in 'enterprise_description', with: 'Connecting farmers and eaters'
|
|
|
|
description_input =
|
|
page.find("text-angular#enterprise_long_description div[id^='taTextElement']")
|
|
description_input.native.send_keys('This is an interesting long description')
|
|
|
|
# Check StimulusJs switching of sidebar elements
|
|
accept_alert do
|
|
click_link "Primary Details"
|
|
end
|
|
|
|
# Unchecking hides the Properties tab
|
|
uncheck 'enterprise_is_primary_producer'
|
|
choose 'None'
|
|
expect(page).not_to have_selector "[data-test=link_for_enterprise_fees]"
|
|
expect(page).not_to have_selector "[data-test=link_for_payment_methods]"
|
|
expect(page).not_to have_selector "[data-test=link_for_shipping_methods]"
|
|
expect(page).not_to have_selector "[data-test=link_for_properties]"
|
|
# Checking displays the Properties tab
|
|
check 'enterprise_is_primary_producer'
|
|
expect(page).to have_selector "[data-test=link_for_enterprise_fees]"
|
|
expect(page).not_to have_selector "[data-test=link_for_payment_methods]"
|
|
expect(page).not_to have_selector "[data-test=link_for_shipping_methods]"
|
|
expect(page).to have_selector "[data-test=link_for_properties]"
|
|
uncheck 'enterprise_is_primary_producer'
|
|
choose 'Own'
|
|
expect(page).to have_selector "[data-test=link_for_enterprise_fees]"
|
|
expect(page).to have_selector "[data-test=link_for_payment_methods]"
|
|
expect(page).to have_selector "[data-test=link_for_shipping_methods]"
|
|
choose 'Any'
|
|
expect(page).to have_selector "[data-test=link_for_enterprise_fees]"
|
|
expect(page).to have_selector "[data-test=link_for_payment_methods]"
|
|
expect(page).to have_selector "[data-test=link_for_shipping_methods]"
|
|
|
|
page.find("#enterprise_group_ids-ts-control").set(eg1.name)
|
|
page.find("#enterprise_group_ids-ts-dropdown .option.active").click
|
|
|
|
within(".permalink") do
|
|
link_path = "#{main_app.root_url}#{@enterprise.permalink}/shop"
|
|
link = find_link(link)
|
|
expect(link[:href]).to eq link_path
|
|
expect(link[:target]).to eq '_blank'
|
|
end
|
|
|
|
accept_alert do
|
|
click_link "Payment Methods"
|
|
end
|
|
expect(page).not_to have_checked_field "enterprise_payment_method_ids_#{payment_method.id}"
|
|
check "enterprise_payment_method_ids_#{payment_method.id}"
|
|
|
|
accept_alert do
|
|
click_link "Shipping Methods"
|
|
end
|
|
expect(page).not_to have_checked_field "enterprise_shipping_method_ids_#{shipping_method.id}"
|
|
check "enterprise_shipping_method_ids_#{shipping_method.id}"
|
|
|
|
accept_alert do
|
|
click_link "Contact"
|
|
end
|
|
fill_in 'enterprise_contact_name', with: 'Kirsten or Ren'
|
|
fill_in 'enterprise_phone', with: '0413 897 321'
|
|
fill_in 'enterprise_email_address', with: 'info@eaterprises.com.au'
|
|
fill_in 'enterprise_website', with: 'http://eaterprises.com.au'
|
|
|
|
accept_alert do
|
|
click_link "Social"
|
|
end
|
|
fill_in 'enterprise_twitter', with: '@eaterprises'
|
|
|
|
accept_alert do
|
|
click_link "Business Details"
|
|
end
|
|
fill_in 'enterprise_abn', with: '09812309823'
|
|
fill_in 'enterprise_acn', with: ''
|
|
choose 'Yes' # enterprise_charges_sales_tax
|
|
|
|
accept_alert do
|
|
click_link "Address"
|
|
end
|
|
fill_in 'enterprise_address_attributes_address1', with: '35 Ballantyne St'
|
|
fill_in 'enterprise_address_attributes_city', with: 'Thornbury'
|
|
fill_in 'enterprise_address_attributes_zipcode', with: '3072'
|
|
fill_in 'enterprise_address_attributes_latitude', with: '-37.4713077'
|
|
fill_in 'enterprise_address_attributes_longitude', with: '144.7851531'
|
|
# default country (Australia in this test) should be selected by default
|
|
page.find("#enterprise_address_attributes_state_id-ts-control").click
|
|
page.find(".option", text: "Victoria").click
|
|
|
|
accept_alert do
|
|
click_link "Shop Preferences"
|
|
end
|
|
shop_message_input =
|
|
page.find("text-angular#enterprise_preferred_shopfront_message div[id^='taTextElement']")
|
|
shop_message_input.native.send_keys('This is my shopfront message.')
|
|
expect(page)
|
|
.to have_checked_field "enterprise_preferred_shopfront_order_cycle_order_orders_close_at"
|
|
# using "find" as fields outside of the screen and are not visible
|
|
find(:xpath, '//*[@id="enterprise_preferred_shopfront_order_cycle_order_orders_open_at"]')
|
|
.trigger("click")
|
|
find(:xpath, '//*[@id="enterprise_enable_subscriptions_true"]').trigger("click")
|
|
|
|
accept_alert do
|
|
click_link "Inventory Settings"
|
|
end
|
|
expect(page).to have_checked_field(
|
|
"enterprise_preferred_product_selection_from_inventory_only_false"
|
|
)
|
|
|
|
click_button 'Update'
|
|
|
|
expect(flash_message).to eq('Enterprise "Eaterprises" has been successfully updated!')
|
|
expect(page).to have_field 'enterprise_name', with: 'Eaterprises'
|
|
@enterprise.reload
|
|
expect(@enterprise.owner).to eq user
|
|
expect(page).to have_checked_field "enterprise_visible_public"
|
|
|
|
click_link "Business Details"
|
|
expect(page).to have_checked_field "enterprise_charges_sales_tax_true"
|
|
|
|
click_link "Payment Methods"
|
|
expect(page).to have_checked_field "enterprise_payment_method_ids_#{payment_method.id}"
|
|
|
|
click_link "Shipping Methods"
|
|
expect(page).to have_checked_field "enterprise_shipping_method_ids_#{shipping_method.id}"
|
|
|
|
click_link "Enterprise Fees"
|
|
expect(page).to have_selector "td", text: enterprise_fee.name
|
|
|
|
click_link "About"
|
|
expect(page).to have_content 'This is an interesting long description'
|
|
|
|
click_link "Shop Preferences"
|
|
expect(page).to have_content 'This is my shopfront message.'
|
|
expect(page).to have_checked_field(
|
|
"enterprise_preferred_shopfront_order_cycle_order_orders_open_at"
|
|
)
|
|
expect(page).to have_checked_field "enterprise_require_login_true"
|
|
expect(page).to have_checked_field "enterprise_enable_subscriptions_true"
|
|
|
|
# Back navigation loads the tab content
|
|
page.execute_script('window.history.back()')
|
|
expect(page).to have_selector '#enterprise_description'
|
|
|
|
# Forward navigation brings back the previous tab
|
|
page.execute_script('window.history.forward()')
|
|
expect(page).to have_content 'This is my shopfront message.'
|
|
|
|
# Test that the right input alert text is displayed
|
|
accept_alert('Please enter a URL to insert') do
|
|
first('.ta-text').click
|
|
first('button[name="insertLink"]').click
|
|
end
|
|
end
|
|
|
|
describe "producer properties" do
|
|
it "creates producer properties" do
|
|
# Given a producer enterprise
|
|
s = create(:supplier_enterprise)
|
|
|
|
# When I go to its properties page
|
|
login_as_admin
|
|
visit admin_enterprises_path
|
|
within(".enterprise-#{s.id}") { click_link 'Properties' }
|
|
|
|
# And I create a property
|
|
fill_in 'enterprise_producer_properties_attributes_0_property_name', with: "Certified Organic"
|
|
fill_in 'enterprise_producer_properties_attributes_0_value', with: "NASAA 12345"
|
|
click_button 'Update'
|
|
|
|
# Then I should remain on the producer properties page
|
|
expect(current_path).to eq main_app.admin_enterprise_producer_properties_path(s)
|
|
|
|
# And the producer should have the property
|
|
expect(s.producer_properties.reload.count).to eq(1)
|
|
expect(s.producer_properties.first.property.presentation).to eq("Certified Organic")
|
|
expect(s.producer_properties.first.value).to eq("NASAA 12345")
|
|
end
|
|
|
|
it "updates producer properties" do
|
|
# Given a producer enterprise with a property
|
|
s = create(:supplier_enterprise)
|
|
s.producer_properties.create! property_name: 'Certified Organic', value: 'NASAA 12345'
|
|
|
|
# When I go to its properties page
|
|
login_as_admin
|
|
visit main_app.admin_enterprise_producer_properties_path(s)
|
|
|
|
# And I update the property
|
|
fill_in 'enterprise_producer_properties_attributes_0_property_name', with: "Biodynamic"
|
|
fill_in 'enterprise_producer_properties_attributes_0_value', with: "Shininess"
|
|
click_button 'Update'
|
|
|
|
# Then I should remain on the producer properties page
|
|
expect(current_path).to eq main_app.admin_enterprise_producer_properties_path(s)
|
|
|
|
# And the property should be updated
|
|
expect(s.producer_properties.reload.count).to eq(1)
|
|
expect(s.producer_properties.first.property.presentation).to eq("Biodynamic")
|
|
expect(s.producer_properties.first.value).to eq("Shininess")
|
|
end
|
|
|
|
it "removes producer properties" do
|
|
# Given a producer enterprise with a property
|
|
s = create(:supplier_enterprise)
|
|
pp = s.producer_properties.create! property_name: 'Certified Organic', value: 'NASAA 12345'
|
|
|
|
# When I go to its properties page
|
|
login_as_admin
|
|
visit main_app.admin_enterprise_producer_properties_path(s)
|
|
|
|
# And I remove the property
|
|
expect(page).to have_field 'enterprise_producer_properties_attributes_0_property_name',
|
|
with: 'Certified Organic'
|
|
within("#spree_producer_property_#{pp.id}") { page.find('a.remove_fields').click }
|
|
click_button 'Update'
|
|
|
|
# Then the property should have been removed
|
|
expect(current_path).to eq main_app.admin_enterprise_producer_properties_path(s)
|
|
expect(page).not_to have_field 'enterprise_producer_properties_attributes_0_property_name',
|
|
with: 'Certified Organic'
|
|
expect(s.producer_properties.reload).to be_empty
|
|
end
|
|
end
|
|
|
|
context "as an Enterprise user" do
|
|
let(:supplier1) { create(:supplier_enterprise, name: 'First Supplier') }
|
|
let(:supplier2) { create(:supplier_enterprise, name: 'Another Supplier') }
|
|
let(:distributor1) { create(:distributor_enterprise, name: 'First Distributor') }
|
|
let(:distributor2) { create(:distributor_enterprise, name: 'Another Distributor') }
|
|
let(:distributor3) { create(:distributor_enterprise, name: 'Yet Another Distributor') }
|
|
let(:enterprise_user) { create(:user, enterprise_limit: 1) }
|
|
let!(:er) {
|
|
create(:enterprise_relationship, parent: distributor3, child: distributor1,
|
|
permissions_list: [:edit_profile])
|
|
}
|
|
|
|
before(:each) do
|
|
enterprise_user.enterprise_roles.build(enterprise: supplier1).save
|
|
enterprise_user.enterprise_roles.build(enterprise: distributor1).save
|
|
|
|
login_as enterprise_user
|
|
end
|
|
|
|
context "when I have reached my enterprise ownership limit" do
|
|
it "shows a 'limit reached' modal message when trying to create a new enterprise" do
|
|
supplier1.reload
|
|
enterprise_user.owned_enterprises.push [supplier1]
|
|
|
|
visit admin_enterprises_path
|
|
|
|
expect(page).to have_content supplier1.name
|
|
expect(page).to have_content distributor1.name
|
|
|
|
within 'li#new_product_link' do
|
|
expect(page).to have_link 'New Enterprise', href: '#'
|
|
click_link 'New Enterprise'
|
|
end
|
|
|
|
expect(page).to have_content I18n.t('js.admin.enterprise_limit_reached',
|
|
contact_email: ContentConfig.footer_email)
|
|
end
|
|
end
|
|
|
|
context "creating an enterprise" do
|
|
before do
|
|
# When I create an enterprise
|
|
visit admin_enterprises_path
|
|
click_link 'New Enterprise'
|
|
fill_in 'enterprise_name', with: 'zzz'
|
|
fill_in 'enterprise_email_address', with: 'bob@example.com'
|
|
fill_in 'enterprise_address_attributes_address1', with: 'z'
|
|
fill_in 'enterprise_address_attributes_city', with: 'z'
|
|
fill_in 'enterprise_address_attributes_zipcode', with: 'z'
|
|
|
|
page.find("#enterprise_address_attributes_country_id-ts-control").click
|
|
page.find(".option", text: "Australia").click
|
|
|
|
page.find("#enterprise_address_attributes_state_id-ts-control").click
|
|
page.find(".option", text: "Victoria").click
|
|
end
|
|
|
|
it "without violating rules" do
|
|
click_button 'Create'
|
|
|
|
# Then it should be created
|
|
expect(page).to have_content 'Enterprise "zzz" has been successfully created!'
|
|
enterprise = Enterprise.last
|
|
expect(enterprise.name).to eq('zzz')
|
|
|
|
# And I should be managing it
|
|
expect(Enterprise.managed_by(enterprise_user)).to include enterprise
|
|
expect(enterprise.contact).to eq enterprise.owner
|
|
end
|
|
|
|
context "overstepping my owned enterprises limit" do
|
|
before do
|
|
create(:enterprise, owner: enterprise_user)
|
|
end
|
|
|
|
it "shows me an error message" do
|
|
click_button 'Create'
|
|
|
|
# Then it should show me an error
|
|
expect(page).to have_no_content 'Enterprise "zzz" has been successfully created!'
|
|
expect(page).to have_content "#{enterprise_user.email} is not permitted " \
|
|
"to own any more enterprises (limit is 1)."
|
|
end
|
|
end
|
|
end
|
|
|
|
it "editing enterprises I manage" do
|
|
visit admin_enterprises_path
|
|
within("tbody#e_#{distributor1.id}") { click_link 'Settings' }
|
|
|
|
fill_in 'enterprise_name', with: 'Eaterprises'
|
|
|
|
# Because poltergist does not support form onchange event
|
|
# We need trigger the change manually
|
|
page.evaluate_script("angular.element(enterprise_form).scope().setFormDirty()")
|
|
click_button 'Update'
|
|
|
|
expect(flash_message).to eq('Enterprise "Eaterprises" has been successfully updated!')
|
|
expect(distributor1.reload.name).to eq('Eaterprises')
|
|
end
|
|
|
|
describe "enterprises I have edit permission for, but do not manage" do
|
|
it "allows me to edit them" do
|
|
visit admin_enterprises_path
|
|
within("tbody#e_#{distributor3.id}") { click_link 'Settings' }
|
|
|
|
fill_in 'enterprise_name', with: 'Eaterprises'
|
|
|
|
# Because poltergist does not support form onchange event
|
|
# We need trigger the change manually
|
|
page.evaluate_script("angular.element(enterprise_form).scope().setFormDirty()")
|
|
click_button 'Update'
|
|
|
|
expect(flash_message).to eq('Enterprise "Eaterprises" has been successfully updated!')
|
|
expect(distributor3.reload.name).to eq('Eaterprises')
|
|
end
|
|
|
|
it "does not show links to manage shipping methods, payment methods or " \
|
|
"enterprise fees on the edit page" do
|
|
visit admin_enterprises_path
|
|
within("tbody#e_#{distributor3.id}") { click_link 'Settings' }
|
|
|
|
within(".side_menu") do
|
|
expect(page).not_to have_link 'Shipping Methods'
|
|
expect(page).not_to have_link 'Payment Methods'
|
|
expect(page).not_to have_link 'Enterprise Fees'
|
|
end
|
|
end
|
|
end
|
|
|
|
it "managing producer properties" do
|
|
create(:property, name: "Certified Organic")
|
|
visit admin_enterprises_path
|
|
within("#e_#{supplier1.id}") { click_link 'Settings' }
|
|
within(".side_menu") do
|
|
click_link "Properties"
|
|
end
|
|
|
|
# -- Update only
|
|
select2_select "Certified Organic",
|
|
from: 'enterprise_producer_properties_attributes_0_property_name'
|
|
|
|
fill_in 'enterprise_producer_properties_attributes_0_value', with: "NASAA 12345"
|
|
|
|
click_button 'Update'
|
|
|
|
expect(supplier1.producer_properties.reload.count).to eq(1)
|
|
|
|
# -- Destroy
|
|
within(".side_menu") do
|
|
click_link "Properties"
|
|
end
|
|
|
|
accept_alert do
|
|
property = supplier1.producer_properties.first
|
|
within("#spree_producer_property_#{property.id}") { page.find('a.remove_fields').click }
|
|
end
|
|
|
|
click_button 'Update'
|
|
|
|
expect(page).to have_content 'Enterprise "First Supplier" has been successfully updated!'
|
|
expect(supplier1.producer_properties.reload).to be_empty
|
|
end
|
|
|
|
describe "setting ordering preferences" do
|
|
let(:taxon) { create(:taxon, name: "Tricky Taxon") }
|
|
let(:property) { create(:property, presentation: "Fresh and Fine") }
|
|
let(:user) { create(:user, enterprise_limit: 1) }
|
|
let(:oc1) {
|
|
create(:simple_order_cycle, distributors: [distributor1],
|
|
coordinator: create(:distributor_enterprise),
|
|
orders_close_at: 2.days.from_now)
|
|
}
|
|
let(:product) {
|
|
create(:simple_product, supplier: supplier1, primary_taxon: taxon,
|
|
properties: [property], name: "Beans")
|
|
}
|
|
let(:variant) { product.variants.first }
|
|
let(:exchange1) { oc1.exchanges.to_enterprises(distributor1).outgoing.first }
|
|
let(:order) { create(:order, distributor: distributor1) }
|
|
|
|
before do
|
|
exchange1.update_attribute :pickup_time, "monday"
|
|
add_variant_to_order_cycle(exchange1, variant)
|
|
end
|
|
|
|
context "sorting by category" do
|
|
before do
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
|
|
within(".side_menu") do
|
|
click_link "Shop Preferences"
|
|
end
|
|
|
|
choose "enterprise_preferred_shopfront_product_sorting_method_by_category"
|
|
find("#s2id_enterprise_preferred_shopfront_taxon_order").click
|
|
find(".select2-result-label", text: "Tricky Taxon").click
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
end
|
|
|
|
it "sets the preference correctly" do
|
|
expect(distributor1.preferred_shopfront_product_sorting_method).to eql("by_category")
|
|
expect(distributor1.preferred_shopfront_taxon_order).to eql(taxon.id.to_s)
|
|
end
|
|
end
|
|
|
|
context "sorting by producer" do
|
|
before do
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
|
|
within(".side_menu") do
|
|
click_link "Shop Preferences"
|
|
end
|
|
|
|
choose "enterprise_preferred_shopfront_product_sorting_method_by_producer"
|
|
find("#s2id_enterprise_preferred_shopfront_producer_order").click
|
|
find(".select2-result-label", text: "First Supplier").click
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
end
|
|
|
|
it "sets the preference correctly" do
|
|
expect(distributor1.preferred_shopfront_product_sorting_method).to eql("by_producer")
|
|
expect(distributor1.preferred_shopfront_producer_order).to eql(supplier1.id.to_s)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "check users tab" do
|
|
before do
|
|
login_as_admin
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
within ".side_menu" do
|
|
click_link 'Users'
|
|
end
|
|
end
|
|
|
|
context "invite user as manager" do
|
|
before do
|
|
expect(page).to have_selector('a', text: /Add an unregistered user/i)
|
|
page.find('a', text: /Add an unregistered user/i).click
|
|
end
|
|
|
|
it "shows an error message if the email is invalid" do
|
|
within ".reveal-modal" do
|
|
expect(page).to have_content "Invite an unregistered user"
|
|
fill_in "email", with: "invalid_email"
|
|
|
|
expect do
|
|
click_button "Invite"
|
|
expect(page).to have_content "Email is invalid"
|
|
end.to_not enqueue_job ActionMailer::MailDeliveryJob
|
|
end
|
|
end
|
|
|
|
it "shows an error message if the email is already linked to an existing user" do
|
|
within ".reveal-modal" do
|
|
expect(page).to have_content "Invite an unregistered user"
|
|
fill_in "email", with: distributor1.owner.email
|
|
|
|
expect do
|
|
click_button "Invite"
|
|
expect(page).to have_content "User already exists"
|
|
end.to_not enqueue_job ActionMailer::MailDeliveryJob
|
|
end
|
|
end
|
|
|
|
it "finally, can invite unregistered users" do
|
|
within ".reveal-modal" do
|
|
expect(page).to have_content "Invite an unregistered user"
|
|
fill_in "email", with: "email@email.com"
|
|
|
|
expect do
|
|
click_button "Invite"
|
|
expect(page)
|
|
.to have_content "email@email.com has been invited to manage this enterprise"
|
|
end.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "white label settings" do
|
|
before do
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
|
|
select_white_label
|
|
end
|
|
|
|
it "set the hide_ofn_navigation preference for the current shop" do
|
|
check "Hide OFN navigation"
|
|
click_button 'Update'
|
|
success_message = 'Enterprise "First Distributor" has been successfully updated!'
|
|
expect(flash_message).to eq success_message
|
|
expect(distributor1.reload.hide_ofn_navigation).to be true
|
|
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
|
|
uncheck "Hide OFN navigation"
|
|
click_button 'Update'
|
|
expect(flash_message).to eq success_message
|
|
expect(distributor1.reload.hide_ofn_navigation).to be false
|
|
end
|
|
|
|
it "set the hide_ofn_navigation preference for the current shop" do
|
|
expect(page).not_to have_content "LOGO USED IN SHOPFRONT"
|
|
check "Hide OFN navigation"
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.hide_ofn_navigation).to be true
|
|
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
|
|
expect(page).to have_content "LOGO USED IN SHOPFRONT"
|
|
uncheck "Hide OFN navigation"
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.hide_ofn_navigation).to be false
|
|
end
|
|
|
|
context "when white label is active via `hide_ofn_navigation`" do
|
|
before do
|
|
distributor1.update_attribute(:hide_ofn_navigation, true)
|
|
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
end
|
|
|
|
it "can updload the white label logo for the current shop" do
|
|
attach_file "enterprise_white_label_logo", white_logo_path
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.white_label_logo_blob.filename).to eq("logo-white.png")
|
|
end
|
|
|
|
it "does not show the white label logo link field" do
|
|
expect(page).not_to have_field "white_label_logo_link"
|
|
end
|
|
|
|
context "when enterprise has a white label logo" do
|
|
before do
|
|
distributor1.update white_label_logo: white_logo_file
|
|
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
end
|
|
|
|
it "can remove the white label logo for the current shop" do
|
|
expect(page).to have_selector("img[src*='logo-white.png']")
|
|
expect(distributor1.white_label_logo).to be_attached
|
|
click_button "Remove"
|
|
within ".reveal-modal" do
|
|
click_button "Confirm"
|
|
end
|
|
expect(flash_message).to match(/Logo removed/)
|
|
distributor1.reload
|
|
expect(distributor1.white_label_logo).to_not be_attached
|
|
end
|
|
|
|
shared_examples "edit link with" do |url, result|
|
|
it "url: #{url}" do
|
|
fill_in "enterprise_white_label_logo_link", with: url
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.white_label_logo_link).to eq(result)
|
|
end
|
|
end
|
|
|
|
context "can edit white label logo link" do
|
|
it_behaves_like "edit link with", "https://www.openfoodnetwork.org", "https://www.openfoodnetwork.org"
|
|
it_behaves_like "edit link with", "www.openfoodnetwork.org", "http://www.openfoodnetwork.org"
|
|
it_behaves_like "edit link with", "openfoodnetwork.org", "http://openfoodnetwork.org"
|
|
end
|
|
|
|
shared_examples "edit link with invalid" do |url|
|
|
it "url: #{url}" do
|
|
fill_in "enterprise_white_label_logo_link", with: url
|
|
click_button 'Update'
|
|
expect(page)
|
|
.to have_content "Link for the logo used in shopfront '#{url}' is an invalid URL"
|
|
expect(distributor1.reload.white_label_logo_link).to be_nil
|
|
end
|
|
end
|
|
|
|
context "can not edit white label logo link" do
|
|
it_behaves_like "edit link with invalid", "invalid url"
|
|
end
|
|
end
|
|
|
|
it "can check/uncheck the hide_groups_tab attribute" do
|
|
check "Hide groups tab in shopfront"
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.hide_groups_tab).to be true
|
|
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
|
|
uncheck "Hide groups tab in shopfront"
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.hide_groups_tab).to be false
|
|
end
|
|
|
|
context "creating custom tabs" do
|
|
before do
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
check "Create custom tab in shopfront"
|
|
end
|
|
|
|
it "can save custom tab fields" do
|
|
fill_in "enterprise_custom_tab_attributes_title", with: "Custom tab title"
|
|
fill_in_trix_editor "custom_tab_content", with: "Custom tab content"
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.custom_tab.title).to eq("Custom tab title")
|
|
expect(distributor1.reload.custom_tab.content).to eq("<div>Custom tab content</div>")
|
|
end
|
|
|
|
context "managing errors" do
|
|
it "can't save custom tab fields if title is blank" do
|
|
fill_in "enterprise_custom_tab_attributes_title", with: ""
|
|
fill_in_trix_editor "custom_tab_content", with: "Custom tab content"
|
|
click_button 'Update'
|
|
expect(page).to have_content("Custom tab title can't be blank")
|
|
expect(distributor1.reload.custom_tab).to be_nil
|
|
|
|
select_white_label
|
|
expect(page).to have_checked_field "Create custom tab in shopfront"
|
|
end
|
|
|
|
it "can't save custom tab fields if title is too long" do
|
|
fill_in "enterprise_custom_tab_attributes_title", with: "a" * 21
|
|
fill_in_trix_editor "custom_tab_content", with: "Custom tab content"
|
|
click_button 'Update'
|
|
expect(page).
|
|
to have_content("Custom tab title is too long (maximum is 20 characters)")
|
|
expect(distributor1.reload.custom_tab).to be_nil
|
|
end
|
|
end
|
|
|
|
context "when custom tab is already created" do
|
|
let(:custom_tab) {
|
|
create(:custom_tab, title: "Custom tab title",
|
|
content: "Custom tab content")
|
|
}
|
|
|
|
before do
|
|
distributor1.update(custom_tab:)
|
|
visit edit_admin_enterprise_path(distributor1)
|
|
select_white_label
|
|
end
|
|
|
|
it "display the custom tab fields with the current values" do
|
|
expect(page).to have_checked_field "Create custom tab in shopfront"
|
|
expect(page).
|
|
to have_field "enterprise_custom_tab_attributes_title", with: "Custom tab title"
|
|
expect(page).to have_content("Custom tab content")
|
|
end
|
|
|
|
it "enable the update button on custom tab content change" do
|
|
fill_in_trix_editor "custom_tab_content", with: "Custom tab content changed"
|
|
within "save-bar" do
|
|
expect(page).to have_button("Update", disabled: false)
|
|
end
|
|
expect {
|
|
click_button 'Update'
|
|
}.to change { distributor1.reload.custom_tab.content }
|
|
.from("Custom tab content")
|
|
.to("<div>Custom tab content changed</div>")
|
|
end
|
|
|
|
it "can delete custom tab if uncheck the checkbox" do
|
|
uncheck "Create custom tab in shopfront"
|
|
click_button 'Update'
|
|
expect(flash_message)
|
|
.to eq('Enterprise "First Distributor" has been successfully updated!')
|
|
expect(distributor1.reload.custom_tab).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context "changing package" do
|
|
let!(:owner) { create(:user) }
|
|
let!(:enterprise) { create(:distributor_enterprise, owner:, is_primary_producer: true) }
|
|
before do
|
|
login_as owner
|
|
end
|
|
|
|
context "via admin path, for a producer" do
|
|
before do
|
|
visit spree.admin_dashboard_path
|
|
end
|
|
|
|
it "changes user role" do
|
|
click_button "Change Package"
|
|
|
|
# checks options for producer profile
|
|
expect(page).to have_content "PRODUCER PROFILE"
|
|
expect(page).to have_content "PRODUCER SHOP"
|
|
expect(page).to have_content "PRODUCER HUB"
|
|
expect(page).not_to have_content "PROFILE ONLY"
|
|
expect(page).not_to have_content "HUB SHOP"
|
|
|
|
# Producer hub option is selected
|
|
page.find('a', class: 'selected', text: "PRODUCER HUB")
|
|
expect(enterprise.reload.is_primary_producer).to eq true
|
|
expect(enterprise.reload.sells).to eq('any')
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_hub_menu
|
|
assert_hub_content
|
|
|
|
# Changes to producer shop
|
|
page.find('a', text: "PRODUCER SHOP").click
|
|
click_button "Change now"
|
|
expect(page).to have_content update_message
|
|
|
|
# Checks changes are persistent
|
|
click_button "Change Package"
|
|
|
|
page.find('a', class: 'selected', text: "PRODUCER SHOP")
|
|
expect(enterprise.reload.is_primary_producer).to eq true
|
|
expect(enterprise.reload.sells).to eq('own')
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_hub_menu
|
|
assert_hub_content
|
|
|
|
# Changes to producer profile
|
|
page.find('a', text: "PRODUCER PROFILE").click
|
|
click_button "Change now"
|
|
expect(page).to have_content update_message
|
|
|
|
# Checks changes are persistent
|
|
click_button "Change Package"
|
|
|
|
page.find('a', class: 'selected', text: "PRODUCER PROFILE")
|
|
|
|
# a primary producer:
|
|
expect(enterprise.reload.is_primary_producer).to eq true
|
|
|
|
# which is not selling:
|
|
expect(enterprise.reload.sells).to eq('none')
|
|
|
|
# then, this should imply
|
|
# producer_profile_only to be true
|
|
# this probably relates to issue #7835
|
|
expect(enterprise.reload.producer_profile_only).to eq false
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_supplier_menu
|
|
assert_supplier_content
|
|
end
|
|
end
|
|
|
|
context "via admin path, for a non-producer" do
|
|
before do
|
|
enterprise.update!(is_primary_producer: false)
|
|
visit spree.admin_dashboard_path
|
|
end
|
|
|
|
it "changes user role" do
|
|
click_button "Change Package"
|
|
|
|
# checks options for non-producer profile
|
|
expect(page).not_to have_content "PRODUCER PROFILE"
|
|
expect(page).not_to have_content "PRODUCER SHOP"
|
|
expect(page).not_to have_content "PRODUCER HUB"
|
|
expect(page).to have_content "PROFILE ONLY"
|
|
expect(page).to have_content "HUB SHOP"
|
|
|
|
# Producer hub option is selected
|
|
page.find('a', class: 'selected', text: "HUB SHOP")
|
|
expect(enterprise.reload.is_primary_producer).to eq false
|
|
expect(enterprise.reload.producer_profile_only).to eq false
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_hub_menu
|
|
assert_hub_content
|
|
|
|
# Changes to producer shop
|
|
page.find('a', text: "PROFILE ONLY").click
|
|
click_button "Change now"
|
|
expect(page).to have_content update_message
|
|
|
|
# Checks changes are persistent
|
|
click_button "Change Package"
|
|
|
|
page.find('a', class: 'selected', text: "PROFILE ONLY")
|
|
expect(enterprise.reload.is_primary_producer).to eq false
|
|
expect(enterprise.reload.producer_profile_only).to eq false
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_profile
|
|
end
|
|
end
|
|
|
|
context "via enterprises path, for a producer" do
|
|
before do
|
|
visit admin_enterprises_path
|
|
end
|
|
|
|
it "sees and changes user role" do
|
|
page.find("td.package").click
|
|
|
|
# checks options for producer profile
|
|
expect(page).to have_content "PROFILE ONLY"
|
|
expect(page).to have_content "PRODUCER SHOP"
|
|
expect(page).to have_content "PRODUCER HUB"
|
|
expect(page).not_to have_content "HUB SHOP"
|
|
|
|
# Producer hub option is selected
|
|
page.find('a', class: 'selected', text: "PRODUCER HUB")
|
|
expect(enterprise.is_primary_producer).to eq true
|
|
expect(enterprise.reload.sells).to eq('any')
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_hub_menu
|
|
|
|
# Changes to producer shop
|
|
page.find('a', text: "PRODUCER SHOP").click
|
|
page.find('a', text: "SAVE").click
|
|
|
|
# Checks changes are persistent
|
|
page.find('a', class: 'selected', text: "PRODUCER SHOP")
|
|
|
|
# updates page
|
|
page.refresh
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_hub_menu
|
|
expect(enterprise.reload.sells).to eq('own')
|
|
expect(enterprise.is_primary_producer).to eq true
|
|
|
|
# Changes to producer profile
|
|
page.find("td.package").click
|
|
page.find('a', text: "PROFILE ONLY").click
|
|
page.find('a', text: "SAVE").click
|
|
|
|
# Checks changes are persistent
|
|
page.find('a', class: 'selected', text: "PROFILE ONLY")
|
|
|
|
# updates page
|
|
page.refresh
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_supplier_menu
|
|
|
|
# a primary producer:
|
|
expect(enterprise.reload.is_primary_producer).to eq true
|
|
|
|
# which is not selling:
|
|
expect(enterprise.reload.sells).to eq('none')
|
|
|
|
# then, this should imply
|
|
# producer_profile_only to be true
|
|
# this probably relates to issue #7835
|
|
expect(enterprise.reload.producer_profile_only).to eq false
|
|
end
|
|
end
|
|
|
|
context "via enterprises path, for a non-producer" do
|
|
before do
|
|
visit admin_enterprises_path
|
|
end
|
|
|
|
it "sees and changes user role" do
|
|
# changes to non-producer profile
|
|
page.find("td.producer").click
|
|
|
|
# checks options for producer profile
|
|
expect(page).to have_content "PRODUCER"
|
|
expect(page).to have_content "NON-PRODUCER"
|
|
|
|
# Producer hub option is selected
|
|
page.find('a', class: 'selected', text: "PRODUCER")
|
|
expect(enterprise.is_primary_producer).to eq true
|
|
expect(enterprise.reload.sells).to eq('any')
|
|
|
|
# Changes to non-producer
|
|
page.find('a', text: "NON-PRODUCER").click
|
|
page.find('a', text: "SAVE").click
|
|
|
|
# updates page
|
|
page.refresh
|
|
|
|
# Displays the correct dashboard sections
|
|
assert_hub_menu
|
|
|
|
page.find("td.package").click
|
|
|
|
# checks options for non-producer profile
|
|
expect(page).not_to have_content "PRODUCER PROFILE"
|
|
expect(page).not_to have_content "PRODUCER SHOP"
|
|
expect(page).not_to have_content "PRODUCER HUB"
|
|
expect(page).to have_content "PROFILE ONLY"
|
|
expect(page).to have_content "HUB SHOP"
|
|
|
|
# Producer hub option is selected
|
|
page.find('a', class: 'selected', text: "HUB SHOP")
|
|
expect(enterprise.reload.is_primary_producer).to eq false
|
|
expect(enterprise.reload.sells).to eq('any')
|
|
|
|
# Changes to producer shop
|
|
page.find('a', text: "PROFILE ONLY").click
|
|
page.find('a', text: "SAVE").click
|
|
|
|
# updates page
|
|
page.refresh
|
|
|
|
# Checks changes are persistent
|
|
page.find("td.package").click
|
|
page.find('a', class: 'selected', text: "PROFILE ONLY")
|
|
|
|
# Displays the correct dashboard sections
|
|
within "#admin-menu" do
|
|
expect(page).to have_content "DASHBOARD"
|
|
expect(page).to have_content "ENTERPRISES"
|
|
end
|
|
|
|
expect(enterprise.reload.is_primary_producer).to eq false
|
|
expect(enterprise.reload.sells).to eq('none')
|
|
end
|
|
end
|
|
end
|
|
|
|
def select_white_label
|
|
# The savebar sits on top of the bottom menu item until we scroll.
|
|
scroll_to :bottom
|
|
within(".side_menu") do
|
|
click_link "White Label"
|
|
end
|
|
end
|
|
end
|
|
|
|
def update_message
|
|
%(Congratulations! Registration for #{enterprise.name} is complete!)
|
|
end
|
|
|
|
def assert_hub_menu
|
|
within "#admin-menu" do
|
|
expect(page).to have_content "DASHBOARD"
|
|
expect(page).to have_content "PRODUCTS"
|
|
expect(page).to have_content "ORDER CYCLES"
|
|
expect(page).to have_content "ORDERS"
|
|
expect(page).to have_content "REPORTS"
|
|
expect(page).to have_content "ENTERPRISES"
|
|
expect(page).to have_content "CUSTOMERS"
|
|
end
|
|
end
|
|
|
|
def assert_hub_content
|
|
within "#content" do
|
|
expect(page).to have_content "Your profile live"
|
|
expect(page).to have_content "Edit profile details"
|
|
expect(page).to have_content "Add & manage products"
|
|
expect(page).to have_content "Add & manage order cycles"
|
|
end
|
|
end
|
|
|
|
def assert_supplier_menu
|
|
within "#admin-menu" do
|
|
expect(page).to have_content "DASHBOARD"
|
|
expect(page).to have_content "PRODUCTS"
|
|
expect(page).not_to have_content "ORDER CYCLES"
|
|
expect(page).not_to have_content "ORDERS"
|
|
expect(page).to have_content "REPORTS"
|
|
expect(page).to have_content "ENTERPRISES"
|
|
expect(page).not_to have_content "CUSTOMERS"
|
|
end
|
|
end
|
|
|
|
def assert_supplier_content
|
|
within "#content" do
|
|
expect(page).to have_content "Your profile live"
|
|
expect(page).to have_content "Edit profile details"
|
|
expect(page).to have_content "Add & manage products"
|
|
expect(page).not_to have_content "Add & manage order cycles"
|
|
end
|
|
end
|
|
|
|
def assert_profile
|
|
within "#admin-menu" do
|
|
expect(page).to have_content "DASHBOARD"
|
|
expect(page).to have_content "ENTERPRISES"
|
|
end
|
|
|
|
within "#content" do
|
|
expect(page).to have_content "Your profile live"
|
|
expect(page).to have_content "Edit profile details"
|
|
end
|
|
end
|