From 36ec5eaf85702179633e30c1caff747f2b6865f8 Mon Sep 17 00:00:00 2001
From: Steve Halasz <stevehalasz@gmail.com>
Date: Thu, 27 Oct 2016 15:46:28 -0400
Subject: [PATCH] Only show one error message for an invalid email

If notification_email is blank, it's set from email. If an admin
attempted to create a user with an invalid email, an error would be
displayed for both fields. Only validate the notification_email if it's
different from email.
---
 app/models/user.rb                              |  4 +++-
 spec/controllers/admin/users_controller_spec.rb | 11 +++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/app/models/user.rb b/app/models/user.rb
index f367f4616fb..ae951f19d24 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -93,8 +93,10 @@ class User < ActiveRecord::Base
   #
   # Validations
   #
+  # Note: devise :validatable above adds validations for :email and :password
   validates :name, presence: true
-  validates :notification_email, presence: true, email: true
+  validates :notification_email, presence: true
+  validates :notification_email, email: true, if: ->(user) { user.notification_email != user.email }
   validates :public_email, presence: true, uniqueness: true, email: true, allow_blank: true
   validates :bio, length: { maximum: 255 }, allow_blank: true
   validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 }
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index 33fe3c73822..2ab2ca1b667 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -114,6 +114,17 @@ describe Admin::UsersController do
     end
   end
 
+  describe 'POST create' do
+    it 'creates the user' do
+      expect{ post :create, user: attributes_for(:user) }.to change{ User.count }.by(1)
+    end
+
+    it 'shows only one error message for an invalid email' do
+      post :create, user: attributes_for(:user, email: 'bogus')
+      expect(assigns[:user].errors).to contain_exactly("Email is invalid")
+    end
+  end
+
   describe 'POST update' do
     context 'when the password has changed' do
       def update_password(user, password, password_confirmation = nil)
-- 
GitLab