user_spec.rb 6.14 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
  end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
68 69 70 71
  describe 'modules' do
    it { should include_module(Account) }
  end

gitlabhq's avatar
gitlabhq committed
72 73 74 75
  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
76
    it { should respond_to(:private_token) }
gitlabhq's avatar
gitlabhq committed
77 78
  end

79 80 81 82 83
  describe '#identifier' do
    it "should return valid identifier" do
      user = build(:user, email: "test@mail.com")
      user.identifier.should == "test_mail_com"
    end
84

85 86 87 88
    it "should return identifier without + sign" do
      user = build(:user, email: "test+foo@mail.com")
      user.identifier.should == "test_foo_mail_com"
    end
89

90 91 92 93
    it "should conform to Gitolite's required identifier pattern" do
      user = build(:user, email: "_test@example.com")
      user.identifier.should == 'test_example_com'
    end
94 95
  end

96 97 98 99 100 101 102 103 104 105 106
  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
107

108 109 110 111 112
    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
113 114
  end

115 116
  describe 'authentication token' do
    it "should have authentication token" do
117
      user = create(:user)
118 119
      user.authentication_token.should_not be_blank
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
120
  end
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 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187

  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
      @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
      @user = create :user
      @project = create :project
    end

    it { User.not_in_project(@project).should == [@user, @project.owner] }
  end
gitlabhq's avatar
gitlabhq committed
188
end