user_spec.rb 29.6 KB
Newer Older
G
gitlabhq 已提交
1 2
require 'spec_helper'

D
Douwe Maan 已提交
3
describe User, models: true do
4 5
  include Gitlab::CurrentSettings

6 7 8 9 10 11 12 13 14 15 16
  describe 'modules' do
    subject { described_class }

    it { is_expected.to include_module(Gitlab::ConfigHelper) }
    it { is_expected.to include_module(Gitlab::CurrentSettings) }
    it { is_expected.to include_module(Referable) }
    it { is_expected.to include_module(Sortable) }
    it { is_expected.to include_module(TokenAuthenticatable) }
  end

  describe 'associations' do
17 18 19 20 21 22 23 24 25 26 27 28 29
    it { is_expected.to have_one(:namespace) }
    it { is_expected.to have_many(:snippets).class_name('Snippet').dependent(:destroy) }
    it { is_expected.to have_many(:project_members).dependent(:destroy) }
    it { is_expected.to have_many(:groups) }
    it { is_expected.to have_many(:keys).dependent(:destroy) }
    it { is_expected.to have_many(:events).class_name('Event').dependent(:destroy) }
    it { is_expected.to have_many(:recent_events).class_name('Event') }
    it { is_expected.to have_many(:issues).dependent(:destroy) }
    it { is_expected.to have_many(:notes).dependent(:destroy) }
    it { is_expected.to have_many(:assigned_issues).dependent(:destroy) }
    it { is_expected.to have_many(:merge_requests).dependent(:destroy) }
    it { is_expected.to have_many(:assigned_merge_requests).dependent(:destroy) }
    it { is_expected.to have_many(:identities).dependent(:destroy) }
R
Rémy Coutable 已提交
30
    it { is_expected.to have_one(:abuse_report) }
31
    it { is_expected.to have_many(:spam_logs).dependent(:destroy) }
32
    it { is_expected.to have_many(:todos).dependent(:destroy) }
33
    it { is_expected.to have_many(:award_emoji).dependent(:destroy) }
34 35 36
  end

  describe 'validations' do
R
Robert Speicher 已提交
37 38 39 40 41 42 43 44 45 46 47 48 49
    describe 'username' do
      it 'validates presence' do
        expect(subject).to validate_presence_of(:username)
      end

      it 'rejects blacklisted names' do
        user = build(:user, username: 'dashboard')

        expect(user).not_to be_valid
        expect(user.errors.values).to eq [['dashboard is a reserved name']]
      end

      it 'validates uniqueness' do
50
        expect(subject).to validate_uniqueness_of(:username).case_insensitive
R
Robert Speicher 已提交
51 52 53
      end
    end

54 55 56 57
    it { is_expected.to validate_presence_of(:projects_limit) }
    it { is_expected.to validate_numericality_of(:projects_limit) }
    it { is_expected.to allow_value(0).for(:projects_limit) }
    it { is_expected.not_to allow_value(-1).for(:projects_limit) }
58

59
    it { is_expected.to validate_length_of(:bio).is_within(0..255) }
60

61 62 63
    it_behaves_like 'an object with email-formated attributes', :email do
      subject { build(:user) }
    end
64

65 66 67
    it_behaves_like 'an object with email-formated attributes', :public_email, :notification_email do
      subject { build(:user).tap { |user| user.emails << build(:email, email: email_value) } }
    end
68

69
    describe 'email' do
70
      context 'when no signup domains listed' do
71 72 73
        before do
          allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return([])
        end
74

75 76 77 78 79 80 81
        it 'accepts any email' do
          user = build(:user, email: "info@example.com")
          expect(user).to be_valid
        end
      end

      context 'when a signup domain is listed and subdomains are allowed' do
82 83 84
        before do
          allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return(['example.com', '*.example.com'])
        end
85

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
        it 'accepts info@example.com' do
          user = build(:user, email: "info@example.com")
          expect(user).to be_valid
        end

        it 'accepts info@test.example.com' do
          user = build(:user, email: "info@test.example.com")
          expect(user).to be_valid
        end

        it 'rejects example@test.com' do
          user = build(:user, email: "example@test.com")
          expect(user).to be_invalid
        end
      end

      context 'when a signup domain is listed and subdomains are not allowed' do
