user_spec.rb 27.6 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
G
gitlabhq 已提交
177 178 179
  end

  describe "Respond to" do
180 181 182
    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 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195 196
    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 已提交
197 198
  end

199 200 201 202 203 204 205 206
  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
207
      user.confirm
208 209 210 211
      expect(user.confirmed?).to be_truthy
    end
  end

212 213 214 215 216 217 218 219
  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

220 221 222
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
223
      expect(user).to receive(:generate_password)
224 225 226 227
      user.save
    end

    it "should not generate password by default" do
228
      user = create(:user, password: 'abcdefghe')
229
      expect(user.password).to eq('abcdefghe')
230
    end
231

232
    it "should generate password when forcing random password" do
233
      allow(Devise).to receive(:friendly_token).and_return('123456789')
234
      user = create(:user, password: 'abcdefg', force_random_password: true)
235
      expect(user.password).to eq('12345678')
236
    end
237 238
  end

239 240
  describe 'authentication token' do
    it "should have authentication token" do
241
      user = create(:user)
242
      expect(user.authentication_token).not_to be_blank
243
    end
N
Nihad Abbasov 已提交
244
  end
245

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

      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
282
      expect(user.otp_grace_period_started_at).to be_nil
R
Robert Speicher 已提交
283 284 285
    end
  end

286 287 288 289
  describe 'projects' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
D
Dmitriy Zaporozhets 已提交
290 291
      @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
292

293 294
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
295 296
    end

297 298 299 300 301 302 303 304 305
    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) }
306 307 308 309 310
  end

  describe 'groups' do
    before do
      @user = create :user
311 312
      @group = create :group
      @group.add_owner(@user)
313 314
    end

315 316 317
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
318
    it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
319 320
  end

321 322 323 324
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
325 326
      @group = create :group
      @group.add_owner(@user)
327

328
      @group.add_user(@user2, GroupMember::OWNER)
329 330
    end

331
    it { expect(@user2.several_namespaces?).to be_truthy }
332 333
  end

334 335 336 337 338 339
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

340
    it { expect(@user.several_namespaces?).to be_falsey }
341
    it { expect(@user.namespaces).to eq([@user.namespace]) }
342 343 344 345 346 347 348
  end

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

    it "should block user" do
      user.block
349
      expect(user.blocked?).to be_truthy
350 351 352
    end
  end

353 354 355 356 357 358 359
  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
360 361
    end

362 363 364 365
    it 'filters by admins' do
      expect(User).to receive(:admins).and_return([user])

      expect(User.filter('admins')).to include user
366 367
    end

368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
    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
391 392 393 394
  end

  describe :not_in_project do
    before do
395
      User.delete_all
396 397 398 399
      @user = create :user
      @project = create :project
    end

400
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
401
  end
D
Dmitriy Zaporozhets 已提交
402

403 404 405
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
406

407 408 409 410 411
      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') }
412
    end
413

D
Dmitriy Zaporozhets 已提交
414
    describe 'with defaults' do
415
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
416

D
Dmitriy Zaporozhets 已提交
417
      it "should apply defaults to user" do
418 419 420
        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 已提交
421
        expect(user.external).to be_falsey
422 423 424
      end
    end

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

D
Dmitriy Zaporozhets 已提交
428
      it "should apply defaults to user" do
429 430
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
431
        expect(user.theme_id).to eq(1)
432
      end
433 434
    end
  end
435

436
  describe '.find_by_any_email' do
437 438 439
    it 'finds by primary email' do
      user = create(:user, email: 'foo@example.com')

440
      expect(User.find_by_any_email(user.email)).to eq user
441 442 443 444 445 446
    end

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

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

    it 'returns nil when nothing found' do
451
      expect(User.find_by_any_email('')).to be_nil
452 453 454
    end
  end

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

495
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
496 497
    let(:user1) { create(:user, username: 'foo') }

498
    it "should get the correct user" do
