user_spec.rb 29.4 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
        before { allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return([]) }
72 73 74 75 76 77 78
        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
79
        before { allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return(['example.com', '*.example.com']) }
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
        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
97
        before { allow_any_instance_of(ApplicationSetting).to receive(:restricted_signup_domains).and_return(['example.com']) }
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

        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
114 115 116 117 118 119 120

      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
121
    end
122 123 124 125 126 127 128 129 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
  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 已提交
182 183 184
  end

  describe "Respond to" do
185 186 187
    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 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201
    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 已提交
202 203
  end

204
  describe '#confirm' do
205
    before { allow_any_instance_of(ApplicationSetting).to receive(:send_user_confirmation_email).and_return(true) }
206 207 208 209 210 211 212
    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
213
      user.confirm
214 215 216 217
      expect(user.confirmed?).to be_truthy
    end
  end

218 219 220 221 222 223 224 225
  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

226 227 228
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
229
      expect(user).to receive(:generate_password)
230 231 232 233
      user.save
    end

    it "should not generate password by default" do
234
      user = create(:user, password: 'abcdefghe')
235
      expect(user.password).to eq('abcdefghe')
236
    end
237

238
    it "should generate password when forcing random password" do
239
      allow(Devise).to receive(:friendly_token).and_return('123456789')
240
      user = create(:user, password: 'abcdefg', force_random_password: true)
241
      expect(user.password).to eq('12345678')
242
    end
243 244
  end

245 246
  describe 'authentication token' do
    it "should have authentication token" do
247
      user = create(:user)
248
      expect(user.authentication_token).not_to be_blank
249
    end
N
Nihad Abbasov 已提交
250
  end
251

252
  describe '#recently_sent_password_reset?' do
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
    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 已提交
272 273 274 275 276 277 278
  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
279
      expect(user.otp_grace_period_started_at).not_to be_nil
R
Robert Speicher 已提交
280 281 282 283 284 285 286 287

      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
288
      expect(user.otp_grace_period_started_at).to be_nil
R
Robert Speicher 已提交
289 290 291
    end
  end

292 293 294 295
  describe 'projects' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
D
Dmitriy Zaporozhets 已提交
296 297
      @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
298

299 300
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
301 302
    end

303 304 305 306 307 308 309 310 311
    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) }
312 313 314 315 316
  end

  describe 'groups' do
    before do
      @user = create :user
317 318
      @group = create :group
      @group.add_owner(@user)
319 320
    end

321 322 323
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
324
    it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
325 326
  end

327 328 329 330
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
331 332
      @group = create :group
      @group.add_owner(@user)
333

334
      @group.add_user(@user2, GroupMember::OWNER)
335 336
    end

337
    it { expect(@user2.several_namespaces?).to be_truthy }
338 339
  end

340 341 342 343 344 345
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

346
    it { expect(@user.several_namespaces?).to be_falsey }
347
    it { expect(@user.namespaces).to eq([@user.namespace]) }
348 349 350 351 352 353 354
  end

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

    it "should block user" do
      user.block
355
      expect(user.blocked?).to be_truthy
356 357 358
    end
  end

359 360 361 362 363 364 365
  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
366 367
    end

368 369 370 371
    it 'filters by admins' do
      expect(User).to receive(:admins).and_return([user])

      expect(User.filter('admins')).to include user
372 373
    end

374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
    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
397 398 399 400
  end

  describe :not_in_project do
    before do
401
      User.delete_all
402 403 404 405
      @user = create :user
      @project = create :project
    end

406
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
407
  end
D
Dmitriy Zaporozhets 已提交
408

409 410 411
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
412

413 414 415 416 417
      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') }
418
    end
419

D
Dmitriy Zaporozhets 已提交
420
    describe 'with defaults' do
421
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
422

D
Dmitriy Zaporozhets 已提交
423
      it "should apply defaults to user" do
424 425 426
        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 已提交
427
        expect(user.external).to be_falsey
428 429 430
      end
    end

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

D
Dmitriy Zaporozhets 已提交
434
      it "should apply defaults to user" do
435 436
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
437
        expect(user.theme_id).to eq(1)
438
      end
439 440
    end
  end
441

442
  describe '.find_by_any_email' do
443 444 445
    it 'finds by primary email' do
      user = create(:user, email: 'foo@example.com')

446
      expect(User.find_by_any_email(user.email)).to eq user
447 448 449 450 451 452
    end

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

453
      expect(User.find_by_any_email(email.email)).to eq user
454 455 456
    end

    it 'returns nil when nothing found' do
457
      expect(User.find_by_any_email('')).to be_nil
458 459 460
    end
  end

461 462 463 464 465 466 467 468 469 470 471
  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 已提交
472
    it 'returns users with a matching name regardless of the casing' do
473 474 475 476 477 478 479 480 481 482 483
      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 已提交
484
    it 'returns users with a matching Email regardless of the casing' do
485 486 487 488 489 490 491 492 493 494 495
      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 已提交
496
    it 'returns users with a matching username regardless of the casing' do
497
      expect(described_class.search(user.username.upcase)).to eq([user])
M
Marin Jankovski 已提交
498 499 500
    end
  end

501
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
502 503
    let(:user1) { create(:user, username: 'foo') }

504
    it "should get the correct user" do
505 506 507 508
      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
509 510
    end
  end
G
GitLab 已提交
511

512 513 514 515 516 517 518 519 520 521 522 523 524 525
  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 已提交
526 527 528 529 530 531 532 533 534 535 536 537
  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 已提交
538
  describe 'all_ssh_keys' do
