55 "reflect"
66 "testing"
77
8+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
89 "google.golang.org/api/cloudresourcemanager/v1"
910)
1011
@@ -658,7 +659,7 @@ func TestIamCreateIamBindingsMap(t *testing.T) {
658659 input : []* cloudresourcemanager.Binding {
659660 {
660661 Role : "role-1" ,
661- Members : []string {"deleted:serviceAccount:user -1" , "user-2" },
662+ Members : []string {"deleted:serviceAccount:useR -1" , "user-2" },
662663 },
663664 {
664665 Role : "role-2" ,
@@ -676,11 +677,49 @@ func TestIamCreateIamBindingsMap(t *testing.T) {
676677 Role : "role-3" ,
677678 Members : []string {"user-3" },
678679 },
680+ {
681+ Role : "role-4" ,
682+ Members : []string {"deleted:principal:useR-1" },
683+ },
679684 },
680685 expect : map [iamBindingKey ]map [string ]struct {}{
681686 {"role-1" , conditionKey {}}: {"deleted:serviceAccount:user-1" : {}, "user-2" : {}, "serviceAccount:user-3" : {}},
682687 {"role-2" , conditionKey {}}: {"deleted:user:user-1" : {}, "user-2" : {}},
683688 {"role-3" , conditionKey {}}: {"user-3" : {}},
689+ {"role-4" , conditionKey {}}: {"deleted:principal:useR-1" : {}},
690+ },
691+ },
692+ {
693+ input : []* cloudresourcemanager.Binding {
694+ {
695+ Role : "role-1" ,
696+ Members : []string {"principalSet://iam.googleapis.com/projects/1066737951711/locations/global/workloadIdentityPools/example-pool/attribute.aws_role/arn:aws:sts::999999999999:assumed-role/some-eu-central-1-lambdaRole" },
697+ },
698+ {
699+ Role : "role-2" ,
700+ Members : []string {"principal://iam.googleapis.com/projects/1066737951711/locations/global/workloadIdentityPools/example-pool/attribute.aws_role/arn:aws:sts::999999999999:assumed-role/some-eu-central-1-lambdaRole" },
701+ },
702+ {
703+ Role : "role-1" ,
704+ Members : []string {"serviceAccount:useR-3" },
705+ },
706+ {
707+ Role : "role-2" ,
708+ Members : []string {"user-2" },
709+ },
710+ {
711+ Role : "role-3" ,
712+ Members : []string {"user-3" },
713+ },
714+ {
715+ Role : "role-3" ,
716+ Members : []string {"principalHierarchy://iam.googleapis.com/projects/1066737951711/locations/global/workloadIdentityPools" },
717+ },
718+ },
719+ expect : map [iamBindingKey ]map [string ]struct {}{
720+ {"role-1" , conditionKey {}}: {"principalSet://iam.googleapis.com/projects/1066737951711/locations/global/workloadIdentityPools/example-pool/attribute.aws_role/arn:aws:sts::999999999999:assumed-role/some-eu-central-1-lambdaRole" : {}, "serviceAccount:user-3" : {}},
721+ {"role-2" , conditionKey {}}: {"principal://iam.googleapis.com/projects/1066737951711/locations/global/workloadIdentityPools/example-pool/attribute.aws_role/arn:aws:sts::999999999999:assumed-role/some-eu-central-1-lambdaRole" : {}, "user-2" : {}},
722+ {"role-3" , conditionKey {}}: {"principalHierarchy://iam.googleapis.com/projects/1066737951711/locations/global/workloadIdentityPools" : {}, "user-3" : {}},
684723 },
685724 },
686725 {
@@ -748,6 +787,84 @@ func TestIamCreateIamBindingsMap(t *testing.T) {
748787 }
749788}
750789
790+ func TestIamMember_MemberDiffSuppress (t * testing.T ) {
791+ type IamMemberTestcase struct {
792+ name string
793+ old string
794+ new string
795+ equal bool
796+ }
797+ var iamMemberTestcases = []IamMemberTestcase {
798+ {
799+ name : "control" ,
800+ old : "somevalue" ,
801+ new : "somevalue" ,
802+ equal : true ,
803+ },
804+ {
805+ name : "principal same casing" ,
806+ old : "principal:someValueHere" ,
807+ new : "principal:someValueHere" ,
808+ equal : true ,
809+ },
810+ {
811+ name : "principal not same casing" ,
812+ old : "principal:somevalueHere" ,
813+ new : "principal:someValuehere" ,
814+ equal : false ,
815+ },
816+ {
817+ name : "principalSet same casing" ,
818+ old : "principalSet:someValueHere" ,
819+ new : "principalSet:someValueHere" ,
820+ equal : true ,
821+ },
822+ {
823+ name : "principalSet not same casing" ,
824+ old : "principalSet:somevalueHere" ,
825+ new : "principalSet:someValuehere" ,
826+ equal : false ,
827+ },
828+ {
829+ name : "principalHierarchy same casing" ,
830+ old : "principalHierarchy:someValueHere" ,
831+ new : "principalHierarchy:someValueHere" ,
832+ equal : true ,
833+ },
834+ {
835+ name : "principalHierarchy not same casing" ,
836+ old : "principalHierarchy:somevalueHere" ,
837+ new : "principalHierarchy:someValuehere" ,
838+ equal : false ,
839+ },
840+ {
841+ name : "serviceAccount same casing" ,
842+ old :
"serviceAccount:[email protected] " ,
843+ new :
"serviceAccount:[email protected] " ,
844+ equal : true ,
845+ },
846+ {
847+ name : "serviceAccount diff casing" ,
848+ old :
"serviceAccount:[email protected] " ,
849+ new :
"serviceAccount:[email protected] " ,
850+ equal : true ,
851+ },
852+ {
853+ name : "random diff" ,
854+ old : "serviasfsfljJKLSD" ,
855+ new : "servicsFDJKLSFJdfjdlkfsf" ,
856+ equal : false ,
857+ },
858+ }
859+
860+ for _ , testcase := range iamMemberTestcases {
861+ areEqual := iamMemberCaseDiffSuppress ("" , testcase .old , testcase .new , & schema.ResourceData {})
862+ if areEqual != testcase .equal {
863+ t .Errorf ("Testcase %s failed: expected equality to be %t but got %t" , testcase .name , testcase .equal , areEqual )
864+ }
865+ }
866+ }
867+
751868func TestIamListFromIamBindingMap (t * testing.T ) {
752869 testCases := []struct {
753870 input map [iamBindingKey ]map [string ]struct {}
0 commit comments