diff --git a/fluxer_gateway/src/guild/guild_request_members_search.erl b/fluxer_gateway/src/guild/guild_request_members_search.erl index 13302a913..08757dd22 100644 --- a/fluxer_gateway/src/guild/guild_request_members_search.erl +++ b/fluxer_gateway/src/guild/guild_request_members_search.erl @@ -130,10 +130,21 @@ filter_members_by_query([Member | Rest], NormalizedQuery, Limit, Acc) -> end. -spec member_matches_normalized_query(member(), binary()) -> boolean(). -member_matches_normalized_query(Member, NormalizedQuery) -> - DisplayName = get_display_name(Member), - NormalizedName = string:lowercase(DisplayName), - prefix_binary(NormalizedQuery, NormalizedName). +member_matches_normalized_query(_Member, <<>>) -> + true; +member_matches_normalized_query(Member, NormalizedQuery) when is_map(Member) -> + User = map_utils:ensure_map(maps:get(<<"user">>, Member, #{})), + name_matches(maps:get(<<"nick">>, Member, undefined), NormalizedQuery) orelse + name_matches(maps:get(<<"global_name">>, User, undefined), NormalizedQuery) orelse + name_matches(maps:get(<<"username">>, User, undefined), NormalizedQuery); +member_matches_normalized_query(_Member, _NormalizedQuery) -> + false. + +-spec name_matches(term(), binary()) -> boolean(). +name_matches(Name, NormalizedQuery) when is_binary(Name) -> + prefix_binary(NormalizedQuery, string:lowercase(Name)); +name_matches(_Name, _NormalizedQuery) -> + false. -spec prefix_binary(binary(), binary()) -> boolean(). prefix_binary(Prefix, Value) -> diff --git a/fluxer_gateway/test/guild_data_tests.erl b/fluxer_gateway/test/guild_data_tests.erl index ea670eac0..0f463ebdc 100644 --- a/fluxer_gateway/test/guild_data_tests.erl +++ b/fluxer_gateway/test/guild_data_tests.erl @@ -357,6 +357,17 @@ search_guild_members_limits_prefix_matches_without_paginating_all_test() -> ) ). +search_guild_members_matches_username_of_nicknamed_member_test() -> + Nicknamed = (member(1, <<"jiralite">>))#{<<"nick">> => <<"Specsaver engineer">>}, + State = #{data => #{<<"members">> => [Nicknamed, member(2, <<"Bob">>)]}}, + {reply, Reply, _State} = guild_data:search_guild_members( + #{query => <<"jiralite">>, limit => 25}, State + ), + ?assertEqual( + [1], + [guild_request_members_search:extract_user_id(M) || M <- maps:get(members, Reply)] + ). + get_guild_state_includes_parent_category_when_child_channel_is_visible_test() -> GuildId = 50, UserId = 300, diff --git a/fluxer_gateway/test/guild_request_members_search_tests.erl b/fluxer_gateway/test/guild_request_members_search_tests.erl index c0f32957b..7aa099cdf 100644 --- a/fluxer_gateway/test/guild_request_members_search_tests.erl +++ b/fluxer_gateway/test/guild_request_members_search_tests.erl @@ -95,6 +95,56 @@ filter_members_by_query_matches_nick_test() -> Results = guild_request_members_search:filter_members_by_query(Members, <<"super">>, 10), ?assertEqual(1, length(Results)). +filter_members_by_query_matches_username_behind_nick_test() -> + Members = [ + #{ + <<"user">> => #{ + <<"id">> => <<"1">>, + <<"username">> => <<"jiralite">>, + <<"global_name">> => <<"Jiralite">> + }, + <<"nick">> => <<"Specsaver engineer">> + }, + #{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"bob">>}} + ], + [Match] = guild_request_members_search:filter_members_by_query(Members, <<"JIRA">>, 10), + ?assertEqual(1, guild_request_members_search:extract_user_id(Match)). + +member_matches_every_name_test() -> + Member = #{ + <<"user">> => #{ + <<"id">> => <<"1">>, + <<"username">> => <<"jiralite">>, + <<"global_name">> => <<"Jira Lite">> + }, + <<"nick">> => <<"Specsaver engineer">> + }, + Matches = fun(Query) -> + guild_request_members_search:member_matches_normalized_query(Member, Query) + end, + ?assert(Matches(<<"specsaver">>)), + ?assert(Matches(<<"jira l">>)), + ?assert(Matches(<<"jiral">>)), + ?assert(Matches(<<>>)), + ?assertNot(Matches(<<"engineer">>)), + ?assertNot(Matches(<<"lite">>)). + +member_matches_ignores_non_binary_names_test() -> + Member = #{ + <<"user">> => #{<<"username">> => <<"user">>, <<"global_name">> => null}, + <<"nick">> => 12345 + }, + ?assert(guild_request_members_search:member_matches_normalized_query(Member, <<"us">>)), + ?assertNot(guild_request_members_search:member_matches_normalized_query(Member, <<"12">>)). + +member_matches_non_map_member_test() -> + ?assert( + guild_request_members_search:member_matches_normalized_query(invalid_member(), <<>>) + ), + ?assertNot( + guild_request_members_search:member_matches_normalized_query(invalid_member(), <<"a">>) + ). + fetch_members_with_query_uses_guild_search_call_test() -> Parent = self(), Member = #{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"Alice">>}},