require 'rails_helper' RSpec.describe 'Account settings', type: :feature do let(:user) { create :user } feature "Update email address" do let(:geraint) { create :user, id: 2, cn: 'geraint', email: "lamagliarosa@example.com" } before do login_as user, :scope => :user geraint.save! allow_any_instance_of(User).to receive(:valid_ldap_authentication?) .with("invalid password").and_return(false) allow_any_instance_of(User).to receive(:valid_ldap_authentication?) .with("valid password").and_return(true) allow_any_instance_of(User).to receive(:pgp_pubkey).and_return(nil) end scenario 'fails with invalid password' do visit setting_path(:account) fill_in 'Address', with: "lamagliarosa@example.com" fill_in 'Current password', with: "invalid password" click_button "Update" expect(current_url).to eq(setting_url(:account)) expect(user.reload.unconfirmed_email).to be_nil within ".flash-msg" do expect(page).to have_content("did not match your current password") end end scenario 'fails when new address already taken' do visit setting_path(:account) fill_in 'Address', with: "lamagliarosa@example.com" fill_in 'Current password', with: "valid password" click_button "Update" expect(current_url).to eq(setting_url(:update_email)) expect(user.reload.unconfirmed_email).to be_nil within ".error-msg" do expect(page).to have_content("has already been taken") end end scenario 'works with valid password and address' do visit setting_path(:account) fill_in 'Address', with: "lamagliabianca@example.com" fill_in 'Current password', with: "valid password" click_button "Update" expect(current_url).to eq(setting_url(:account)) expect(user.reload.unconfirmed_email).to eq("lamagliabianca@example.com") within ".flash-msg" do expect(page).to have_content("Please confirm your new address") end end end feature "Update OpenPGP key" do let(:invalid_key) { File.read("#{Rails.root}/spec/fixtures/files/pgp_key_invalid.asc") } let(:valid_key_alice) { File.read("#{Rails.root}/spec/fixtures/files/pgp_key_valid_alice.asc") } let(:fingerprint_alice) { "EB85BB5FA33A75E15E944E63F231550C4F47E38E" } before do login_as user, :scope => :user allow_any_instance_of(User).to receive(:ldap_entry).and_return({ uid: user.cn, ou: user.ou, display_name: nil, pgp_key: nil }) end scenario 'rejects an invalid key' do expect(UserManager::UpdatePgpKey).not_to receive(:call) visit setting_path(:account) fill_in 'Public key', with: invalid_key click_button "Save" expect(current_url).to eq(setting_url(:account)) within ".error-msg" do expect(page).to have_content("This is not a valid armored PGP public key block") end end scenario 'stores a valid key' do expect(UserManager::UpdatePgpKey).to receive(:call) .with(user: user).and_return(true) visit setting_path(:account) fill_in 'Public key', with: valid_key_alice click_button "Save" expect(current_url).to eq(setting_url(:account)) within ".flash-msg" do expect(page).to have_content("Settings saved") end end end end