Files
openfoodnetwork/spec/system/admin/enterprise_fees_spec.rb
2022-10-20 12:15:22 +05:30

238 lines
10 KiB
Ruby

# frozen_string_literal: true
require 'system_helper'
describe '
As an administrator
I want to manage enterprise fees
' do
include WebHelper
include AuthenticationHelper
let!(:tax_category_gst) { create(:tax_category, name: 'GST') }
it "listing enterprise fees" do
fee = create(:enterprise_fee, name: '$0.50 / kg', fee_type: 'packing',
tax_category: tax_category_gst)
amount = fee.calculator.preferred_amount
login_as_admin_and_visit spree.edit_admin_general_settings_path
click_link 'Enterprise Fees'
expect(page).to have_select "sets_enterprise_fee_set_collection_attributes_0_enterprise_id"
expect(page).to have_select "sets_enterprise_fee_set_collection_attributes_0_fee_type",
selected: 'Packing fee'
expect(page).to have_selector "input[value='$0.50 / kg']"
expect(page).to have_select "sets_enterprise_fee_set_collection_attributes_0_tax_category_id",
selected: 'GST'
expect(page).to have_select "sets_enterprise_fee_set_collection_attributes_0_calculator_type",
selected: 'Flat Rate (per item)'
expect(page).to have_selector "input[value='#{amount}']"
end
it "creating an enterprise fee" do
# Given an enterprise
e = create(:supplier_enterprise, name: 'Feedme')
# When I go to the enterprise fees page
login_as_admin_and_visit admin_enterprise_fees_path
# And I fill in the fields for a new enterprise fee and click update
select 'Feedme', from: 'sets_enterprise_fee_set_collection_attributes_0_enterprise_id'
select 'Admin', from: 'sets_enterprise_fee_set_collection_attributes_0_fee_type'
fill_in 'sets_enterprise_fee_set_collection_attributes_0_name', with: 'Hello!'
select 'GST', from: 'sets_enterprise_fee_set_collection_attributes_0_tax_category_id'
select 'Flat Percent', from: 'sets_enterprise_fee_set_collection_attributes_0_calculator_type'
click_button 'Update'
# Then I should see my fee and fields for the calculator
expect(page).to have_content "Your enterprise fees have been updated."
expect(page).to have_selector "input[value='Hello!']"
# When I fill in the calculator fields and click update
fill_in 'sets_enterprise_fee_set_collection_attributes_0_calculator_attributes_preferred_flat_percent',
with: '12.34'
click_button 'Update'
# Then I should see the correct values in my calculator fields
expect(page).to have_selector "#sets_enterprise_fee_set_collection_attributes_0_calculator_attributes_preferred_flat_percent[value='12.34']"
end
it "creating an enterprise fee with invalid amount shows error flash message" do
# Given an enterprise
e = create(:supplier_enterprise, name: 'Feedme')
# When I go to the enterprise fees page
login_as_admin_and_visit admin_enterprise_fees_path
# And I fill in the fields for a new enterprise fee and click update
select 'Feedme', from: 'sets_enterprise_fee_set_collection_attributes_0_enterprise_id'
select 'Admin', from: 'sets_enterprise_fee_set_collection_attributes_0_fee_type'
fill_in 'sets_enterprise_fee_set_collection_attributes_0_name', with: 'Hello!'
select 'GST', from: 'sets_enterprise_fee_set_collection_attributes_0_tax_category_id'
select 'Flat Percent', from: 'sets_enterprise_fee_set_collection_attributes_0_calculator_type'
click_button 'Update'
# Then I should see my fee and fields for the calculator
expect(page).to have_content "Your enterprise fees have been updated."
expect(page).to have_selector "input[value='Hello!']"
# When I fill in the calculator fields and click update
fill_in 'sets_enterprise_fee_set_collection_attributes_0_calculator_attributes_preferred_flat_percent',
with: "\'20.0'"
click_button 'Update'
# Then I should see the flash error message
expect(flash_message).to eq('Invalid input. Please use only numbers. For example: 10, 5.5, -20')
end
context "editing an enterprise fee" do
# Given an enterprise fee
let!(:fee) { create(:enterprise_fee) }
let!(:enterprise) { create(:enterprise, name: 'Foo') }
before do
# When I go to the enterprise fees page
login_as_admin_and_visit admin_enterprise_fees_path
# And I update the fields for the enterprise fee and click update
select 'Foo', from: 'sets_enterprise_fee_set_collection_attributes_0_enterprise_id'
select 'Admin', from: 'sets_enterprise_fee_set_collection_attributes_0_fee_type'
fill_in 'sets_enterprise_fee_set_collection_attributes_0_name', with: 'Greetings!'
select 'Inherit From Product', from: 'sets_enterprise_fee_set_collection_attributes_0_tax_category_id'
select 'Flat Percent', from: 'sets_enterprise_fee_set_collection_attributes_0_calculator_type'
click_button 'Update'
end
it "handle the default cases" do
# Then I should see the updated fields for my fee
expect(page).to have_select "sets_enterprise_fee_set_collection_attributes_0_enterprise_id",
selected: 'Foo'
expect(page).to have_select "sets_enterprise_fee_set_collection_attributes_0_fee_type",
selected: 'Admin fee'
expect(page).to have_selector "input[value='Greetings!']"
expect(page).to have_select 'sets_enterprise_fee_set_collection_attributes_0_tax_category_id',
selected: 'Inherit From Product'
expect(page).to have_selector "option[selected]", text: 'Flat Percent (per item)'
fee.reload
expect(fee.enterprise).to eq(enterprise)
expect(fee.name).to eq('Greetings!')
expect(fee.fee_type).to eq('admin')
expect(fee.calculator_type).to eq("Calculator::FlatPercentPerItem")
# Sets tax_category and inherits_tax_category
expect(fee.tax_category).to eq(nil)
expect(fee.inherits_tax_category).to eq(true)
end
it "handle when updating calculator type for Weight to Flat Rate" do
select 'Weight (per kg or lb)', from: 'sets_enterprise_fee_set_collection_attributes_0_calculator_type'
click_button 'Update'
select 'Flat Rate (per item)', from: 'sets_enterprise_fee_set_collection_attributes_0_calculator_type'
click_button 'Update'
expect(fee.reload.calculator_type).to eq("Calculator::PerItem")
end
it 'shows error flash when updating fee amount with invalid values' do
# When I fill in the calculator fields and click update
fill_in 'sets_enterprise_fee_set_collection_attributes_0_calculator_attributes_preferred_flat_percent',
with: "\'20.0'"
click_button 'Update'
# Then I should see the flash error message
expect(flash_message).to eq('Invalid input. Please use only numbers. For example: 10, 5.5, -20')
end
end
it "deleting an enterprise fee" do
# Given an enterprise fee
fee = create(:enterprise_fee)
# When I go to the enterprise fees page
login_as_admin_and_visit admin_enterprise_fees_path
# And I click delete
accept_alert do
find("a.delete-resource").click
end
# Then my enterprise fee should have been deleted
visit admin_enterprise_fees_path
expect(page).to have_no_selector "input[value='#{fee.name}']"
end
context "as an enterprise manager" do
let(:enterprise_user) { create(:user) }
let(:distributor1) { create(:distributor_enterprise, name: 'First Distributor') }
let(:distributor2) { create(:distributor_enterprise, name: 'Second Distributor') }
let(:distributor3) { create(:distributor_enterprise, name: 'Third Distributor') }
let(:ef1) { create(:enterprise_fee, name: 'One', enterprise: distributor1) }
let(:ef2) { create(:enterprise_fee, name: 'Two', enterprise: distributor2) }
before(:each) do
enterprise_user.enterprise_roles.build(enterprise: distributor1).save
enterprise_user.enterprise_roles.build(enterprise: distributor2).save
login_as enterprise_user
end
it "creates enterprise fees" do
visit edit_admin_enterprise_path(distributor1)
within(".side_menu") { click_link 'Enterprise Fees' }
click_link "Create One Now"
select distributor1.name,
from: 'sets_enterprise_fee_set_collection_attributes_0_enterprise_id'
select 'Packing', from: 'sets_enterprise_fee_set_collection_attributes_0_fee_type'
fill_in 'sets_enterprise_fee_set_collection_attributes_0_name', with: 'foo'
select 'GST', from: 'sets_enterprise_fee_set_collection_attributes_0_tax_category_id'
select 'Flat Percent', from: 'sets_enterprise_fee_set_collection_attributes_0_calculator_type'
click_button 'Update'
expect(flash_message).to eq('Your enterprise fees have been updated.')
# After saving, we should be redirected to the fees for our chosen enterprise
expect(page).not_to have_select 'sets_enterprise_fee_set_collection_attributes_1_enterprise_id',
selected: 'Second Distributor'
enterprise_fee = EnterpriseFee.find_by name: 'foo'
expect(enterprise_fee.enterprise).to eq(distributor1)
end
it "shows me only enterprise fees for the enterprise I select" do
ef1
ef2
visit edit_admin_enterprise_path(distributor1)
within(".side_menu") { click_link 'Enterprise Fees' }
click_link "Manage Enterprise Fees"
expect(page).to have_field 'sets_enterprise_fee_set_collection_attributes_0_name',
with: 'One'
expect(page).not_to have_field 'sets_enterprise_fee_set_collection_attributes_1_name',
with: 'Two'
visit edit_admin_enterprise_path(distributor2)
within(".side_menu") { click_link 'Enterprise Fees' }
click_link "Manage Enterprise Fees"
expect(page).not_to have_field 'sets_enterprise_fee_set_collection_attributes_0_name',
with: 'One'
expect(page).to have_field 'sets_enterprise_fee_set_collection_attributes_0_name',
with: 'Two'
end
it "only allows me to select enterprises I have access to" do
ef1
ef2
distributor3
visit edit_admin_enterprise_path(distributor2)
within(".side_menu") { click_link 'Enterprise Fees' }
click_link "Manage Enterprise Fees"
expect(page).to have_select('sets_enterprise_fee_set_collection_attributes_0_enterprise_id',
selected: 'Second Distributor',
options: ['First Distributor', 'Second Distributor'])
end
end
end