From d29827433d77b9f9353fcae396ca321dd9016771 Mon Sep 17 00:00:00 2001
From: Robert Speicher <rspeicher@gmail.com>
Date: Tue, 4 Sep 2012 00:04:36 -0400
Subject: [PATCH] Update User#identifier to conform to Gitolite 2.x's user
 pattern

Also modifies the specs a bit because I can't help myself.

Closes #480
---
 app/roles/account.rb     | 11 ++++++--
 spec/factories.rb        |  2 +-
 spec/models/user_spec.rb | 58 +++++++++++++++++++++++-----------------
 3 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/app/roles/account.rb b/app/roles/account.rb
index 63a9b5c51b..b8c445a3d5 100644
--- a/app/roles/account.rb
+++ b/app/roles/account.rb
@@ -1,6 +1,13 @@
-module Account 
+module Account
+  # Returns a string for use as a Gitolite user identifier
+  #
+  # Note that Gitolite 2.x requires the following pattern for users:
+  #
+  #   ^@?[0-9a-zA-Z][0-9a-zA-Z._\@+-]*$
   def identifier
-    email.gsub /[^[:alnum:]]/, "_"
+    # Replace non-word chars with underscores, then make sure it starts with
+    # valid chars
+    email.gsub(/\W/, '_').gsub(/\A([\W\_])+/, '')
   end
 
   def is_admin?
diff --git a/spec/factories.rb b/spec/factories.rb
index 2e4acf3946..a8b3bc57d3 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -28,7 +28,7 @@ FactoryGirl.define do
     email { Faker::Internet.email }
     name
     password "123456"
-    password_confirmation "123456"
+    password_confirmation { password }
 
     trait :admin do
       admin true
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index ca34f07df7..081767543e 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -31,36 +31,46 @@ describe User do
     it { should respond_to(:private_token) }
   end
 
-  it "should return valid identifier" do
-    user = User.new(email: "test@mail.com")
-    user.identifier.should == "test_mail_com"
-  end
+  describe '#identifier' do
+    it "should return valid identifier" do
+      user = build(:user, email: "test@mail.com")
+      user.identifier.should == "test_mail_com"
+    end
 
-  it "should return identifier without + sign" do
-    user = User.new(email: "test+foo@mail.com")
-    user.identifier.should == "test_foo_mail_com"
-  end
+    it "should return identifier without + sign" do
+      user = build(:user, email: "test+foo@mail.com")
+      user.identifier.should == "test_foo_mail_com"
+    end
 
-  it "should execute callback when force_random_password specified" do
-    user = User.new(email: "test@mail.com", force_random_password: true)
-    user.should_receive(:generate_password)
-    user.save
+    it "should conform to Gitolite's required identifier pattern" do
+      user = build(:user, email: "_test@example.com")
+      user.identifier.should == 'test_example_com'
+    end
   end
 
-  it "should not generate password by default" do
-    user = Factory(:user, password: 'abcdefg', password_confirmation: 'abcdefg')
-    user.password.should == 'abcdefg'
-  end
+  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
 
-  it "should generate password when forcing random password" do
-    Devise.stub(:friendly_token).and_return('123456789')
-    user = User.create(email: "test1@mail.com", force_random_password: true)
-    user.password.should == user.password_confirmation
-    user.password.should == '12345678'
+    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
   end
 
-  it "should have authentication token" do
-    user = Factory(:user)
-    user.authentication_token.should_not == ""
+  describe 'authentication token' do
+    it "should have authentication token" do
+      user = Factory(:user)
+      user.authentication_token.should_not be_blank
+    end
   end
 end
-- 
2.30.9