user_spec.rb 30.9 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
    it { is_expected.to have_many(:builds).dependent(:nullify) }
    it { is_expected.to have_many(:pipelines).dependent(:nullify) }
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

    describe '#group_members' do
      it 'does not include group memberships for which user is a requester' do
        user = create(:user)
        group = create(:group, :public)
        group.request_access(user)

        expect(user.group_members).to be_empty
      end
    end

    describe '#project_members' do
      it 'does not include project memberships for which user is a requester' do
        user = create(:user)
        project = create(:project, :public)
        project.request_access(user)

        expect(user.project_members).to be_empty
      end
    end
56 57 58
  end

  describe 'validations' do
R
Robert Speicher 已提交
59 60 61 62 63 64 65 66 67 68 69 70 71
    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
72
        expect(subject).to validate_uniqueness_of(:username).case_insensitive
R
Robert Speicher 已提交
73 74 75
      end
    end

76 77 78 79
    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) }
80

81
    it { is_expected.to validate_length_of(:bio).is_within(0..255) }
82

83 84 85
    it_behaves_like 'an object with email-formated attributes', :email do
      subject { build(:user) }
    end
86

87 88 89
    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
90

91
    describe 'email' do
92
      context 'when no signup domains listed' do
93 94 95
        before do
          allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return([])
        end
96

97 98 99 100 101 102 103
        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
104 105 106
        before do
          allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return(['example.com', '*.example.com'])
        end
107

108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
        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
125 126 127
        before do
          allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return(['example.com'])
        end
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143

        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
144 145 146 147 148 149 150

      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
151
    end
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 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
  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 已提交
212 213 214
  end

  describe "Respond to" do
215 216 217
    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 已提交
218 219 220 221 222 223 224 225 226 227 228 229 230 231
    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 已提交
232 233
  end

234
  describe '#confirm' do
235 236 237
    before do
      allow_any_instance_of(ApplicationSetting).to receive(:send_user_confirmation_email).and_return(true)
    end
238

239 240 241 242 243 244 245
    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
246
      user.confirm
247 248 249 250
      expect(user.confirmed?).to be_truthy
    end
  end

251 252 253 254 255 256 257 258
  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

259 260 261
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
262
      expect(user).to receive(:generate_password)
263 264 265 266
      user.save
    end

    it "should not generate password by default" do
267
      user = create(:user, password: 'abcdefghe')
268
      expect(user.password).to eq('abcdefghe')
269
    end
270

271
    it "should generate password when forcing random password" do
272
      allow(Devise).to receive(:friendly_token).and_return('123456789')
273
      user = create(:user, password: 'abcdefg', force_random_password: true)
274
      expect(user.password).to eq('12345678')
275
    end
276 277
  end

278 279
  describe 'authentication token' do
    it "should have authentication token" do
280
      user = create(:user)
281
      expect(user.authentication_token).not_to be_blank
282
    end
N
Nihad Abbasov 已提交
283
  end
284

285
  describe '#recently_sent_password_reset?' do
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
    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 已提交
305 306 307 308 309 310 311
  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
312
      expect(user.otp_grace_period_started_at).not_to be_nil
R
Robert Speicher 已提交
313 314 315 316 317 318 319 320

      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
321
      expect(user.otp_grace_period_started_at).to be_nil
R
Robert Speicher 已提交
322 323 324
    end
  end

325 326 327 328
  describe 'projects' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
D
Dmitriy Zaporozhets 已提交
329 330
      @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
331

332 333
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
334 335
    end

336 337 338 339 340 341 342 343 344
    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) }
345 346 347 348 349
  end

  describe 'groups' do
    before do
      @user = create :user
350 351
      @group = create :group
      @group.add_owner(@user)
352 353
    end

354 355 356
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
357
    it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
358 359
  end

360 361 362 363
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
364 365
      @group = create :group
      @group.add_owner(@user)
366

367
      @group.add_user(@user2, GroupMember::OWNER)
368 369
    end

370
    it { expect(@user2.several_namespaces?).to be_truthy }
371 372
  end

373 374 375 376 377 378
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

379
    it { expect(@user.several_namespaces?).to be_falsey }
380
    it { expect(@user.namespaces).to eq([@user.namespace]) }
381 382 383 384 385 386 387
  end

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

    it "should block user" do
      user.block
388
      expect(user.blocked?).to be_truthy
389 390 391
    end
  end

392 393 394 395 396 397 398
  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
399 400
    end

401 402 403 404
    it 'filters by admins' do
      expect(User).to receive(:admins).and_return([user])

      expect(User.filter('admins')).to include user
