mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 21:15:32 +09:00
93 lines
3.4 KiB
Erlang
93 lines
3.4 KiB
Erlang
%% SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
-module(guild_manager_shard_lifecycle_tests).
|
|
-typing([eqwalizer]).
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
start_new_guild_skips_start_when_already_registered_test() ->
|
|
process_registry:init(),
|
|
GuildId = 77777,
|
|
GuildKey = process_registry:build_process_key(guild, GuildId),
|
|
ExistingPid = spawn(fun mock_guild_loop/0),
|
|
ets:insert(process_registry_table, {GuildKey, ExistingPid}),
|
|
try
|
|
State0 = #{guilds => #{}, pending_requests => #{}, shard_index => 0},
|
|
Data = #{<<"guild">> => #{<<"id">> => <<"77777">>, <<"features">> => []}},
|
|
Result = guild_manager_shard_lifecycle:start_new_guild(GuildId, Data, GuildKey, State0),
|
|
?assertMatch({ok, ExistingPid, _}, Result),
|
|
{ok, RetPid, _NewState} = Result,
|
|
?assertEqual(ExistingPid, RetPid)
|
|
after
|
|
process_registry:registry_unregister(GuildKey),
|
|
ExistingPid ! stop
|
|
end.
|
|
|
|
normalize_transferred_guild_state_keeps_only_transferable_fields_test() ->
|
|
GuildId = 99998,
|
|
TransferState = #{
|
|
id => 1,
|
|
data => #{<<"guild">> => #{<<"id">> => <<"99998">>}},
|
|
sessions => #{<<"s1">> => #{pid => self()}},
|
|
voice_states => #{<<"v1">> => #{}},
|
|
virtual_channel_access => #{10 => sets:from_list([20])},
|
|
thread_handoff_resends => [<<"s1">>],
|
|
thread_handoff_syncs => [<<"s2">>],
|
|
thread_handoff_lists => [30],
|
|
thread_resend_pending => #{<<"s1">> => true},
|
|
member_list_engine => make_ref(),
|
|
channel_member_list_engines => #{<<"500">> => make_ref()},
|
|
voice_server_pid => self()
|
|
},
|
|
Normalized = guild_manager_shard_lifecycle:normalize_transferred_guild_state(
|
|
GuildId, TransferState
|
|
),
|
|
?assertEqual(GuildId, maps:get(id, Normalized)),
|
|
?assertEqual(#{<<"guild">> => #{<<"id">> => <<"99998">>}}, maps:get(data, Normalized)),
|
|
?assertEqual(#{<<"s1">> => #{pid => self()}}, maps:get(sessions, Normalized)),
|
|
?assertEqual(#{<<"v1">> => #{}}, maps:get(voice_states, Normalized)),
|
|
?assertNot(maps:is_key(member_list_engine, Normalized)),
|
|
?assertNot(maps:is_key(channel_member_list_engines, Normalized)),
|
|
?assertEqual([<<"s1">>], maps:get(thread_handoff_resends, Normalized)),
|
|
?assertEqual([<<"s2">>], maps:get(thread_handoff_syncs, Normalized)),
|
|
?assertEqual([30], maps:get(thread_handoff_lists, Normalized)),
|
|
?assertNot(maps:is_key(thread_resend_pending, Normalized)),
|
|
?assertNot(maps:is_key(voice_server_pid, Normalized)).
|
|
|
|
shard_terminate_drains_pending_requests_test() ->
|
|
ReplyRef1 = make_ref(),
|
|
ReplyRef2 = make_ref(),
|
|
State = #{
|
|
guilds => #{111 => loading, 222 => loading},
|
|
pending_requests => #{
|
|
111 => [{self(), ReplyRef1}],
|
|
222 => [{self(), ReplyRef2}]
|
|
},
|
|
fetch_workers => #{},
|
|
shard_index => 0
|
|
},
|
|
guild_manager_shard:terminate(shutdown, State),
|
|
receive
|
|
{ReplyRef1, {error, shard_shutdown}} -> ok
|
|
after 100 ->
|
|
?assert(false)
|
|
end,
|
|
receive
|
|
{ReplyRef2, {error, shard_shutdown}} -> ok
|
|
after 100 ->
|
|
?assert(false)
|
|
end.
|
|
|
|
mock_guild_loop() ->
|
|
receive
|
|
{'$gen_call', From, _Msg} ->
|
|
gen_server:reply(From, ok),
|
|
mock_guild_loop();
|
|
stop ->
|
|
ok;
|
|
_Other ->
|
|
mock_guild_loop()
|
|
after infinity ->
|
|
ok
|
|
end.
|