add tests for principalsToSet and SetPrincipalRoles

pull/165/head
Jim Lambert 6 years ago
parent 6eeea83693
commit 33ac38d3d2

@ -3,6 +3,7 @@ package iam
import (
"context"
"errors"
"sort"
"testing"
"time"
@ -419,3 +420,330 @@ func TestRepository_DeletePrincipalRoles(t *testing.T) {
})
}
}
func TestRepository_SetPrincipalRoles(t *testing.T) {
t.Parallel()
cleanup, conn, _ := db.TestSetup(t, "postgres")
defer func() {
err := cleanup()
assert.NoError(t, err)
err = conn.Close()
assert.NoError(t, err)
}()
rw := db.New(conn)
wrapper := db.TestWrapper(t)
repo, err := NewRepository(rw, rw, wrapper)
require.NoError(t, err)
org, proj := TestScopes(t, conn)
testUser := TestUser(t, conn, org.PublicId)
testGrp := TestGroup(t, conn, proj.PublicId)
createUsersFn := func() []string {
results := []string{}
for i := 0; i < 5; i++ {
u := TestUser(t, conn, org.PublicId)
results = append(results, u.PublicId)
}
return results
}
createGrpsFn := func() []string {
results := []string{}
for i := 0; i < 5; i++ {
g := TestGroup(t, conn, proj.PublicId)
results = append(results, g.PublicId)
}
return results
}
setupFn := func(role *Role) ([]string, []string) {
users := createUsersFn()
grps := createGrpsFn()
_, err := repo.AddPrincipalRoles(context.Background(), role.PublicId, 1, users, grps)
require.NoError(t, err)
return users, grps
}
type args struct {
role *Role
roleVersion int
userIds []string
groupIds []string
addToOrigUsers bool
addToOrigGrps bool
opt []Option
}
tests := []struct {
name string
setup func(*Role) ([]string, []string)
args args
wantAffectedRows int
wantErr bool
}{
{
name: "clear",
setup: setupFn,
args: args{
role: TestRole(t, conn, proj.PublicId),
roleVersion: 2, // yep, since setupFn will increment it to 2
userIds: []string{},
groupIds: []string{},
},
wantErr: false,
wantAffectedRows: 10,
},
{
name: "no change",
setup: setupFn,
args: args{
role: TestRole(t, conn, proj.PublicId),
roleVersion: 2, // yep, since setupFn will increment it to 2
userIds: []string{},
groupIds: []string{},
addToOrigUsers: true,
addToOrigGrps: true,
},
wantErr: false,
wantAffectedRows: 0,
},
{
name: "add users and grps",
setup: setupFn,
args: args{
role: TestRole(t, conn, proj.PublicId),
roleVersion: 2, // yep, since setupFn will increment it to 2
userIds: []string{testUser.PublicId},
groupIds: []string{testGrp.PublicId},
addToOrigUsers: true,
addToOrigGrps: true,
},
wantErr: false,
wantAffectedRows: 2,
},
{
name: "remove existing and add users and grps",
setup: setupFn,
args: args{
role: TestRole(t, conn, proj.PublicId),
roleVersion: 2, // yep, since setupFn will increment it to 2
userIds: []string{testUser.PublicId},
groupIds: []string{testGrp.PublicId},
addToOrigUsers: false,
addToOrigGrps: false,
},
wantErr: false,
wantAffectedRows: 12,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
var origUsers, origGrps []string
if tt.setup != nil {
origUsers, origGrps = tt.setup(tt.args.role)
}
setUsers := tt.args.userIds
setGrps := tt.args.groupIds
if tt.args.addToOrigUsers {
setUsers = append(setUsers, origUsers...)
}
if tt.args.addToOrigGrps {
setGrps = append(setGrps, origGrps...)
}
got, affectedRows, err := repo.SetPrincipalRoles(context.Background(), tt.args.role.PublicId, tt.args.roleVersion, setUsers, setGrps, tt.args.opt...)
if tt.wantErr {
require.Error(err)
return
}
require.NoError(err)
assert.Equal(tt.wantAffectedRows, affectedRows)
var gotIds []string
for _, r := range got {
gotIds = append(gotIds, r.GetPrincipalId())
}
var wantIds []string
wantIds = append(wantIds, tt.args.userIds...)
wantIds = append(wantIds, tt.args.groupIds...)
sort.Strings(wantIds)
sort.Strings(gotIds)
assert.Equal(wantIds, wantIds)
})
}
}
func TestRepository_principalsToSet(t *testing.T) {
t.Parallel()
cleanup, conn, _ := db.TestSetup(t, "postgres")
defer func() {
err := cleanup()
assert.NoError(t, err)
err = conn.Close()
assert.NoError(t, err)
}()
rw := db.New(conn)
wrapper := db.TestWrapper(t)
repo, err := NewRepository(rw, rw, wrapper)
require.NoError(t, err)
org, proj := TestScopes(t, conn)
createUsersFn := func() []string {
results := []string{}
for i := 0; i < 5; i++ {
u := TestUser(t, conn, org.PublicId)
results = append(results, u.PublicId)
}
return results
}
createGrpsFn := func() []string {
results := []string{}
for i := 0; i < 5; i++ {
g := TestGroup(t, conn, proj.PublicId)
results = append(results, g.PublicId)
}
return results
}
setupFn := func() (*Role, []string, []string) {
users := createUsersFn()
grps := createGrpsFn()
role := TestRole(t, conn, proj.PublicId)
_, err := repo.AddPrincipalRoles(context.Background(), role.PublicId, 1, users, grps)
require.NoError(t, err)
return role, users, grps
}
type args struct {
userIds []string
groupIds []string
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "all new",
args: args{
userIds: createUsersFn(),
groupIds: createGrpsFn(),
},
wantErr: false,
},
{
name: "clear all",
args: args{
userIds: nil,
groupIds: nil,
},
wantErr: false,
},
{
name: "just new users",
args: args{
userIds: createUsersFn(),
groupIds: nil,
},
wantErr: false,
},
{
name: "just new groups",
args: args{
userIds: nil,
groupIds: createGrpsFn(),
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
require := require.New(t)
r, origUsers, origGrps := setupFn()
got, err := repo.principalsToSet(context.Background(), r, tt.args.userIds, tt.args.groupIds)
if tt.wantErr {
require.Error(err)
return
}
require.NoError(err)
assertSetResults(t, got, tt.args.userIds, tt.args.groupIds, origUsers, origGrps)
})
}
t.Run("nil role", func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
_, users, grps := setupFn()
got, err := repo.principalsToSet(context.Background(), nil, users, grps)
require.Error(err)
assert.Nil(got)
assert.Truef(errors.Is(err, db.ErrNilParameter), "unexpected error %s", err.Error())
})
t.Run("no change", func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
r, users, grps := setupFn()
got, err := repo.principalsToSet(context.Background(), r, users, grps)
require.NoError(err)
assert.Empty(got.addUserRoles)
assert.Empty(got.addGroupRoles)
assert.Empty(got.deleteUserRoles)
assert.Empty(got.deleteGroupRoles)
})
t.Run("mixed", func(t *testing.T) {
require := require.New(t)
r, users, grps := setupFn()
var wantSetUsers, wantSetGrps, wantDeleteUsers, wantDeleteGrps []string
for i, id := range users {
if i < 2 {
wantSetUsers = append(wantSetUsers, id)
} else {
wantDeleteUsers = append(wantDeleteUsers, id)
}
}
for i, id := range grps {
if i < 2 {
wantSetGrps = append(wantSetGrps, id)
} else {
wantDeleteGrps = append(wantDeleteGrps, id)
}
}
newUser := TestUser(t, conn, org.PublicId)
newGrp := TestGroup(t, conn, proj.PublicId)
wantSetUsers = append(wantSetUsers, newUser.PublicId)
wantSetGrps = append(wantSetGrps, newGrp.PublicId)
got, err := repo.principalsToSet(context.Background(), r, wantSetUsers, wantSetGrps)
require.NoError(err)
assertSetResults(t, got, []string{newUser.PublicId}, []string{newGrp.PublicId}, wantDeleteUsers, wantDeleteGrps)
})
}
func assertSetResults(t *testing.T, got *principalSet, wantAddUsers, wantAddGroups, wantDeleteUsers, wantDeleteGroups []string) {
t.Helper()
assert := assert.New(t)
var gotAddUsers []string
for _, r := range got.addUserRoles {
gotAddUsers = append(gotAddUsers, r.(*UserRole).PrincipalId)
}
// sort.Strings(wantAddUsers)
// sort.Strings(gotAddUsers)
assert.Equal(wantAddUsers, gotAddUsers)
var gotAddGrps []string
for _, r := range got.addGroupRoles {
gotAddGrps = append(gotAddGrps, r.(*GroupRole).PrincipalId)
}
// sort.Strings(wantAddGroups)
// sort.Strings(gotAddGrps)
assert.Equal(wantAddGroups, gotAddGrps)
var gotDeleteUsers []string
for _, r := range got.deleteUserRoles {
gotDeleteUsers = append(gotDeleteUsers, r.(*UserRole).PrincipalId)
}
sort.Strings(wantDeleteUsers)
sort.Strings(gotDeleteUsers)
assert.Equal(wantDeleteUsers, gotDeleteUsers)
var gotDeleteGroups []string
for _, r := range got.deleteGroupRoles {
gotDeleteGroups = append(gotDeleteGroups, r.(*GroupRole).PrincipalId)
}
sort.Strings(wantDeleteGroups)
sort.Strings(gotDeleteGroups)
assert.Equal(wantDeleteGroups, gotDeleteGroups)
}

Loading…
Cancel
Save