mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-05 22:26:07 +00:00
The `login_as_admin_and_visit` helper was used a lot but isn't really
shorter than:
login_as_admin
visit path_visit
Calling those methods separately reduces line length. It also removes
the potential impression that it may be more efficient to use the
helper. Now we have less indirection if one of the calls fails and see
the failing spec line straight away.
253 lines
11 KiB
Ruby
253 lines
11 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|