405 406
    end

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
    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
430 431
  end

432
  describe '.not_in_project' do
433
    before do
434
      User.delete_all
435 436 437 438
      @user = create :user
      @project = create :project
    end

439
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
440
  end
D
Dmitriy Zaporozhets 已提交
441

442 443 444
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
445

446 447 448 449 450
      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') }
451
      it { expect(user.external).to be_falsey }
452
    end
453

D
Dmitriy Zaporozhets 已提交
454
    describe 'with defaults' do
455
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
456

D
Dmitriy Zaporozhets 已提交
457
      it "should apply defaults to user" do
458 459 460
        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 已提交
461
        expect(user.external).to be_falsey
462 463 464
      end
    end

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

D
Dmitriy Zaporozhets 已提交
468
      it "should apply defaults to user" do
469 470
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
471
        expect(user.theme_id).to eq(1)
472
      end
473
    end
474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493

    context 'when current_application_settings.user_default_external is true' do
      before do
        stub_application_setting(user_default_external: true)
      end

      it "creates external user by default" do
        user = build(:user)

        expect(user.external).to be_truthy
      end

      describe 'with default overrides' do
        it "creates a non-external user" do
          user = build(:user, external: false)

          expect(user.external).to be_falsey
        end
      end
    end
494
  end
495

496
  describe '.find_by_any_email' do
497 498 499
    it 'finds by primary email' do
      user = create(:user, email: 'foo@example.com')

500
      expect(User.find_by_any_email(user.email)).to eq user
501 502 503 504 505 506
    end

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

507
      expect(User.find_by_any_email(email.email)).to eq user
508 509 510
    end

    it 'returns nil when nothing found' do
511
      expect(User.find_by_any_email('')).to be_nil
512 513 514
    end
  end

515 516 517 518 519 520 521 522 523 524 525
  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 已提交
526
    it 'returns users with a matching name regardless of the casing' do
527 528 529 530 531 532 533 534 535 536 537
      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 已提交
538
    it 'returns users with a matching Email regardless of the casing' do
539 540 541 542 543 544 545 546 547 548 549
      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 已提交
550
    it 'returns users with a matching username regardless of the casing' do
551
      expect(described_class.search(user.username.upcase)).to eq([user])
M
Marin Jankovski 已提交
552 553 554
    end
  end

555
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
556 557
    let(:user1) { create(:user, username: 'foo') }

558
    it "should get the correct user" do
559 560 561 562
      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
563 564
    end
  end
G
GitLab 已提交
565

566 567 568 569 570 571 572 573 574 575 576 577 578 579
  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 已提交
580 581 582 583 584 585 586 587 588 589 590 591
  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 已提交
592
  describe 'all_ssh_keys' do
593
    it { is_expected.to have_many(:keys).dependent(:destroy) }
G
GitLab 已提交
594 595 596 597 598

    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

599
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
600
    end
G
GitLab 已提交
601
  end
602

603
  describe '#avatar_type' do
D
Dmitriy Zaporozhets 已提交
604 605 606 607
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
608
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
609 610 611 612
    end

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

617
  describe '#requires_ldap_check?' do
618 619
    let(:user) { User.new }

620 621
    it 'is false when LDAP is disabled' do
      # Create a condition which would otherwise cause 'true' to be returned
622
      allow(user).to receive(:ldap_user?).and_return(true)
623
      user.last_credential_check_at = nil
624
      expect(user.requires_ldap_check?).to be_falsey
625 626
    end

627
    context 'when LDAP is enabled' do
628 629 630
      before do
        allow(Gitlab.config.ldap).to receive(:enabled).and_return(true)
      end
631

632
      it 'is false for non-LDAP users' do
633
        allow(user).to receive(:ldap_user?).and_return(false)
634
        expect(user.requires_ldap_check?).to be_falsey
635 636
      end

637
      context 'and when the user is an LDAP user' do
638 639 640
        before do
          allow(user).to receive(:ldap_user?).and_return(true)
        end
641 642 643

        it 'is true when the user has never had an LDAP check before' do
          user.last_credential_check_at = nil
644
          expect(user.requires_ldap_check?).to be_truthy
645 646 647 648
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
649
          expect(user.requires_ldap_check?).to be_truthy
650
        end
651 652 653 654
      end
    end
  end

655
  context 'ldap synchronized user' do
656
    describe '#ldap_user?' do
657 658 659 660
      it 'is true if provider name starts with ldap' do
        user = create(:omniauth_user, provider: 'ldapmain')
        expect(user.ldap_user?).to be_truthy
      end
