mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 05:25:40 +09:00
116 lines
4.1 KiB
Erlang
116 lines
4.1 KiB
Erlang
%% SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
-module(gateway_rpc_guild_lifecycle_tests).
|
|
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
with_guild_pid(Fun) ->
|
|
meck:new(gateway_rpc_guild_infra, [passthrough, no_link]),
|
|
meck:expect(gateway_rpc_guild_infra, with_guild_unchecked, fun(_GuildId, GuildFun) ->
|
|
GuildFun(self())
|
|
end),
|
|
try
|
|
Fun()
|
|
after
|
|
meck:unload(gateway_rpc_guild_infra)
|
|
end.
|
|
|
|
dispatch_many_casts_every_event_in_order_test() ->
|
|
with_guild_pid(fun() ->
|
|
Params = #{
|
|
<<"guild_id">> => <<"1">>,
|
|
<<"events">> => [
|
|
#{<<"event">> => <<"THREAD_UPDATE">>, <<"data">> => #{<<"id">> => <<"5">>}},
|
|
#{
|
|
<<"event">> => <<"THREAD_MEMBER_UPDATE">>,
|
|
<<"data">> => #{<<"id">> => <<"5">>}
|
|
},
|
|
#{<<"event">> => <<"MESSAGE_CREATE">>, <<"data">> => #{<<"id">> => <<"6">>}}
|
|
]
|
|
},
|
|
?assertEqual(
|
|
true, gateway_rpc_guild_lifecycle:handle(<<"guild.dispatch_many">>, Params)
|
|
),
|
|
receive
|
|
{'$gen_cast', {dispatch_many, Requests}} ->
|
|
?assertEqual(
|
|
[
|
|
#{event => thread_update, data => #{<<"id">> => <<"5">>}},
|
|
#{event => thread_member_update, data => #{<<"id">> => <<"5">>}},
|
|
#{event => message_create, data => #{<<"id">> => <<"6">>}}
|
|
],
|
|
Requests
|
|
)
|
|
after 1000 -> ?assert(false)
|
|
end
|
|
end).
|
|
|
|
dispatch_many_rejects_malformed_payloads_without_casting_test() ->
|
|
with_guild_pid(fun() ->
|
|
Malformed = [
|
|
#{
|
|
<<"guild_id">> => <<"1">>,
|
|
<<"events">> => [#{<<"event">> => <<"THREAD_UPDATE">>}]
|
|
},
|
|
#{
|
|
<<"guild_id">> => <<"1">>,
|
|
<<"events">> => [
|
|
#{<<"event">> => <<"THREAD_UPDATE">>, <<"data">> => #{}},
|
|
#{<<"event">> => 7, <<"data">> => #{}}
|
|
]
|
|
},
|
|
#{<<"guild_id">> => <<"1">>, <<"events">> => #{}},
|
|
#{<<"guild_id">> => <<"1">>}
|
|
],
|
|
lists:foreach(
|
|
fun(Params) ->
|
|
?assertError(
|
|
{gateway_rpc_error, validation_invalid_params},
|
|
gateway_rpc_guild_lifecycle:handle(<<"guild.dispatch_many">>, Params)
|
|
)
|
|
end,
|
|
Malformed
|
|
),
|
|
?assertError(
|
|
{validation, validation_invalid_snowflake},
|
|
gateway_rpc_guild_lifecycle:handle(
|
|
<<"guild.dispatch_many">>, #{<<"guild_id">> => <<"0">>, <<"events">> => []}
|
|
)
|
|
),
|
|
receive
|
|
{'$gen_cast', {dispatch_many, _}} -> ?assert(false)
|
|
after 50 -> ok
|
|
end
|
|
end).
|
|
|
|
dispatch_many_reaches_an_overloaded_guild_test() ->
|
|
GuildId = 987654321,
|
|
guild_manager_cache:ensure_guild_pid_cache(),
|
|
ok = guild_ets_owner:ensure_table(guild_health_status, [named_table, public, set]),
|
|
Pending = {make_ref(), erlang:monotonic_time(millisecond), 2500},
|
|
true = ets:insert(guild_pid_cache, {GuildId, self()}),
|
|
true = ets:insert(guild_health_status, {self(), GuildId, true, undefined, Pending}),
|
|
try
|
|
?assert(guild_health:is_overloaded(self())),
|
|
Params = #{
|
|
<<"guild_id">> => integer_to_binary(GuildId),
|
|
<<"events">> => [
|
|
#{<<"event">> => <<"THREAD_CREATE">>, <<"data">> => #{<<"id">> => <<"5">>}},
|
|
#{
|
|
<<"event">> => <<"THREAD_MEMBER_UPDATE">>,
|
|
<<"data">> => #{<<"id">> => <<"5">>}
|
|
}
|
|
]
|
|
},
|
|
?assertEqual(
|
|
true, gateway_rpc_guild_lifecycle:handle(<<"guild.dispatch_many">>, Params)
|
|
),
|
|
receive
|
|
{'$gen_cast', {dispatch_many, Requests}} -> ?assertEqual(2, length(Requests))
|
|
after 1000 -> ?assert(false)
|
|
end
|
|
after
|
|
ets:delete(guild_health_status, self()),
|
|
ets:delete(guild_pid_cache, GuildId)
|
|
end.
|