Files
fluxer/fluxer_gateway/test/guild_data_normalize_tests.erl
T

213 lines
7.1 KiB
Erlang

%% SPDX-License-Identifier: AGPL-3.0-or-later
-module(guild_data_normalize_tests).
-typing([eqwalizer]).
-include_lib("eunit/include/eunit.hrl").
snowflake_uses_fluxer_response_shape_test() ->
?assertEqual(123, snowflake_id:parse(<<"123">>)),
?assertEqual(123, snowflake_id:parse(123)),
?assertError({invalid_snowflake, <<"0">>}, snowflake_id:parse(<<"0">>)),
?assertError({invalid_snowflake, 0}, snowflake_id:parse(0)),
?assertError({invalid_snowflake, <<"001">>}, snowflake_id:parse(<<"001">>)),
?assertError({invalid_snowflake, <<"+1">>}, snowflake_id:parse(<<"+1">>)),
?assertError({invalid_snowflake, <<"-1">>}, snowflake_id:parse(<<"-1">>)),
?assertError({invalid_snowflake, null}, snowflake_id:parse(null)).
permission_accepts_unsigned_decimal_strings_test() ->
?assertEqual(0, permission_bits:parse(<<"0">>)),
?assertEqual(1, permission_bits:parse(<<"001">>)),
?assertEqual(42, permission_bits:parse(42)),
?assertError({invalid_bitset, <<"+1">>}, permission_bits:parse(<<"+1">>)),
?assertError({invalid_bitset, <<"-1">>}, permission_bits:parse(<<"-1">>)).
member_role_ids_are_integer_keyed_in_memory_test() ->
Member = normalized_member(#{
<<"user">> => #{<<"id">> => <<"42">>},
<<"roles">> => [<<"10">>, 20]
}),
?assertEqual(42, maps:get(<<"id">>, maps:get(<<"user">>, Member))),
?assertEqual([10, 20], maps:get(<<"roles">>, Member)).
member_role_ids_reject_invalid_snowflakes_test() ->
?assertError(
{invalid_snowflake, <<"001">>},
normalized_member(#{<<"user">> => #{<<"id">> => <<"42">>}, <<"roles">> => [<<"001">>]})
).
role_permissions_are_integer_in_memory_test() ->
Role = normalized_role(#{
<<"id">> => <<"55">>,
<<"permissions">> => <<"1024">>
}),
?assertEqual(55, maps:get(<<"id">>, Role)),
?assertEqual(1024, maps:get(<<"permissions">>, Role)).
int_fields_follow_fluxer_non_negative_int32_schema_test() ->
Guild = #{
<<"id">> => <<"10">>,
<<"owner_id">> => <<"20">>,
<<"member_count">> => <<"0">>,
<<"online_count">> => <<"-1">>,
<<"banner_width">> => -1
},
Normalized = maps:get(<<"guild">>, normalized_guild_data(#{<<"guild">> => Guild})),
?assertEqual(0, maps:get(<<"member_count">>, Normalized)),
?assertNot(maps:is_key(<<"online_count">>, Normalized)),
?assertNot(maps:is_key(<<"banner_width">>, Normalized)).
guild_normalizes_only_fluxer_response_snowflakes_test() ->
Guild = #{
<<"id">> => <<"10">>,
<<"owner_id">> => <<"20">>,
<<"system_channel_id">> => null,
<<"rules_channel_id">> => <<"30">>,
<<"permissions">> => <<"8">>
},
?assertEqual(
#{
<<"id">> => 10,
<<"owner_id">> => 20,
<<"system_channel_id">> => null,
<<"rules_channel_id">> => 30,
<<"permissions">> => 8
},
maps:get(<<"guild">>, normalized_guild_data(#{<<"guild">> => Guild}))
).
guild_rejects_invalid_snowflake_fields_test() ->
Guild = #{
<<"id">> => <<"10">>,
<<"owner_id">> => <<"20">>,
<<"afk_channel_id">> => <<"invalid">>
},
?assertError(
{invalid_snowflake, <<"invalid">>}, normalized_guild_data(#{<<"guild">> => Guild})
).
channel_normalizes_required_optional_and_nullable_ids_test() ->
Channel = normalized_channel(#{
<<"id">> => <<"100">>,
<<"guild_id">> => null,
<<"owner_id">> => null,
<<"parent_id">> => <<"200">>,
<<"last_message_id">> => <<"300">>
}),
?assertEqual(100, maps:get(<<"id">>, Channel)),
?assertNot(maps:is_key(<<"guild_id">>, Channel)),
?assertEqual(null, maps:get(<<"owner_id">>, Channel)),
?assertEqual(200, maps:get(<<"parent_id">>, Channel)),
?assertEqual(300, maps:get(<<"last_message_id">>, Channel)).
channel_rejects_invalid_nullable_snowflake_test() ->
?assertError(
{invalid_snowflake, <<"001">>},
normalized_channel(#{<<"id">> => <<"100">>, <<"last_message_id">> => <<"001">>})
).
channel_rejects_invalid_permission_overwrites_test() ->
?assertError(
{invalid_snowflake, <<"011">>},
normalized_channel(#{
<<"id">> => <<"100">>,
<<"permission_overwrites">> => [
#{
<<"id">> => <<"011">>,
<<"type">> => 0,
<<"allow">> => <<"1">>,
<<"deny">> => <<"0">>
}
]
})
),
?assertError(
{invalid_bitset, <<"bad">>},
normalized_channel(#{
<<"id">> => <<"100">>,
<<"permission_overwrites">> => [
#{
<<"id">> => <<"12">>,
<<"type">> => 0,
<<"allow">> => <<"bad">>,
<<"deny">> => <<"0">>
}
]
})
).
channel_filters_non_permission_overwrite_schema_test() ->
Channel = normalized_channel(#{
<<"id">> => <<"100">>,
<<"permission_overwrites">> => [
#{
<<"id">> => <<"10">>,
<<"type">> => 0,
<<"allow">> => <<"1">>,
<<"deny">> => <<"0">>
},
#{<<"type">> => 0, <<"allow">> => <<"1">>, <<"deny">> => <<"0">>},
#{<<"id">> => <<"13">>, <<"type">> => 0, <<"allow">> => <<"1">>},
#{<<"id">> => <<"14">>, <<"type">> => 0, <<"deny">> => <<"0">>},
#{
<<"id">> => <<"15">>,
<<"type">> => 2,
<<"allow">> => <<"1">>,
<<"deny">> => <<"0">>
}
]
}),
?assertEqual(
[
#{<<"id">> => 10, <<"type">> => 0, <<"allow">> => 1, <<"deny">> => 0}
],
maps:get(<<"permission_overwrites">>, Channel)
).
channel_overwrites_keep_only_fluxer_schema_fields_test() ->
Channel = normalized_channel(#{
<<"id">> => <<"100">>,
<<"permission_overwrites">> => [
#{
<<"id">> => <<"10">>,
<<"type">> => 1,
<<"allow">> => <<"2048">>,
<<"deny">> => <<"0">>,
<<"extra">> => <<"drop">>
}
]
}),
?assertEqual(
[
#{<<"id">> => 10, <<"type">> => 1, <<"allow">> => 2048, <<"deny">> => 0}
],
maps:get(<<"permission_overwrites">>, Channel)
).
nicks_are_integer_keyed_in_memory_test() ->
Channel = normalized_channel(#{
<<"id">> => <<"100">>,
<<"nicks">> => #{<<"10">> => <<"Ada">>}
}),
?assertEqual(#{10 => <<"Ada">>}, maps:get(<<"nicks">>, Channel)).
nicks_reject_invalid_snowflake_keys_test() ->
?assertError(
{invalid_snowflake, <<"bad">>},
normalized_channel(#{
<<"id">> => <<"100">>, <<"nicks">> => #{<<"bad">> => <<"ignored">>}
})
).
normalized_member(Member) ->
#{} = guild_data_normalize:member(Member).
normalized_role(Role) ->
#{} = guild_data_normalize:role(Role).
normalized_guild_data(Data) ->
#{} = guild_data_normalize:guild_data(Data).
normalized_channel(Channel) ->
#{} = guild_data_normalize:channel(Channel).