mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 18:33:37 +08:00
2ee144c27f
* Also adds a event trigger when user logs in for the first time.
121 lines
3.9 KiB
Ruby
121 lines
3.9 KiB
Ruby
require 'rails_helper'
|
|
|
|
describe UsersEmailController do
|
|
|
|
describe '.confirm' do
|
|
it 'errors out for invalid tokens' do
|
|
get :confirm, token: 'asdfasdf'
|
|
expect(response).to be_success
|
|
expect(assigns(:update_result)).to eq(:error)
|
|
end
|
|
|
|
context 'valid old address token' do
|
|
let(:user) { Fabricate(:moderator) }
|
|
let(:updater) { EmailUpdater.new(user.guardian, user) }
|
|
|
|
before do
|
|
updater.change_to('new.n.cool@example.com')
|
|
end
|
|
|
|
it 'confirms with a correct token' do
|
|
get :confirm, token: user.email_tokens.last.token
|
|
expect(response).to be_success
|
|
expect(assigns(:update_result)).to eq(:authorizing_new)
|
|
end
|
|
end
|
|
|
|
context 'valid new address token' do
|
|
let(:user) { Fabricate(:user) }
|
|
let(:updater) { EmailUpdater.new(user.guardian, user) }
|
|
|
|
before do
|
|
updater.change_to('new.n.cool@example.com')
|
|
end
|
|
|
|
it 'confirms with a correct token' do
|
|
user.user_stat.update_columns(bounce_score: 42, reset_bounce_score_after: 1.week.from_now)
|
|
|
|
events = DiscourseEvent.track_events do
|
|
get :confirm, token: user.email_tokens.last.token
|
|
end
|
|
|
|
expect(events.map { |event| event[:event_name] }).to include(
|
|
:user_logged_in, :user_first_logged_in
|
|
)
|
|
|
|
expect(response).to be_success
|
|
expect(assigns(:update_result)).to eq(:complete)
|
|
|
|
user.reload
|
|
|
|
expect(user.user_stat.bounce_score).to eq(0)
|
|
expect(user.user_stat.reset_bounce_score_after).to eq(nil)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '.update' do
|
|
let(:new_email) { 'bubblegum@adventuretime.ooo' }
|
|
|
|
it "requires you to be logged in" do
|
|
expect { xhr :put, :update, username: 'asdf', email: new_email }.to raise_error(Discourse::NotLoggedIn)
|
|
end
|
|
|
|
context 'when logged in' do
|
|
let!(:user) { log_in }
|
|
|
|
it 'raises an error without an email parameter' do
|
|
expect { xhr :put, :update, username: user.username }.to raise_error(ActionController::ParameterMissing)
|
|
end
|
|
|
|
it "raises an error if you can't edit the user's email" do
|
|
Guardian.any_instance.expects(:can_edit_email?).with(user).returns(false)
|
|
xhr :put, :update, username: user.username, email: new_email
|
|
expect(response).to be_forbidden
|
|
end
|
|
|
|
context 'when the new email address is taken' do
|
|
let!(:other_user) { Fabricate(:coding_horror) }
|
|
it 'raises an error' do
|
|
xhr :put, :update, username: user.username, email: other_user.email
|
|
expect(response).to_not be_success
|
|
end
|
|
|
|
it 'raises an error if there is whitespace too' do
|
|
xhr :put, :update, username: user.username, email: other_user.email + ' '
|
|
expect(response).to_not be_success
|
|
end
|
|
end
|
|
|
|
context 'when new email is different case of existing email' do
|
|
let!(:other_user) { Fabricate(:user, email: 'case.insensitive@gmail.com')}
|
|
|
|
it 'raises an error' do
|
|
xhr :put, :update, username: user.username, email: other_user.email.upcase
|
|
expect(response).to_not be_success
|
|
end
|
|
end
|
|
|
|
it 'raises an error when new email domain is present in email_domains_blacklist site setting' do
|
|
SiteSetting.email_domains_blacklist = "mailinator.com"
|
|
xhr :put, :update, username: user.username, email: "not_good@mailinator.com"
|
|
expect(response).to_not be_success
|
|
end
|
|
|
|
it 'raises an error when new email domain is not present in email_domains_whitelist site setting' do
|
|
SiteSetting.email_domains_whitelist = "discourse.org"
|
|
xhr :put, :update, username: user.username, email: new_email
|
|
expect(response).to_not be_success
|
|
end
|
|
|
|
context 'success' do
|
|
it 'has an email token' do
|
|
expect { xhr :put, :update, username: user.username, email: new_email }.to change(EmailChangeRequest, :count)
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|