mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 13:05:32 +09:00
99 lines
3.7 KiB
Erlang
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).
|