Files
openfoodnetwork/spec/features/admin/enterprises_spec.rb
filipefurtad0 6f694e2cab Standardise spec block naming
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.
2021-09-28 08:24:05 +10:00

448 lines
17 KiB
Ruby

# frozen_string_literal: true
require "spec_helper"
describe '
As an administrator
I want to manage enterprises
' do
include WebHelper
include AuthenticationHelper
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", js: true do
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
admin = 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
select2_select 'Victoria', from: 'enterprise_address_attributes_state_id'
click_button 'Create'
expect(flash_message).to eq('Enterprise "Eaterprises" has been successfully created!')
end
it "editing an existing enterprise", js: true 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"
choose "Visible to registered customers only"
expect(page).to have_no_checked_field "enterprise_require_login_false"
# expect(page).to have_checked_field "enterprise_enable_subscriptions_false"
accept_alert do
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 Angularjs switching of sidebar elements
accept_alert do
click_link "Primary Details"
end
uncheck 'enterprise_is_primary_producer'
choose 'None'
expect(page).not_to have_selector "#enterprise_fees"
expect(page).not_to have_selector "#payment_methods"
expect(page).not_to have_selector "#shipping_methods"
check 'enterprise_is_primary_producer'
expect(page).to have_selector "#enterprise_fees"
expect(page).not_to have_selector "#payment_methods"
expect(page).not_to have_selector "#shipping_methods"
uncheck 'enterprise_is_primary_producer'
choose 'Own'
expect(page).to have_selector "#enterprise_fees"
expect(page).to have_selector "#payment_methods"
expect(page).to have_selector "#shipping_methods"
choose 'Any'
expect(page).to have_selector "#enterprise_fees"
expect(page).to have_selector "#payment_methods"
expect(page).to have_selector "#shipping_methods"
select2_select eg1.name, from: 'enterprise_group_ids'
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
select2_select 'Victoria', from: 'enterprise_address_attributes_state_id'
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"
choose "enterprise_preferred_shopfront_order_cycle_order_orders_open_at"
choose "enterprise_enable_subscriptions_true"
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_true"
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"
# 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_and_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_and_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", js: true 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_and_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", js: true 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'
select2_select 'Australia', from: 'enterprise_address_attributes_country_id'
select2_select 'Victoria', from: 'enterprise_address_attributes_state_id'
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
end
end