user_spec.rb 27.8 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4
# == Schema Information
#
# Table name: users
#
S
Stan Hu 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
#  id                          :integer          not null, primary key
#  email                       :string(255)      default(""), not null
#  encrypted_password          :string(255)      default(""), not null
#  reset_password_token        :string(255)
#  reset_password_sent_at      :datetime
#  remember_created_at         :datetime
#  sign_in_count               :integer          default(0)
#  current_sign_in_at          :datetime
#  last_sign_in_at             :datetime
#  current_sign_in_ip          :string(255)
#  last_sign_in_ip             :string(255)
#  created_at                  :datetime
#  updated_at                  :datetime
#  name                        :string(255)
#  admin                       :boolean          default(FALSE), not null
#  projects_limit              :integer          default(10)
#  skype                       :string(255)      default(""), not null
#  linkedin                    :string(255)      default(""), not null
#  twitter                     :string(255)      default(""), not null
#  authentication_token        :string(255)
#  theme_id                    :integer          default(1), not null
#  bio                         :string(255)
#  failed_attempts             :integer          default(0)
#  locked_at                   :datetime
#  username                    :string(255)
#  can_create_group            :boolean          default(TRUE), not null
#  can_create_team             :boolean          default(TRUE), not null
#  state                       :string(255)
#  color_scheme_id             :integer          default(1), not null
#  notification_level          :integer          default(1), not null
#  password_expires_at         :datetime
#  created_by_id               :integer
#  last_credential_check_at    :datetime
#  avatar                      :string(255)
#  confirmation_token          :string(255)
#  confirmed_at                :datetime
#  confirmation_sent_at        :datetime
#  unconfirmed_email           :string(255)
#  hide_no_ssh_key             :boolean          default(FALSE)
#  website_url                 :string(255)      default(""), not null
#  notification_email          :string(255)
#  hide_no_password            :boolean          default(FALSE)
#  password_automatically_set  :boolean          default(FALSE)
#  location                    :string(255)
#  encrypted_otp_secret        :string(255)
#  encrypted_otp_secret_iv     :string(255)
#  encrypted_otp_secret_salt   :string(255)
#  otp_required_for_login      :boolean          default(FALSE), not null
#  otp_backup_codes            :text
#  public_email                :string(255)      default(""), not null
#  dashboard                   :integer          default(0)
#  project_view                :integer          default(0)
#  consumed_timestep           :integer
#  layout                      :integer          default(0)
#  hide_project_limit          :boolean          default(FALSE)
#  unlock_token                :string
#  otp_grace_period_started_at :datetime
D
Dmitriy Zaporozhets 已提交
62 63
#

G
gitlabhq 已提交
64 65
require 'spec_helper'

D
Douwe Maan 已提交
66
describe User, models: true do
67 68
  include Gitlab::CurrentSettings

69 70 71 72 73 74 75 76 77 78 79
  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
80 81 82 83 84 85 86 87 88 89 90 91 92
    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 已提交
93
    it { is_expected.to have_one(:abuse_report) }
94
    it { is_expected.to have_many(:spam_logs).dependent(:destroy) }
95
    it { is_expected.to have_many(:todos).dependent(:destroy) }
96 97 98
  end

  describe 'validations' do
R
Robert Speicher 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111
    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
112
        expect(subject).to validate_uniqueness_of(:username).case_insensitive
R
Robert Speicher 已提交
113 114 115
      end
    end

116 117 118 119
    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) }
120

121
    it { is_expected.to validate_length_of(:bio).is_within(0..255) }
122

123 124 125
    it_behaves_like 'an object with email-formated attributes', :email do
      subject { build(:user) }
    end
126

127 128 129
    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
130

131
    describe 'email' do
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
      context 'when no signup domains listed' do
        before { allow(current_application_settings).to receive(:restricted_signup_domains).and_return([]) }
        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
        before { allow(current_application_settings).to receive(:restricted_signup_domains).and_return(['example.com', '*.example.com']) }
        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
        before { allow(current_application_settings).to receive(:restricted_signup_domains).and_return(['example.com']) }

        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
176
    end
177 178

    describe 'avatar' do
179
      it 'only validates when avatar is present and changed' do