103 104 105
        before do
          allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return(['example.com'])
        end
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

        it 'accepts info@example.com' do
          user = build(:user, email: "info@example.com")
          expect(user).to be_valid
        end

        it 'rejects info@test.example.com' do
          user = build(:user, email: "info@test.example.com")
          expect(user).to be_invalid
        end

        it 'rejects example@test.com' do
          user = build(:user, email: "example@test.com")
          expect(user).to be_invalid
        end
      end
122 123 124 125 126 127 128

      context 'owns_notification_email' do
        it 'accepts temp_oauth_email emails' do
          user = build(:user, email: "temp-email-for-oauth@example.com")
          expect(user).to be_valid
        end
      end
129
    end
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
  end

  describe "scopes" do
    describe ".with_two_factor" do
      it "returns users with 2fa enabled via OTP" do
        user_with_2fa = create(:user, :two_factor_via_otp)
        user_without_2fa = create(:user)
        users_with_two_factor = User.with_two_factor.pluck(:id)

        expect(users_with_two_factor).to include(user_with_2fa.id)
        expect(users_with_two_factor).not_to include(user_without_2fa.id)
      end

      it "returns users with 2fa enabled via U2F" do
        user_with_2fa = create(:user, :two_factor_via_u2f)
        user_without_2fa = create(:user)
        users_with_two_factor = User.with_two_factor.pluck(:id)

        expect(users_with_two_factor).to include(user_with_2fa.id)
        expect(users_with_two_factor).not_to include(user_without_2fa.id)
      end

      it "returns users with 2fa enabled via OTP and U2F" do
        user_with_2fa = create(:user, :two_factor_via_otp, :two_factor_via_u2f)
        user_without_2fa = create(:user)
        users_with_two_factor = User.with_two_factor.pluck(:id)

        expect(users_with_two_factor).to eq([user_with_2fa.id])
        expect(users_with_two_factor).not_to include(user_without_2fa.id)
      end
    end

    describe ".without_two_factor" do
      it "excludes users with 2fa enabled via OTP" do
        user_with_2fa = create(:user, :two_factor_via_otp)
        user_without_2fa = create(:user)
        users_without_two_factor = User.without_two_factor.pluck(:id)

        expect(users_without_two_factor).to include(user_without_2fa.id)
        expect(users_without_two_factor).not_to include(user_with_2fa.id)
      end

      it "excludes users with 2fa enabled via U2F" do
        user_with_2fa = create(:user, :two_factor_via_u2f)
        user_without_2fa = create(:user)
        users_without_two_factor = User.without_two_factor.pluck(:id)

        expect(users_without_two_factor).to include(user_without_2fa.id)
        expect(users_without_two_factor).not_to include(user_with_2fa.id)
      end

      it "excludes users with 2fa enabled via OTP and U2F" do
        user_with_2fa = create(:user, :two_factor_via_otp, :two_factor_via_u2f)
        user_without_2fa = create(:user)
        users_without_two_factor = User.without_two_factor.pluck(:id)

        expect(users_without_two_factor).to include(user_without_2fa.id)
        expect(users_without_two_factor).not_to include(user_with_2fa.id)
      end
    end
G
gitlabhq 已提交
190 191 192
  end

  describe "Respond to" do
193 194 195
    it { is_expected.to respond_to(:is_admin?) }
    it { is_expected.to respond_to(:name) }
    it { is_expected.to respond_to(:private_token) }
Z
Zeger-Jan van de Weg 已提交
196 197 198 199 200 201 202 203 204 205 206 207 208 209
    it { is_expected.to respond_to(:external?) }
  end

  describe 'before save hook' do
    context 'when saving an external user' do
      let(:user)          { create(:user) }
      let(:external_user) { create(:user, external: true) }

      it "sets other properties aswell" do
        expect(external_user.can_create_team).to be_falsey
        expect(external_user.can_create_group).to be_falsey
        expect(external_user.projects_limit).to be 0
      end
    end