539
    it { is_expected.to have_many(:keys).dependent(:destroy) }
G
GitLab 已提交
540 541 542 543 544

    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

545
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
546
    end
G
GitLab 已提交
547
  end
548

D
Dmitriy Zaporozhets 已提交
549 550 551 552 553
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
554
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
555 556 557 558
    end

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

563 564 565
  describe :requires_ldap_check? do
    let(:user) { User.new }

566 567
    it 'is false when LDAP is disabled' do
      # Create a condition which would otherwise cause 'true' to be returned
568
      allow(user).to receive(:ldap_user?).and_return(true)
569
      user.last_credential_check_at = nil
570
      expect(user.requires_ldap_check?).to be_falsey
571 572
    end

573
    context 'when LDAP is enabled' do
574 575 576
      before do
        allow(Gitlab.config.ldap).to receive(:enabled).and_return(true)
      end
577

578
      it 'is false for non-LDAP users' do
579
        allow(user).to receive(:ldap_user?).and_return(false)
580
        expect(user.requires_ldap_check?).to be_falsey
581 582
      end

583
      context 'and when the user is an LDAP user' do
584 585 586
        before do
          allow(user).to receive(:ldap_user?).and_return(true)
        end
587 588 589

        it 'is true when the user has never had an LDAP check before' do
          user.last_credential_check_at = nil
590
          expect(user.requires_ldap_check?).to be_truthy
591 592 593 594
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
595
          expect(user.requires_ldap_check?).to be_truthy
596
        end
597 598 599 600
      end
    end
  end

601 602 603 604 605 606
  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
607

608 609 610 611 612 613 614 615 616
      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
617 618
    end

619 620 621 622 623
    describe :ldap_identity do
      it 'returns ldap identity' do
        user = create :omniauth_user
        expect(user.ldap_identity.provider).not_to be_empty
      end
624 625
    end

626 627 628 629 630 631 632 633
    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
634 635 636
    end
  end

J
Jerome Dalbert 已提交
637 638 639 640 641 642 643 644 645 646 647 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
  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'
676

J
Jerome Dalbert 已提交
677 678
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
679
  end
C
Ciro Santilli 已提交
680

681 682 683 684 685 686
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

687 688
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
689 690

      star1 = UsersStarProject.create!(project: project1, user: user)
691 692
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_falsey
693 694

      star2 = UsersStarProject.create!(project: project2, user: user)
695 696
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
697 698

      star1.destroy
699 700
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
701 702

      star2.destroy
703 704
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
705 706 707
    end
  end

C
Ciro Santilli 已提交
708 709 710 711 712
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

713
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
714
      user.toggle_star(project)
715
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
716
      user.toggle_star(project)
717
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
718 719
    end
  end
V
Valery Sizov 已提交
720 721 722 723 724 725 726

  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
727

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

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

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

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

Y
Yorick Peterse 已提交
744 745
    it "sorts users by id in descending order when nil is passed" do
      expect(User.sort(nil).first).to eq(@user1)
V
Valery Sizov 已提交
746 747
    end
  end
748

749
  describe "#contributed_projects" do
750 751 752 753 754 755 756 757 758 759 760 761 762 763
    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
764
      expect(subject.contributed_projects).to include(project1)
765 766 767
    end

    it "includes IDs for projects the user has had merge requests merged into" do
768
      expect(subject.contributed_projects).to include(project3)
769 770 771
    end

    it "doesn't include IDs for unrelated projects" do
772
      expect(subject.contributed_projects).not_to include(project2)
773 774
    end
  end
775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791

  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
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820

  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
821 822 823 824 825 826 827 828 829

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

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

830
    subject { user.authorized_groups }
831

832
    it { is_expected.to eq([private_group]) }
833 834 835 836 837 838 839 840 841 842
  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

843
    subject { user.authorized_projects }
844

845
    it { is_expected.to eq([private_project]) }
846
  end
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 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
  describe '#ci_authorized_runners' do
    let(:user) { create(:user) }
    let(:runner) { create(:ci_runner) }

    before { project.runners << runner }

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

      it 'does not load' do
        expect(user.ci_authorized_runners).to eq([])
      end
    end

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

      it 'loads' do
        expect(user.ci_authorized_runners).to eq([runner])
      end
    end

    shared_examples :member do
      it 'loads when the user is a master' do
        add_user(Gitlab::Access::MASTER)
        expect(user.ci_authorized_runners).to eq([runner])
      end

      it 'does not load when the user is a developer' do
        add_user(Gitlab::Access::DEVELOPER)
        expect(user.ci_authorized_runners).to eq([])
      end
    end

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

      def add_user access
        group.add_user(user, access)
      end

      it_behaves_like :member
    end

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

      def add_user access
L
Lin Jen-Shin 已提交
898
        project.team << [user, access]
899 900 901 902 903 904
      end

      it_behaves_like :member
    end
  end

905 906
  describe '#viewable_starred_projects' do
    let(:user) { create(:user) }
S
Sean McGivern 已提交
907 908 909
    let(:public_project) { create(:empty_project, :public) }
    let(:private_project) { create(:empty_project, :private) }
    let(:private_viewable_project) { create(:empty_project, :private) }
910 911 912 913

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

S
Sean McGivern 已提交
914 915 916
      [public_project, private_project, private_viewable_project].each do |project|
        user.toggle_star(project)
      end
917 918
    end

S
Sean McGivern 已提交
919 920
    it 'returns only starred projects the user can view' do
      expect(user.viewable_starred_projects).not_to include(private_project)
921 922
    end
  end
G
gitlabhq 已提交
923
end