180 181 182 183 184 185 186
        user = build(:user, :with_avatar)

        user.avatar_crop_x    = nil
        user.avatar_crop_y    = nil
        user.avatar_crop_size = nil

        expect(user).not_to be_valid
187 188 189 190 191 192 193 194 195 196 197 198 199 200
        expect(user.errors.keys).
          to match_array %i(avatar_crop_x avatar_crop_y avatar_crop_size)
      end

      it 'does not validate when avatar has not changed' do
        user = create(:user, :with_avatar)

        expect { user.avatar_crop_x = nil }.not_to change(user, :valid?)
      end

      it 'does not validate when avatar is not present' do
        user = create(:user)

        expect { user.avatar_crop_y = nil }.not_to change(user, :valid?)
201 202
      end
    end
G
gitlabhq 已提交
203 204 205
  end

  describe "Respond to" do
206 207 208
    it { is_expected.to respond_to(:is_admin?) }
    it { is_expected.to respond_to(:name) }
    it { is_expected.to respond_to(:private_token) }
G
gitlabhq 已提交
209 210
  end

211 212 213 214 215 216 217 218
  describe '#confirm' do
    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
219
      user.confirm
220 221 222 223
      expect(user.confirmed?).to be_truthy
    end
  end

224 225 226 227 228 229 230 231
  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

232 233 234
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
235
      expect(user).to receive(:generate_password)
236 237 238 239
      user.save
    end

    it "should not generate password by default" do
240
      user = create(:user, password: 'abcdefghe')
241
      expect(user.password).to eq('abcdefghe')
242
    end
243

244
    it "should generate password when forcing random password" do
245
      allow(Devise).to receive(:friendly_token).and_return('123456789')
246
      user = create(:user, password: 'abcdefg', force_random_password: true)
247
      expect(user.password).to eq('12345678')
248
    end
249 250
  end

251 252
  describe 'authentication token' do
    it "should have authentication token" do
253
      user = create(:user)
254
      expect(user.authentication_token).not_to be_blank
255
    end
N
Nihad Abbasov 已提交
256
  end
257

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

      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
294
      expect(user.otp_grace_period_started_at).to be_nil
R
Robert Speicher 已提交
295 296 297
    end
  end

298 299 300 301
  describe 'projects' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
D
Dmitriy Zaporozhets 已提交
302 303
      @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
304

305 306
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
307 308
    end

309 310 311 312 313 314 315 316 317
    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) }
318 319 320 321 322
  end

  describe 'groups' do
    before do
      @user = create :user
323 324
      @group = create :group
      @group.add_owner(@user)
325 326
    end

327 328 329
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
330
    it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
331 332
  end

333 334 335 336
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
337 338
      @group = create :group
      @group.add_owner(@user)
339

340
      @group.add_user(@user2, GroupMember::OWNER)
341 342
    end

343
    it { expect(@user2.several_namespaces?).to be_truthy }
344 345
  end

346 347 348 349 350 351
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

352
    it { expect(@user.several_namespaces?).to be_falsey }
353
    it { expect(@user.namespaces).to eq([@user.namespace]) }
354 355 356 357 358 359 360
  end

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

    it "should block user" do
      user.block
361
      expect(user.blocked?).to be_truthy
362 363 364
    end
  end

365 366 367 368 369 370 371
  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
372 373
    end

374 375 376 377
    it 'filters by admins' do
      expect(User).to receive(:admins).and_return([user])

      expect(User.filter('admins')).to include user
378 379
    end

380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402
    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
403 404 405 406
  end

  describe :not_in_project do
    before do
407
      User.delete_all
408 409 410 411
      @user = create :user
      @project = create :project
    end

412
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
413
  end
D
Dmitriy Zaporozhets 已提交
414

415 416 417
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
418

419 420 421 422 423
      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') }
424
    end
425

D
Dmitriy Zaporozhets 已提交
426
    describe 'with defaults' do
427
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
428

D
Dmitriy Zaporozhets 已提交
429
      it "should apply defaults to user" do
430 431 432
        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)
433 434 435
      end
    end

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

D
Dmitriy Zaporozhets 已提交
439
      it "should apply defaults to user" do
440 441
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
442
        expect(user.theme_id).to eq(1)
