Files
openfoodnetwork/spec/features/admin/customers_spec.rb
Kristina Lim 822b2c929a Fix frontend sorting in "Customers" index
The scope for customersCtrl did not have access to the sorting
preferences stored in the nested ColumnsCtrl scope. To address this,
the page has been changed to use a new set of sorting preferences
declared in the customersCtrl scope itself.

Also, these sorting preferences are now stored in an object. This
enables the parent scope to see changes to the sorting preferences which
are done via the nested ColumnsCtrl scope,

The "Bulk Order Management" page is also affected by the same scoping
issue. Once this page is fixed, we can remove remnants of the sorting
preferences initialized in ColumnsCtrl.
2018-07-23 10:33:39 +10:00

271 lines
10 KiB
Ruby

require 'spec_helper'
feature 'Customers' do
include AuthenticationWorkflow
include WebHelper
context "as an enterprise user" do
let(:user) { create_enterprise_user(enterprise_limit: 10) }
let(:managed_distributor1) { create(:distributor_enterprise, owner: user) }
let(:managed_distributor2) { create(:distributor_enterprise, owner: user) }
let(:unmanaged_distributor) { create(:distributor_enterprise) }
describe "using the customers index", js: true do
let!(:customer1) { create(:customer, enterprise: managed_distributor1, code: nil) }
let!(:customer2) { create(:customer, enterprise: managed_distributor1, code: nil) }
let!(:customer3) { create(:customer, enterprise: unmanaged_distributor) }
let!(:customer4) { create(:customer, enterprise: managed_distributor2) }
before do
quick_login_as user
visit admin_customers_path
end
it "passes the smoke test" do
# Prompts for a hub for a list of my managed enterprises
expect(page).to have_select2 "shop_id", with_options: [managed_distributor1.name,managed_distributor2.name], without_options: [unmanaged_distributor.name]
select2_select managed_distributor2.name, from: "shop_id"
# Loads the right customers
expect(page).to_not have_selector "tr#c_#{customer1.id}"
expect(page).to_not have_selector "tr#c_#{customer2.id}"
expect(page).to_not have_selector "tr#c_#{customer3.id}"
expect(page).to have_selector "tr#c_#{customer4.id}"
# Changing Shops
select2_select managed_distributor1.name, from: "shop_id"
# Loads the right customers
expect(page).to have_selector "tr#c_#{customer1.id}"
expect(page).to have_selector "tr#c_#{customer2.id}"
expect(page).to_not have_selector "tr#c_#{customer3.id}"
expect(page).to_not have_selector "tr#c_#{customer4.id}"
# Searching
fill_in "quick_search", with: customer2.email
expect(page).to_not have_selector "tr#c_#{customer1.id}"
expect(page).to have_selector "tr#c_#{customer2.id}"
fill_in "quick_search", with: ""
# Sorting when the header of a sortable column is clicked
customer_emails = [customer1.email, customer2.email].sort
within "#customers thead" do
click_on "Email"
end
expect(page).to have_selector("#customers .customer:nth-child(1) .email", text: customer_emails[0])
expect(page).to have_selector("#customers .customer:nth-child(2) .email", text: customer_emails[1])
# Then sorting in reverse when the header is clicked again
within "#customers thead" do
click_on "Email"
end
expect(page).to have_selector("#customers .customer:nth-child(1) .email", text: customer_emails[1])
expect(page).to have_selector("#customers .customer:nth-child(2) .email", text: customer_emails[0])
# Toggling columns
expect(page).to have_selector "th.email"
expect(page).to have_content customer1.email
first("div#columns-dropdown", :text => "COLUMNS").click
first("div#columns-dropdown div.menu div.menu_item", text: "Email").click
expect(page).to_not have_selector "th.email"
expect(page).to_not have_content customer1.email
# Deleting
create(:order, customer: customer1)
expect{
within "tr#c_#{customer1.id}" do
find("a.delete-customer").trigger('click')
end
expect(page).to have_selector "#info-dialog .text", text: I18n.t('admin.customers.destroy.has_associated_orders')
click_button "OK"
}.to_not change{Customer.count}
expect{
within "tr#c_#{customer2.id}" do
find("a.delete-customer").click
end
expect(page).to_not have_selector "tr#c_#{customer2.id}"
}.to change{Customer.count}.by(-1)
end
it "allows updating of attributes" do
select2_select managed_distributor1.name, from: "shop_id"
within "tr#c_#{customer1.id}" do
find_field('name').value.should eq 'John Doe'
fill_in "code", with: "new-customer-code"
expect(page).to have_css "input[name=code].update-pending"
fill_in "name", with: "customer abc"
expect(page).to have_css "input[name=name].update-pending"
find(:css, "tags-input .tags input").set "awesome\n"
expect(page).to have_css ".tag_watcher.update-pending"
end
expect(page).to have_content I18n.t('admin.unsaved_changes')
click_button "Save Changes"
# Every says it updated
expect(page).to have_css "input[name=code].update-success"
expect(page).to have_css "input[name=name].update-success"
expect(page).to have_css ".tag_watcher.update-success"
# And it actually did
expect(customer1.reload.code).to eq "new-customer-code"
expect(customer1.reload.name).to eq "customer abc"
expect(customer1.tag_list).to eq ["awesome"]
# Clearing attributes
within "tr#c_#{customer1.id}" do
fill_in "code", with: ""
expect(page).to have_css "input[name=code].update-pending"
fill_in "name", with: ""
expect(page).to have_css "input[name=name].update-pending"
find("tags-input li.tag-item a.remove-button").trigger('click')
expect(page).to have_css ".tag_watcher.update-pending"
end
click_button "Save Changes"
# Every says it updated
expect(page).to have_css "input[name=code].update-success"
expect(page).to have_css "input[name=name].update-success"
expect(page).to have_css ".tag_watcher.update-success"
# And it actually did
expect(customer1.reload.code).to be nil
expect(customer1.reload.name).to eq ''
expect(customer1.tag_list).to eq []
end
it "prevents duplicate codes from being saved" do
select2_select managed_distributor1.name, from: "shop_id"
within "tr#c_#{customer1.id}" do
fill_in "code", with: "new-customer-code"
expect(page).to have_css "input[name=code].update-pending"
end
click_button "Save Changes"
within "tr#c_#{customer1.id}" do
expect(page).to have_css "input[name=code].update-success"
end
within "tr#c_#{customer2.id}" do
fill_in "code", with: "new-customer-code"
expect(page).to have_content "This code is used already."
end
click_button "Save Changes"
within "tr#c_#{customer2.id}" do
expect(page).to have_css "input[name=code].update-error"
end
expect(page).to have_content "Oh no! I was unable to save your changes"
expect(customer1.reload.code).to eq "new-customer-code"
expect(customer2.reload.code).to be nil
end
describe 'updating a customer addresses' do
before do
select2_select managed_distributor2.name, from: "shop_id"
end
it 'updates the existing billing address' do
expect(page).to have_content 'BILLING ADDRESS'
first('#bill-address-link').click
expect(page).to have_content 'Edit Billing Address'
expect(page).to have_select2 'country_id', selected: 'Australia'
expect(page).to have_select2 'state_id', selected: 'Victoria'
fill_in 'address1', with: "New Address1"
click_button 'Update Address'
expect(page).to have_content 'Address updated successfully.'
expect(page).to have_link 'New Address1'
expect(customer4.reload.bill_address.address1).to eq 'New Address1'
end
it 'creates a new shipping address' do
expect(page).to have_content 'SHIPPING ADDRESS'
first('#ship-address-link').click
expect(page).to have_content 'Edit Shipping Address'
fill_in 'firstname', with: "First"
fill_in 'lastname', with: "Last"
fill_in 'address1', with: "New Address1"
fill_in 'phone', with: "12345678"
fill_in 'city', with: "Melbourne"
fill_in 'zipcode', with: "3000"
select2_select 'Australia', from: 'country_id'
select2_select 'Victoria', from: 'state_id'
click_button 'Update Address'
expect(page).to have_content 'Address updated successfully.'
expect(page).to have_link 'New Address1'
ship_address = customer4.reload.ship_address
expect(ship_address.firstname).to eq 'First'
expect(ship_address.lastname).to eq 'Last'
expect(ship_address.address1).to eq 'New Address1'
expect(ship_address.phone).to eq '12345678'
expect(ship_address.city).to eq 'Melbourne'
end
end
describe "creating a new customer" do
context "when no shop has been selected" do
it "asks the user to select a shop" do
accept_alert 'Please select a shop first' do
click_link('New Customer')
end
end
end
context "when a shop is selected" do
before do
select2_select managed_distributor1.name, from: "shop_id"
end
it "creates customers when the email provided is valid" do
# When an invalid email is used
expect{
click_link('New Customer')
fill_in 'email', with: "not_an_email"
click_button 'Add Customer'
expect(page).to have_selector "#new-customer-dialog .error", text: "Please enter a valid email address"
}.to_not change{Customer.of(managed_distributor1).count}
# When an existing email is used
expect{
fill_in 'email', with: customer1.email
click_button 'Add Customer'
expect(page).to have_selector "#new-customer-dialog .error", text: "Email is associated with an existing customer"
}.to_not change{Customer.of(managed_distributor1).count}
# When a new valid email is used
expect{
fill_in 'email', with: "new@email.com"
click_button 'Add Customer'
expect(page).not_to have_selector "#new-customer-dialog"
}.to change{Customer.of(managed_distributor1).count}.from(2).to(3)
end
end
end
end
end
end