user_spec.rb 6.03 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
#  theme_id               :integer          default(1), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
26
#  bio                    :string(255)
27
#  failed_attempts        :integer          default(0)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
28 29 30
#  locked_at              :datetime
#  extern_uid             :string(255)
#  provider               :string(255)
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
31
#  username               :string(255)
32 33
#  can_create_group       :boolean          default(TRUE), not null
#  can_create_team        :boolean          default(TRUE), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
34 35
#  state                  :string(255)
#  color_scheme_id        :integer          default(1), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
36
#  notification_level     :integer          default(1), not null
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
37 38
#

gitlabhq's avatar
gitlabhq committed
39 40 41 42
require 'spec_helper'

describe User do
  describe "Associations" do
43
    it { should have_one(:namespace) }
44
    it { should have_many(:users_projects).dependent(:destroy) }
45
    it { should have_many(:groups) }
46 47 48
    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') }
49
    it { should have_many(:issues).dependent(:destroy) }
50
    it { should have_many(:notes).dependent(:destroy) }
51 52 53
    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) }
54 55
  end

56 57 58 59 60
  describe "Mass assignment" do
    it { should_not allow_mass_assignment_of(:projects_limit) }
    it { should allow_mass_assignment_of(:projects_limit).as(:admin) }
  end

61
  describe 'validations' do
62
    it { should validate_presence_of(:username) }
63 64 65 66 67 68
    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
69 70 71 72 73
  end

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

77 78 79 80 81 82 83 84 85 86 87
  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
88

89 90 91 92 93
    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
94 95
  end

96 97
  describe 'authentication token' do
    it "should have authentication token" do
98
      user = create(:user)
99 100
      user.authentication_token.should_not be_blank
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
101
  end
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 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

  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
144
      user.blocked?.should be_true
145 146 147 148 149
    end
  end

  describe 'filter' do
    before do
150
      User.delete_all
151 152
      @user = create :user
      @admin = create :user, admin: true
153
      @blocked = create :user, state: :blocked
154 155 156 157 158 159 160 161 162 163
    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
164
      User.delete_all
165 166 167 168 169 170
      @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
171 172 173 174 175 176

  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
177
    it { user.can_create_group?.should be_true }
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
178 179 180
    it { user.can_create_project?.should be_true }
    it { user.first_name.should == 'John' }
  end
gitlabhq's avatar
gitlabhq committed
181
end