From f78a3da197e2f6749a3e9129bf2d50c4df432831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez=20Di=20Antonio?= Date: Sun, 1 Oct 2023 11:50:36 +0200 Subject: [PATCH] test: improve test cases and use a better struct comparator --- .vscode/settings.json | 1 + internal/core/options_test.go | 4 +- internal/idp/helpers_test.go | 4 - internal/idp/idp_test.go | 33 ++- internal/model/member_test.go | 8 +- internal/model/operations_test.go | 379 ++++++++++++++++-------------- internal/scim/helpers_test.go | 173 +++++++++++++- internal/scim/operations_test.go | 11 +- 8 files changed, 413 insertions(+), 200 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9d3754ed..76c92551 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,7 @@ "Babs", "bjensen", "christiangda", + "cmpopts", "codecov", "codeql", "Debugf", diff --git a/internal/core/options_test.go b/internal/core/options_test.go index 1fdc167b..1a3fa9b3 100644 --- a/internal/core/options_test.go +++ b/internal/core/options_test.go @@ -53,7 +53,7 @@ func TestWithIdentityProviderGroupsFilter(t *testing.T) { } if !reflect.DeepEqual(got, want) { - t.Errorf("got = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(want, true)) + t.Errorf("NewSyncService() got = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(want, true)) } }) } @@ -102,7 +102,7 @@ func TestWithIdentityProviderUsersFilter(t *testing.T) { } if !reflect.DeepEqual(got, want) { - t.Errorf("got = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(want, true)) + t.Errorf("NewSyncService() got = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(want, true)) } }) } diff --git a/internal/idp/helpers_test.go b/internal/idp/helpers_test.go index d6f6a141..9c9459c6 100644 --- a/internal/idp/helpers_test.go +++ b/internal/idp/helpers_test.go @@ -114,10 +114,6 @@ func Test_buildUser(t *testing.T) { t.Run(tt.name, func(t *testing.T) { got := buildUser(tt.given) - // if !reflect.DeepEqual(got, tt.want) { - // t.Errorf("buildUser() got = %v, want %v", string(utils.ToJSON(got)), string(utils.ToJSON(tt.want))) - // } - sort := func(x, y string) bool { return x > y } if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { t.Errorf("mismatch (-want +got):\n%s", diff) diff --git a/internal/idp/idp_test.go b/internal/idp/idp_test.go index 637dd8c7..fdc95098 100644 --- a/internal/idp/idp_test.go +++ b/internal/idp/idp_test.go @@ -3,11 +3,11 @@ package idp import ( "context" "errors" - "reflect" "testing" gomock "github.com/golang/mock/gomock" - "github.com/slashdevops/idp-scim-sync/internal/convert" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/slashdevops/idp-scim-sync/internal/model" mocks "github.com/slashdevops/idp-scim-sync/mocks/idp" @@ -146,8 +146,10 @@ func TestGetGroups(t *testing.T) { t.Errorf("GoogleProvider.GetGroups() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GoogleProvider.GetGroups() = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(tt.want, true)) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GetGroups() (-want +got):\n%s", diff) } }) } @@ -320,8 +322,10 @@ func TestGetUsers(t *testing.T) { t.Errorf("GoogleProvider.GetUsers() got error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GoogleProvider.GetUsers() got = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(tt.want, true)) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GetUsers() (-want +got):\n%s", diff) } }) } @@ -455,8 +459,10 @@ func TestGetGroupMembers(t *testing.T) { t.Errorf("GoogleProvider.GetGroupMembers() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GoogleProvider.GetGroupMembers() = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(tt.want, true)) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GetGroupMembers() (-want +got):\n%s", diff) } }) } @@ -705,8 +711,10 @@ func TestGetUsersByGroupsMembers(t *testing.T) { t.Errorf("GoogleProvider.GetUsersFromGroupMembers() got error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("GoogleProvider.GetUsersFromGroupMembers() got = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(tt.want, true)) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GetUsersByGroupsMembers() (-want +got):\n%s", diff) } }) } @@ -872,8 +880,9 @@ func TestGetGroupsMembers(t *testing.T) { return } - if !tt.wantErr && !reflect.DeepEqual(got, tt.want) { - t.Errorf("GoogleProvider.GetGroupsMembers() = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(tt.want, true)) + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GetGroupsMembers() (-want +got):\n%s", diff) } }) } diff --git a/internal/model/member_test.go b/internal/model/member_test.go index 3fbce65a..76be8091 100644 --- a/internal/model/member_test.go +++ b/internal/model/member_test.go @@ -6,6 +6,8 @@ import ( "reflect" "testing" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/slashdevops/idp-scim-sync/internal/convert" ) @@ -310,8 +312,10 @@ func TestGroupsMembersResult_MarshalJSON(t *testing.T) { t.Errorf("UsersResult.MarshalJSON() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("UsersResult.MarshalJSON() = %s, want %s", string(got), string(tt.want)) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("MarshalJSON() (-want +got):\n%s", diff) } }) } diff --git a/internal/model/operations_test.go b/internal/model/operations_test.go index 3c546b0b..43bee62f 100644 --- a/internal/model/operations_test.go +++ b/internal/model/operations_test.go @@ -1,10 +1,10 @@ package model import ( - "reflect" "testing" - "github.com/slashdevops/idp-scim-sync/internal/convert" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/assert" ) @@ -230,17 +230,23 @@ func TestGroupsOperations(t *testing.T) { t.Errorf("GroupsOperations() error = %v", err) return } - if !reflect.DeepEqual(gotCreate, tt.wantCreate) { - t.Errorf("GroupsOperations() gotCreate = %s, want %s", convert.ToJSONString(gotCreate, true), convert.ToJSONString(tt.wantCreate, true)) + + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantCreate, gotCreate, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotCreate (-tt.wantCreate +gotCreate):\n%s", diff) } - if !reflect.DeepEqual(gotUpdate, tt.wantUpdate) { - t.Errorf("GroupsOperations() gotUpdate = %s, want %s", convert.ToJSONString(gotUpdate, true), convert.ToJSONString(tt.wantUpdate, true)) + + if diff := cmp.Diff(tt.wantUpdate, gotUpdate, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotUpdate (-tt.wantUpdate +gotUpdate):\n%s", diff) } - if !reflect.DeepEqual(gotEqual, tt.wantEqual) { - t.Errorf("GroupsOperations() gotEqual = %s, want %s", convert.ToJSONString(gotEqual, true), convert.ToJSONString(tt.wantEqual, true)) + + if diff := cmp.Diff(tt.wantEqual, gotEqual, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotEqual (-tt.wantEqual +gotEqual):\n%s", diff) } - if !reflect.DeepEqual(gotDelete, tt.wantDelete) { - t.Errorf("GroupsOperations() gotDelete = %s, want %s", convert.ToJSONString(gotDelete, true), convert.ToJSONString(tt.wantDelete, true)) + + if diff := cmp.Diff(tt.wantDelete, gotDelete, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotDelete (-tt.wantDelete +gotDelete):\n%s", diff) } }) } @@ -260,42 +266,42 @@ func TestUsersOperations(t *testing.T) { wantDelete *UsersResult wantErr bool }{ - // { - // name: "empty", - // args: args{ - // idp: UsersResultBuilder().Build(), - // state: UsersResultBuilder().Build(), - // }, - // wantCreate: UsersResultBuilder().Build(), - // wantUpdate: UsersResultBuilder().Build(), - // wantEqual: UsersResultBuilder().Build(), - // wantDelete: UsersResultBuilder().Build(), - // wantErr: false, - // }, - // { - // name: "nil idp", - // args: args{ - // idp: nil, - // state: UsersResultBuilder().Build(), - // }, - // wantCreate: nil, - // wantUpdate: nil, - // wantEqual: nil, - // wantDelete: nil, - // wantErr: true, - // }, - // { - // name: "nil state", - // args: args{ - // idp: UsersResultBuilder().Build(), - // state: nil, - // }, - // wantCreate: nil, - // wantUpdate: nil, - // wantEqual: nil, - // wantDelete: nil, - // wantErr: true, - // }, + { + name: "empty", + args: args{ + idp: UsersResultBuilder().Build(), + state: UsersResultBuilder().Build(), + }, + wantCreate: UsersResultBuilder().Build(), + wantUpdate: UsersResultBuilder().Build(), + wantEqual: UsersResultBuilder().Build(), + wantDelete: UsersResultBuilder().Build(), + wantErr: false, + }, + { + name: "nil idp", + args: args{ + idp: nil, + state: UsersResultBuilder().Build(), + }, + wantCreate: nil, + wantUpdate: nil, + wantEqual: nil, + wantDelete: nil, + wantErr: true, + }, + { + name: "nil state", + args: args{ + idp: UsersResultBuilder().Build(), + state: nil, + }, + wantCreate: nil, + wantUpdate: nil, + wantEqual: nil, + wantDelete: nil, + wantErr: true, + }, { name: "2 equals", args: args{ @@ -377,107 +383,107 @@ func TestUsersOperations(t *testing.T) { ).Build(), wantDelete: UsersResultBuilder().Build(), }, - // { - // name: "1 equals, 1 update, 1 delete", - // args: args{ - // idp: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // }, - // ).Build(), - // state: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("2").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), - // }, - // ).Build(), - // }, - // wantCreate: UsersResultBuilder().Build(), - // wantUpdate: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // }, - // ).Build(), - // wantEqual: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // }, - // ).Build(), - // wantDelete: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), - // }, - // ).Build(), - // }, - // { - // name: "1 equals, 1 update", - // args: args{ - // idp: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // }, - // ).Build(), - // state: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("2").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // }, - // ).Build(), - // }, - // wantCreate: UsersResultBuilder().Build(), - // wantUpdate: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // }, - // ).Build(), - // wantEqual: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // }, - // ).Build(), - // wantDelete: UsersResultBuilder().Build(), - // }, - // { - // name: "1 equals, 1 update, 1 delete, 1 create", - // args: args{ - // idp: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // UserBuilder().WithIPID("4").WithEmail(EmailBuilder().WithValue("user.4@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("4").WithGivenName("user").WithDisplayName("user 4").WithActive(true).Build(), - // }, - // ).Build(), - // state: UsersResultBuilder().WithResources([]*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("2").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), - // }, - // ).Build(), - // }, - // wantCreate: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("4").WithEmail(EmailBuilder().WithValue("user.4@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("4").WithGivenName("user").WithDisplayName("user 4").WithActive(true).Build(), - // }, - // ).Build(), - // wantUpdate: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), - // }, - // ).Build(), - // wantEqual: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), - // }, - // ).Build(), - // wantDelete: UsersResultBuilder().WithResources( - // []*User{ - // UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), - // }, - // ).Build(), - // }, + { + name: "1 equals, 1 update, 1 delete", + args: args{ + idp: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + }, + ).Build(), + state: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("2").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), + }, + ).Build(), + }, + wantCreate: UsersResultBuilder().Build(), + wantUpdate: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + }, + ).Build(), + wantEqual: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + }, + ).Build(), + wantDelete: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), + }, + ).Build(), + }, + { + name: "1 equals, 1 update", + args: args{ + idp: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + }, + ).Build(), + state: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("2").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + }, + ).Build(), + }, + wantCreate: UsersResultBuilder().Build(), + wantUpdate: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + }, + ).Build(), + wantEqual: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + }, + ).Build(), + wantDelete: UsersResultBuilder().Build(), + }, + { + name: "1 equals, 1 update, 1 delete, 1 create", + args: args{ + idp: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + UserBuilder().WithIPID("4").WithEmail(EmailBuilder().WithValue("user.4@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("4").WithGivenName("user").WithDisplayName("user 4").WithActive(true).Build(), + }, + ).Build(), + state: UsersResultBuilder().WithResources([]*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("2").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), + }, + ).Build(), + }, + wantCreate: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("4").WithEmail(EmailBuilder().WithValue("user.4@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("4").WithGivenName("user").WithDisplayName("user 4").WithActive(true).Build(), + }, + ).Build(), + wantUpdate: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("2").WithEmail(EmailBuilder().WithValue("user.2@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("different").WithGivenName("user").WithDisplayName("user 2").WithActive(true).Build(), + }, + ).Build(), + wantEqual: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("1").WithEmail(EmailBuilder().WithValue("user.1@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("1").WithGivenName("user").WithDisplayName("user 1").WithActive(true).Build(), + }, + ).Build(), + wantDelete: UsersResultBuilder().WithResources( + []*User{ + UserBuilder().WithIPID("3").WithEmail(EmailBuilder().WithValue("user.3@mail.com").WithType("Work").WithPrimary(true).Build()).WithFamilyName("3").WithGivenName("user").WithDisplayName("user 3").WithActive(true).Build(), + }, + ).Build(), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -493,17 +499,23 @@ func TestUsersOperations(t *testing.T) { t.Errorf("GroupsOperations() error = %v", err) return } - if !reflect.DeepEqual(gotCreate, tt.wantCreate) { - t.Errorf("UsersOperations() gotCreate = %s, want %s", convert.ToJSONString(gotCreate), convert.ToJSONString(tt.wantCreate)) + + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantCreate, gotCreate, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotCreate (-tt.wantCreate +gotCreate):\n%s", diff) } - if !reflect.DeepEqual(gotUpdate, tt.wantUpdate) { - t.Errorf("UsersOperations() gotUpdate = %s, want %s", convert.ToJSONString(gotUpdate), convert.ToJSONString(tt.wantUpdate)) + + if diff := cmp.Diff(tt.wantUpdate, gotUpdate, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotUpdate (-tt.wantUpdate +gotUpdate):\n%s", diff) } - if !reflect.DeepEqual(gotEqual, tt.wantEqual) { - t.Errorf("UsersOperations() gotEqual = %s, want %s", convert.ToJSONString(gotEqual), convert.ToJSONString(tt.wantEqual)) + + if diff := cmp.Diff(tt.wantEqual, gotEqual, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotEqual (-tt.wantEqual +gotEqual):\n%s", diff) } - if !reflect.DeepEqual(gotDelete, tt.wantDelete) { - t.Errorf("UsersOperations() gotDelete = %s, want %s", convert.ToJSONString(gotDelete), convert.ToJSONString(tt.wantDelete)) + + if diff := cmp.Diff(tt.wantDelete, gotDelete, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotDelete (-tt.wantDelete +gotDelete):\n%s", diff) } }) } @@ -846,14 +858,19 @@ func TestMembersOperations(t *testing.T) { t.Errorf("MembersOperations() error = %v", err) return } - if !reflect.DeepEqual(gotCreate, tt.wantCreate) { - t.Errorf("MembersOperations() gotCreate = %s, want %s", convert.ToJSONString(gotCreate), convert.ToJSONString(tt.wantCreate)) + + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantCreate, gotCreate, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotCreate (-tt.wantCreate +gotCreate):\n%s", diff) } - if !reflect.DeepEqual(gotEqual, tt.wantEqual) { - t.Errorf("MembersOperations() gotEqual = %s, want %s", convert.ToJSONString(gotEqual), convert.ToJSONString(tt.wantEqual)) + + if diff := cmp.Diff(tt.wantEqual, gotEqual, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotEqual (-tt.wantEqual +gotEqual):\n%s", diff) } - if !reflect.DeepEqual(gotDelete, tt.wantDelete) { - t.Errorf("MembersOperations() gotDelete = %s, want %s", convert.ToJSONString(gotDelete), convert.ToJSONString(tt.wantDelete)) + + if diff := cmp.Diff(tt.wantDelete, gotDelete, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("GroupsOperations() gotDelete (-tt.wantDelete +gotDelete):\n%s", diff) } }) } @@ -925,8 +942,12 @@ func TestMergeGroupsResult(t *testing.T) { t.Run(tt.name, func(t *testing.T) { tt.wantMerged.SetHashCode() - if gotMerged := MergeGroupsResult(tt.args.grs...); !reflect.DeepEqual(gotMerged, tt.wantMerged) { - t.Errorf("MergeGroupsResult() = %s, want %s", convert.ToJSONString(gotMerged), convert.ToJSONString(tt.wantMerged)) + got := MergeGroupsResult(tt.args.grs...) + + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantMerged, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("MergeGroupsResult() got (-tt.wantMerged +got):\n%s", diff) } }) } @@ -998,8 +1019,12 @@ func TestMergeUsersResult(t *testing.T) { t.Run(tt.name, func(t *testing.T) { tt.wantMerged.SetHashCode() - if gotMerged := MergeUsersResult(tt.args.urs...); !reflect.DeepEqual(gotMerged, tt.wantMerged) { - t.Errorf("MergeUsersResult() = %s, want %s", convert.ToJSONString(gotMerged), convert.ToJSONString(tt.wantMerged)) + got := MergeUsersResult(tt.args.urs...) + + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantMerged, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("MergeUsersResult() got (-tt.wantMerged +got):\n%s", diff) } }) } @@ -1169,8 +1194,12 @@ func TestMergeGroupsMembersResult(t *testing.T) { t.Run(tt.name, func(t *testing.T) { tt.wantMerged.SetHashCode() - if gotMerged := MergeGroupsMembersResult(tt.args.gms...); !reflect.DeepEqual(gotMerged, tt.wantMerged) { - t.Errorf("MergeGroupsMembersResult() = %s, want %s", convert.ToJSONString(gotMerged), convert.ToJSONString(tt.wantMerged)) + got := MergeGroupsMembersResult(tt.args.gms...) + + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantMerged, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("MergeGroupsMembersResult() got (-tt.wantMerged +got):\n%s", diff) } }) } @@ -1496,14 +1525,18 @@ func TestMembersDataSets(t *testing.T) { gotCreate, gotEqual, gotDelete := membersDataSets(tt.args.idp, tt.args.scim) - if !reflect.DeepEqual(gotCreate, tt.wantCreate) { - t.Errorf("membersDataSets() gotCreate = %s, want %s", convert.ToJSONString(gotCreate), convert.ToJSONString(tt.wantCreate)) + sort := func(x, y string) bool { return x > y } + + if diff := cmp.Diff(tt.wantCreate, gotCreate, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("membersDataSets() gotCreate (-tt.wantCreate +gotCreate):\n%s", diff) } - if !reflect.DeepEqual(gotEqual, tt.wantEqual) { - t.Errorf("membersDataSets() gotEqual = %s, want %s", convert.ToJSONString(gotEqual), convert.ToJSONString(tt.wantEqual)) + + if diff := cmp.Diff(tt.wantEqual, gotEqual, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("membersDataSets() gotEqual (-tt.wantEqual +gotEqual):\n%s", diff) } - if !reflect.DeepEqual(gotDelete, tt.wantDelete) { - t.Errorf("membersDataSets() gotDelete = %s, want %s", convert.ToJSONString(gotDelete), convert.ToJSONString(tt.wantDelete)) + + if diff := cmp.Diff(tt.wantDelete, gotDelete, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("membersDataSets() gotDelete (-tt.wantDelete +gotDelete):\n%s", diff) } }) } diff --git a/internal/scim/helpers_test.go b/internal/scim/helpers_test.go index 7d1f6ff9..225e1051 100644 --- a/internal/scim/helpers_test.go +++ b/internal/scim/helpers_test.go @@ -1,9 +1,10 @@ package scim import ( - "reflect" "testing" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/slashdevops/idp-scim-sync/internal/model" "github.com/slashdevops/idp-scim-sync/pkg/aws" ) @@ -35,6 +36,7 @@ func Test_buildCreateUserRequest(t *testing.T) { name: "user with name", args: args{ user: &model.User{ + IPID: "ipid", Name: &model.Name{ FamilyName: "familyName", GivenName: "givenName", @@ -46,6 +48,7 @@ func Test_buildCreateUserRequest(t *testing.T) { }, }, want: &aws.CreateUserRequest{ + ExternalID: "ipid", Name: &aws.Name{ FamilyName: "familyName", GivenName: "givenName", @@ -60,6 +63,7 @@ func Test_buildCreateUserRequest(t *testing.T) { name: "user with name and email", args: args{ user: &model.User{ + IPID: "ipid", Name: &model.Name{ FamilyName: "familyName", GivenName: "givenName", @@ -78,6 +82,7 @@ func Test_buildCreateUserRequest(t *testing.T) { }, }, want: &aws.CreateUserRequest{ + ExternalID: "ipid", Name: &aws.Name{ FamilyName: "familyName", GivenName: "givenName", @@ -99,6 +104,7 @@ func Test_buildCreateUserRequest(t *testing.T) { name: "user with name and email and phone", args: args{ user: &model.User{ + IPID: "ipid", Name: &model.Name{ FamilyName: "familyName", GivenName: "givenName", @@ -123,6 +129,7 @@ func Test_buildCreateUserRequest(t *testing.T) { }, }, want: &aws.CreateUserRequest{ + ExternalID: "ipid", Name: &aws.Name{ FamilyName: "familyName", GivenName: "givenName", @@ -149,8 +156,168 @@ func Test_buildCreateUserRequest(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := buildCreateUserRequest(tt.args.user); !reflect.DeepEqual(got, tt.want) { - t.Errorf("buildCreateUserRequest() = %v, want %v", got, tt.want) + got := buildCreateUserRequest(tt.args.user) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("buildCreateUserRequest() (-want +got):\n%s", diff) + } + }) + } +} + +func Test_buildPutUserRequest(t *testing.T) { + type args struct { + user *model.User + } + tests := []struct { + name string + args args + want *aws.PutUserRequest + }{ + { + name: "nil user", + args: args{ + user: nil, + }, + want: nil, + }, + { + name: "empty user", + args: args{ + user: &model.User{}, + }, + want: &aws.PutUserRequest{}, + }, + { + name: "user with name", + args: args{ + user: &model.User{ + SCIMID: "scimid", + Name: &model.Name{ + FamilyName: "familyName", + GivenName: "givenName", + Formatted: "formatted", + MiddleName: "middleName", + HonorificPrefix: "honorificPrefix", + HonorificSuffix: "honorificSuffix", + }, + }, + }, + want: &aws.PutUserRequest{ + ID: "scimid", + Name: &aws.Name{ + FamilyName: "familyName", + GivenName: "givenName", + Formatted: "formatted", + MiddleName: "middleName", + HonorificPrefix: "honorificPrefix", + HonorificSuffix: "honorificSuffix", + }, + }, + }, + { + name: "user with name and email", + args: args{ + user: &model.User{ + SCIMID: "scimid", + Name: &model.Name{ + FamilyName: "familyName", + GivenName: "givenName", + Formatted: "formatted", + MiddleName: "middleName", + HonorificPrefix: "honorificPrefix", + HonorificSuffix: "honorificSuffix", + }, + Emails: []model.Email{ + { + Value: "email", + Type: "work", + Primary: true, + }, + }, + }, + }, + want: &aws.PutUserRequest{ + ID: "scimid", + Name: &aws.Name{ + FamilyName: "familyName", + GivenName: "givenName", + Formatted: "formatted", + MiddleName: "middleName", + HonorificPrefix: "honorificPrefix", + HonorificSuffix: "honorificSuffix", + }, + Emails: []aws.Email{ + { + Value: "email", + Type: "work", + Primary: true, + }, + }, + }, + }, + { + name: "user with name and email and phone", + args: args{ + user: &model.User{ + SCIMID: "scimid", + Name: &model.Name{ + FamilyName: "familyName", + GivenName: "givenName", + Formatted: "formatted", + MiddleName: "middleName", + HonorificPrefix: "honorificPrefix", + HonorificSuffix: "honorificSuffix", + }, + Emails: []model.Email{ + { + Value: "email", + Type: "work", + Primary: true, + }, + }, + PhoneNumbers: []model.PhoneNumber{ + { + Value: "phone", + Type: "work", + }, + }, + }, + }, + want: &aws.PutUserRequest{ + ID: "scimid", + Name: &aws.Name{ + FamilyName: "familyName", + GivenName: "givenName", + Formatted: "formatted", + MiddleName: "middleName", + HonorificPrefix: "honorificPrefix", + HonorificSuffix: "honorificSuffix", + }, + Emails: []aws.Email{ + { + Value: "email", + Type: "work", + Primary: true, + }, + }, + PhoneNumbers: []aws.PhoneNumber{ + { + Value: "phone", + Type: "work", + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := buildPutUserRequest(tt.args.user) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("buildPutUserRequest() (-want +got):\n%s", diff) } }) } diff --git a/internal/scim/operations_test.go b/internal/scim/operations_test.go index 0a67cc32..5d075311 100644 --- a/internal/scim/operations_test.go +++ b/internal/scim/operations_test.go @@ -1,11 +1,11 @@ package scim import ( - "reflect" "strconv" "testing" - "github.com/slashdevops/idp-scim-sync/internal/convert" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" "github.com/slashdevops/idp-scim-sync/internal/model" "github.com/slashdevops/idp-scim-sync/pkg/aws" ) @@ -125,8 +125,11 @@ func Test_patchGroupOperations(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := patchGroupOperations(tt.args.op, tt.args.path, tt.args.pvs, tt.args.gms); !reflect.DeepEqual(got, tt.want) { - t.Errorf("patchGroupOperations() = %s, want %s", convert.ToJSONString(got, true), convert.ToJSONString(tt.want, true)) + got := patchGroupOperations(tt.args.op, tt.args.path, tt.args.pvs, tt.args.gms) + + sort := func(x, y string) bool { return x > y } + if diff := cmp.Diff(tt.want, got, cmpopts.SortSlices(sort)); diff != "" { + t.Errorf("patchGroupOperations() (-want +got):\n%s", diff) } }) }