user_spec.rb 6.43 KB
Newer Older
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
1 2 3 4
# == Schema Information
#
# Table name: users
#
5 6 7
#  id                     :integer          not null, primary key
#  email                  :string(255)      default(""), not null
#  encrypted_password     :string(255)      default(""), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
8 9 10
#  reset_password_token   :string(255)
#  reset_password_sent_at :datetime
#  remember_created_at    :datetime
11
#  sign_in_count          :integer          default(0)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
12 13 14 15
#  current_sign_in_at     :datetime
#  last_sign_in_at        :datetime
#  current_sign_in_ip     :string(255)
#  last_sign_in_ip        :string(255)
16 17
#  created_at             :datetime         not null
#  updated_at             :datetime         not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
18
#  name                   :string(255)
19 20 21 22 23
#  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
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
24
#  authentication_token   :string(255)
25 26
#  dark_scheme            :boolean          default(FALSE), not null
#  theme_id               :integer          default(1), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
27
#  bio                    :string(255)
28 29
#  blocked                :boolean          default(FALSE), not null
#  failed_attempts        :integer          default(0)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
30 31 32
#  locked_at              :datetime
#  extern_uid             :string(255)
#  provider               :string(255)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
33
#  username               :string(255)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
34 35
#

gitlabhq's avatar
gitlabhq committed
36 37 38 39
require 'spec_helper'

describe User do
  describe "Associations" do
40
    it { should have_one(:namespace) }
41
    it { should have_many(:users_projects).dependent(:destroy) }
42
    it { should have_many(:groups) }
43 44 45
    it { should have_many(:keys).dependent(:destroy) }
    it { should have_many(:events).class_name('Event').dependent(:destroy) }
    it { should have_many(:recent_events).class_name('Event') }
46
    it { should have_many(:issues).dependent(:destroy) }
47
    it { should have_many(:notes).dependent(:destroy) }
48 49 50
    it { should have_many(:assigned_issues).dependent(:destroy) }
    it { should have_many(:merge_requests).dependent(:destroy) }
    it { should have_many(:assigned_merge_requests).dependent(:destroy) }
51 52
  end

53 54 55 56 57
  describe "Mass assignment" do
    it { should_not allow_mass_assignment_of(:projects_limit) }
    it { should allow_mass_assignment_of(:projects_limit).as(:admin) }
  end

58
  describe 'validations' do
59
    it { should validate_presence_of(:username) }
60 61 62 63 64 65
    it { should validate_presence_of(:projects_limit) }
    it { should validate_numericality_of(:projects_limit) }
    it { should allow_value(0).for(:projects_limit) }
    it { should_not allow_value(-1).for(:projects_limit) }

    it { should ensure_length_of(:bio).is_within(0..255) }
gitlabhq's avatar
gitlabhq committed
66 67 68 69 70 71
  end

  describe "Respond to" do
    it { should respond_to(:is_admin?) }
    it { should respond_to(:identifier) }
    it { should respond_to(:name) }
Nihad Abbasov's avatar
Nihad Abbasov committed
72
    it { should respond_to(:private_token) }
gitlabhq's avatar
gitlabhq committed
73 74
  end

75 76 77 78 79
  describe '#identifier' do
    it "should return valid identifier" do
      user = build(:user, email: "test@mail.com")
      user.identifier.should == "test_mail_com"
    end
80

81 82 83 84
    it "should return identifier without + sign" do
      user = build(:user, email: "test+foo@mail.com")
      user.identifier.should == "test_foo_mail_com"
    end
85

86 87 88 89
    it "should conform to Gitolite's required identifier pattern" do
      user = build(:user, email: "_test@example.com")
      user.identifier.should == 'test_example_com'
    end
90 91
  end

92 93 94 95 96 97 98 99 100 101 102
  describe '#generate_password' do
    it "should execute callback when force_random_password specified" do
      user = build(:user, force_random_password: true)
      user.should_receive(:generate_password)
      user.save
    end

    it "should not generate password by default" do
      user = create(:user, password: 'abcdefg')
      user.password.should == 'abcdefg'
    end
103

104 105 106 107 108
    it "should generate password when forcing random password" do
      Devise.stub(:friendly_token).and_return('123456789')
      user = create(:user, password: 'abcdefg', force_random_password: true)
      user.password.should == '12345678'
    end
109 110
  end

111 112
  describe 'authentication token' do
    it "should have authentication token" do
113
      user = create(:user)
114 115
      user.authentication_token.should_not be_blank
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
116
  end
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164

  describe 'projects' do
    before do
      ActiveRecord::Base.observers.enable(:user_observer)
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

    it { @user.authorized_projects.should include(@project) }
    it { @user.owned_projects.should include(@project) }
    it { @user.personal_projects.should include(@project) }
  end

  describe 'groups' do
    before do
      ActiveRecord::Base.observers.enable(:user_observer)
      @user = create :user
      @group = create :group, owner: @user
    end

    it { @user.several_namespaces?.should be_true }
    it { @user.namespaces.should == [@user.namespace, @group] }
    it { @user.authorized_groups.should == [@group] }
    it { @user.owned_groups.should == [@group] }
  end

  describe 'namespaced' do
    before do
      ActiveRecord::Base.observers.enable(:user_observer)
      @user = create :user
      @project = create :project, namespace: @user.namespace
    end

    it { @user.several_namespaces?.should be_false }
    it { @user.namespaces.should == [@user.namespace] }
  end

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

    it "should block user" do
      user.block
      user.blocked.should be_true
    end
  end

  describe 'filter' do
    before do
165
      User.delete_all
166 167 168 169 170 171 172 173 174 175 176 177 178
      @user = create :user
      @admin = create :user, admin: true
      @blocked = create :user, blocked: true
    end

    it { User.filter("admins").should == [@admin] }
    it { User.filter("blocked").should == [@blocked] }
    it { User.filter("wop").should == [@user, @admin, @blocked] }
    it { User.filter(nil).should == [@user, @admin] }
  end

  describe :not_in_project do
    before do
179
      User.delete_all
180 181 182 183 184 185
      @user = create :user
      @project = create :project
    end

    it { User.not_in_project(@project).should == [@user, @project.owner] }
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
186 187 188 189 190 191

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

    it { user.is_admin?.should be_false }
    it { user.require_ssh_key?.should be_true }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
192
    it { user.can_create_group?.should be_true }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
193 194 195
    it { user.can_create_project?.should be_true }
    it { user.first_name.should == 'John' }
  end
gitlabhq's avatar
gitlabhq committed
196
end