%% SPDX-License-Identifier: AGPL-3.0-or-later -module(guild_state_roles_tests). -typing([eqwalizer]). -include_lib("eunit/include/eunit.hrl"). handle_role_delete_strips_from_members_test() -> RoleIdToDelete = <<"200">>, Data = guild_data_index:normalize_map(#{ <<"roles">> => [ #{<<"id">> => <<"100">>, <<"name">> => <<"Admin">>}, #{<<"id">> => <<"200">>, <<"name">> => <<"Moderator">>} ], <<"members">> => #{ 1 => #{<<"user">> => #{<<"id">> => <<"1">>}, <<"roles">> => [<<"100">>, <<"200">>]}, 2 => #{<<"user">> => #{<<"id">> => <<"2">>}, <<"roles">> => [<<"200">>]}, 3 => #{<<"user">> => #{<<"id">> => <<"3">>}, <<"roles">> => [<<"100">>]} }, <<"channels">> => [] }), EventData = #{<<"role_id">> => RoleIdToDelete}, Result = guild_state_roles:handle_role_delete(EventData, Data), Members = maps:get(<<"members">>, Result), M1 = maps:get(1, Members), M2 = maps:get(2, Members), M3 = maps:get(3, Members), ?assertEqual([100], maps:get(<<"roles">>, M1)), ?assertEqual([], maps:get(<<"roles">>, M2)), ?assertEqual([100], maps:get(<<"roles">>, M3)). handle_role_delete_strips_from_channel_overwrites_test() -> RoleIdToDelete = <<"200">>, Data = #{ <<"roles">> => [ #{<<"id">> => <<"100">>, <<"name">> => <<"Everyone">>}, #{<<"id">> => <<"200">>, <<"name">> => <<"Moderator">>} ], <<"members">> => [], <<"channels">> => [ #{ <<"id">> => <<"500">>, <<"permission_overwrites">> => [ #{ <<"id">> => <<"100">>, <<"type">> => 0, <<"allow">> => <<"0">>, <<"deny">> => <<"1024">> }, #{ <<"id">> => <<"200">>, <<"type">> => 0, <<"allow">> => <<"1024">>, <<"deny">> => <<"0">> }, #{ <<"id">> => <<"1">>, <<"type">> => 1, <<"allow">> => <<"2048">>, <<"deny">> => <<"0">> } ] } ] }, EventData = #{<<"role_id">> => RoleIdToDelete}, Result = guild_state_roles:handle_role_delete(EventData, Data), Channels = maps:get(<<"channels">>, Result), [Ch1] = Channels, Ch1Overwrites = maps:get(<<"permission_overwrites">>, Ch1), ?assertEqual(2, length(Ch1Overwrites)). handle_role_create_test() -> Data = #{ <<"roles">> => [#{<<"id">> => <<"1">>, <<"name">> => <<"Everyone">>}], <<"members">> => [], <<"channels">> => [] }, EventData = #{<<"role">> => #{<<"id">> => <<"2">>, <<"name">> => <<"New">>}}, Result = guild_state_roles:handle_role_create(EventData, Data), Roles = guild_data_index:role_list(Result), ?assertEqual(2, length(Roles)), RoleIndex = guild_data_index:role_index(Result), ?assertMatch(#{2 := _}, RoleIndex). handle_role_update_replaces_role_test() -> Data = #{ <<"roles">> => [ #{<<"id">> => <<"1">>, <<"name">> => <<"Old">>}, #{<<"id">> => <<"2">>, <<"name">> => <<"Keep">>} ], <<"members">> => [], <<"channels">> => [] }, EventData = #{<<"role">> => #{<<"id">> => <<"1">>, <<"name">> => <<"Updated">>}}, Result = guild_state_roles:handle_role_update(EventData, Data), Roles = guild_data_index:role_list(Result), [R1, R2] = Roles, ?assertEqual(<<"Updated">>, maps:get(<<"name">>, R1)), ?assertEqual(<<"Keep">>, maps:get(<<"name">>, R2)). handle_role_update_bulk_test() -> Data = #{ <<"roles">> => [ #{<<"id">> => <<"1">>, <<"name">> => <<"A">>}, #{<<"id">> => <<"2">>, <<"name">> => <<"B">>}, #{<<"id">> => <<"3">>, <<"name">> => <<"C">>} ], <<"members">> => [], <<"channels">> => [] }, EventData = #{ <<"roles">> => [ #{<<"id">> => <<"1">>, <<"name">> => <<"A2">>}, #{<<"id">> => <<"3">>, <<"name">> => <<"C2">>} ] }, Result = guild_state_roles:handle_role_update_bulk(EventData, Data), Roles = guild_data_index:role_list(Result), [R1, R2, R3] = Roles, ?assertEqual(<<"A2">>, maps:get(<<"name">>, R1)), ?assertEqual(<<"B">>, maps:get(<<"name">>, R2)), ?assertEqual(<<"C2">>, maps:get(<<"name">>, R3)). handle_role_delete_removes_role_from_list_test() -> Data = #{ <<"roles">> => [ #{<<"id">> => <<"1">>, <<"name">> => <<"Keep">>}, #{<<"id">> => <<"2">>, <<"name">> => <<"Delete">>} ], <<"members">> => [], <<"channels">> => [] }, EventData = #{<<"role_id">> => <<"2">>}, Result = guild_state_roles:handle_role_delete(EventData, Data), Roles = guild_data_index:role_list(Result), ?assertEqual(1, length(Roles)), ?assertEqual(<<"Keep">>, maps:get(<<"name">>, hd(Roles))). strip_role_from_members_no_affected_users_test() -> Data = guild_data_index:normalize_map(#{ <<"roles">> => [], <<"members">> => #{ 1 => #{<<"user">> => #{<<"id">> => <<"1">>}, <<"roles">> => [<<"100">>]} }, <<"channels">> => [] }), Result = guild_state_roles_delete:strip_role_from_members(999, Data), #{<<"roles">> := Roles} = guild_data_index:get_member(1, Result), ?assertEqual([100], Roles). strip_role_from_channel_overwrites_preserves_user_overwrites_test() -> Data = #{ <<"channels">> => [ #{ <<"id">> => <<"500">>, <<"permission_overwrites">> => [ #{ <<"id">> => <<"100">>, <<"type">> => 0, <<"allow">> => <<"0">>, <<"deny">> => <<"0">> }, #{ <<"id">> => <<"1">>, <<"type">> => 1, <<"allow">> => <<"1024">>, <<"deny">> => <<"0">> } ] } ] }, Result = guild_state_roles_delete:strip_role_from_channel_overwrites(100, Data), [Ch] = guild_data_index:channel_list(Result), Overwrites = maps:get(<<"permission_overwrites">>, Ch), ?assertEqual(1, length(Overwrites)), ?assertEqual(1, maps:get(<<"type">>, hd(Overwrites))).