Commit 5837835

mo khan <mo@mokhan.ca>
2015-11-15 19:23:37
lowercase email and username.
1 parent 34dcbc8
Changed files (2)
app
models
spec
app/models/user.rb
@@ -11,6 +11,7 @@ class User < ActiveRecord::Base
   validates_acceptance_of :terms_and_conditions
 
   after_create :create_profile
+  before_validation :lowercase_account_fields
 
   def timezone
     TZInfo::Timezone.get('Canada/Mountain')
@@ -53,8 +54,13 @@ class User < ActiveRecord::Base
     GoogleDrive.new(self)
   end
 
-  def self.authenticate(username,password)
-    if user = User.where("email = :email OR username = :username", username: username, email: username).first
+  def self.authenticate(username, password)
+    user = User.where(
+      "email = :email OR username = :username",
+      username: username.downcase,
+      email: username.downcase
+    ).first
+    if user.present?
       user.authenticate(password)
     end
   end
@@ -64,4 +70,9 @@ class User < ActiveRecord::Base
   def create_profile
     self.profile = Profile.create!(user: self)
   end
+
+  def lowercase_account_fields
+    self.username.downcase! if self.username.present?
+    self.email.downcase! if self.email.present?
+  end
 end
spec/models/user_spec.rb
@@ -10,6 +10,16 @@ describe User do
       expect(saved_user.email).to eql(user.email)
       expect(saved_user.password).to be_nil
     end
+
+    it "lowercases the username" do
+      user = create(:user, username: "UpCASE")
+      expect(user.reload.username).to eql("upcase")
+    end
+
+    it "lowercases the email" do
+      user = create(:user, email: FFaker::Internet.email.upcase)
+      expect(user.reload.email).to eql(user.email.downcase)
+    end
   end
 
   describe "validations" do
@@ -93,7 +103,16 @@ describe User do
     context "when credentials are correct" do
       it "returns true" do
         user = create(:user, password: "password", password_confirmation: "password")
-        expect(User.authenticate(user.email, "password")).to eql(user)
+        expect(User.authenticate(user.email.upcase, "password")).to eql(user)
+      end
+
+      it "is case in-sensitive for username" do
+        user = create(:user,
+                      username: "upcase",
+                      password: "password",
+                      password_confirmation: "password"
+                     )
+        expect(User.authenticate("UPcase", "password")).to eql(user)
       end
     end