From 8f800ad6917e5fb41d17098f3f860d0d1aedcabe Mon Sep 17 00:00:00 2001
From: Paul Woolcock <paul@woolcock.us>
Date: Tue, 10 Apr 2018 09:46:27 -0400
Subject: [PATCH] Change custom emoji search to `ILIKE` instead of `=` (#7099)

---
 app/models/custom_emoji.rb        |  4 ++++
 app/models/custom_emoji_filter.rb |  2 +-
 spec/models/custom_emoji_spec.rb  | 24 ++++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/app/models/custom_emoji.rb b/app/models/custom_emoji.rb
index 476178e86e..1ec21d1a0b 100644
--- a/app/models/custom_emoji.rb
+++ b/app/models/custom_emoji.rb
@@ -58,5 +58,9 @@ class CustomEmoji < ApplicationRecord
 
       where(shortcode: shortcodes, domain: domain, disabled: false)
     end
+
+    def search(shortcode)
+      where('"custom_emojis"."shortcode" ILIKE ?', "%#{shortcode}%")
+    end
   end
 end
diff --git a/app/models/custom_emoji_filter.rb b/app/models/custom_emoji_filter.rb
index 2c09ed65ca..c4bc310bb0 100644
--- a/app/models/custom_emoji_filter.rb
+++ b/app/models/custom_emoji_filter.rb
@@ -28,7 +28,7 @@ class CustomEmojiFilter
     when 'by_domain'
       CustomEmoji.where(domain: value)
     when 'shortcode'
-      CustomEmoji.where(shortcode: value)
+      CustomEmoji.search(value)
     else
       raise "Unknown filter: #{key}"
     end
diff --git a/spec/models/custom_emoji_spec.rb b/spec/models/custom_emoji_spec.rb
index bb150b8376..87367df500 100644
--- a/spec/models/custom_emoji_spec.rb
+++ b/spec/models/custom_emoji_spec.rb
@@ -1,6 +1,30 @@
 require 'rails_helper'
 
 RSpec.describe CustomEmoji, type: :model do
+  describe '#search' do
+    let(:custom_emoji) { Fabricate(:custom_emoji, shortcode: shortcode) }
+
+    subject  { described_class.search(search_term) }
+
+    context 'shortcode is exact' do
+      let(:shortcode) { 'blobpats' }
+      let(:search_term) { 'blobpats' }
+
+      it 'finds emoji' do
+        is_expected.to include(custom_emoji)
+      end
+    end
+
+    context 'shortcode is partial' do
+      let(:shortcode) { 'blobpats' }
+      let(:search_term) { 'blob' }
+
+      it 'finds emoji' do
+        is_expected.to include(custom_emoji)
+      end
+    end
+  end
+
   describe '#local?' do
     let(:custom_emoji) { Fabricate(:custom_emoji, domain: domain) }
 
-- 
GitLab