registrations_controller_spec.rb 4.8 KB
Newer Older
1 2 3
require 'spec_helper'

describe RegistrationsController do
4 5
  include TermsHelper

6
  describe '#create' do
7 8 9
    let(:user_params) { { user: { name: 'new_user', username: 'new_username', email: 'new@user.com', password: 'Any_password' } } }

    context 'email confirmation' do
10
      around do |example|
11 12 13
        perform_enqueued_jobs do
          example.run
        end
14 15
      end

16 17 18 19
      context 'when send_user_confirmation_email is false' do
        it 'signs the user in' do
          allow_any_instance_of(ApplicationSetting).to receive(:send_user_confirmation_email).and_return(false)

20
          expect { post(:create, user_params) }.not_to change { ActionMailer::Base.deliveries.size }
21 22 23
          expect(subject.current_user).not_to be_nil
        end
      end
24

25 26 27
      context 'when send_user_confirmation_email is true' do
        it 'does not authenticate user and sends confirmation email' do
          allow_any_instance_of(ApplicationSetting).to receive(:send_user_confirmation_email).and_return(true)
28

29 30 31 32 33
          post(:create, user_params)

          expect(ActionMailer::Base.deliveries.last.to.first).to eq(user_params[:user][:email])
          expect(subject.current_user).to be_nil
        end
34 35 36 37 38 39 40 41 42
      end

      context 'when signup_enabled? is false' do
        it 'redirects to sign_in' do
          allow_any_instance_of(ApplicationSetting).to receive(:signup_enabled?).and_return(false)

          expect { post(:create, user_params) }.not_to change(User, :count)
          expect(response).to redirect_to(new_user_session_path)
        end
43 44 45
      end
    end

46 47 48 49 50 51 52 53
    context 'when reCAPTCHA is enabled' do
      before do
        stub_application_setting(recaptcha_enabled: true)
      end

      it 'displays an error when the reCAPTCHA is not solved' do
        # Without this, `verify_recaptcha` arbitraily returns true in test env
        Recaptcha.configuration.skip_verify_env.delete('test')
54 55

        post(:create, user_params)
56 57

        expect(response).to render_template(:new)
58
        expect(flash[:alert]).to include 'There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.'
59 60 61 62 63 64 65 66 67 68 69
      end

      it 'redirects to the dashboard when the recaptcha is solved' do
        # Avoid test ordering issue and ensure `verify_recaptcha` returns true
        unless Recaptcha.configuration.skip_verify_env.include?('test')
          Recaptcha.configuration.skip_verify_env << 'test'
        end

        post(:create, user_params)

        expect(flash[:notice]).to include 'Welcome! You have signed up successfully.'
70 71
      end
    end
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

    context 'when terms are enforced' do
      before do
        enforce_terms
      end

      it 'redirects back with a notice when the checkbox was not checked' do
        post :create, user_params

        expect(flash[:alert]).to match /you must accept our terms/i
      end

      it 'creates the user with agreement when terms are accepted' do
        post :create, user_params.merge(terms_opt_in: '1')

        expect(subject.current_user).to be_present
        expect(subject.current_user.terms_accepted?).to be(true)
      end
    end
91
  end
S
Stan Hu 已提交
92 93 94 95 96 97 98 99

  describe '#destroy' do
    let(:user) { create(:user) }

    before do
      sign_in(user)
    end

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
    def expect_failure(message)
      expect(flash[:alert]).to eq(message)
      expect(response.status).to eq(303)
      expect(response).to redirect_to profile_account_path
    end

    def expect_password_failure
      expect_failure('Invalid password')
    end

    def expect_username_failure
      expect_failure('Invalid username')
    end

    def expect_success
      expect(flash[:notice]).to eq 'Account scheduled for removal.'
      expect(response.status).to eq(303)
      expect(response).to redirect_to new_user_session_path
    end
S
Stan Hu 已提交
119

120 121 122
    context 'user requires password confirmation' do
      it 'fails if password confirmation is not provided' do
        post :destroy
S
Stan Hu 已提交
123

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
        expect_password_failure
      end

      it 'fails if password confirmation is wrong' do
        post :destroy, password: 'wrong password'

        expect_password_failure
      end

      it 'succeeds if password is confirmed' do
        post :destroy, password: '12345678'

        expect_success
      end
    end

    context 'user does not require password confirmation' do
      before do
142 143
        stub_application_setting(password_authentication_enabled_for_web: false)
        stub_application_setting(password_authentication_enabled_for_git: false)
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
      end

      it 'fails if username confirmation is not provided' do
        post :destroy

        expect_username_failure
      end

      it 'fails if username confirmation is wrong' do
        post :destroy, username: 'wrong username'

        expect_username_failure
      end

      it 'succeeds if username is confirmed' do
        post :destroy, username: user.username

        expect_success
      end
S
Stan Hu 已提交
163 164
    end
  end
165
end