Files
fluxer/fluxer_gateway/test/guild_data_index_members_tests.erl
T

99 lines
3.7 KiB
Erlang

%% SPDX-License-Identifier: AGPL-3.0-or-later
-module(guild_data_index_members_tests).
-typing([eqwalizer]).
-include_lib("eunit/include/eunit.hrl").
member_map_edge_cases_test() ->
?assertEqual(#{}, guild_data_index_members:member_map(invalid_guild_data())),
?assertEqual(#{}, guild_data_index_members:member_map(#{<<"members">> => <<"invalid">>})),
?assertEqual(
#{},
guild_data_index_members:member_map(#{<<"members">> => [#{<<"nick">> => <<"orphan">>}]})
).
member_map_duplicate_user_ids_last_wins_test() ->
Data = #{
<<"members">> => [
#{<<"user">> => #{<<"id">> => <<"1">>}, <<"nick">> => <<"first">>},
#{<<"user">> => #{<<"id">> => <<"1">>}, <<"nick">> => <<"second">>}
]
},
MemberMap = guild_data_index_members:member_map(Data),
?assertEqual(<<"second">>, maps:get(<<"nick">>, maps:get(1, MemberMap))).
member_map_rejects_malformed_snowflake_ids_test() ->
Data = #{
<<"members">> => #{
<<"001">> => #{<<"user">> => #{<<"id">> => <<"001">>}},
<<"2">> => #{<<"user">> => #{<<"id">> => <<"02">>}},
<<"bad">> => #{<<"user">> => #{<<"id">> => <<"3">>}}
}
},
?assertEqual(
#{3 => #{<<"user">> => #{<<"id">> => 3}}}, guild_data_index_members:member_map(Data)
).
member_list_uses_cache_consistently_test() ->
Base = guild_data_index_members:put_member_map(
#{
5 => #{<<"user">> => #{<<"id">> => <<"5">>}},
1 => #{<<"user">> => #{<<"id">> => <<"1">>}}
},
#{<<"members">> => #{}}
),
?assert(maps:is_key(members_sorted_ids, Base)),
?assertEqual([1, 5], [member_id(M) || M <- guild_data_index_members:member_list(Base)]),
Added = guild_data_index_members:put_member(
#{<<"user">> => #{<<"id">> => <<"3">>}}, Base
),
?assertNot(maps:is_key(members_sorted_ids, Added)),
?assertEqual([1, 3, 5], [member_id(M) || M <- guild_data_index_members:member_list(Added)]),
Removed = guild_data_index_members:remove_member(1, Added),
?assertEqual([3, 5], [member_id(M) || M <- guild_data_index_members:member_list(Removed)]).
member_id(Member) ->
maps:get(<<"id">>, maps:get(<<"user">>, Member)).
member_role_index_test() ->
?assertEqual(#{}, guild_data_index_members:member_role_index(invalid_guild_data())),
Data = #{
<<"members">> => #{
1 => #{<<"user">> => #{<<"id">> => <<"1">>}, <<"roles">> => [<<"10">>, <<"11">>]},
2 => #{<<"user">> => #{<<"id">> => <<"2">>}, <<"roles">> => [<<"11">>]}
}
},
Index = guild_data_index_members:member_role_index(Data),
?assertEqual(#{1 => true}, maps:get(10, Index)),
?assertEqual(#{1 => true, 2 => true}, maps:get(11, Index)),
?assertEqual(
#{},
guild_data_index_members:member_role_index(#{
<<"members">> => #{
1 => #{<<"user">> => #{<<"id">> => <<"1">>}}
}
})
).
role_index_sync_test() ->
Data0 = #{
<<"members">> => #{
3 => #{<<"user">> => #{<<"id">> => <<"3">>}, <<"roles">> => [<<"20">>]}
}
},
Data1 = guild_data_index_members:put_member(
#{<<"user">> => #{<<"id">> => <<"3">>}, <<"roles">> => [<<"30">>]}, Data0
),
?assertEqual(
undefined, maps:get(20, guild_data_index_members:member_role_index(Data1), undefined)
),
?assertEqual(#{3 => true}, maps:get(30, guild_data_index_members:member_role_index(Data1))),
Data2 = guild_data_index_members:remove_member(3, Data1),
?assertEqual(
undefined, maps:get(30, guild_data_index_members:member_role_index(Data2), undefined)
).
invalid_guild_data() ->
eqwalizer:dynamic_cast(not_a_map).