diff options
Diffstat (limited to 'spec/models/user_spec.rb')
-rw-r--r-- | spec/models/user_spec.rb | 221 |
1 files changed, 186 insertions, 35 deletions
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 3abf2a651a0..cb34917f073 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -20,6 +20,10 @@ RSpec.describe User do it { is_expected.to include_module(AsyncDeviseEmail) } end + describe 'constants' do + it { expect(described_class::COUNT_CACHE_VALIDITY_PERIOD).to be_a(Integer) } + end + describe 'delegations' do it { is_expected.to delegate_method(:path).to(:namespace).with_prefix } @@ -79,6 +83,7 @@ RSpec.describe User do it { is_expected.to have_one(:user_detail) } it { is_expected.to have_one(:atlassian_identity) } it { is_expected.to have_one(:user_highest_role) } + it { is_expected.to have_one(:credit_card_validation) } it { is_expected.to have_many(:snippets).dependent(:destroy) } it { is_expected.to have_many(:members) } it { is_expected.to have_many(:project_members) } @@ -132,7 +137,7 @@ RSpec.describe User do it 'creates `user_detail` when `bio` is first updated' do user = create(:user) - expect { user.update(bio: 'my bio') }.to change { user.user_detail.persisted? }.from(false).to(true) + expect { user.update!(bio: 'my bio') }.to change { user.user_detail.persisted? }.from(false).to(true) end end @@ -655,9 +660,10 @@ RSpec.describe User do it 'does not accept not verified emails' do email = create(:email) user = email.user - user.update(notification_email: email.email) + user.notification_email = email.email expect(user).to be_invalid + expect(user.errors[:notification_email]).to include('is not an email you own') end end @@ -665,7 +671,7 @@ RSpec.describe User do it 'accepts verified emails' do email = create(:email, :confirmed, email: 'test@test.com') user = email.user - user.update(public_email: email.email) + user.notification_email = email.email expect(user).to be_valid end @@ -673,9 +679,10 @@ RSpec.describe User do it 'does not accept not verified emails' do email = create(:email) user = email.user - user.update(public_email: email.email) + user.public_email = email.email expect(user).to be_invalid + expect(user.errors[:public_email]).to include('is not an email you own') end end @@ -721,6 +728,7 @@ RSpec.describe User do let_it_be(:blocked_user) { create(:user, :blocked) } let_it_be(:ldap_blocked_user) { create(:omniauth_user, :ldap_blocked) } let_it_be(:blocked_pending_approval_user) { create(:user, :blocked_pending_approval) } + let_it_be(:banned_user) { create(:user, :banned) } describe '.blocked' do subject { described_class.blocked } @@ -731,7 +739,7 @@ RSpec.describe User do ldap_blocked_user ) - expect(subject).not_to include(active_user, blocked_pending_approval_user) + expect(subject).not_to include(active_user, blocked_pending_approval_user, banned_user) end end @@ -742,6 +750,14 @@ RSpec.describe User do expect(subject).to contain_exactly(blocked_pending_approval_user) end end + + describe '.banned' do + subject { described_class.banned } + + it 'returns only banned users' do + expect(subject).to contain_exactly(banned_user) + end + end end describe ".with_two_factor" do @@ -1056,6 +1072,21 @@ RSpec.describe User do .to contain_exactly(user) end end + + describe '.for_todos' do + let_it_be(:user1) { create(:user) } + let_it_be(:user2) { create(:user) } + let_it_be(:issue) { create(:issue) } + + let_it_be(:todo1) { create(:todo, target: issue, author: user1, user: user1) } + let_it_be(:todo2) { create(:todo, target: issue, author: user1, user: user1) } + let_it_be(:todo3) { create(:todo, target: issue, author: user2, user: user2) } + + it 'returns users for the given todos' do + expect(described_class.for_todos(issue.todos)) + .to contain_exactly(user1, user2) + end + end end describe "Respond to" do @@ -1274,7 +1305,7 @@ RSpec.describe User do let(:secondary) { create(:email, :confirmed, email: 'secondary@example.com', user: user) } before do - user.emails.create(email_attrs) + user.emails.create!(email_attrs) user.tap { |u| u.update!(notification_email: email_attrs[:email]) }.reload end @@ -1366,6 +1397,26 @@ RSpec.describe User do end end + describe '#credit_card_validated_at' do + let_it_be(:user) { create(:user) } + + context 'when credit_card_validation does not exist' do + it 'returns nil' do + expect(user.credit_card_validated_at).to be nil + end + end + + context 'when credit_card_validation exists' do + it 'returns the credit card validated time' do + credit_card_validated_time = Time.current - 1.day + + create(:credit_card_validation, credit_card_validated_at: credit_card_validated_time, user: user) + + expect(user.credit_card_validated_at).to eq(credit_card_validated_time) + end + end + end + describe '#update_tracked_fields!', :clean_gitlab_redis_shared_state do let(:request) { OpenStruct.new(remote_ip: "127.0.0.1") } let(:user) { create(:user) } @@ -1428,7 +1479,7 @@ RSpec.describe User do let!(:accessible_deploy_keys_project) { create(:deploy_keys_project, project: project) } before do - public_deploy_keys_project.deploy_key.update(public: true) + public_deploy_keys_project.deploy_key.update!(public: true) project.add_developer(user) end @@ -1518,13 +1569,13 @@ RSpec.describe User do it 'receives callback when external changes' do expect(user).to receive(:ensure_user_rights_and_limits) - user.update(external: false) + user.update!(external: false) end it 'ensures correct rights and limits for user' do stub_config_setting(default_can_create_group: true) - expect { user.update(external: false) }.to change { user.can_create_group }.to(true) + expect { user.update!(external: false) }.to change { user.can_create_group }.to(true) .and change { user.projects_limit }.to(Gitlab::CurrentSettings.default_projects_limit) end end @@ -1535,11 +1586,11 @@ RSpec.describe User do it 'receives callback when external changes' do expect(user).to receive(:ensure_user_rights_and_limits) - user.update(external: true) + user.update!(external: true) end it 'ensures correct rights and limits for user' do - expect { user.update(external: true) }.to change { user.can_create_group }.to(false) + expect { user.update!(external: true) }.to change { user.can_create_group }.to(false) .and change { user.projects_limit }.to(0) end end @@ -1892,6 +1943,12 @@ RSpec.describe User do expect(described_class.filter_items('blocked')).to include user end + it 'filters by banned' do + expect(described_class).to receive(:banned).and_return([user]) + + expect(described_class.filter_items('banned')).to include user + end + it 'filters by blocked pending approval' do expect(described_class).to receive(:blocked_pending_approval).and_return([user]) @@ -2435,7 +2492,7 @@ RSpec.describe User do end context 'with a redirect route matching the given path' do - let!(:redirect_route) { user.namespace.redirect_routes.create(path: 'foo') } + let!(:redirect_route) { user.namespace.redirect_routes.create!(path: 'foo') } context 'without the follow_redirects option' do it 'returns nil' do @@ -2511,8 +2568,9 @@ RSpec.describe User do it 'is false if avatar is html page' do user.update_attribute(:avatar, 'uploads/avatar.html') + user.avatar_type - expect(user.avatar_type).to eq(['file format is not supported. Please try one of the following supported formats: png, jpg, jpeg, gif, bmp, tiff, ico, webp']) + expect(user.errors.added?(:avatar, "file format is not supported. Please try one of the following supported formats: png, jpg, jpeg, gif, bmp, tiff, ico, webp")).to be true end end @@ -2535,7 +2593,7 @@ RSpec.describe User do expect(Gitlab::AvatarCache).to receive(:delete_by_email).with(*user.verified_emails) - user.update(avatar: fixture_file_upload('spec/fixtures/dk.png')) + user.update!(avatar: fixture_file_upload('spec/fixtures/dk.png')) end end @@ -2849,12 +2907,12 @@ RSpec.describe User do expect(user.starred?(project1)).to be_truthy expect(user.starred?(project2)).to be_truthy - star1.destroy + star1.destroy! expect(user.starred?(project1)).to be_falsey expect(user.starred?(project2)).to be_truthy - star2.destroy + star2.destroy! expect(user.starred?(project1)).to be_falsey expect(user.starred?(project2)).to be_falsey @@ -3404,7 +3462,7 @@ RSpec.describe User do expect(user.authorized_projects).to include(project) - member.destroy + member.destroy! expect(user.authorized_projects).not_to include(project) end @@ -3429,7 +3487,7 @@ RSpec.describe User do expect(user2.authorized_projects).to include(project) - project.destroy + project.destroy! expect(user2.authorized_projects).not_to include(project) end @@ -3443,7 +3501,7 @@ RSpec.describe User do expect(user.authorized_projects).to include(project) - group.destroy + group.destroy! expect(user.authorized_projects).not_to include(project) end @@ -4200,16 +4258,45 @@ RSpec.describe User do end describe '#invalidate_issue_cache_counts' do - let(:user) { build_stubbed(:user) } + let_it_be(:user) { create(:user) } - it 'invalidates cache for issue counter' do - cache_mock = double + subject do + user.invalidate_issue_cache_counts + user.save! + end - expect(cache_mock).to receive(:delete).with(['users', user.id, 'assigned_open_issues_count']) + shared_examples 'invalidates the cached value' do + it 'invalidates cache for issue counter' do + expect(Rails.cache).to receive(:delete).with(['users', user.id, 'assigned_open_issues_count']) - allow(Rails).to receive(:cache).and_return(cache_mock) + subject + end + end - user.invalidate_issue_cache_counts + it_behaves_like 'invalidates the cached value' + + context 'if feature flag assigned_open_issues_cache is enabled' do + it 'calls the recalculate worker' do + expect(Users::UpdateOpenIssueCountWorker).to receive(:perform_async).with(user.id) + + subject + end + + it_behaves_like 'invalidates the cached value' + end + + context 'if feature flag assigned_open_issues_cache is disabled' do + before do + stub_feature_flags(assigned_open_issues_cache: false) + end + + it 'does not call the recalculate worker' do + expect(Users::UpdateOpenIssueCountWorker).not_to receive(:perform_async).with(user.id) + + subject + end + + it_behaves_like 'invalidates the cached value' end end @@ -4414,9 +4501,10 @@ RSpec.describe User do end it 'adds the namespace errors to the user' do - user.update(username: new_username) + user.username = new_username - expect(user.errors.full_messages.first).to eq('A user, alias, or group already exists with that username.') + expect(user).to be_invalid + expect(user.errors[:base]).to include('A user, alias, or group already exists with that username.') end end end @@ -5238,6 +5326,26 @@ RSpec.describe User do end end + describe 'user credit card validation' do + context 'when user is initialized' do + let(:user) { build(:user) } + + it { expect(user.credit_card_validation).not_to be_present } + end + + context 'when create user without credit card validation' do + let(:user) { create(:user) } + + it { expect(user.credit_card_validation).not_to be_present } + end + + context 'when user credit card validation exists' do + let(:user) { create(:user, :with_credit_card_validation) } + + it { expect(user.credit_card_validation).to be_persisted } + end + end + describe 'user detail' do context 'when user is initialized' do let(:user) { build(:user) } @@ -5307,21 +5415,21 @@ RSpec.describe User do with_them do context 'when state was changed' do - subject { user.update(attributes) } + subject { user.update!(attributes) } include_examples 'update highest role with exclusive lease' end end context 'when state was not changed' do - subject { user.update(email: 'newmail@example.com') } + subject { user.update!(email: 'newmail@example.com') } include_examples 'does not update the highest role' end end describe 'destroy user' do - subject { user.destroy } + subject { user.destroy! } include_examples 'does not update the highest role' end @@ -5343,7 +5451,7 @@ RSpec.describe User do context 'when user is a ghost user' do before do - user.update(user_type: :ghost) + user.update!(user_type: :ghost) end it { is_expected.to be false } @@ -5361,7 +5469,7 @@ RSpec.describe User do with_them do before do - user.update(user_type: user_type) + user.update!(user_type: user_type) end it { is_expected.to be expected_result } @@ -5384,7 +5492,7 @@ RSpec.describe User do context 'when user is an internal user' do before do - user.update(user_type: :ghost) + user.update!(user_type: :ghost) end it { is_expected.to be :forbidden } @@ -5418,7 +5526,7 @@ RSpec.describe User do context 'when user is an internal user' do before do - user.update(user_type: 'alert_bot') + user.update!(user_type: 'alert_bot') end it_behaves_like 'does not require password to be present' @@ -5426,7 +5534,7 @@ RSpec.describe User do context 'when user is a project bot user' do before do - user.update(user_type: 'project_bot') + user.update!(user_type: 'project_bot') end it_behaves_like 'does not require password to be present' @@ -5600,4 +5708,47 @@ RSpec.describe User do end end end + + describe '.dormant' do + it 'returns dormant users' do + freeze_time do + not_that_long_ago = (described_class::MINIMUM_INACTIVE_DAYS - 1).days.ago.to_date + too_long_ago = described_class::MINIMUM_INACTIVE_DAYS.days.ago.to_date + + create(:user, :deactivated, last_activity_on: too_long_ago) + + User::INTERNAL_USER_TYPES.map do |user_type| + create(:user, state: :active, user_type: user_type, last_activity_on: too_long_ago) + end + + create(:user, last_activity_on: not_that_long_ago) + + dormant_user = create(:user, last_activity_on: too_long_ago) + + expect(described_class.dormant).to contain_exactly(dormant_user) + end + end + end + + describe '.with_no_activity' do + it 'returns users with no activity' do + freeze_time do + not_that_long_ago = (described_class::MINIMUM_INACTIVE_DAYS - 1).days.ago.to_date + too_long_ago = described_class::MINIMUM_INACTIVE_DAYS.days.ago.to_date + + create(:user, :deactivated, last_activity_on: nil) + + User::INTERNAL_USER_TYPES.map do |user_type| + create(:user, state: :active, user_type: user_type, last_activity_on: nil) + end + + create(:user, last_activity_on: not_that_long_ago) + create(:user, last_activity_on: too_long_ago) + + user_with_no_activity = create(:user, last_activity_on: nil) + + expect(described_class.with_no_activity).to contain_exactly(user_with_no_activity) + end + end + end end |