BigW Consortium Gitlab

user_spec.rb 13.4 KB
Newer Older
Dmitriy Zaporozhets committed
1 2 3 4
# == Schema Information
#
# Table name: users
#
Dmitriy Zaporozhets committed
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
#  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
#  extern_uid               :string(255)
#  provider                 :string(255)
#  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
Dmitriy Zaporozhets committed
47 48
#

gitlabhq committed
49 50 51 52
require 'spec_helper'

describe User do
  describe "Associations" do
53
    it { should have_one(:namespace) }
54
    it { should have_many(:snippets).class_name('Snippet').dependent(:destroy) }
55
    it { should have_many(:users_projects).dependent(:destroy) }
56
    it { should have_many(:groups) }
57 58 59
    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') }
60
    it { should have_many(:issues).dependent(:destroy) }
61
    it { should have_many(:notes).dependent(:destroy) }
62 63 64
    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) }
65 66
  end

67 68 69 70 71
  describe "Mass assignment" do
    it { should_not allow_mass_assignment_of(:projects_limit) }
    it { should allow_mass_assignment_of(:projects_limit).as(:admin) }
  end

72
  describe 'validations' do
73
    it { should validate_presence_of(:username) }
74 75 76 77 78 79
    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) }
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

    describe 'email' do
      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 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
    end
gitlabhq committed
101 102 103 104 105
  end

  describe "Respond to" do
    it { should respond_to(:is_admin?) }
    it { should respond_to(:name) }
Nihad Abbasov committed
106
    it { should respond_to(:private_token) }
gitlabhq committed
107 108
  end

109 110 111 112 113 114 115 116
  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
117 118
      user = create(:user, password: 'abcdefghe')
      user.password.should == 'abcdefghe'
119
    end
120

121 122 123 124 125
    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
126 127
  end

128 129
  describe 'authentication token' do
    it "should have authentication token" do
130
      user = create(:user)
131 132
      user.authentication_token.should_not be_blank
    end
Nihad Abbasov committed
133
  end
134 135 136 137 138 139

  describe 'projects' do
    before do
      ActiveRecord::Base.observers.enable(:user_observer)
      @user = create :user
      @project = create :project, namespace: @user.namespace
Dmitriy Zaporozhets committed
140 141
      @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
142

143 144
      @project_2.team << [@user, :master]
      @project_3.team << [@user, :developer]
145 146 147
    end

    it { @user.authorized_projects.should include(@project) }
148 149
    it { @user.authorized_projects.should include(@project_2) }
    it { @user.authorized_projects.should include(@project_3) }
150
    it { @user.owned_projects.should include(@project) }
151 152
    it { @user.owned_projects.should_not include(@project_2) }
    it { @user.owned_projects.should_not include(@project_3) }
153
    it { @user.personal_projects.should include(@project) }
154 155
    it { @user.personal_projects.should_not include(@project_2) }
    it { @user.personal_projects.should_not include(@project_3) }
156 157 158 159 160 161
  end

  describe 'groups' do
    before do
      ActiveRecord::Base.observers.enable(:user_observer)
      @user = create :user
162 163
      @group = create :group
      @group.add_owner(@user)
164 165 166 167 168 169 170
    end

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

171 172 173 174 175
  describe 'group multiple owners' do
    before do
      ActiveRecord::Base.observers.enable(:user_observer)
      @user = create :user
      @user2 = create :user
176 177
      @group = create :group
      @group.add_owner(@user)
178

179
      @group.add_user(@user2, UsersGroup::OWNER)
180 181 182 183 184
    end

    it { @user2.several_namespaces?.should be_true }
  end

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
  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 }
  end

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

    it "should block user" do
      user.block
200
      user.blocked?.should be_true
201 202 203 204 205
    end
  end

  describe 'filter' do
    before do
206
      User.delete_all
207 208
      @user = create :user
      @admin = create :user, admin: true
209
      @blocked = create :user, state: :blocked
210 211 212 213
    end

    it { User.filter("admins").should == [@admin] }
    it { User.filter("blocked").should == [@blocked] }
214 215
    it { User.filter("wop").should include(@user, @admin, @blocked) }
    it { User.filter(nil).should include(@user, @admin) }
216 217 218 219
  end

  describe :not_in_project do
    before do
220
      User.delete_all
221 222 223 224
      @user = create :user
      @project = create :project
    end

225
    it { User.not_in_project(@project).should include(@user, @project.owner) }
226
  end
Dmitriy Zaporozhets committed
227

228 229 230
  describe 'user creation' do
    describe 'normal user' do
      let(:user) { create(:user, name: 'John Smith') }
Dmitriy Zaporozhets committed
231

