user_spec.rb 16.9 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4
# == Schema Information
#
# Table name: users
#
D
Dmitriy Zaporozhets 已提交
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
#  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
#  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
D
Dmitriy Zaporozhets 已提交
44 45
#  last_credential_check_at :datetime
#  github_access_token      :string(255)
D
Dmitriy Zaporozhets 已提交
46 47
#

G
gitlabhq 已提交
48 49 50 51
require 'spec_helper'

describe User do
  describe "Associations" do
52 53 54 55 56 57 58 59 60 61 62 63 64
    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) }
65 66
  end

67 68 69
  describe "Mass assignment" do
  end

70
  describe 'validations' do
71 72 73 74 75
    it { is_expected.to validate_presence_of(:username) }
    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) }
76

77
    it { is_expected.to ensure_length_of(:bio).is_within(0..255) }
78 79 80 81 82 83

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

85 86 87 88 89
      it 'accepts info+test@example.com' do
        user = build(:user, email: 'info+test@example.com')
        expect(user).to be_valid
      end

90 91 92 93 94
      it "accepts o'reilly@example.com" do
        user = build(:user, email: "o'reilly@example.com")
        expect(user).to be_valid
      end

95 96 97 98 99 100 101 102 103
      it 'rejects test@test@example.com' do
        user = build(:user, email: 'test@test@example.com')
        expect(user).to be_invalid
      end

      it 'rejects mailto:test@example.com' do
        user = build(:user, email: 'mailto:test@example.com')
        expect(user).to be_invalid
      end
104 105 106 107 108

      it "rejects lol!'+=?><#$%^&*()@gmail.com" do
        user = build(:user, email: "lol!'+=?><#$%^&*()@gmail.com")
        expect(user).to be_invalid
      end
109
    end
G
gitlabhq 已提交
110 111 112
  end

  describe "Respond to" do
113 114 115
    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 已提交
116 117
  end

118 119 120
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
121
      expect(user).to receive(:generate_password)
122 123 124 125
      user.save
    end

    it "should not generate password by default" do
126
      user = create(:user, password: 'abcdefghe')
127
      expect(user.password).to eq('abcdefghe')
128
    end
129

130
    it "should generate password when forcing random password" do
131
      allow(Devise).to receive(:friendly_token).and_return('123456789')
132
      user = create(:user, password: 'abcdefg', force_random_password: true)
133
      expect(user.password).to eq('12345678')
134
    end
135 136
  end

137 138
  describe 'authentication token' do
    it "should have authentication token" do
139
      user = create(:user)
140
      expect(user.authentication_token).not_to be_blank
141
    end
N
Nihad Abbasov 已提交
142
  end
143 144 145 146 147

  describe 'projects' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
D
Dmitriy Zaporozhets 已提交
148 149
      @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
150

151 152
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
153 154
    end

155 156 157 158 159 160 161 162 163
    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) }
164 165 166 167 168
  end

  describe 'groups' do
    before do
      @user = create :user
169 170
      @group = create :group
      @group.add_owner(@user)
171 172
    end

173 174 175
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
176 177
  end

178 179 180 181
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
182 183
      @group = create :group
      @group.add_owner(@user)
184

185
      @group.add_user(@user2, GroupMember::OWNER)
186 187
    end

188
    it { expect(@user2.several_namespaces?).to be_truthy }
189 190
  end

191 192 193 194 195 196
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

197
    it { expect(@user.several_namespaces?).to be_falsey }
198 199 200 201 202 203 204
  end

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

    it "should block user" do
      user.block
205
      expect(user.blocked?).to be_truthy
206 207 208 209 210
    end
  end

  describe 'filter' do
    before do
211
      User.delete_all
212 213
      @user = create :user
      @admin = create :user, admin: true
214
      @blocked = create :user, state: :blocked
215 216
    end

217 218 219 220
    it { expect(User.filter("admins")).to eq([@admin]) }
    it { expect(User.filter("blocked")).to eq([@blocked]) }
    it { expect(User.filter("wop")).to include(@user, @admin, @blocked) }
    it { expect(User.filter(nil)).to include(@user, @admin) }
221 222 223 224
  end

  describe :not_in_project do
    before do
225
      User.delete_all
226 227 228 229
      @user = create :user
      @project = create :project
    end

230
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
231
  end
D
Dmitriy Zaporozhets 已提交
232

233 234 235
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
236

237 238 239 240 241
      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') }
242
    end
243

D
Dmitriy Zaporozhets 已提交
244
    describe 'with defaults' do
245
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
246

D
Dmitriy Zaporozhets 已提交
247
      it "should apply defaults to user" do
248 249 250
        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)
251 252 253
      end
    end

D
Dmitriy Zaporozhets 已提交
254 255
    describe 'with default overrides' do
      let(:user) { User.new(projects_limit: 123, can_create_group: false, can_create_team: true, theme_id: Gitlab::Theme::BASIC) }
D
Dmitriy Zaporozhets 已提交
256

D
Dmitriy Zaporozhets 已提交
257
      it "should apply defaults to user" do
258 259 260
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
        expect(user.theme_id).to eq(Gitlab::Theme::BASIC)
261
      end
262 263
    end
  end
264

M
Marin Jankovski 已提交
265 266 267 268 269
  describe 'search' do
    let(:user1) { create(:user, username: 'James', email: 'james@testing.com') }
    let(:user2) { create(:user, username: 'jameson', email: 'jameson@example.com') }

    it "should be case insensitive" do
270 271 272 273 274 275
      expect(User.search(user1.username.upcase).to_a).to eq([user1])
      expect(User.search(user1.username.downcase).to_a).to eq([user1])
      expect(User.search(user2.username.upcase).to_a).to eq([user2])
      expect(User.search(user2.username.downcase).to_a).to eq([user2])
      expect(User.search(user1.username.downcase).to_a.count).to eq(2)
      expect(User.search(user2.username.downcase).to_a.count).to eq(1)
M
Marin Jankovski 已提交
276 277 278
    end
  end

279
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
280 281
    let(:user1) { create(:user, username: 'foo') }

282
    it "should get the correct user" do
283 284 285 286
      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
287 288
    end
  end
G
GitLab 已提交
289

290 291 292 293 294 295 296 297 298 299 300 301 302 303
  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

304 305
  describe ".clean_username" do

306 307
    let!(:user) { create(:user, username: "johngitlab-etc") }
    let!(:namespace) { create(:namespace, path: "JohnGitLab-etc1") }
308 309 310 311 312 313

    it "cleans a username and makes sure it's available" do
      expect(User.clean_username("-john+gitlab-ETC%.git@gmail.com")).to eq("johngitlab-ETC2")
    end
  end

G
GitLab 已提交
314
  describe 'all_ssh_keys' do
315
    it { is_expected.to have_many(:keys).dependent(:destroy) }
G
GitLab 已提交
316 317 318 319 320

    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

321
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
322
    end
G
GitLab 已提交
323
  end
324

D
Dmitriy Zaporozhets 已提交
325 326 327 328 329
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
330
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
331 332 333 334
    end

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

339 340 341
  describe :requires_ldap_check? do
    let(:user) { User.new }

342 343 344 345
    it 'is false when LDAP is disabled' do
      # Create a condition which would otherwise cause 'true' to be returned
      user.stub(ldap_user?: true)
      user.last_credential_check_at = nil
346
      expect(user.requires_ldap_check?).to be_falsey
347 348
    end

349 350
    context 'when LDAP is enabled' do
      before { Gitlab.config.ldap.stub(enabled: true) }
351

352 353
      it 'is false for non-LDAP users' do
        user.stub(ldap_user?: false)
354
        expect(user.requires_ldap_check?).to be_falsey
355 356
      end

357 358 359 360 361
      context 'and when the user is an LDAP user' do
        before { user.stub(ldap_user?: true) }

        it 'is true when the user has never had an LDAP check before' do
          user.last_credential_check_at = nil
362
          expect(user.requires_ldap_check?).to be_truthy
363 364 365 366
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
367
          expect(user.requires_ldap_check?).to be_truthy
368
        end
369 370 371 372
      end
    end
  end

373 374
  describe :ldap_user? do
    it "is true if provider name starts with ldap" do
375
      user = create(:omniauth_user, provider: 'ldapmain')
376
      expect( user.ldap_user? ).to be_truthy
377 378 379
    end

    it "is false for other providers" do
380
      user = create(:omniauth_user, provider: 'other-provider')
381
      expect( user.ldap_user? ).to be_falsey
382 383 384
    end

    it "is false if no extern_uid is provided" do
385
      user = create(:omniauth_user, extern_uid: nil)
386
      expect( user.ldap_user? ).to be_falsey
387 388 389
    end
  end

390 391 392
  describe :ldap_identity do
    it "returns ldap identity" do
      user = create :omniauth_user
393
      expect(user.ldap_identity.provider).not_to be_empty
394 395 396
    end
  end

J
Jerome Dalbert 已提交
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
  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'
436

J
Jerome Dalbert 已提交
437 438
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
439
  end
C
Ciro Santilli 已提交
440

441 442 443 444 445 446
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

447 448
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
449 450

      star1 = UsersStarProject.create!(project: project1, user: user)
451 452
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_falsey
453 454

      star2 = UsersStarProject.create!(project: project2, user: user)
455 456
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
457 458

      star1.destroy
459 460
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
461 462

      star2.destroy
463 464
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
465 466 467
    end
  end

C
Ciro Santilli 已提交
468 469 470 471 472
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

473
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
474
      user.toggle_star(project)
475
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
476
      user.toggle_star(project)
477
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
478 479
    end
  end
V
Valery Sizov 已提交
480 481 482 483 484 485 486

  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
487

V
Valery Sizov 已提交
488
    it "sorts users as recently_signed_in" do
489
      expect(User.sort('recent_sign_in').first).to eq(@user)
V
Valery Sizov 已提交
490 491 492
    end

    it "sorts users as late_signed_in" do
493
      expect(User.sort('oldest_sign_in').first).to eq(@user1)
V
Valery Sizov 已提交
494 495 496
    end

    it "sorts users as recently_created" do
497
      expect(User.sort('created_desc').first).to eq(@user)
V
Valery Sizov 已提交
498 499 500
    end

    it "sorts users as late_created" do
501
      expect(User.sort('created_asc').first).to eq(@user1)
V
Valery Sizov 已提交
502 503 504
    end

    it "sorts users by name when nil is passed" do
505
      expect(User.sort(nil).first).to eq(@user)
V
Valery Sizov 已提交
506 507
    end
  end
G
gitlabhq 已提交
508
end