mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
fix(gateway): match member search on username and global name (#2791)
This commit is contained in:
@@ -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) ->
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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">>}},
|
||||
|
||||
Reference in New Issue
Block a user