summaryrefslogtreecommitdiff
path: root/spec/models/user_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/user_spec.rb')
-rw-r--r--spec/models/user_spec.rb167
1 files changed, 162 insertions, 5 deletions
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index a9e8bd2d27b..cb78e1015ea 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -311,7 +311,7 @@ describe User do
end
it_behaves_like 'an object with RFC3696 compliant email-formated attributes', :public_email, :notification_email do
- subject { build(:user).tap { |user| user.emails << build(:email, email: email_value) } }
+ subject { create(:user).tap { |user| user.emails << build(:email, email: email_value, confirmed_at: Time.current) } }
end
describe '#commit_email' do
@@ -568,6 +568,32 @@ describe User do
user = build(:user, email: "temp-email-for-oauth@example.com")
expect(user).to be_valid
end
+
+ it 'does not accept not verified emails' do
+ email = create(:email)
+ user = email.user
+ user.update(notification_email: email.email)
+
+ expect(user).to be_invalid
+ end
+ end
+
+ context 'owns_public_email' do
+ it 'accepts verified emails' do
+ email = create(:email, :confirmed, email: 'test@test.com')
+ user = email.user
+ user.update(public_email: email.email)
+
+ expect(user).to be_valid
+ end
+
+ it 'does not accept not verified emails' do
+ email = create(:email)
+ user = email.user
+ user.update(public_email: email.email)
+
+ expect(user).to be_invalid
+ end
end
context 'set_commit_email' do
@@ -791,6 +817,7 @@ describe User do
let_it_be(:expired_token) { create(:personal_access_token, user: user1, expires_at: 2.days.ago) }
let_it_be(:revoked_token) { create(:personal_access_token, user: user1, revoked: true) }
+ let_it_be(:impersonation_token) { create(:personal_access_token, :impersonation, user: user1, expires_at: 2.days.from_now) }
let_it_be(:valid_token_and_notified) { create(:personal_access_token, user: user2, expires_at: 2.days.from_now, expire_notification_delivered: true) }
let_it_be(:valid_token1) { create(:personal_access_token, user: user2, expires_at: 2.days.from_now) }
let_it_be(:valid_token2) { create(:personal_access_token, user: user2, expires_at: 2.days.from_now) }
@@ -917,6 +944,108 @@ describe User do
expect(@user.emails.count).to eq 1
expect(@user.emails.first.confirmed_at).not_to eq nil
end
+
+ context 'when the first email was unconfirmed and the second email gets confirmed' do
+ let(:user) { create(:user, :unconfirmed, email: 'should-be-unconfirmed@test.com') }
+
+ before do
+ user.update!(email: 'should-be-confirmed@test.com')
+ user.confirm
+ end
+
+ it 'updates user.email' do
+ expect(user.email).to eq('should-be-confirmed@test.com')
+ end
+
+ it 'confirms user.email' do
+ expect(user).to be_confirmed
+ end
+
+ it 'keeps the unconfirmed email unconfirmed' do
+ email = user.emails.first
+
+ expect(email.email).to eq('should-be-unconfirmed@test.com')
+ expect(email).not_to be_confirmed
+ end
+
+ it 'has only one email association' do
+ expect(user.emails.size).to eq(1)
+ end
+ end
+ end
+
+ context 'when an existing email record is set as primary' do
+ let(:user) { create(:user, email: 'confirmed@test.com') }
+
+ context 'when it is unconfirmed' do
+ let(:originally_unconfirmed_email) { 'should-stay-unconfirmed@test.com' }
+
+ before do
+ user.emails << create(:email, email: originally_unconfirmed_email, confirmed_at: nil)
+
+ user.update!(email: originally_unconfirmed_email)
+ end
+
+ it 'keeps the user confirmed' do
+ expect(user).to be_confirmed
+ end
+
+ it 'keeps the original email' do
+ expect(user.email).to eq('confirmed@test.com')
+ end
+
+ context 'when the email gets confirmed' do
+ before do
+ user.confirm
+ end
+
+ it 'keeps the user confirmed' do
+ expect(user).to be_confirmed
+ end
+
+ it 'updates the email' do
+ expect(user.email).to eq(originally_unconfirmed_email)
+ end
+ end
+ end
+
+ context 'when it is confirmed' do
+ let!(:old_confirmed_email) { user.email }
+ let(:confirmed_email) { 'already-confirmed@test.com' }
+
+ before do
+ user.emails << create(:email, :confirmed, email: confirmed_email)
+
+ user.update!(email: confirmed_email)
+ end
+
+ it 'keeps the user confirmed' do
+ expect(user).to be_confirmed
+ end
+
+ it 'updates the email' do
+ expect(user.email).to eq(confirmed_email)
+ end
+
+ it 'moves the old email' do
+ email = user.reload.emails.first
+
+ expect(email.email).to eq(old_confirmed_email)
+ expect(email).to be_confirmed
+ end
+ end
+ end
+
+ context 'when unconfirmed user deletes a confirmed additional email' do
+ let(:user) { create(:user, :unconfirmed) }
+
+ before do
+ user.emails << create(:email, :confirmed)
+ end
+
+ it 'does not affect the confirmed status' do
+ expect { user.emails.confirmed.destroy_all }.not_to change { user.confirmed? } # rubocop: disable Cop/DestroyAll
+ end
end
describe '#update_notification_email' do
@@ -2070,6 +2199,31 @@ describe User do
end
end
+ describe '#public_verified_emails' do
+ let(:user) { create(:user) }
+
+ it 'returns only confirmed public emails' do
+ email_confirmed = create :email, user: user, confirmed_at: Time.current
+ create :email, user: user
+
+ expect(user.public_verified_emails).to contain_exactly(
+ user.email,
+ email_confirmed.email
+ )
+ end
+
+ it 'returns confirmed public emails plus main user email when user is not confirmed' do
+ user = create(:user, confirmed_at: nil)
+ email_confirmed = create :email, user: user, confirmed_at: Time.current
+ create :email, user: user
+
+ expect(user.public_verified_emails).to contain_exactly(
+ user.email,
+ email_confirmed.email
+ )
+ end
+ end
+
describe '#verified_email?' do
let(:user) { create(:user) }
@@ -4200,9 +4354,10 @@ describe User do
context 'when an ancestor has a level other than Global' do
let(:ancestor) { create(:group) }
let(:group) { create(:group, parent: ancestor) }
+ let(:email) { create(:email, :confirmed, email: 'ancestor@example.com', user: user) }
before do
- create(:notification_setting, user: user, source: ancestor, level: 'participating', notification_email: 'ancestor@example.com')
+ create(:notification_setting, user: user, source: ancestor, level: 'participating', notification_email: email.email)
end
it 'has the same level set' do
@@ -4227,10 +4382,12 @@ describe User do
let(:grand_ancestor) { create(:group) }
let(:ancestor) { create(:group, parent: grand_ancestor) }
let(:group) { create(:group, parent: ancestor) }
+ let(:ancestor_email) { create(:email, :confirmed, email: 'ancestor@example.com', user: user) }
+ let(:grand_email) { create(:email, :confirmed, email: 'grand@example.com', user: user) }
before do
- create(:notification_setting, user: user, source: grand_ancestor, level: 'participating', notification_email: 'grand@example.com')
- create(:notification_setting, user: user, source: ancestor, level: 'global', notification_email: 'ancestor@example.com')
+ create(:notification_setting, user: user, source: grand_ancestor, level: 'participating', notification_email: grand_email.email)
+ create(:notification_setting, user: user, source: ancestor, level: 'global', notification_email: ancestor_email.email)
end
it 'has the same email set' do
@@ -4268,7 +4425,7 @@ describe User do
context 'when group has notification email set' do
it 'returns group notification email' do
group_notification_email = 'user+group@example.com'
-
+ create(:email, :confirmed, user: user, email: group_notification_email)
create(:notification_setting, user: user, source: group, notification_email: group_notification_email)
is_expected.to eq(group_notification_email)