mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-07 19:22:14 +09:00
210 lines
7.6 KiB
Erlang
210 lines
7.6 KiB
Erlang
%% SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
-module(guild_request_members_search_tests).
|
|
-typing([eqwalizer]).
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
-define(FULL_MEMBER_LIST_LIMIT, 100000).
|
|
-define(DEFAULT_QUERY_LIMIT, 25).
|
|
|
|
resolve_member_limit_full_scan_test() ->
|
|
?assertEqual(
|
|
?FULL_MEMBER_LIST_LIMIT, guild_request_members_search:resolve_member_limit(<<>>, 0)
|
|
).
|
|
|
|
resolve_member_limit_query_default_test() ->
|
|
?assertEqual(
|
|
?DEFAULT_QUERY_LIMIT, guild_request_members_search:resolve_member_limit(<<"ab">>, 0)
|
|
).
|
|
|
|
resolve_member_limit_explicit_test() ->
|
|
?assertEqual(25, guild_request_members_search:resolve_member_limit(<<"ab">>, 25)).
|
|
|
|
filter_members_by_query_test() ->
|
|
Members = [
|
|
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"alice">>}},
|
|
#{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"bob">>}},
|
|
#{<<"user">> => #{<<"id">> => <<"3">>, <<"username">> => <<"alicia">>}}
|
|
],
|
|
Results = guild_request_members_search:filter_members_by_query(Members, <<"ali">>, 10),
|
|
?assertEqual(2, length(Results)).
|
|
|
|
display_name_priority_test() ->
|
|
MemberWithNick = #{
|
|
<<"user">> => #{<<"username">> => <<"user">>, <<"global_name">> => <<"Global">>},
|
|
<<"nick">> => <<"Nick">>
|
|
},
|
|
?assertEqual(<<"Nick">>, guild_request_members_search:get_display_name(MemberWithNick)),
|
|
MemberWithGlobal = #{
|
|
<<"user">> => #{<<"username">> => <<"user">>, <<"global_name">> => <<"Global">>}
|
|
},
|
|
?assertEqual(<<"Global">>, guild_request_members_search:get_display_name(MemberWithGlobal)),
|
|
MemberWithUsername = #{
|
|
<<"user">> => #{<<"username">> => <<"user">>}
|
|
},
|
|
?assertEqual(<<"user">>, guild_request_members_search:get_display_name(MemberWithUsername)).
|
|
|
|
filter_members_by_query_case_insensitive_test() ->
|
|
Members = [
|
|
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"Alice">>}},
|
|
#{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"bob">>}}
|
|
],
|
|
Results = guild_request_members_search:filter_members_by_query(Members, <<"ALICE">>, 10),
|
|
?assertEqual(1, length(Results)).
|
|
|
|
filter_members_by_query_respects_limit_test() ->
|
|
Members = [
|
|
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"alice1">>}},
|
|
#{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"alice2">>}},
|
|
#{<<"user">> => #{<<"id">> => <<"3">>, <<"username">> => <<"alice3">>}}
|
|
],
|
|
Results = guild_request_members_search:filter_members_by_query(Members, <<"alice">>, 2),
|
|
?assertEqual(2, length(Results)).
|
|
|
|
filter_members_by_query_zero_limit_test() ->
|
|
Members = [
|
|
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"alice1">>}}
|
|
],
|
|
?assertEqual(
|
|
[], guild_request_members_search:filter_members_by_query(Members, <<"alice">>, 0)
|
|
).
|
|
|
|
filter_members_by_query_empty_query_matches_all_test() ->
|
|
Members = [
|
|
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"alice">>}},
|
|
#{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"bob">>}}
|
|
],
|
|
Results = guild_request_members_search:filter_members_by_query(Members, <<>>, 10),
|
|
?assertEqual(2, length(Results)).
|
|
|
|
filter_members_by_query_no_match_test() ->
|
|
Members = [
|
|
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"alice">>}}
|
|
],
|
|
Results = guild_request_members_search:filter_members_by_query(Members, <<"zzz">>, 10),
|
|
?assertEqual(0, length(Results)).
|
|
|
|
filter_members_by_query_matches_nick_test() ->
|
|
Members = [
|
|
#{
|
|
<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"alice">>},
|
|
<<"nick">> => <<"SuperNick">>
|
|
}
|
|
],
|
|
Results = guild_request_members_search:filter_members_by_query(Members, <<"super">>, 10),
|
|
?assertEqual(1, length(Results)).
|
|
|
|
fetch_members_with_query_uses_guild_search_call_test() ->
|
|
Parent = self(),
|
|
Member = #{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"Alice">>}},
|
|
GuildPid = spawn(fun() ->
|
|
reply_once_to_guild_call(Parent, #{members => [Member], total => 1})
|
|
end),
|
|
{Members, Presences} = guild_request_members_search:fetch_members_with_rollout(
|
|
1, GuildPid, <<"ali">>, 1, [], false
|
|
),
|
|
?assertEqual([Member], Members),
|
|
?assertEqual([], Presences),
|
|
?assertEqual(
|
|
{guild_call, {search_guild_members, #{query => <<"ali">>, limit => 1}}},
|
|
receive_guild_call()
|
|
).
|
|
|
|
fetch_members_empty_query_uses_paginated_list_call_test() ->
|
|
Parent = self(),
|
|
Member = #{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"Alice">>}},
|
|
GuildPid = spawn(fun() ->
|
|
reply_once_to_guild_call(Parent, #{members => [Member], total => 1})
|
|
end),
|
|
{Members, Presences} = guild_request_members_search:fetch_members_with_rollout(
|
|
1, GuildPid, <<>>, 1, [], false
|
|
),
|
|
?assertEqual([Member], Members),
|
|
?assertEqual([], Presences),
|
|
?assertEqual(
|
|
{guild_call, {list_guild_members, #{limit => 1, offset => 0}}},
|
|
receive_guild_call()
|
|
).
|
|
|
|
get_display_name_null_nick_test() ->
|
|
Member = #{
|
|
<<"user">> => #{<<"username">> => <<"user">>},
|
|
<<"nick">> => null
|
|
},
|
|
?assertEqual(<<"user">>, guild_request_members_search:get_display_name(Member)).
|
|
|
|
get_display_name_non_binary_nick_test() ->
|
|
Member = #{
|
|
<<"user">> => #{<<"username">> => <<"user">>},
|
|
<<"nick">> => 12345
|
|
},
|
|
?assertEqual(<<"user">>, guild_request_members_search:get_display_name(Member)).
|
|
|
|
get_display_name_non_map_test() ->
|
|
?assertEqual(<<>>, guild_request_members_search:get_display_name(invalid_member())).
|
|
|
|
get_display_name_null_global_name_test() ->
|
|
Member = #{<<"user">> => #{<<"username">> => <<"user">>, <<"global_name">> => null}},
|
|
?assertEqual(<<"user">>, guild_request_members_search:get_display_name(Member)).
|
|
|
|
get_display_name_non_binary_global_name_test() ->
|
|
Member = #{<<"user">> => #{<<"username">> => <<"user">>, <<"global_name">> => 12345}},
|
|
?assertEqual(<<"user">>, guild_request_members_search:get_display_name(Member)).
|
|
|
|
get_username_null_test() ->
|
|
?assertEqual(<<>>, guild_request_members_search:get_username(#{<<"username">> => null})).
|
|
|
|
get_username_undefined_test() ->
|
|
?assertEqual(
|
|
<<>>, guild_request_members_search:get_username(#{<<"username">> => undefined})
|
|
).
|
|
|
|
get_username_non_binary_test() ->
|
|
?assertEqual(<<>>, guild_request_members_search:get_username(#{<<"username">> => 12345})).
|
|
|
|
get_username_missing_test() ->
|
|
?assertEqual(<<>>, guild_request_members_search:get_username(#{})).
|
|
|
|
extract_user_id_valid_test() ->
|
|
?assertEqual(
|
|
42,
|
|
guild_request_members_search:extract_user_id(#{<<"user">> => #{<<"id">> => <<"42">>}})
|
|
).
|
|
|
|
extract_user_id_rejects_malformed_snowflake_test() ->
|
|
?assertEqual(
|
|
undefined,
|
|
guild_request_members_search:extract_user_id(
|
|
#{<<"user">> => #{<<"id">> => <<"042">>}}
|
|
)
|
|
).
|
|
|
|
extract_user_id_missing_user_test() ->
|
|
?assertEqual(undefined, guild_request_members_search:extract_user_id(#{})).
|
|
|
|
extract_user_id_non_map_test() ->
|
|
?assertEqual(undefined, guild_request_members_search:extract_user_id(invalid_member())).
|
|
|
|
invalid_member() ->
|
|
eqwalizer:dynamic_cast(not_a_map).
|
|
|
|
receive_guild_call() ->
|
|
receive
|
|
{guild_call, _Msg} = Msg ->
|
|
Msg;
|
|
_Other ->
|
|
receive_guild_call()
|
|
after 1000 ->
|
|
timeout
|
|
end.
|
|
|
|
reply_once_to_guild_call(Parent, Reply) ->
|
|
receive
|
|
{'$gen_call', {From, Tag}, Msg} ->
|
|
Parent ! {guild_call, Msg},
|
|
From ! {Tag, Reply}
|
|
after 1000 ->
|
|
Parent ! guild_call_timeout
|
|
end.
|