499 500 501 502
      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
503 504
    end
  end
G
GitLab 已提交
505

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

    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

539
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
540
    end
G
GitLab 已提交
541
  end
542

D
Dmitriy Zaporozhets 已提交
543 544 545 546 547
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
548
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
549 550 551 552
    end

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

557 558 559
  describe :requires_ldap_check? do
    let(:user) { User.new }

560 561
    it 'is false when LDAP is disabled' do
      # Create a condition which would otherwise cause 'true' to be returned
562
      allow(user).to receive(:ldap_user?).and_return(true)
563
      user.last_credential_check_at = nil
564
      expect(user.requires_ldap_check?).to be_falsey
565 566
    end

567
    context 'when LDAP is enabled' do
568 569 570
      before do
        allow(Gitlab.config.ldap).to receive(:enabled).and_return(true)
      end
571

572
      it 'is false for non-LDAP users' do
573
        allow(user).to receive(:ldap_user?).and_return(false)
574
        expect(user.requires_ldap_check?).to be_falsey
575 576
      end

577
      context 'and when the user is an LDAP user' do
578 579 580
        before do
          allow(user).to receive(:ldap_user?).and_return(true)
        end
581 582 583

        it 'is true when the user has never had an LDAP check before' do
          user.last_credential_check_at = nil
584
          expect(user.requires_ldap_check?).to be_truthy
585 586 587 588
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
589
          expect(user.requires_ldap_check?).to be_truthy
590
        end
591 592 593 594
      end
    end
  end

595 596 597 598 599 600
  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
601

602 603 604 605 606 607 608 609 610
      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
611 612
    end

613 614 615 616 617
    describe :ldap_identity do
      it 'returns ldap identity' do
        user = create :omniauth_user
        expect(user.ldap_identity.provider).not_to be_empty
      end
618 619
    end

620 621 622 623 624 625 626 627
    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
628 629 630
    end
  end

J
Jerome Dalbert 已提交
631 632 633 634 635 636 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
  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'
670

J
Jerome Dalbert 已提交
671 672
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
673
  end
C
Ciro Santilli 已提交
674

675 676 677 678 679 680
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

681 682
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
683 684

      star1 = UsersStarProject.create!(project: project1, user: user)
685 686
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_falsey
687 688

      star2 = UsersStarProject.create!(project: project2, user: user)
689 690
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
691 692

      star1.destroy
693 694
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
695 696

      star2.destroy
697 698
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
699 700 701
    end
  end

C
Ciro Santilli 已提交
702 703 704 705 706
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

707
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
708
      user.toggle_star(project)
709
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
710
      user.toggle_star(project)
711
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
712 713
    end
  end
V
Valery Sizov 已提交
714 715 716 717 718 719 720

  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
721

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

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

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

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

Y
Yorick Peterse 已提交
738 739
    it "sorts users by id in descending order when nil is passed" do
      expect(User.sort(nil).first).to eq(@user1)
V
Valery Sizov 已提交
740 741
    end
  end
742

743
  describe "#contributed_projects" do
744 745 746 747 748 749 750 751 752 753 754 755 756 757
    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
758
      expect(subject.contributed_projects).to include(project1)
759 760 761
    end

    it "includes IDs for projects the user has had merge requests merged into" do
762
      expect(subject.contributed_projects).to include(project3)
763 764 765
    end

    it "doesn't include IDs for unrelated projects" do
766
      expect(subject.contributed_projects).not_to include(project2)
767 768
    end
  end
769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785

  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
786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814

  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
815 816 817 818 819 820 821 822 823

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

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

824
    subject { user.authorized_groups }
825

826
    it { is_expected.to eq([private_group]) }
827 828 829 830 831 832 833 834 835 836
  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

837
    subject { user.authorized_projects }
838

839
    it { is_expected.to eq([private_project]) }
840
  end
G
gitlabhq 已提交
841
end