G
gitlabhq 已提交
210 211
  end

212
  describe '#confirm' do
213 214 215
    before do
      allow_any_instance_of(ApplicationSetting).to receive(:send_user_confirmation_email).and_return(true)
    end
216

217 218 219 220 221 222 223
    let(:user) { create(:user, confirmed_at: nil, unconfirmed_email: 'test@gitlab.com') }

    it 'returns unconfirmed' do
      expect(user.confirmed?).to be_falsey
    end

    it 'confirms a user' do
224
      user.confirm
225 226 227 228
      expect(user.confirmed?).to be_truthy
    end
  end

229 230 231 232 233 234 235 236
  describe '#to_reference' do
    let(:user) { create(:user) }

    it 'returns a String reference to the object' do
      expect(user.to_reference).to eq "@#{user.username}"
    end
  end

237 238 239
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
240
      expect(user).to receive(:generate_password)
241 242 243 244
      user.save
    end

    it "should not generate password by default" do
245
      user = create(:user, password: 'abcdefghe')
246
      expect(user.password).to eq('abcdefghe')
247
    end
248

249
    it "should generate password when forcing random password" do
250
      allow(Devise).to receive(:friendly_token).and_return('123456789')
251
      user = create(:user, password: 'abcdefg', force_random_password: true)
252
      expect(user.password).to eq('12345678')
253
    end
254 255
  end

256 257
  describe 'authentication token' do
    it "should have authentication token" do
258
      user = create(:user)
259
      expect(user.authentication_token).not_to be_blank
260
    end
N
Nihad Abbasov 已提交
261
  end
262

263
  describe '#recently_sent_password_reset?' do
264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
    it 'is false when reset_password_sent_at is nil' do
      user = build_stubbed(:user, reset_password_sent_at: nil)

      expect(user.recently_sent_password_reset?).to eq false
    end

    it 'is false when sent more than one minute ago' do
      user = build_stubbed(:user, reset_password_sent_at: 5.minutes.ago)

      expect(user.recently_sent_password_reset?).to eq false
    end

    it 'is true when sent less than one minute ago' do
      user = build_stubbed(:user, reset_password_sent_at: Time.now)

      expect(user.recently_sent_password_reset?).to eq true
    end
  end

R
Robert Speicher 已提交
283 284 285 286 287 288 289
  describe '#disable_two_factor!' do
    it 'clears all 2FA-related fields' do
      user = create(:user, :two_factor)

      expect(user).to be_two_factor_enabled
      expect(user.encrypted_otp_secret).not_to be_nil
      expect(user.otp_backup_codes).not_to be_nil
290
      expect(user.otp_grace_period_started_at).not_to be_nil
R
Robert Speicher 已提交
291 292 293 294 295 296 297 298

      user.disable_two_factor!

      expect(user).not_to be_two_factor_enabled
      expect(user.encrypted_otp_secret).to be_nil
      expect(user.encrypted_otp_secret_iv).to be_nil
      expect(user.encrypted_otp_secret_salt).to be_nil
      expect(user.otp_backup_codes).to be_nil
299
      expect(user.otp_grace_period_started_at).to be_nil
R
Robert Speicher 已提交
300 301 302
    end
  end

303 304 305 306
  describe 'projects' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
D
Dmitriy Zaporozhets 已提交
307 308
      @project_2 = create :project, group: create(:group) # Grant MASTER access to the user
      @project_3 = create :project, group: create(:group) # Grant DEVELOPER access to the user
309

310 311
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
312 313
    end

314 315 316 317 318 319 320 321 322
    it { expect(@user.authorized_projects).to include(@project) }
    it { expect(@user.authorized_projects).to include(@project_2) }
    it { expect(@user.authorized_projects).to include(@project_3) }
    it { expect(@user.owned_projects).to include(@project) }
    it { expect(@user.owned_projects).not_to include(@project_2) }
    it { expect(@user.owned_projects).not_to include(@project_3) }
    it { expect(@user.personal_projects).to include(@project) }
    it { expect(@user.personal_projects).not_to include(@project_2) }
    it { expect(@user.personal_projects).not_to include(@project_3) }
