@@ -928,7 +928,7 @@ defmodule Module.Types.IntegrationTest do
928928 assert_no_warnings ( files )
929929 end
930930
931- test "redundant clause checking of mixed open and closed maps" do
931+ test "redundant clause checking of mixed open and closed maps (1) " do
932932 files = % {
933933 "mixed_open_closed_maps.ex" => """
934934 defmodule MixedOpenClosedMaps do
@@ -983,6 +983,59 @@ defmodule Module.Types.IntegrationTest do
983983 assert_no_warnings ( files )
984984 end
985985
986+ test "redundant clause checking of mixed open and closed maps (2)" do
987+ files = % {
988+ "mixed_open_closed_maps.ex" => """
989+ defmodule MixedOpenClose.Roles do
990+ defstruct engineering_admin: false,
991+ admin: false,
992+ support: false,
993+ service_desk: false,
994+ sales: false
995+ end
996+
997+ defmodule MixedOpenClose.User do
998+ defstruct roles: %MixedOpenClose.Roles{}
999+ end
1000+
1001+ defmodule MixedOpenClose.Policy do
1002+ alias MixedOpenClose.{User, Roles}
1003+
1004+ @admin_actions [
1005+ :access,
1006+ :edit,
1007+ :manage_roles,
1008+ :global_search,
1009+ :get_users_with_roles,
1010+ :deactivate,
1011+ :reactivate,
1012+ :confirm_email,
1013+ :soft_delete
1014+ ]
1015+
1016+ def can?(%User{roles: %Roles{support: true}}, _a, action)
1017+ when action in [:global_search, :confirm_email, :get_users_with_roles], do: true
1018+
1019+ def can?(%User{roles: %Roles{service_desk: true}}, _a, action)
1020+ when action in [:global_search, :confirm_email], do: true
1021+
1022+ def can?(%User{roles: %Roles{sales: true}}, _a, action)
1023+ when action in [:edit, :confirm_email], do: true
1024+
1025+ def can?(%User{roles: roles}, _a, action)
1026+ when action in @admin_actions and (roles.admin == true or roles.engineering_admin == true),
1027+ do: true
1028+
1029+ def can?(user, %URI{} = uri, action), do: can?(user, uri, action)
1030+
1031+ def can?(_a, _b, _c), do: false
1032+ end
1033+ """
1034+ }
1035+
1036+ assert_no_warnings ( files )
1037+ end
1038+
9861039 test "redundant clause checking of open maps with distinct keys" do
9871040 files = % {
9881041 "large_head.ex" => """
0 commit comments