From 3796ccc8744af354a50eced5ad3ad2ec831c7ead Mon Sep 17 00:00:00 2001 From: taitus Date: Thu, 25 Mar 2021 10:41:27 +0100 Subject: [PATCH 1/4] Allow search User through email with whitespaces --- app/models/user.rb | 2 +- spec/models/user_spec.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index f20db4bea..35dd762cc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -302,7 +302,7 @@ class User < ApplicationRecord end def self.search(term) - term.present? ? where("email = ? OR username ILIKE ?", term, "%#{term}%") : none + term.present? ? where("email = ? OR username ILIKE ?", term.strip, "%#{term}%") : none end def self.username_max_length diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f10eefed7..0b7eb3c20 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -424,6 +424,14 @@ describe User do expect(search).to eq [user1] end + it "find users by email with whitespaces" do + user1 = create(:user, email: "larry@consul.dev") + create(:user, email: "bird@consul.dev") + search = User.search(" larry@consul.dev ") + + expect(search).to eq [user1] + end + it "find users by name" do user1 = create(:user, username: "Larry Bird") create(:user, username: "Robert Parish") From 95503f581103293754de1f7d0c4b02462db93173 Mon Sep 17 00:00:00 2001 From: taitus Date: Thu, 25 Mar 2021 10:43:53 +0100 Subject: [PATCH 2/4] Allow search User through name with whitespaces --- app/models/user.rb | 5 ++++- spec/models/user_spec.rb | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 35dd762cc..0bb7e62a3 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -302,7 +302,10 @@ class User < ApplicationRecord end def self.search(term) - term.present? ? where("email = ? OR username ILIKE ?", term.strip, "%#{term}%") : none + return none if term.blank? + + search = term.strip + where("email = ? OR username ILIKE ?", search, "%#{search}%") end def self.username_max_length diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 0b7eb3c20..c37ec298c 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -440,6 +440,14 @@ describe User do expect(search).to eq [user1] end + it "find users by name with whitespaces" do + user1 = create(:user, username: "Larry Bird") + create(:user, username: "Robert Parish") + search = User.search(" larry ") + + expect(search).to eq [user1] + end + it "returns no results if no search term provided" do expect(User.search(" ")).to be_empty end From 65f734bf3d506dbf5c8ccc86703b07587942c3e4 Mon Sep 17 00:00:00 2001 From: taitus Date: Thu, 25 Mar 2021 10:59:47 +0100 Subject: [PATCH 3/4] Reduce the number of specs lines of code --- spec/models/user_spec.rb | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index c37ec298c..f0bf8afd3 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -416,36 +416,26 @@ describe User do end describe "self.search" do - it "find users by email" do - user1 = create(:user, email: "larry@consul.dev") - create(:user, email: "bird@consul.dev") - search = User.search("larry@consul.dev") + describe "find users" do + let!(:larry) { create(:user, email: "larry@consul.dev", username: "Larry Bird") } - expect(search).to eq [user1] - end + before { create(:user, email: "robert@consul.dev", username: "Robert Parish") } - it "find users by email with whitespaces" do - user1 = create(:user, email: "larry@consul.dev") - create(:user, email: "bird@consul.dev") - search = User.search(" larry@consul.dev ") + it "by email" do + expect(User.search("larry@consul.dev")).to eq [larry] + end - expect(search).to eq [user1] - end + it "by email with whitespaces" do + expect(User.search(" larry@consul.dev ")).to eq [larry] + end - it "find users by name" do - user1 = create(:user, username: "Larry Bird") - create(:user, username: "Robert Parish") - search = User.search("larry") + it "by name" do + expect(User.search("larry")).to eq [larry] + end - expect(search).to eq [user1] - end - - it "find users by name with whitespaces" do - user1 = create(:user, username: "Larry Bird") - create(:user, username: "Robert Parish") - search = User.search(" larry ") - - expect(search).to eq [user1] + it "by name with whitespaces" do + expect(User.search(" larry ")).to eq [larry] + end end it "returns no results if no search term provided" do From 85aba8830a63afb47a53e991ed2987c44a03d62e Mon Sep 17 00:00:00 2001 From: taitus Date: Mon, 12 Apr 2021 11:36:40 +0200 Subject: [PATCH 4/4] Allow scope :by_username_email_or_document_number search users with whitespaces --- app/models/user.rb | 4 ++-- spec/models/user_spec.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 0bb7e62a3..e1470ae07 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -113,8 +113,8 @@ class User < ApplicationRecord joins(:comments).where("comments.commentable": commentables).distinct end scope :by_username_email_or_document_number, ->(search_string) do - string = "%#{search_string}%" - where("username ILIKE ? OR email ILIKE ? OR document_number ILIKE ?", string, string, string) + search = "%#{search_string.strip}%" + where("username ILIKE ? OR email ILIKE ? OR document_number ILIKE ?", search, search, search) end scope :between_ages, ->(from, to) do where( diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index f0bf8afd3..2eb0eae8a 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -413,6 +413,38 @@ describe User do expect(User.erased).not_to include(user3) end end + + describe ".by_username_email_or_document_number" do + let!(:larry) do + create(:user, email: "larry@consul.dev", username: "Larry Bird", document_number: "12345678Z") + end + + before { create(:user, email: "robert@consul.dev", username: "Robert Parish") } + + it "finds users by email" do + expect(User.by_username_email_or_document_number("larry@consul.dev")).to eq [larry] + end + + it "finds users by email with whitespaces" do + expect(User.by_username_email_or_document_number(" larry@consul.dev ")).to eq [larry] + end + + it "finds users by name" do + expect(User.by_username_email_or_document_number("larry")).to eq [larry] + end + + it "finds users by name with whitespaces" do + expect(User.by_username_email_or_document_number(" larry ")).to eq [larry] + end + + it "finds users by document_number" do + expect(User.by_username_email_or_document_number("12345678Z")).to eq [larry] + end + + it "finds users by document_number with whitespaces" do + expect(User.by_username_email_or_document_number(" 12345678Z ")).to eq [larry] + end + end end describe "self.search" do