323 324 325 326 327
  end

  describe 'groups' do
    before do
      @user = create :user
328 329
      @group = create :group
      @group.add_owner(@user)
330 331
    end

332 333 334
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
335
    it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
336 337
  end

338 339 340 341
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
342 343
      @group = create :group
      @group.add_owner(@user)
344

345
      @group.add_user(@user2, GroupMember::OWNER)
346 347
    end

348
    it { expect(@user2.several_namespaces?).to be_truthy }
349 350
  end

351 352 353 354 355 356
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

357
    it { expect(@user.several_namespaces?).to be_falsey }
358
    it { expect(@user.namespaces).to eq([@user.namespace]) }
359 360 361 362 363 364 365
  end

  describe 'blocking user' do
    let(:user) { create(:user, name: 'John Smith') }

    it "should block user" do
      user.block
366
      expect(user.blocked?).to be_truthy
367 368 369
    end
  end

370 371 372 373 374 375 376
  describe '.filter' do
    let(:user) { double }

    it 'filters by active users by default' do
      expect(User).to receive(:active).and_return([user])

      expect(User.filter(nil)).to include user
377 378
    end

379 380 381 382
    it 'filters by admins' do
      expect(User).to receive(:admins).and_return([user])

      expect(User.filter('admins')).to include user
383 384
    end

385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
    it 'filters by blocked' do
      expect(User).to receive(:blocked).and_return([user])

      expect(User.filter('blocked')).to include user
    end

    it 'filters by two_factor_disabled' do
      expect(User).to receive(:without_two_factor).and_return([user])

      expect(User.filter('two_factor_disabled')).to include user
    end

    it 'filters by two_factor_enabled' do
      expect(User).to receive(:with_two_factor).and_return([user])

      expect(User.filter('two_factor_enabled')).to include user
    end

    it 'filters by wop' do
      expect(User).to receive(:without_projects).and_return([user])

      expect(User.filter('wop')).to include user
    end
408 409 410 411
  end

  describe :not_in_project do
    before do
412
      User.delete_all
413 414 415 416
      @user = create :user
      @project = create :project
    end

417
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
418
  end
D
Dmitriy Zaporozhets 已提交
419

420 421 422
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
423

424 425 426 427 428
      it { expect(user.is_admin?).to be_falsey }
      it { expect(user.require_ssh_key?).to be_truthy }
      it { expect(user.can_create_group?).to be_truthy }
      it { expect(user.can_create_project?).to be_truthy }
      it { expect(user.first_name).to eq('John') }
429
    end
430

D
Dmitriy Zaporozhets 已提交
431
    describe 'with defaults' do
432
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
433

D
Dmitriy Zaporozhets 已提交
434
      it "should apply defaults to user" do
435 436 437
        expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit)
        expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group)
        expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme)
Z
Zeger-Jan van de Weg 已提交
438
        expect(user.external).to be_falsey
439 440 441
      end
    end

D
Dmitriy Zaporozhets 已提交
442
    describe 'with default overrides' do
443
      let(:user) { User.new(projects_limit: 123, can_create_group: false, can_create_team: true, theme_id: 1) }
D
Dmitriy Zaporozhets 已提交
444

D
Dmitriy Zaporozhets 已提交
445
      it "should apply defaults to user" do
446 447
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
448
        expect(user.theme_id).to eq(1)
449
      end
450 451
    end
  end
452

453
  describe '.find_by_any_email' do
454 455 456
    it 'finds by primary email' do
      user = create(:user, email: 'foo@example.com')

457
      expect(User.find_by_any_email(user.email)).to eq user
458 459 460 461 462 463
    end

    it 'finds by secondary email' do
      email = create(:email, email: 'foo@example.com')
      user  = email.user

464
      expect(User.find_by_any_email(email.email)).to eq user
