mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-18 05:25:40 +09:00
ci: add tests (#1141)
This commit is contained in:
1 parent
ad99de22bc
commit
545814abc1
152 files changed
+287
-532
No files matched your search
+1
-3
@@ -205,11 +205,9 @@ active_nodes_for_role(undefined) ->
|
||||
active_nodes_for_role(Role) ->
|
||||
gateway_node_router:active_nodes(Role).
|
||||
|
||||
-spec select_owner_nodes(term(), [node()], pos_integer()) -> [node()].
|
||||
-spec select_owner_nodes(term(), [node(), ...], pos_integer()) -> [node()].
|
||||
select_owner_nodes(Key, CandidateNodes, ReplicaCount) ->
|
||||
case lists:usort(CandidateNodes) of
|
||||
[] ->
|
||||
[];
|
||||
[SingleNode] ->
|
||||
[SingleNode];
|
||||
UniqueNodes when ReplicaCount =:= 1 ->
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
ranch,
|
||||
cowboy,
|
||||
ezstd,
|
||||
erlcass,
|
||||
base64url,
|
||||
enats
|
||||
]},
|
||||
|
||||
@@ -180,7 +180,7 @@ resume_lookup_trace_meta(SessionId) ->
|
||||
session_pid_trace_meta(Pid) ->
|
||||
node_trace_meta(session, node(Pid)).
|
||||
|
||||
-spec node_trace_meta(term(), node()) -> map().
|
||||
-spec node_trace_meta(atom(), node()) -> map().
|
||||
node_trace_meta(Operation, NodeName) ->
|
||||
#{
|
||||
remote => #{
|
||||
@@ -189,13 +189,9 @@ node_trace_meta(Operation, NodeName) ->
|
||||
}
|
||||
}.
|
||||
|
||||
-spec trace_key(term()) -> binary().
|
||||
trace_key(Value) when is_binary(Value) ->
|
||||
Value;
|
||||
trace_key(Value) when is_atom(Value) ->
|
||||
atom_to_binary(Value, utf8);
|
||||
-spec trace_key(atom()) -> binary().
|
||||
trace_key(Value) ->
|
||||
list_to_binary(io_lib:format("~p", [Value])).
|
||||
atom_to_binary(Value, utf8).
|
||||
|
||||
-spec node_pod_name_or_name(node()) -> binary().
|
||||
node_pod_name_or_name(NodeName) ->
|
||||
|
||||
@@ -89,7 +89,6 @@ beam_module_from_info(Info) ->
|
||||
beam_md5(Beam) when is_binary(Beam) ->
|
||||
case beam_lib:md5(Beam) of
|
||||
{ok, {_Module, Md5}} when is_binary(Md5) -> {ok, Md5};
|
||||
{ok, Md5} when is_binary(Md5) -> {ok, Md5};
|
||||
Error -> {error, {beam_md5_failed, Error}}
|
||||
end.
|
||||
|
||||
|
||||
@@ -42,8 +42,7 @@ fetch_events(BuildSha) when is_binary(BuildSha) ->
|
||||
case erlcass:execute(?STMT_FETCH_EVENTS, [BuildSha]) of
|
||||
{ok, _Columns, Rows} -> {ok, normalize_event_rows(Rows)};
|
||||
ok -> {ok, []};
|
||||
{error, Reason} -> {error, Reason};
|
||||
Other -> {error, {unexpected_fetch_result, Other}}
|
||||
{error, Reason} -> {error, Reason}
|
||||
end.
|
||||
|
||||
-spec append_event(binary(), binary(), binary(), binary(), binary()) ->
|
||||
@@ -99,8 +98,7 @@ execute_append_event(EventId, Params) ->
|
||||
case erlcass:execute(?STMT_APPEND_EVENT, Params) of
|
||||
ok -> {ok, EventId};
|
||||
{ok, _Columns, _Rows} -> {ok, EventId};
|
||||
{error, Reason} -> {error, Reason};
|
||||
Other -> {error, {unexpected_append_result, Other}}
|
||||
{error, Reason} -> {error, Reason}
|
||||
end.
|
||||
|
||||
-spec audit_applied(binary(), binary(), binary(), map(), ok | {error, term()}) ->
|
||||
@@ -116,8 +114,7 @@ audit_applied(BuildSha, NodeName, EventId, Summary, Result) when
|
||||
case erlcass:execute(?STMT_AUDIT_APPLIED, Params) of
|
||||
ok -> ok;
|
||||
{ok, _Columns, _Rows} -> ok;
|
||||
{error, Reason} -> {error, Reason};
|
||||
Other -> {error, {unexpected_audit_result, Other}}
|
||||
{error, Reason} -> {error, Reason}
|
||||
end.
|
||||
|
||||
-spec normalize_event_rows([list()]) -> [map()].
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
{no_opaque, [
|
||||
handle_info/2,
|
||||
handle_connect_ok/4,
|
||||
handle_connect_ok_entry/5,
|
||||
accept_connect_ok/4,
|
||||
ignore_stale_connect_ok/2,
|
||||
handle_ready/4,
|
||||
handle_conn_event_down/2,
|
||||
handle_slot_monitor_down/5,
|
||||
|
||||
@@ -340,8 +340,7 @@ subscribe_to_nats(State) ->
|
||||
subscribe_to_rollout_subject() ->
|
||||
try gateway_nats_rpc:subscribe(?NATS_SUBJECT, <<>>) of
|
||||
{ok, Sid} -> {ok, Sid};
|
||||
{error, Reason} -> {error, Reason};
|
||||
Other -> {error, Other}
|
||||
{error, Reason} -> {error, Reason}
|
||||
catch
|
||||
Class:Reason -> {error, {Class, Reason}}
|
||||
end.
|
||||
|
||||
@@ -52,9 +52,7 @@ upsert_voice_state(ConnectionId, VoiceState, State) ->
|
||||
end,
|
||||
State#{voice_states => VoiceStates}.
|
||||
|
||||
-spec strip_members
|
||||
(map()) -> map();
|
||||
(term()) -> term().
|
||||
-spec strip_members(term()) -> term().
|
||||
strip_members(Data) when is_map(Data) ->
|
||||
Data1 = maps:remove(<<"members">>, Data),
|
||||
maps:remove(<<"member_role_index">>, Data1);
|
||||
|
||||
@@ -34,9 +34,7 @@
|
||||
|
||||
-export_type([guild_data/0]).
|
||||
|
||||
-spec normalize_data
|
||||
(map()) -> guild_data();
|
||||
(term()) -> term().
|
||||
-spec normalize_data(term()) -> term().
|
||||
normalize_data(Data) when is_map(Data) ->
|
||||
Data0 =
|
||||
case guild_data_normalize:guild_data(Data) of
|
||||
|
||||
@@ -40,9 +40,7 @@ channel_index(Data) when is_map(Data) ->
|
||||
channel_index(_) ->
|
||||
#{}.
|
||||
|
||||
-spec put_channels
|
||||
(term(), guild_data()) -> guild_data();
|
||||
(term(), term()) -> term().
|
||||
-spec put_channels(term(), term()) -> term().
|
||||
put_channels(Channels, Data) when is_map(Data) ->
|
||||
ChannelList = lists:filtermap(
|
||||
fun normalize_channel_item/1,
|
||||
|
||||
@@ -37,9 +37,7 @@ role_index(Data) when is_map(Data) ->
|
||||
role_index(_) ->
|
||||
#{}.
|
||||
|
||||
-spec put_roles
|
||||
(term(), guild_data()) -> guild_data();
|
||||
(term(), term()) -> term().
|
||||
-spec put_roles(term(), term()) -> term().
|
||||
put_roles(Roles, Data) when is_map(Data) ->
|
||||
RoleList = [
|
||||
normalize_role(Role)
|
||||
|
||||
@@ -10,16 +10,13 @@
|
||||
channel/1
|
||||
]).
|
||||
|
||||
-spec guild_data
|
||||
(map()) -> map();
|
||||
(term()) -> term().
|
||||
-spec guild_data(term()) -> term().
|
||||
guild_data(Data) when is_map(Data) ->
|
||||
normalize_nested_map(<<"guild">>, fun guild/1, Data);
|
||||
guild_data(Data) ->
|
||||
Data.
|
||||
-spec member
|
||||
(map()) -> map();
|
||||
(term()) -> term().
|
||||
|
||||
-spec member(term()) -> term().
|
||||
member(Member) when is_map(Member) ->
|
||||
Member1 = normalize_nested_map(<<"user">>, fun user/1, Member),
|
||||
Member2 = normalize_snowflake_list_field(<<"roles">>, Member1),
|
||||
@@ -30,9 +27,7 @@ member(Member) when is_map(Member) ->
|
||||
member(Member) ->
|
||||
Member.
|
||||
|
||||
-spec role
|
||||
(map()) -> map();
|
||||
(term()) -> term().
|
||||
-spec role(term()) -> term().
|
||||
role(Role) when is_map(Role) ->
|
||||
Role1 = normalize_required_snowflake_field(<<"id">>, Role),
|
||||
Role2 = normalize_permission_field(<<"permissions">>, Role1),
|
||||
@@ -44,9 +39,7 @@ role(Role) when is_map(Role) ->
|
||||
role(Role) ->
|
||||
Role.
|
||||
|
||||
-spec channel
|
||||
(map()) -> map();
|
||||
(term()) -> term().
|
||||
-spec channel(term()) -> term().
|
||||
channel(Channel) when is_map(Channel) ->
|
||||
Channel1 = normalize_required_snowflake_field(<<"id">>, Channel),
|
||||
Channel2 = normalize_optional_snowflake_field(<<"guild_id">>, Channel1),
|
||||
|
||||
@@ -36,8 +36,7 @@ from_sorted(OSet, Keys) ->
|
||||
-spec destroy(oset()) -> ok.
|
||||
destroy(OSet) ->
|
||||
try guild_member_list_oset_nif:destroy(OSet) of
|
||||
ok -> ok;
|
||||
_ -> ok
|
||||
ok -> ok
|
||||
catch
|
||||
_:_ -> ok
|
||||
end.
|
||||
|
||||
@@ -79,18 +79,18 @@ range(_OSet, _Start, _Count) ->
|
||||
to_list(_OSet) ->
|
||||
erlang:nif_error(nif_not_loaded).
|
||||
|
||||
-spec nif_path() -> file:filename().
|
||||
-spec nif_path() -> file:filename_all().
|
||||
nif_path() ->
|
||||
filename:join(priv_dir(), ?NIF_NAME).
|
||||
|
||||
-spec priv_dir() -> file:filename().
|
||||
-spec priv_dir() -> file:filename_all().
|
||||
priv_dir() ->
|
||||
case code:priv_dir(fluxer_gateway) of
|
||||
{error, _Reason} -> priv_dir_from_beam();
|
||||
Dir -> Dir
|
||||
end.
|
||||
|
||||
-spec priv_dir_from_beam() -> file:filename().
|
||||
-spec priv_dir_from_beam() -> file:filename_all().
|
||||
priv_dir_from_beam() ->
|
||||
case code:which(?MODULE) of
|
||||
Beam when is_list(Beam) ->
|
||||
|
||||
@@ -44,12 +44,12 @@ start_async(State) ->
|
||||
UserIds -> spawn_reconcile_fetch(UserIds, self())
|
||||
end.
|
||||
|
||||
-spec spawn_reconcile_fetch([user_id()], pid()) -> ok.
|
||||
-spec spawn_reconcile_fetch([user_id(), ...], pid()) -> ok.
|
||||
spawn_reconcile_fetch(UserIds, Parent) ->
|
||||
_ = spawn(fun() -> fetch_and_reply(UserIds, Parent) end),
|
||||
ok.
|
||||
|
||||
-spec fetch_and_reply([user_id()], pid()) -> ok.
|
||||
-spec fetch_and_reply([user_id(), ...], pid()) -> ok.
|
||||
fetch_and_reply(UserIds, Parent) ->
|
||||
Parent ! {presence_reconcile_apply, authoritative_presence_map(UserIds)},
|
||||
ok.
|
||||
@@ -183,9 +183,7 @@ authoritative_presence(UserId) ->
|
||||
exit:_ -> undefined
|
||||
end.
|
||||
|
||||
-spec authoritative_presence_map([user_id()]) -> presence_by_id().
|
||||
authoritative_presence_map([]) ->
|
||||
#{};
|
||||
-spec authoritative_presence_map([user_id(), ...]) -> presence_by_id().
|
||||
authoritative_presence_map(UserIds) ->
|
||||
lists:foldl(fun add_presence_to_map/2, #{}, safe_bulk_get(UserIds)).
|
||||
|
||||
@@ -199,8 +197,7 @@ add_presence_to_map(Presence, Acc) ->
|
||||
-spec safe_bulk_get([user_id()]) -> [presence()].
|
||||
safe_bulk_get(UserIds) ->
|
||||
try presence_cache:bulk_get(UserIds) of
|
||||
Presences when is_list(Presences) -> Presences;
|
||||
_ -> []
|
||||
Presences -> Presences
|
||||
catch
|
||||
error:_ -> [];
|
||||
exit:_ -> []
|
||||
|
||||
@@ -162,9 +162,7 @@ sanitize_text(Bin) when is_binary(Bin) ->
|
||||
safe_codepoints_to_binary(Codepoints, Bin);
|
||||
_ ->
|
||||
Bin
|
||||
end;
|
||||
sanitize_text(Other) ->
|
||||
Other.
|
||||
end.
|
||||
|
||||
-spec safe_codepoints_to_binary([integer()], binary()) -> binary().
|
||||
safe_codepoints_to_binary(Codepoints, Fallback) ->
|
||||
|
||||
@@ -35,8 +35,7 @@ render_bounded_context(Content, ContextJson) when
|
||||
byte_size(ContextJson) =< ?MAX_CONTEXT_JSON_BYTES
|
||||
->
|
||||
try push_markdown_plaintext_nif:render_push_preview_nif(Content, ContextJson) of
|
||||
Preview when is_binary(Preview) -> Preview;
|
||||
_ -> strip_to_safe(Content)
|
||||
Preview when is_binary(Preview) -> Preview
|
||||
catch
|
||||
_:_ -> strip_to_safe(Content)
|
||||
end;
|
||||
|
||||
@@ -20,24 +20,24 @@ init() ->
|
||||
|
||||
-spec available() -> boolean().
|
||||
available() ->
|
||||
false.
|
||||
erlang:nif_error(nif_not_loaded).
|
||||
|
||||
-spec render_push_preview_nif(binary(), binary()) -> binary().
|
||||
render_push_preview_nif(_Content, _ContextJson) ->
|
||||
erlang:nif_error(nif_not_loaded).
|
||||
|
||||
-spec nif_path() -> file:filename().
|
||||
-spec nif_path() -> file:filename_all().
|
||||
nif_path() ->
|
||||
filename:join(priv_dir(), ?NIF_NAME).
|
||||
|
||||
-spec priv_dir() -> file:filename().
|
||||
-spec priv_dir() -> file:filename_all().
|
||||
priv_dir() ->
|
||||
case code:priv_dir(fluxer_gateway) of
|
||||
{error, _Reason} -> priv_dir_from_beam();
|
||||
Dir -> Dir
|
||||
end.
|
||||
|
||||
-spec priv_dir_from_beam() -> file:filename().
|
||||
-spec priv_dir_from_beam() -> file:filename_all().
|
||||
priv_dir_from_beam() ->
|
||||
case code:which(?MODULE) of
|
||||
Beam when is_list(Beam) ->
|
||||
|
||||
@@ -167,9 +167,7 @@ user_nickname(UserId0, UserNicknames) when is_map(UserNicknames) ->
|
||||
case user_id_binary(UserId0) of
|
||||
Id when is_binary(Id) -> maps:get(Id, UserNicknames, undefined);
|
||||
undefined -> undefined
|
||||
end;
|
||||
user_nickname(_UserId0, _UserNicknames) ->
|
||||
undefined.
|
||||
end.
|
||||
|
||||
-spec user_id_binary(term()) -> binary() | undefined.
|
||||
user_id_binary(UserId) when is_integer(UserId), UserId > 0 ->
|
||||
@@ -266,9 +264,7 @@ channel_names_from_guild_data(ChannelIds, GuildData) when is_map(GuildData) ->
|
||||
fun(ChannelId, Acc) -> put_index_channel_name(ChannelId, ChannelIndex, Acc) end,
|
||||
#{},
|
||||
ChannelIds
|
||||
);
|
||||
channel_names_from_guild_data(_ChannelIds, _GuildData) ->
|
||||
#{}.
|
||||
).
|
||||
|
||||
-spec put_index_channel_name(integer(), map(), map()) -> map().
|
||||
put_index_channel_name(ChannelId, ChannelIndex, Acc) ->
|
||||
|
||||
@@ -171,8 +171,6 @@ rollback_on_start_failure({reply, {success, Pid}, _State} = Result, _UserId) whe
|
||||
Result;
|
||||
rollback_on_start_failure({reply, {error, _Reason}, _State} = Result, UserId) ->
|
||||
session_abuse_protection:decrement_user_sessions(UserId),
|
||||
Result;
|
||||
rollback_on_start_failure(Result, _UserId) ->
|
||||
Result.
|
||||
|
||||
-spec validate_identify_payload(term()) ->
|
||||
|
||||
@@ -82,10 +82,6 @@ user_id(User) when is_map(User) ->
|
||||
user_id(_) ->
|
||||
undefined.
|
||||
|
||||
-spec presence_visible(map()) -> boolean().
|
||||
presence_visible(P) ->
|
||||
presence_utils:is_visible_presence(P).
|
||||
|
||||
-spec dedup_presences([map()]) -> [map()].
|
||||
dedup_presences(Presences) ->
|
||||
Map = lists:foldl(fun add_presence_by_id/2, #{}, Presences),
|
||||
@@ -325,15 +321,6 @@ ensure_relationship_id(Rel, UserId) ->
|
||||
-ifdef(TEST).
|
||||
-include_lib("eunit/include/eunit.hrl").
|
||||
|
||||
presence_visible_test() ->
|
||||
?assertEqual(true, presence_visible(#{<<"status">> => <<"online">>})),
|
||||
?assertEqual(true, presence_visible(#{<<"status">> => <<"idle">>})),
|
||||
?assertEqual(true, presence_visible(#{<<"status">> => <<"dnd">>})),
|
||||
?assertEqual(false, presence_visible(#{<<"status">> => <<"offline">>})),
|
||||
?assertEqual(false, presence_visible(#{<<"status">> => <<"invisible">>})),
|
||||
?assertEqual(false, presence_visible(#{})),
|
||||
ok.
|
||||
|
||||
presence_user_id_rejects_malformed_id_test() ->
|
||||
?assertEqual(undefined, presence_user_id(#{<<"user">> => #{<<"id">> => <<"001">>}})).
|
||||
|
||||
|
||||
@@ -199,10 +199,7 @@ cleanup_on_down(DeadPid, ProcessMap) ->
|
||||
ProcessMap
|
||||
).
|
||||
|
||||
-spec cleanup_on_down
|
||||
(process_prefix(), pid(), #{binary() => {pid(), reference()}}) ->
|
||||
#{binary() => {pid(), reference()}};
|
||||
(process_prefix(), pid(), process_map()) -> process_map().
|
||||
-spec cleanup_on_down(process_prefix(), pid(), process_map()) -> process_map().
|
||||
cleanup_on_down(Prefix, DeadPid, ProcessMap) ->
|
||||
maps:fold(
|
||||
fun
|
||||
|
||||
Reference in new issue
Block a user