661

662 663 664 665 666 667 668 669 670
      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
671 672
    end

673
    describe '#ldap_identity' do
674 675 676 677
      it 'returns ldap identity' do
        user = create :omniauth_user
        expect(user.ldap_identity.provider).not_to be_empty
      end
678 679
    end

680 681 682 683 684 685 686 687
    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
688 689 690
    end
  end

J
Jerome Dalbert 已提交
691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
  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'
730

J
Jerome Dalbert 已提交
731 732
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
733
  end
C
Ciro Santilli 已提交
734

735 736 737 738 739 740
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

741 742
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
743 744

      star1 = UsersStarProject.create!(project: project1, user: user)
745 746
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_falsey
747 748

      star2 = UsersStarProject.create!(project: project2, user: user)
749 750
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
751 752

      star1.destroy
753 754
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
755 756

      star2.destroy
757 758
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
759 760 761
    end
  end

C
Ciro Santilli 已提交
762 763 764 765 766
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

767
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
768
      user.toggle_star(project)
769
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
770
      user.toggle_star(project)
771
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
772 773
    end
  end
V
Valery Sizov 已提交
774 775 776 777 778 779 780

  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
781

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

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

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

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

Y
Yorick Peterse 已提交
798 799
    it "sorts users by id in descending order when nil is passed" do
      expect(User.sort(nil).first).to eq(@user1)
V
Valery Sizov 已提交
800 801
    end
  end
802

803
  describe "#contributed_projects" do
804 805 806 807 808 809 810 811 812 813 814 815 816 817
    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
818
      expect(subject.contributed_projects).to include(project1)
819 820 821
    end

    it "includes IDs for projects the user has had merge requests merged into" do
822
      expect(subject.contributed_projects).to include(project3)
823 824 825
    end

    it "doesn't include IDs for unrelated projects" do
826
      expect(subject.contributed_projects).not_to include(project2)
827 828
    end
  end
829

830
  describe '#can_be_removed?' do
831 832 833 834 835 836 837 838 839 840 841 842 843 844 845
    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
846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874

  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
875 876 877 878 879 880 881 882 883

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

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

884
    subject { user.authorized_groups }
885

886
    it { is_expected.to eq([private_group]) }
887 888 889 890 891 892 893 894 895 896
  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

897
    subject { user.authorized_projects }
898

899
    it { is_expected.to eq([private_project]) }
900
  end
901

902 903 904 905
  describe '#ci_authorized_runners' do
    let(:user) { create(:user) }
    let(:runner) { create(:ci_runner) }

906 907 908
    before do
      project.runners << runner
    end
909 910 911 912 913

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

      it 'does not load' do
914
        expect(user.ci_authorized_runners).to be_empty
915 916 917 918 919 920 921 922
      end
    end

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

      it 'loads' do
923
        expect(user.ci_authorized_runners).to contain_exactly(runner)
924 925 926 927
      end
    end

    shared_examples :member do
928
      context 'when the user is a master' do
929 930 931
        before do
          add_user(Gitlab::Access::MASTER)
        end
932

933 934 935
        it 'loads' do
          expect(user.ci_authorized_runners).to contain_exactly(runner)
        end
936 937
      end

938
      context 'when the user is a developer' do
939 940 941
        before do
          add_user(Gitlab::Access::DEVELOPER)
        end
942

943 944 945
        it 'does not load' do
          expect(user.ci_authorized_runners).to be_empty
        end
946 947 948 949 950 951 952
      end
    end

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

L
Lin Jen-Shin 已提交
953
      def add_user(access)
954 955 956 957 958 959 960 961 962
        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 已提交
963
      def add_user(access)
L
Lin Jen-Shin 已提交
964
        project.team << [user, access]
965 966 967 968 969 970
      end

      it_behaves_like :member
    end
  end

971 972
  describe '#viewable_starred_projects' do
    let(:user) { create(:user) }
S
Sean McGivern 已提交
973 974 975
    let(:public_project) { create(:empty_project, :public) }
    let(:private_project) { create(:empty_project, :private) }
    let(:private_viewable_project) { create(:empty_project, :private) }
976 977 978 979

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

S
Sean McGivern 已提交
980 981 982
      [public_project, private_project, private_viewable_project].each do |project|
        user.toggle_star(project)
      end
983 984
    end

S
Sean McGivern 已提交
985 986
    it 'returns only starred projects the user can view' do
      expect(user.viewable_starred_projects).not_to include(private_project)
987 988
    end
  end
G
gitlabhq 已提交
989
end