465 466 467
    end

    it 'returns nil when nothing found' do
468
      expect(User.find_by_any_email('')).to be_nil
469 470 471
    end
  end

472 473 474 475 476 477 478 479 480 481 482
  describe '.search' do
    let(:user) { create(:user) }

    it 'returns users with a matching name' do
      expect(described_class.search(user.name)).to eq([user])
    end

    it 'returns users with a partially matching name' do
      expect(described_class.search(user.name[0..2])).to eq([user])
    end

Y
Yorick Peterse 已提交
483
    it 'returns users with a matching name regardless of the casing' do
484 485 486 487 488 489 490 491 492 493 494
      expect(described_class.search(user.name.upcase)).to eq([user])
    end

    it 'returns users with a matching Email' do
      expect(described_class.search(user.email)).to eq([user])
    end

    it 'returns users with a partially matching Email' do
      expect(described_class.search(user.email[0..2])).to eq([user])
    end

Y
Yorick Peterse 已提交
495
    it 'returns users with a matching Email regardless of the casing' do
496 497 498 499 500 501 502 503 504 505 506
      expect(described_class.search(user.email.upcase)).to eq([user])
    end

    it 'returns users with a matching username' do
      expect(described_class.search(user.username)).to eq([user])
    end

    it 'returns users with a partially matching username' do
      expect(described_class.search(user.username[0..2])).to eq([user])
    end

Y
Yorick Peterse 已提交
507
    it 'returns users with a matching username regardless of the casing' do
508
      expect(described_class.search(user.username.upcase)).to eq([user])
M
Marin Jankovski 已提交
509 510 511
    end
  end

512
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
513 514
    let(:user1) { create(:user, username: 'foo') }

515
    it "should get the correct user" do
516 517 518 519
      expect(User.by_username_or_id(user1.id)).to eq(user1)
      expect(User.by_username_or_id('foo')).to eq(user1)
      expect(User.by_username_or_id(-1)).to be_nil
      expect(User.by_username_or_id('bar')).to be_nil
520 521
    end
  end
G
GitLab 已提交
522

523 524 525 526 527 528 529 530 531 532 533 534 535 536
  describe '.by_login' do
    let(:username) { 'John' }
    let!(:user) { create(:user, username: username) }

    it 'should get the correct user' do
      expect(User.by_login(user.email.upcase)).to eq user
      expect(User.by_login(user.email)).to eq user
      expect(User.by_login(username.downcase)).to eq user
      expect(User.by_login(username)).to eq user
      expect(User.by_login(nil)).to be_nil
      expect(User.by_login('')).to be_nil
    end
  end

R
Robert Speicher 已提交
537 538 539 540 541 542 543 544 545 546 547 548
  describe '.find_by_username!' do
    it 'raises RecordNotFound' do
      expect { described_class.find_by_username!('JohnDoe') }.
        to raise_error(ActiveRecord::RecordNotFound)
    end

    it 'is case-insensitive' do
      user = create(:user, username: 'JohnDoe')
      expect(described_class.find_by_username!('JOHNDOE')).to eq user
    end
  end

G
GitLab 已提交
549
  describe 'all_ssh_keys' do
550
    it { is_expected.to have_many(:keys).dependent(:destroy) }
G
GitLab 已提交
551 552 553 554 555

    it "should have all ssh keys" do
      user = create :user
      key = create :key, key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD33bWLBxu48Sev9Fert1yzEO4WGcWglWF7K/AwblIUFselOt/QdOL9DSjpQGxLagO1s9wl53STIO8qGS4Ms0EJZyIXOEFMjFJ5xmjSy+S37By4sG7SsltQEHMxtbtFOaW5LV2wCrX+rUsRNqLMamZjgjcPO0/EgGCXIGMAYW4O7cwGZdXWYIhQ1Vwy+CsVMDdPkPgBXqK7nR/ey8KMs8ho5fMNgB5hBw/AL9fNGhRw3QTD6Q12Nkhl4VZES2EsZqlpNnJttnPdp847DUsT6yuLRlfiQfz5Cn9ysHFdXObMN5VYIiPFwHeYCZp1X2S4fDZooRE8uOLTfxWHPXwrhqSH", user_id: user.id

556
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
557
    end
G
GitLab 已提交
558
  end
559

D
Dmitriy Zaporozhets 已提交
560 561 562 563 564
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
565
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
566 567 568 569
    end

    it "should be false if avatar is html page" do
      user.update_attribute(:avatar, 'uploads/avatar.html')
570
      expect(user.avatar_type).to eq(["only images allowed"])
D
Dmitriy Zaporozhets 已提交
571 572
    end
  end
J
Jerome Dalbert 已提交
573

574 575 576
  describe :requires_ldap_check? do
    let(:user) { User.new }

577 578
    it 'is false when LDAP is disabled' do
      # Create a condition which would otherwise cause 'true' to be returned
579
      allow(user).to receive(:ldap_user?).and_return(true)
580
      user.last_credential_check_at = nil
581
      expect(user.requires_ldap_check?).to be_falsey
582 583
    end

584
    context 'when LDAP is enabled' do
585 586 587
      before do
        allow(Gitlab.config.ldap).to receive(:enabled).and_return(true)
      end
588

589
      it 'is false for non-LDAP users' do
590
        allow(user).to receive(:ldap_user?).and_return(false)
591
        expect(user.requires_ldap_check?).to be_falsey
592 593
      end

594
      context 'and when the user is an LDAP user' do
595 596 597
        before do
          allow(user).to receive(:ldap_user?).and_return(true)
        end
598 599 600

        it 'is true when the user has never had an LDAP check before' do
          user.last_credential_check_at = nil
601
          expect(user.requires_ldap_check?).to be_truthy
602 603 604 605
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
606
          expect(user.requires_ldap_check?).to be_truthy
607
        end
608 609 610 611
      end
    end
  end

612 613 614 615 616 617
  context 'ldap synchronized user' do
    describe :ldap_user? do
      it 'is true if provider name starts with ldap' do
        user = create(:omniauth_user, provider: 'ldapmain')
        expect(user.ldap_user?).to be_truthy
      end
618

619 620 621 622 623 624 625 626 627
      it 'is false for other providers' do
        user = create(:omniauth_user, provider: 'other-provider')
        expect(user.ldap_user?).to be_falsey
      end

      it 'is false if no extern_uid is provided' do
        user = create(:omniauth_user, extern_uid: nil)
        expect(user.ldap_user?).to be_falsey
      end
628 629
    end

630 631 632 633 634
    describe :ldap_identity do
      it 'returns ldap identity' do
        user = create :omniauth_user
        expect(user.ldap_identity.provider).not_to be_empty
      end
635 636
    end

637 638 639 640 641 642 643 644
    describe '#ldap_block' do
      let(:user) { create(:omniauth_user, provider: 'ldapmain', name: 'John Smith') }

      it 'blocks user flaging the action caming from ldap' do
        user.ldap_block
        expect(user.blocked?).to be_truthy
        expect(user.ldap_blocked?).to be_truthy
      end
645 646 647
    end
  end

J
Jerome Dalbert 已提交
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686
  describe '#full_website_url' do
    let(:user) { create(:user) }

    it 'begins with http if website url omits it' do
      user.website_url = 'test.com'

      expect(user.full_website_url).to eq 'http://test.com'
    end

    it 'begins with http if website url begins with http' do
      user.website_url = 'http://test.com'

      expect(user.full_website_url).to eq 'http://test.com'
    end

    it 'begins with https if website url begins with https' do
      user.website_url = 'https://test.com'

      expect(user.full_website_url).to eq 'https://test.com'
    end
  end

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

    it 'does not begin with http if website url omits it' do
      user.website_url = 'test.com'

      expect(user.short_website_url).to eq 'test.com'
    end

    it 'does not begin with http if website url begins with http' do
      user.website_url = 'http://test.com'

      expect(user.short_website_url).to eq 'test.com'
    end

    it 'does not begin with https if website url begins with https' do
      user.website_url = 'https://test.com'
687

J
Jerome Dalbert 已提交
688 689
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
690
  end
C
Ciro Santilli 已提交
691

692 693 694 695 696 697
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

698 699
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
700 701

      star1 = UsersStarProject.create!(project: project1, user: user)
702 703
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_falsey
704 705

      star2 = UsersStarProject.create!(project: project2, user: user)
706 707
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
708 709

      star1.destroy
710 711
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
712 713

      star2.destroy
714 715
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
716 717 718
    end
  end

C
Ciro Santilli 已提交
719 720 721 722 723
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

724
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
725
      user.toggle_star(project)
726
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
727
      user.toggle_star(project)
728
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
729 730
    end
  end
V
Valery Sizov 已提交
731 732 733 734 735 736 737

  describe "#sort" do
    before do
      User.delete_all
      @user = create :user, created_at: Date.today, last_sign_in_at: Date.today, name: 'Alpha'
      @user1 = create :user, created_at: Date.today - 1, last_sign_in_at: Date.today - 1, name: 'Omega'
    end
738

Y
Yorick Peterse 已提交
739
    it "sorts users by the recent sign-in time" do
740
      expect(User.sort('recent_sign_in').first).to eq(@user)
V
Valery Sizov 已提交
741 742
    end

Y
Yorick Peterse 已提交
743
    it "sorts users by the oldest sign-in time" do
744
      expect(User.sort('oldest_sign_in').first).to eq(@user1)
V
Valery Sizov 已提交
745 746
    end

Y
Yorick Peterse 已提交
747
    it "sorts users in descending order by their creation time" do
748
      expect(User.sort('created_desc').first).to eq(@user)
V
Valery Sizov 已提交
749 750
    end

Y
Yorick Peterse 已提交
751
    it "sorts users in ascending order by their creation time" do
752
      expect(User.sort('created_asc').first).to eq(@user1)
V
Valery Sizov 已提交
753 754
    end

Y
Yorick Peterse 已提交
755 756
    it "sorts users by id in descending order when nil is passed" do
      expect(User.sort(nil).first).to eq(@user1)
V
Valery Sizov 已提交
757 758
    end
  end
759

760
  describe "#contributed_projects" do
761 762 763 764 765 766 767 768 769 770 771 772 773 774
    subject { create(:user) }
    let!(:project1) { create(:project) }
    let!(:project2) { create(:project, forked_from_project: project3) }
    let!(:project3) { create(:project) }
    let!(:merge_request) { create(:merge_request, source_project: project2, target_project: project3, author: subject) }
    let!(:push_event) { create(:event, action: Event::PUSHED, project: project1, target: project1, author: subject) }
    let!(:merge_event) { create(:event, action: Event::CREATED, project: project3, target: merge_request, author: subject) }

    before do
      project1.team << [subject, :master]
      project2.team << [subject, :master]
    end

    it "includes IDs for projects the user has pushed to" do
775
      expect(subject.contributed_projects).to include(project1)
776 777 778
    end

    it "includes IDs for projects the user has had merge requests merged into" do
779
      expect(subject.contributed_projects).to include(project3)
780 781 782
    end

    it "doesn't include IDs for unrelated projects" do
783
      expect(subject.contributed_projects).not_to include(project2)
784 785
    end
  end
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802

  describe :can_be_removed? do
    subject { create(:user) }

    context 'no owned groups' do
      it { expect(subject.can_be_removed?).to be_truthy }
    end

    context 'has owned groups' do
      before do
        group = create(:group)
        group.add_owner(subject)
      end

      it { expect(subject.can_be_removed?).to be_falsey }
    end
  end
803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831

  describe "#recent_push" do
    subject { create(:user) }
    let!(:project1) { create(:project) }
    let!(:project2) { create(:project, forked_from_project: project1) }
    let!(:push_data) { Gitlab::PushDataBuilder.build_sample(project2, subject) }
    let!(:push_event) { create(:event, action: Event::PUSHED, project: project2, target: project1, author: subject, data: push_data) }

    before do
      project1.team << [subject, :master]
      project2.team << [subject, :master]
    end

    it "includes push event" do
      expect(subject.recent_push).to eq(push_event)
    end

    it "excludes push event if branch has been deleted" do
      allow_any_instance_of(Repository).to receive(:branch_names).and_return(['foo'])

      expect(subject.recent_push).to eq(nil)
    end

    it "excludes push event if MR is opened for it" do
      create(:merge_request, source_project: project2, target_project: project1, source_branch: project2.default_branch, target_branch: 'fix', author: subject)

      expect(subject.recent_push).to eq(nil)
    end
  end
832 833 834 835 836 837 838 839 840

  describe '#authorized_groups' do
    let!(:user) { create(:user) }
    let!(:private_group) { create(:group) }

    before do
      private_group.add_user(user, Gitlab::Access::MASTER)
    end

841
    subject { user.authorized_groups }
842

843
    it { is_expected.to eq([private_group]) }
844 845 846 847 848 849 850 851 852 853
  end

  describe '#authorized_projects' do
    let!(:user) { create(:user) }
    let!(:private_project) { create(:project, :private) }

    before do
      private_project.team << [user, Gitlab::Access::MASTER]
    end

854
    subject { user.authorized_projects }
855

856
    it { is_expected.to eq([private_project]) }
857
  end
858

859 860 861 862
  describe '#ci_authorized_runners' do
    let(:user) { create(:user) }
    let(:runner) { create(:ci_runner) }

863 864 865
    before do
      project.runners << runner
    end
866 867 868 869 870

    context 'without any projects' do
      let(:project) { create(:project) }

      it 'does not load' do
871
        expect(user.ci_authorized_runners).to be_empty
872 873 874 875 876 877 878 879
      end
    end

    context 'with personal projects runners' do
      let(:namespace) { create(:namespace, owner: user) }
      let(:project) { create(:project, namespace: namespace) }

      it 'loads' do
880
        expect(user.ci_authorized_runners).to contain_exactly(runner)
881 882 883 884
      end
    end

    shared_examples :member do
885
      context 'when the user is a master' do
886 887 888
        before do
          add_user(Gitlab::Access::MASTER)
        end
889

890 891 892
        it 'loads' do
          expect(user.ci_authorized_runners).to contain_exactly(runner)
        end
893 894
      end

895
      context 'when the user is a developer' do
896 897 898
        before do
          add_user(Gitlab::Access::DEVELOPER)
        end
899

900 901 902
        it 'does not load' do
          expect(user.ci_authorized_runners).to be_empty
        end
903 904 905 906 907 908 909
      end
    end

    context 'with groups projects runners' do
      let(:group) { create(:group) }
      let(:project) { create(:project, group: group) }

L
Lin Jen-Shin 已提交
910
      def add_user(access)
911 912 913 914 915 916 917 918 919
        group.add_user(user, access)
      end

      it_behaves_like :member
    end

    context 'with other projects runners' do
      let(:project) { create(:project) }

L
Lin Jen-Shin 已提交
920
      def add_user(access)
L
Lin Jen-Shin 已提交
921
        project.team << [user, access]
922 923 924 925 926 927
      end

      it_behaves_like :member
    end
  end

928 929
  describe '#viewable_starred_projects' do
    let(:user) { create(:user) }
S
Sean McGivern 已提交
930 931 932
    let(:public_project) { create(:empty_project, :public) }
    let(:private_project) { create(:empty_project, :private) }
    let(:private_viewable_project) { create(:empty_project, :private) }
933 934 935 936

    before do
      private_viewable_project.team << [user, Gitlab::Access::MASTER]

S
Sean McGivern 已提交
937 938 939
      [public_project, private_project, private_viewable_project].each do |project|
        user.toggle_star(project)
      end
940 941
    end

S
Sean McGivern 已提交
942 943
    it 'returns only starred projects the user can view' do
      expect(user.viewable_starred_projects).not_to include(private_project)
944 945
    end
  end
G
gitlabhq 已提交
946
end