From 612f2a43e4cd7bd60a70b9b27f32c64af16efa08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez=20Di=20Antonio?= Date: Sun, 21 Mar 2021 13:37:20 +0100 Subject: [PATCH] fixed errors on functions thanks to unit tests --- internal/sync.go | 51 ++++---- internal/sync_test.go | 292 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 319 insertions(+), 24 deletions(-) create mode 100644 internal/sync_test.go diff --git a/internal/sync.go b/internal/sync.go index 1d092650..27145a9d 100644 --- a/internal/sync.go +++ b/internal/sync.go @@ -588,27 +588,27 @@ func getGroupOperations(awsGroups []*aws.Group, googleGroups []*admin.Group) (ad awsMap := make(map[string]*aws.Group, len(awsGroups)) googleMap := make(map[string]struct{}, len(googleGroups)) - for _, e := range awsGroups { - awsMap[e.DisplayName] = e + for _, awsGroup := range awsGroups { + awsMap[awsGroup.DisplayName] = awsGroup } - for _, e := range googleGroups { - googleMap[e.Name] = struct{}{} + for _, gGroup := range googleGroups { + googleMap[gGroup.Name] = struct{}{} } // AWS Groups found and not found in google - for _, e := range googleGroups { - if _, found := awsMap[e.Name]; found { - equals = append(equals, awsMap[e.Name]) + for _, gGroup := range googleGroups { + if _, found := awsMap[gGroup.Name]; found { + equals = append(equals, awsMap[gGroup.Name]) } else { - add = append(add, aws.NewGroup(e.Name)) + add = append(add, aws.NewGroup(gGroup.Name)) } } // Google Groups founds and not in aws - for _, e := range awsGroups { - if _, found := googleMap[e.DisplayName]; !found { - delete = append(delete, aws.NewGroup(e.DisplayName)) + for _, awsGroup := range awsGroups { + if _, found := googleMap[awsGroup.DisplayName]; !found { + delete = append(delete, aws.NewGroup(awsGroup.DisplayName)) } } @@ -621,30 +621,33 @@ func getUserOperations(awsUsers []*aws.User, googleUsers []*admin.User) (add []* awsMap := make(map[string]*aws.User, len(awsUsers)) googleMap := make(map[string]struct{}, len(googleUsers)) - for _, e := range awsUsers { - awsMap[e.DisplayName] = e + for _, awsUser := range awsUsers { + awsMap[awsUser.Username] = awsUser } - for _, e := range googleUsers { - googleMap[e.PrimaryEmail] = struct{}{} + for _, gUser := range googleUsers { + googleMap[gUser.PrimaryEmail] = struct{}{} } // AWS Users found and not found in google - for _, e := range googleUsers { - if _, found := awsMap[e.PrimaryEmail]; found { - equals = append(equals, awsMap[e.PrimaryEmail]) - if awsMap[e.PrimaryEmail].Active == e.Suspended { - update = append(update, aws.NewUser(e.Name.GivenName, e.Name.FamilyName, e.PrimaryEmail, !e.Suspended)) + for _, gUser := range googleUsers { + if awsUser, found := awsMap[gUser.PrimaryEmail]; found { + if awsUser.Active == gUser.Suspended || + awsUser.Name.GivenName != gUser.Name.GivenName || + awsUser.Name.FamilyName != gUser.Name.FamilyName { + update = append(update, aws.NewUser(gUser.Name.GivenName, gUser.Name.FamilyName, gUser.PrimaryEmail, !gUser.Suspended)) + } else { + equals = append(equals, awsUser) } } else { - add = append(add, aws.NewUser(e.Name.GivenName, e.Name.FamilyName, e.PrimaryEmail, !e.Suspended)) + add = append(add, aws.NewUser(gUser.Name.GivenName, gUser.Name.FamilyName, gUser.PrimaryEmail, !gUser.Suspended)) } } // Google Users founds and not in aws - for _, e := range awsUsers { - if _, found := googleMap[e.DisplayName]; !found { - delete = append(delete, aws.NewUser(e.Name.GivenName, e.Name.FamilyName, e.DisplayName, false)) + for _, awsUser := range awsUsers { + if _, found := googleMap[awsUser.Username]; !found { + delete = append(delete, aws.NewUser(awsUser.Name.GivenName, awsUser.Name.FamilyName, awsUser.Username, awsUser.Active)) } } diff --git a/internal/sync_test.go b/internal/sync_test.go new file mode 100644 index 00000000..2bcb4aa3 --- /dev/null +++ b/internal/sync_test.go @@ -0,0 +1,292 @@ +// Copyright (c) 2020, Amazon.com, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package internal ... +package internal + +import ( + "encoding/json" + "log" + "reflect" + "testing" + + "github.com/awslabs/ssosync/internal/aws" + admin "google.golang.org/api/admin/directory/v1" +) + +// toJSON return a json prety of the stc +func toJSON(stc interface{}) []byte { + JSON, err := json.MarshalIndent(stc, "", " ") + if err != nil { + log.Fatalf(err.Error()) + } + return JSON +} + +func Test_getGroupOperations(t *testing.T) { + type args struct { + awsGroups []*aws.Group + googleGroups []*admin.Group + } + tests := []struct { + name string + args args + wantAdd []*aws.Group + wantDelete []*aws.Group + wantEquals []*aws.Group + }{ + { + name: "equal groups google and aws", + args: args{ + awsGroups: []*aws.Group{ + aws.NewGroup("Group-1"), + aws.NewGroup("Group-2"), + }, + googleGroups: []*admin.Group{ + {Name: "Group-1"}, + {Name: "Group-2"}, + }, + }, + wantAdd: nil, + wantDelete: nil, + wantEquals: []*aws.Group{ + aws.NewGroup("Group-1"), + aws.NewGroup("Group-2"), + }, + }, + { + name: "add two new aws groups", + args: args{ + awsGroups: nil, + googleGroups: []*admin.Group{ + {Name: "Group-1"}, + {Name: "Group-2"}, + }, + }, + wantAdd: []*aws.Group{ + aws.NewGroup("Group-1"), + aws.NewGroup("Group-2"), + }, + wantDelete: nil, + wantEquals: nil, + }, + { + name: "delete two aws groups", + args: args{ + awsGroups: []*aws.Group{ + aws.NewGroup("Group-1"), + aws.NewGroup("Group-2"), + }, googleGroups: nil, + }, + wantAdd: nil, + wantDelete: []*aws.Group{ + aws.NewGroup("Group-1"), + aws.NewGroup("Group-2"), + }, + wantEquals: nil, + }, + { + name: "add one, delete one and one equal", + args: args{ + awsGroups: []*aws.Group{ + aws.NewGroup("Group-2"), + aws.NewGroup("Group-3"), + }, + googleGroups: []*admin.Group{ + {Name: "Group-1"}, + {Name: "Group-2"}, + }, + }, + wantAdd: []*aws.Group{ + aws.NewGroup("Group-1"), + }, + wantDelete: []*aws.Group{ + aws.NewGroup("Group-3"), + }, + wantEquals: []*aws.Group{ + aws.NewGroup("Group-2"), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotAdd, gotDelete, gotEquals := getGroupOperations(tt.args.awsGroups, tt.args.googleGroups) + if !reflect.DeepEqual(gotAdd, tt.wantAdd) { + t.Errorf("getGroupOperations() gotAdd = %s, want %s", toJSON(gotAdd), toJSON(tt.wantAdd)) + } + if !reflect.DeepEqual(gotDelete, tt.wantDelete) { + t.Errorf("getGroupOperations() gotDelete = %s, want %s", toJSON(gotDelete), toJSON(tt.wantDelete)) + } + if !reflect.DeepEqual(gotEquals, tt.wantEquals) { + t.Errorf("getGroupOperations() gotEquals = %s, want %s", toJSON(gotEquals), toJSON(tt.wantEquals)) + } + }) + } +} + +func Test_getUserOperations(t *testing.T) { + type args struct { + awsUsers []*aws.User + googleUsers []*admin.User + } + tests := []struct { + name string + args args + wantAdd []*aws.User + wantDelete []*aws.User + wantUpdate []*aws.User + wantEquals []*aws.User + }{ + { + name: "equal user google and aws", + args: args{ + awsUsers: []*aws.User{ + aws.NewUser("name-1", "lastname-1", "user-1@email.com", true), + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + }, + googleUsers: []*admin.User{ + {Name: &admin.UserName{ + GivenName: "name-1", + FamilyName: "lastname-1", + }, + Suspended: false, + PrimaryEmail: "user-1@email.com", + }, + {Name: &admin.UserName{ + GivenName: "name-2", + FamilyName: "lastname-2", + }, + Suspended: false, + PrimaryEmail: "user-2@email.com", + }, + }, + }, + wantAdd: nil, + wantDelete: nil, + wantUpdate: nil, + wantEquals: []*aws.User{ + aws.NewUser("name-1", "lastname-1", "user-1@email.com", true), + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + }, + }, + { + name: "add two new aws users", + args: args{ + awsUsers: nil, + googleUsers: []*admin.User{ + {Name: &admin.UserName{ + GivenName: "name-1", + FamilyName: "lastname-1", + }, + Suspended: false, + PrimaryEmail: "user-1@email.com", + }, + {Name: &admin.UserName{ + GivenName: "name-2", + FamilyName: "lastname-2", + }, + Suspended: false, + PrimaryEmail: "user-2@email.com", + }, + }, + }, + wantAdd: []*aws.User{ + aws.NewUser("name-1", "lastname-1", "user-1@email.com", true), + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + }, + wantDelete: nil, + wantUpdate: nil, + wantEquals: nil, + }, + { + name: "delete two aws users", + args: args{ + awsUsers: []*aws.User{ + aws.NewUser("name-1", "lastname-1", "user-1@email.com", true), + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + }, + googleUsers: nil, + }, + wantAdd: nil, + wantDelete: []*aws.User{ + aws.NewUser("name-1", "lastname-1", "user-1@email.com", true), + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + }, + wantUpdate: nil, + wantEquals: nil, + }, + { + name: "add on, delete one, update one and one equal", + args: args{ + awsUsers: []*aws.User{ + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + aws.NewUser("name-3", "lastname-3", "user-3@email.com", true), + aws.NewUser("name-4", "lastname-4", "user-4@email.com", true), + }, + googleUsers: []*admin.User{ + {Name: &admin.UserName{ + GivenName: "name-1", + FamilyName: "lastname-1", + }, + Suspended: false, + PrimaryEmail: "user-1@email.com", + }, + {Name: &admin.UserName{ + GivenName: "name-2", + FamilyName: "lastname-2", + }, + Suspended: false, + PrimaryEmail: "user-2@email.com", + }, + {Name: &admin.UserName{ + GivenName: "name-4", + FamilyName: "lastname-4", + }, + Suspended: true, + PrimaryEmail: "user-4@email.com", + }, + }, + }, + wantAdd: []*aws.User{ + aws.NewUser("name-1", "lastname-1", "user-1@email.com", true), + }, + wantDelete: []*aws.User{ + aws.NewUser("name-3", "lastname-3", "user-3@email.com", true), + }, + wantUpdate: []*aws.User{ + aws.NewUser("name-4", "lastname-4", "user-4@email.com", false), + }, + wantEquals: []*aws.User{ + aws.NewUser("name-2", "lastname-2", "user-2@email.com", true), + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotAdd, gotDelete, gotUpdate, gotEquals := getUserOperations(tt.args.awsUsers, tt.args.googleUsers) + if !reflect.DeepEqual(gotAdd, tt.wantAdd) { + t.Errorf("getUserOperations() gotAdd = %s, want %s", toJSON(gotAdd), toJSON(tt.wantAdd)) + } + if !reflect.DeepEqual(gotDelete, tt.wantDelete) { + t.Errorf("getUserOperations() gotDelete = %s, want %s", toJSON(gotDelete), toJSON(tt.wantDelete)) + } + if !reflect.DeepEqual(gotUpdate, tt.wantUpdate) { + t.Errorf("getUserOperations() gotUpdate = %s, want %s", toJSON(gotUpdate), toJSON(tt.wantUpdate)) + } + if !reflect.DeepEqual(gotEquals, tt.wantEquals) { + t.Errorf("getUserOperations() gotEquals = %s, want %s", toJSON(gotEquals), toJSON(tt.wantEquals)) + } + }) + } +}