232 233 234 235 236 237
      it { user.is_admin?.should be_false }
      it { user.require_ssh_key?.should be_true }
      it { user.can_create_group?.should be_true }
      it { user.can_create_project?.should be_true }
      it { user.first_name.should == 'John' }
    end
238

239 240
    describe 'without defaults' do
      let(:user) { User.new }
Dmitriy Zaporozhets committed
241

242 243 244 245 246
      it "should not apply defaults to user" do
        user.projects_limit.should == 10
        user.can_create_group.should be_true
        user.theme_id.should == Gitlab::Theme::BASIC
      end
247
    end
248 249 250
    context 'as admin' do
      describe 'with defaults' do
        let(:user) { User.build_user({}, as: :admin) }
Dmitriy Zaporozhets committed
251

252
        it "should apply defaults to user" do
253 254 255
          user.projects_limit.should == Gitlab.config.gitlab.default_projects_limit
          user.can_create_group.should == Gitlab.config.gitlab.default_can_create_group
          user.theme_id.should == Gitlab.config.gitlab.default_theme
256 257 258 259
        end
      end

      describe 'with default overrides' do
Dmitriy Zaporozhets committed
260 261
        let(:user) { User.build_user({projects_limit: 123, can_create_group: true, can_create_team: true, theme_id: Gitlab::Theme::BASIC}, as: :admin) }

262
        it "should apply defaults to user" do
263 264
          Gitlab.config.gitlab.default_projects_limit.should_not == 123
          Gitlab.config.gitlab.default_can_create_group.should_not be_true
Izaak Alpert committed
265
          Gitlab.config.gitlab.default_theme.should_not == Gitlab::Theme::BASIC
266 267
          user.projects_limit.should == 123
          user.can_create_group.should be_true
Dmitriy Zaporozhets committed
268
          user.theme_id.should == Gitlab::Theme::BASIC
269 270 271 272 273 274 275
        end
      end
    end

    context 'as user' do
      describe 'with defaults' do
        let(:user) { User.build_user }
Dmitriy Zaporozhets committed
276

277
        it "should apply defaults to user" do
278 279 280
          user.projects_limit.should == Gitlab.config.gitlab.default_projects_limit
          user.can_create_group.should == Gitlab.config.gitlab.default_can_create_group
          user.theme_id.should == Gitlab.config.gitlab.default_theme
281 282
        end
      end
283

284
      describe 'with default overrides' do
Dmitriy Zaporozhets committed
285 286
        let(:user) { User.build_user(projects_limit: 123, can_create_group: true, theme_id: Gitlab::Theme::BASIC) }

287
        it "should apply defaults to user" do
288 289 290
          user.projects_limit.should == Gitlab.config.gitlab.default_projects_limit
          user.can_create_group.should == Gitlab.config.gitlab.default_can_create_group
          user.theme_id.should == Gitlab.config.gitlab.default_theme
291 292
        end
      end
293 294
    end
  end
295

296 297 298 299 300 301 302 303 304
  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
      User.search(user1.username.upcase).to_a.should == [user1]
      User.search(user1.username.downcase).to_a.should == [user1]
      User.search(user2.username.upcase).to_a.should == [user2]
      User.search(user2.username.downcase).to_a.should == [user2]
305 306
      User.search(user1.username.downcase).to_a.count.should == 2
      User.search(user2.username.downcase).to_a.count.should == 1
307 308 309
    end
  end

310
  describe 'by_username_or_id' do
Dmitriy Zaporozhets committed
311 312
    let(:user1) { create(:user, username: 'foo') }

313 314 315 316 317 318 319
    it "should get the correct user" do
      User.by_username_or_id(user1.id).should == user1
      User.by_username_or_id('foo').should == user1
      User.by_username_or_id(-1).should be_nil
      User.by_username_or_id('bar').should be_nil
    end
  end
320 321 322 323 324 325 326 327 328 329

  describe 'all_ssh_keys' do
    it { should have_many(:keys).dependent(:destroy) }

    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

      user.all_ssh_keys.should include(key.key)
    end
330
  end
331
    
332 333 334 335 336 337 338 339 340 341 342 343 344
  describe :avatar_type do
    let(:user) { create(:user) }

    it "should be true if avatar is image" do
      user.update_attribute(:avatar, 'uploads/avatar.png')
      user.avatar_type.should be_true
    end

    it "should be false if avatar is html page" do
      user.update_attribute(:avatar, 'uploads/avatar.html')
      user.avatar_type.should == ["only images allowed"]
    end
  end
Jerome Dalbert committed
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384

  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'
385

Jerome Dalbert committed
386 387
      expect(user.short_website_url).to eq 'test.com'
    end
388
  end
gitlabhq committed
389
end