password recovery refactoring and tests
This commit is contained in:
parent
a69df8e658
commit
39a89ad564
5 changed files with 98 additions and 16 deletions
|
@ -11,7 +11,10 @@ class UsersController < ApplicationController
|
|||
|
||||
def password_recovery_request
|
||||
@user = User.where(email: params['email']).first
|
||||
UserMailer.with(user: @user).password_recovery.deliver_now
|
||||
recovery_password = ('a'..'z').to_a.shuffle[0,8].join
|
||||
@user.recovery_password = recovery_password
|
||||
@user.save
|
||||
UserMailer.with(user: @user, recovery_password: recovery_password).password_recovery.deliver_now
|
||||
redirect_to '/welcome', notice: "Recovery email sent to #{params['email']}"
|
||||
end
|
||||
|
||||
|
@ -35,7 +38,7 @@ class UsersController < ApplicationController
|
|||
redirect_to '/welcome', notice: 'Passwords don\'t match'
|
||||
end
|
||||
else
|
||||
redirect_to '/welcome', notice: 'Recovery link expired or unvalid'
|
||||
redirect_to '/welcome', notice: 'Recovery link expired or invalid'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
class UserMailer < ApplicationMailer
|
||||
def password_recovery
|
||||
@user = params[:user]
|
||||
recovery_password = ('a'..'z').to_a.shuffle[0,8].join
|
||||
@user.recovery_password = recovery_password
|
||||
@user.save
|
||||
@url = "http://localhost:18210/recover_password/#{@user.id}/#{recovery_password}"
|
||||
@recovery_password = params[:recovery_password]
|
||||
@url = "http://localhost:18210/recover_password/#{@user.id}/#{@recovery_password}"
|
||||
mail(to: @user.email, subject: 'Password recovery')
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,12 +3,12 @@ require 'rails_helper'
|
|||
RSpec.describe ApplicationController do
|
||||
describe 'current_user' do
|
||||
before(:all) do
|
||||
User.create(email: 'karol.selak@gmail.com', password: 'abcde')
|
||||
User.create(email: 'test2@example.com', password: 'abcde')
|
||||
end
|
||||
context 'when a user is logged in' do
|
||||
it 'returns the user' do
|
||||
# TODO
|
||||
# expect(current_user.email).to eql('karol.selak@gmail.com')
|
||||
# expect(current_user.email).to eql('test2@example.com')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,26 +1,107 @@
|
|||
require 'rails_helper'
|
||||
|
||||
RSpec.describe UsersController do
|
||||
before(:all) do # TODO change it to cleanup after each test
|
||||
User.destroy_all
|
||||
end
|
||||
let(:user1) do
|
||||
User.create(email: 'test1@example.com', password: 'abcde', recovery_password: 'recovery password')
|
||||
end
|
||||
describe 'get new' do
|
||||
subject { get 'new' }
|
||||
subject { get :new }
|
||||
it 'renders the users/new template' do
|
||||
expect(subject).to render_template('users/new')
|
||||
end
|
||||
end
|
||||
describe 'get create' do
|
||||
before(:all) do # TODO change it to cleanup after each test
|
||||
User.destroy_all
|
||||
subject do
|
||||
get :create, params: {user: {email: 'test2@example.com', password: 'abcde'}}
|
||||
end
|
||||
subject {
|
||||
get :create, params: {user: {email: 'karol.selak@gmail.com', password: 'abcde'}}
|
||||
}
|
||||
it 'creates a user' do
|
||||
subject
|
||||
expect(User.where(email: 'karol.selak@gmail.com').size).to eql(1)
|
||||
expect(User.where(email: 'test2@example.com').size).to eql(1)
|
||||
end
|
||||
it 'redirects to /welcome' do
|
||||
subject
|
||||
expect(subject).to redirect_to('/welcome')
|
||||
end
|
||||
end
|
||||
describe 'get password_recovery_request_form' do
|
||||
subject { get :password_recovery_request_form }
|
||||
it 'renders the users/password_recovery_request_form template' do
|
||||
expect(subject).to render_template('users/password_recovery_request_form')
|
||||
end
|
||||
end
|
||||
describe 'post password_recovery_request' do
|
||||
subject do
|
||||
get :password_recovery_request, params: {email: user1.email}
|
||||
end
|
||||
it 'sends the proper recovery email' do
|
||||
srand(10)
|
||||
subject
|
||||
email_text = ActionMailer::Base.deliveries.last.body.raw_source
|
||||
expect(email_text).to match("recover_password/#{user1.id}/tfohbclx")
|
||||
end
|
||||
it 'sends a recovery email to the proper email' do
|
||||
subject
|
||||
expect(ActionMailer::Base.deliveries.last.to).to eql([user1.email])
|
||||
end
|
||||
it 'flashes a notice' do
|
||||
subject
|
||||
expect(subject.request.flash[:notice]).to match("Recovery email sent to #{user1.email}")
|
||||
end
|
||||
end
|
||||
describe 'get recover_password_form' do
|
||||
subject do
|
||||
get :recover_password_form, params: {id: user1.id, recovery_password: 'recovery password'}
|
||||
end
|
||||
it 'renders proper form' do
|
||||
subject
|
||||
expect(subject).to render_template('users/recover_password_form')
|
||||
end
|
||||
end
|
||||
describe 'post recover_password' do
|
||||
context 'when passwords match and recovery password is proper' do
|
||||
subject do
|
||||
post :recover_password, params: {
|
||||
user_id: user1.id,
|
||||
recovery_password: 'recovery password',
|
||||
password: 'new password',
|
||||
password_confirmation: 'new password'
|
||||
}
|
||||
end
|
||||
it 'flashes a notice about success' do
|
||||
subject
|
||||
expect(subject.request.flash[:notice]).to match('Password changed')
|
||||
end
|
||||
end
|
||||
context 'when recovery password is inproper' do
|
||||
subject do
|
||||
post :recover_password, params: {
|
||||
user_id: user1.id,
|
||||
recovery_password: 'improper recovery password',
|
||||
password: 'new password',
|
||||
password_confirmation: 'new password'
|
||||
}
|
||||
end
|
||||
it 'flashes a notice about failure' do
|
||||
subject
|
||||
expect(subject.request.flash[:notice]).to match('Recovery link expired or invalid')
|
||||
end
|
||||
end
|
||||
context 'when passwords match and recovery password is improper' do
|
||||
subject do
|
||||
post :recover_password, params: {
|
||||
user_id: user1.id,
|
||||
recovery_password: 'recovery password',
|
||||
password: 'new password',
|
||||
password_confirmation: 'bad password'
|
||||
}
|
||||
end
|
||||
it 'flashes a notice about failure' do
|
||||
subject
|
||||
expect(subject.request.flash[:notice]).to match('Passwords don\'t match')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,5 +1,5 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe UserMailer, type: :mailer do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
# TODO
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue