user_spec.rb 21.2 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 44 45 46 47 48 49 50 51
#  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
#  github_access_token           :string(255)
#  gitlab_access_token           :string(255)
#  notification_email            :string(255)
#  hide_no_password              :boolean          default(FALSE)
#  password_automatically_set    :boolean          default(FALSE)
#  bitbucket_access_token        :string(255)
#  bitbucket_access_token_secret :string(255)
S
Stan Hu 已提交
52
#  location                      :string(255)
53
#  public_email                  :string(255)      default(""), not null
R
Robert Speicher 已提交
54 55 56 57 58
#  encrypted_otp_secret          :string(255)
#  encrypted_otp_secret_iv       :string(255)
#  encrypted_otp_secret_salt     :string(255)
#  otp_required_for_login        :boolean
#  otp_backup_codes              :text
59
#  dashboard                     :integer          default(0)
D
Dmitriy Zaporozhets 已提交
60 61
#

G
gitlabhq 已提交
62 63 64
require 'spec_helper'

describe User do
65 66
  include Gitlab::CurrentSettings

67 68 69 70 71 72 73 74 75 76 77
  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
78 79 80 81 82 83 84 85 86 87 88 89 90
    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) }
91 92 93
  end

  describe 'validations' do
94 95 96 97 98
    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) }
99

100
    it { is_expected.to validate_length_of(:bio).is_within(0..255) }
101 102 103 104 105 106

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

108 109 110 111 112
      it 'accepts info+test@example.com' do
        user = build(:user, email: 'info+test@example.com')
        expect(user).to be_valid
      end

113 114 115 116 117
      it "accepts o'reilly@example.com" do
        user = build(:user, email: "o'reilly@example.com")
        expect(user).to be_valid
      end

118 119 120 121 122 123 124 125 126
      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
127 128 129 130 131

      it "rejects lol!'+=?><#$%^&*()@gmail.com" do
        user = build(:user, email: "lol!'+=?><#$%^&*()@gmail.com")
        expect(user).to be_invalid
      end
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

      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
177
    end
G
gitlabhq 已提交
178 179 180
  end

  describe "Respond to" do
181 182 183
    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 已提交
184 185
  end

186 187 188 189 190 191 192 193
  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

194 195 196
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
197
      expect(user).to receive(:generate_password)
198 199 200 201
      user.save
    end

    it "should not generate password by default" do
202
      user = create(:user, password: 'abcdefghe')
203
      expect(user.password).to eq('abcdefghe')
204
    end
205

206
    it "should generate password when forcing random password" do
207
      allow(Devise).to receive(:friendly_token).and_return('123456789')
208
      user = create(:user, password: 'abcdefg', force_random_password: true)
209
      expect(user.password).to eq('12345678')
210
    end
211 212
  end

213 214
  describe 'authentication token' do
    it "should have authentication token" do
215
      user = create(:user)
216
      expect(user.authentication_token).not_to be_blank
217
    end
N
Nihad Abbasov 已提交
218
  end
219 220 221 222 223

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

227 228
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
229 230
    end

231 232 233 234 235 236 237 238 239
    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) }
240 241 242 243 244
  end

  describe 'groups' do
    before do
      @user = create :user
245 246
      @group = create :group
      @group.add_owner(@user)
247 248
    end

249 250 251
    it { expect(@user.several_namespaces?).to be_truthy }
    it { expect(@user.authorized_groups).to eq([@group]) }
    it { expect(@user.owned_groups).to eq([@group]) }
252
    it { expect(@user.namespaces).to match_array([@user.namespace, @group]) }
253 254
  end

255 256 257 258
  describe 'group multiple owners' do
    before do
      @user = create :user
      @user2 = create :user
259 260
      @group = create :group
      @group.add_owner(@user)
261

262
      @group.add_user(@user2, GroupMember::OWNER)
263 264
    end

265
    it { expect(@user2.several_namespaces?).to be_truthy }
266 267
  end

268 269 270 271 272 273
  describe 'namespaced' do
    before do
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

274
    it { expect(@user.several_namespaces?).to be_falsey }
275
    it { expect(@user.namespaces).to eq([@user.namespace]) }
276 277 278 279 280 281 282
  end

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

    it "should block user" do
      user.block
283
      expect(user.blocked?).to be_truthy
284 285 286 287 288
    end
  end

  describe 'filter' do
    before do
289
      User.delete_all
290 291
      @user = create :user
      @admin = create :user, admin: true
292
      @blocked = create :user, state: :blocked
293 294
    end

295 296 297 298
    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) }
299 300 301 302
  end

  describe :not_in_project do
    before do
303
      User.delete_all
304 305 306 307
      @user = create :user
      @project = create :project
    end

308
    it { expect(User.not_in_project(@project)).to include(@user, @project.owner) }
309
  end
D
Dmitriy Zaporozhets 已提交
310

311 312 313
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
D
Dmitriy Zaporozhets 已提交
314

315 316 317 318 319
      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') }
320
    end
321

D
Dmitriy Zaporozhets 已提交
322
    describe 'with defaults' do
323
      let(:user) { User.new }
D
Dmitriy Zaporozhets 已提交
324

D
Dmitriy Zaporozhets 已提交
325
      it "should apply defaults to user" do
326 327 328
        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)
329 330 331
      end
    end

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

D
Dmitriy Zaporozhets 已提交
335
      it "should apply defaults to user" do
336 337
        expect(user.projects_limit).to eq(123)
        expect(user.can_create_group).to be_falsey
338
        expect(user.theme_id).to eq(1)
339
      end
340 341
    end
  end
342

M
Marin Jankovski 已提交
343 344 345 346 347
  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
348 349 350 351 352 353
      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 已提交
354 355 356
    end
  end

357
  describe 'by_username_or_id' do
D
Dmitriy Zaporozhets 已提交
358 359
    let(:user1) { create(:user, username: 'foo') }

360
    it "should get the correct user" do
361 362 363 364
      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
365 366
    end
  end
G
GitLab 已提交
367

368 369 370 371 372 373 374 375 376 377 378 379 380 381
  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

G
GitLab 已提交
382
  describe 'all_ssh_keys' do
383
    it { is_expected.to have_many(:keys).dependent(:destroy) }
G
GitLab 已提交
384 385 386 387 388

    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

389
      expect(user.all_ssh_keys).to include(key.key)
G
GitLab 已提交
390
    end
G
GitLab 已提交
391
  end
392

D
Dmitriy Zaporozhets 已提交
393 394 395 396 397
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
398
      expect(user.avatar_type).to be_truthy
D
Dmitriy Zaporozhets 已提交
399 400 401 402
    end

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

407 408 409
  describe :requires_ldap_check? do
    let(:user) { User.new }

410 411 412 413
    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
414
      expect(user.requires_ldap_check?).to be_falsey
415 416
    end

417 418
    context 'when LDAP is enabled' do
      before { Gitlab.config.ldap.stub(enabled: true) }
419

420 421
      it 'is false for non-LDAP users' do
        user.stub(ldap_user?: false)
422
        expect(user.requires_ldap_check?).to be_falsey
423 424
      end

425 426 427 428 429
      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
430
          expect(user.requires_ldap_check?).to be_truthy
431 432 433 434
        end

        it 'is true when the last LDAP check happened over 1 hour ago' do
          user.last_credential_check_at = 2.hours.ago
435
          expect(user.requires_ldap_check?).to be_truthy
436
        end
437 438 439 440
      end
    end
  end

441 442
  describe :ldap_user? do
    it "is true if provider name starts with ldap" do
443
      user = create(:omniauth_user, provider: 'ldapmain')
444
      expect( user.ldap_user? ).to be_truthy
445 446 447
    end

    it "is false for other providers" do
448
      user = create(:omniauth_user, provider: 'other-provider')
449
      expect( user.ldap_user? ).to be_falsey
450 451 452
    end

    it "is false if no extern_uid is provided" do
453
      user = create(:omniauth_user, extern_uid: nil)
454
      expect( user.ldap_user? ).to be_falsey
455 456 457
    end
  end

458 459 460
  describe :ldap_identity do
    it "returns ldap identity" do
      user = create :omniauth_user
461
      expect(user.ldap_identity.provider).not_to be_empty
462 463 464
    end
  end

J
Jerome Dalbert 已提交
465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
  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'
504

J
Jerome Dalbert 已提交
505 506
      expect(user.short_website_url).to eq 'test.com'
    end
G
GitLab 已提交
507
  end
C
Ciro Santilli 已提交
508

509 510 511 512 513 514
  describe "#starred?" do
    it "determines if user starred a project" do
      user = create :user
      project1 = create :project, :public
      project2 = create :project, :public

515 516
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
517 518

      star1 = UsersStarProject.create!(project: project1, user: user)
519 520
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_falsey
521 522

      star2 = UsersStarProject.create!(project: project2, user: user)
523 524
      expect(user.starred?(project1)).to be_truthy
      expect(user.starred?(project2)).to be_truthy
525 526

      star1.destroy
527 528
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_truthy
529 530

      star2.destroy
531 532
      expect(user.starred?(project1)).to be_falsey
      expect(user.starred?(project2)).to be_falsey
533 534 535
    end
  end

C
Ciro Santilli 已提交
536 537 538 539 540
  describe "#toggle_star" do
    it "toggles stars" do
      user = create :user
      project = create :project, :public

541
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
542
      user.toggle_star(project)
543
      expect(user.starred?(project)).to be_truthy
C
Ciro Santilli 已提交
544
      user.toggle_star(project)
545
      expect(user.starred?(project)).to be_falsey
C
Ciro Santilli 已提交
546 547
    end
  end
V
Valery Sizov 已提交
548 549 550 551 552 553 554

  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
555

V
Valery Sizov 已提交
556
    it "sorts users as recently_signed_in" do
557
      expect(User.sort('recent_sign_in').first).to eq(@user)
V
Valery Sizov 已提交
558 559 560
    end

    it "sorts users as late_signed_in" do
561
      expect(User.sort('oldest_sign_in').first).to eq(@user1)
V
Valery Sizov 已提交
562 563 564
    end

    it "sorts users as recently_created" do
565
      expect(User.sort('created_desc').first).to eq(@user)
V
Valery Sizov 已提交
566 567 568
    end

    it "sorts users as late_created" do
569
      expect(User.sort('created_asc').first).to eq(@user1)
V
Valery Sizov 已提交
570 571 572
    end

    it "sorts users by name when nil is passed" do
573
      expect(User.sort(nil).first).to eq(@user)
V
Valery Sizov 已提交
574 575
    end
  end
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602

  describe "#contributed_projects_ids" do
    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
      expect(subject.contributed_projects_ids).to include(project1.id)
    end

    it "includes IDs for projects the user has had merge requests merged into" do
      expect(subject.contributed_projects_ids).to include(project3.id)
    end

    it "doesn't include IDs for unrelated projects" do
      expect(subject.contributed_projects_ids).not_to include(project2.id)
    end
  end
603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619

  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
G
gitlabhq 已提交
620
end