diff --git a/test/membership/fuzzy_search_test.exs b/test/membership/fuzzy_search_test.exs index 5e47631..6ec582b 100644 --- a/test/membership/fuzzy_search_test.exs +++ b/test/membership/fuzzy_search_test.exs @@ -30,8 +30,7 @@ defmodule Mv.Membership.FuzzySearchTest do result = Mv.Membership.Member |> Mv.Membership.Member.fuzzy_search(%{ - query: "john", - fields: [:first_name, :last_name, :email] + query: "john" }) |> Ash.read!() @@ -63,8 +62,7 @@ defmodule Mv.Membership.FuzzySearchTest do result = Mv.Membership.Member |> Mv.Membership.Member.fuzzy_search(%{ - query: "tomas", - fields: [:first_name, :last_name, :email] + query: "tomas" }) |> Ash.read!() @@ -195,4 +193,251 @@ defmodule Mv.Membership.FuzzySearchTest do ids = Enum.map(result, & &1.id) assert b.id in ids end + + test "blank character handling: query with spaces matches full name" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "John", + last_name: "Doe", + email: "john.doe@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "Jane", + last_name: "Smith", + email: "jane.smith@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "john doe"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "blank character handling: query with multiple spaces is handled" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Mary", + last_name: "Jane", + email: "mary.jane@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "mary jane"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "special character handling: @ symbol in query matches email" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Test", + last_name: "User", + email: "test.user@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "Other", + last_name: "Person", + email: "other.person@different.org" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "example"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "special character handling: dot in query matches email" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Dot", + last_name: "Test", + email: "dot.test@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "No", + last_name: "Dot", + email: "nodot@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "dot.test"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "special character handling: hyphen in query matches data" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Mary-Jane", + last_name: "Watson", + email: "mary.jane@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "Mary", + last_name: "Smith", + email: "mary.smith@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "mary-jane"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "unicode character handling: umlaut ö in query matches data" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Jörg", + last_name: "Schmidt", + email: "joerg.schmidt@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "John", + last_name: "Smith", + email: "john.smith@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "jörg"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "unicode character handling: umlaut ä in query matches data" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Märta", + last_name: "Andersson", + email: "maerta.andersson@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "Marta", + last_name: "Johnson", + email: "marta.johnson@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "märta"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "unicode character handling: umlaut ü in query matches data" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Günther", + last_name: "Müller", + email: "guenther.mueller@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "Gunter", + last_name: "Miller", + email: "gunter.miller@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "müller"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "unicode character handling: query without umlaut matches data with umlaut" do + {:ok, member} = + Mv.Membership.create_member(%{ + first_name: "Müller", + last_name: "Schmidt", + email: "mueller.schmidt@example.com" + }) + + {:ok, _other} = + Mv.Membership.create_member(%{ + first_name: "Miller", + last_name: "Smith", + email: "miller.smith@example.com" + }) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: "muller"}) + |> Ash.read!() + + ids = Enum.map(result, & &1.id) + assert member.id in ids + end + + test "very long search strings: handles long query without error" do + {:ok, _member} = + Mv.Membership.create_member(%{ + first_name: "Test", + last_name: "User", + email: "test@example.com" + }) + + long_query = String.duplicate("a", 1000) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: long_query}) + |> Ash.read!() + + # Should not crash, may return empty or some results + assert is_list(result) + end + + test "very long search strings: handles extremely long query" do + {:ok, _member} = + Mv.Membership.create_member(%{ + first_name: "Test", + last_name: "User", + email: "test@example.com" + }) + + very_long_query = String.duplicate("test query ", 1000) + + result = + Mv.Membership.Member + |> Mv.Membership.Member.fuzzy_search(%{query: very_long_query}) + |> Ash.read!() + + # Should not crash, may return empty or some results + assert is_list(result) + end end