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 } it 'renders the users/new template' do expect(subject).to render_template('users/new') end end describe 'get create' do subject do get :create, params: {user: {email: 'test2@example.com', password: 'abcde'}} end it 'creates a user' do subject 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