443
      end
444 445
    end
  end
446

447
  describe '.find_by_any_email' do
448 449 450
    it 'finds by primary email' do
      user = create(:user, email: 'foo@example.com')

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

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

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

    it 'returns nil when nothing found' do
462
      expect(User.find_by_any_email('')).to be_nil
463 464 465
    end
  end

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

506
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
507 508
    let(:user1) { create(:user, username: 'foo') }

509
    it "should get the correct user" do
510 511 512 513
      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
514 515
    end
  end
G
GitLab 已提交
516

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

    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

550
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
551
    end
G
GitLab 已提交
552
  end
553

D
Dmitriy Zaporozhets 已提交
554 555 556 557 558
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
559
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
560 561 562 563
    end

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

568 569 570
  describe :requires_ldap_check? do
    let(:user) { User.new }

571 572
    it 'is false when LDAP is disabled' do
      # Create a condition which would otherwise cause 'true' to be returned
573
      allow(user).to receive(:ldap_user?).and_return(true)
574
      user.last_credential_check_at = nil
575
      expect(user.requires_ldap_check?).to be_falsey
576 577
    end

578
    context 'when LDAP is enabled' do
579 580 581
      before do
        allow(Gitlab.config.ldap).to receive(:enabled).and_return(true)
      end
582

583
      it 'is false for non-LDAP users' do
584
        allow(user).to receive(:ldap_user?).and_return(false)
585
        expect(user.requires_ldap_check?).to be_falsey
586 587
      end

588
      context 'and when the user is an LDAP user' do
589 590 591
        before do
          allow(user).to receive(:ldap_user?).and_return(true)
        end
592 593 594

        it 'is true when the user has never had an LDAP check before' do
          user.last_credential_check_at = nil
595
          expect(user.requires_ldap_check?).to be_truthy
596 597 598 599
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
600
          expect(user.requires_ldap_check?).to be_truthy
601
        end
602 603 604 605
      end
    end
  end

606 607 608 609 610 611
  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
612

613 614 615 616 617 618 619 620 621
      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
622 623
    end

624 625 626 627 628
    describe :ldap_identity do
      it 'returns ldap identity' do
        user = create :omniauth_user
        expect(user.ldap_identity.provider).not_to be_empty
      end
629 630
    end

631 632 633 634 635 636 637 638
    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
639 640 641
    end
  end

J
Jerome Dalbert 已提交
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 676 677 678 679 680
  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'
681

J
Jerome Dalbert 已提交
682 683
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
684
  end
C
Ciro Santilli 已提交
685

686 687 688 689 690 691
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

692 693
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
694 695

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

      star2 = UsersStarProject.create!(project: project2, user: user)
700 701
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
702 703

      star1.destroy
704 705
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
706 707

      star2.destroy
708 709
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
710 711 712
    end
  end

C
Ciro Santilli 已提交
713 714 715 716 717
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

718
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
719
      user.toggle_star(project)
720
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
721
      user.toggle_star(project)
722
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
723 724
    end
  end
V
Valery Sizov 已提交
725 726 727 728 729 730 731

  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
732

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

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

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

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

Y
Yorick Peterse 已提交
749 750
    it "sorts users by id in descending order when nil is passed" do
      expect(User.sort(nil).first).to eq(@user1)
V
Valery Sizov 已提交
751 752
    end
  end
753

754
  describe "#contributed_projects" do
755 756 757 758 759 760 761 762 763 764 765 766 767 768
    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
769
      expect(subject.contributed_projects).to include(project1)
770 771 772
    end

    it "includes IDs for projects the user has had merge requests merged into" do
773
      expect(subject.contributed_projects).to include(project3)
774 775 776
    end

    it "doesn't include IDs for unrelated projects" do
777
      expect(subject.contributed_projects).not_to include(project2)
778 779
    end
  end
780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796

  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
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825

  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
826 827 828 829 830 831 832 833 834

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

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

835
    subject { user.authorized_groups }
836

837
    it { is_expected.to eq([private_group]) }
838 839 840 841 842 843 844 845 846 847
  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

848
    subject { user.authorized_projects }
849

850
    it { is_expected.to eq([private_project]) }
851
  end
G
gitlabhq 已提交
852
end