Files
openfoodnetwork/spec/features/admin/enterprise_roles_spec.rb
2019-05-28 16:59:51 +01:00

188 lines
6.4 KiB
Ruby

require 'spec_helper'
feature '
As an Administrator
I want to manage relationships between users and enterprises
', js: true do
include AuthenticationWorkflow
include WebHelper
include OpenFoodNetwork::EmailHelper
context "as a site administrator" do
before { login_to_admin_section }
scenario "listing relationships" do
# Given some users and enterprises with relationships
u1, u2 = create(:user), create(:user)
e1, e2, e3, e4 = create(:enterprise), create(:enterprise), create(:enterprise), create(:enterprise)
create(:enterprise_role, user: u1, enterprise: e1)
create(:enterprise_role, user: u1, enterprise: e2)
create(:enterprise_role, user: u2, enterprise: e3)
create(:enterprise_role, user: u2, enterprise: e4)
# When I go to the roles page
click_link 'Users'
click_link 'Roles'
# Then I should see the relationships
within('table#enterprise-roles') do
expect(page).to have_relationship u1, e1
expect(page).to have_relationship u1, e2
expect(page).to have_relationship u2, e3
expect(page).to have_relationship u2, e4
end
end
scenario "creating a relationship" do
u = create(:user, email: 'u@example.com')
e = create(:enterprise, name: 'One')
visit admin_enterprise_roles_path
select 'u@example.com', from: 'enterprise_role_user_id'
select 'One', from: 'enterprise_role_enterprise_id'
click_button 'Create'
# Wait for row to appear since have_relationship doesn't wait
expect(page).to have_selector 'tr', count: 3
expect(page).to have_relationship u, e
expect(EnterpriseRole.where(user_id: u, enterprise_id: e)).to be_present
end
scenario "attempting to create a relationship with invalid data" do
u = create(:user, email: 'u@example.com')
e = create(:enterprise, name: 'One')
create(:enterprise_role, user: u, enterprise: e)
expect do
# When I attempt to create a duplicate relationship
visit admin_enterprise_roles_path
select 'u@example.com', from: 'enterprise_role_user_id'
select 'One', from: 'enterprise_role_enterprise_id'
click_button 'Create'
# Then I should see an error message
expect(page).to have_content "That role is already present."
end.to change(EnterpriseRole, :count).by(0)
end
scenario "deleting a relationship" do
u = create(:user, email: 'u@example.com')
e = create(:enterprise, name: 'One')
er = create(:enterprise_role, user: u, enterprise: e)
visit admin_enterprise_roles_path
expect(page).to have_relationship u, e
within("#enterprise_role_#{er.id}") do
accept_alert do
find("a.delete-enterprise-role").click
end
end
# Wait for row to disappear, otherwise have_relationship waits 30 seconds.
expect(page).not_to have_selector "#enterprise_role_#{er.id}"
expect(page).not_to have_relationship u, e
expect(EnterpriseRole.where(id: er.id)).to be_empty
end
describe "using the enterprise managers interface" do
let!(:user1) { create(:user, email: 'user1@example.com') }
let!(:user2) { create(:user, email: 'user2@example.com') }
let!(:user3) { create(:user, email: 'user3@example.com', confirmed_at: nil) }
let(:new_email) { 'new@manager.com' }
let!(:enterprise) { create(:enterprise, name: 'Test Enterprise', owner: user1) }
let!(:enterprise_role) { create(:enterprise_role, user_id: user2.id, enterprise_id: enterprise.id) }
before do
click_link 'Enterprises'
click_link 'Test Enterprise'
navigate_to_enterprise_users
expect(page).to have_selector "table.managers"
end
it "lists managers and shows icons for owner, contact, and email confirmation" do
within 'table.managers' do
expect(page).to have_content user1.email
expect(page).to have_content user2.email
within "tr#manager-#{user1.id}" do
# user1 is both the enterprise owner and contact, and has email confirmed
expect(page).to have_css 'i.owner'
expect(page).to have_css 'i.contact'
expect(page).to have_css 'i.confirmed'
end
end
end
it "allows adding new managers" do
within 'table.managers' do
targetted_select2_search user3.email, from: '#s2id_ignored'
# user3 has been added and has an unconfirmed email address
expect(page).to have_css "tr#manager-#{user3.id}"
within "tr#manager-#{user3.id}" do
expect(page).to have_css 'i.unconfirmed'
end
end
end
it "shows changes to enterprise contact or owner" do
select2_select user2.email, from: 'receives_notifications_dropdown'
within('#save-bar') { click_button 'Update' }
navigate_to_enterprise_users
expect(page).to have_selector "table.managers"
within 'table.managers' do
within "tr#manager-#{user1.id}" do
expect(page).to have_css 'i.owner'
expect(page).to have_no_css 'i.contact'
end
within "tr#manager-#{user2.id}" do
expect(page).to have_css 'i.contact'
end
end
end
it "can invite unregistered users to be managers" do
setup_email
find('a.button.help-modal').click
expect(page).to have_css '#invite-manager-modal'
within '#invite-manager-modal' do
fill_in 'invite_email', with: new_email
click_button I18n.t('js.admin.modals.invite')
expect(page).to have_content I18n.t('user_invited', email: new_email)
click_button I18n.t('js.admin.modals.close')
end
expect(page).not_to have_selector "#invite-manager-modal"
expect(page).to have_selector "table.managers"
new_user = Spree::User.find_by_email_and_confirmed_at(new_email, nil)
expect(Enterprise.managed_by(new_user)).to include enterprise
within 'table.managers' do
expect(page).to have_content new_email
within "tr#manager-#{new_user.id}" do
expect(page).to have_css 'i.unconfirmed'
end
end
end
end
end
private
def navigate_to_enterprise_users
within ".side_menu" do
click_link "Users"
end
end
def have_relationship(user, enterprise)
have_table_row [user.email, 'manages', enterprise.name, '']
end
end