From d1e08bd38c029f0b47dfd2f3ba61ca5bb3e414b8 Mon Sep 17 00:00:00 2001
From: Matt Jankowski <mjankowski@thoughtbot.com>
Date: Thu, 1 Jun 2017 08:20:36 -0400
Subject: [PATCH] Handle nil and blank cases in Account finders (#3500)

---
 app/models/concerns/account_finder_concern.rb    | 10 +++++++---
 .../concerns/account_finder_concern_spec.rb      | 16 ++++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/app/models/concerns/account_finder_concern.rb b/app/models/concerns/account_finder_concern.rb
index d3ad519b12..561c7ab9f8 100644
--- a/app/models/concerns/account_finder_concern.rb
+++ b/app/models/concerns/account_finder_concern.rb
@@ -37,21 +37,25 @@ module AccountFinderConcern
 
     def scoped_accounts
       Account.unscoped.tap do |scope|
+        scope.merge! with_usernames
         scope.merge! matching_username
         scope.merge! matching_domain
       end
     end
 
+    def with_usernames
+      Account.where.not(username: [nil, ''])
+    end
+
     def matching_username
-      raise(ActiveRecord::RecordNotFound) if username.blank?
-      Account.where(Account.arel_table[:username].lower.eq username.downcase)
+      Account.where(Account.arel_table[:username].lower.eq username.to_s.downcase)
     end
 
     def matching_domain
       if domain.nil?
         Account.where(domain: nil)
       else
-        Account.where(Account.arel_table[:domain].lower.eq domain.downcase)
+        Account.where(Account.arel_table[:domain].lower.eq domain.to_s.downcase)
       end
     end
   end
diff --git a/spec/models/concerns/account_finder_concern_spec.rb b/spec/models/concerns/account_finder_concern_spec.rb
index 05f0f44f27..25f4fdec4b 100644
--- a/spec/models/concerns/account_finder_concern_spec.rb
+++ b/spec/models/concerns/account_finder_concern_spec.rb
@@ -24,6 +24,14 @@ describe AccountFinderConcern do
       it 'returns nil for regex style username value' do
         expect(Account.find_local('al%')).to be_nil
       end
+
+      it 'returns nil for nil username value' do
+        expect(Account.find_local(nil)).to be_nil
+      end
+
+      it 'returns nil for blank username value' do
+        expect(Account.find_local('')).to be_nil
+      end
     end
 
     describe '.find_local!' do
@@ -70,6 +78,14 @@ describe AccountFinderConcern do
       it 'returns nil for regex style domain value' do
         expect(Account.find_remote('alice', 'm%')).to be_nil
       end
+
+      it 'returns nil for nil username value' do
+        expect(Account.find_remote(nil, 'domain')).to be_nil
+      end
+
+      it 'returns nil for blank username value' do
+        expect(Account.find_remote('', 'domain')).to be_nil
+      end
     end
 
     describe '.find_remote!' do