You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
boundary/internal/db/common/update_test.go

420 lines
8.8 KiB

package common
import (
"testing"
"github.com/hashicorp/go-uuid"
"github.com/hashicorp/vault/sdk/helper/base62"
"github.com/hashicorp/watchtower/internal/db/db_test"
"github.com/jinzhu/gorm"
"github.com/stretchr/testify/assert"
)
func Test_intersection(t *testing.T) {
type args struct {
av []string
bv []string
}
tests := []struct {
name string
args args
want []string
want1 map[string]string
want2 map[string]string
wantErr bool
wantErrMsg string
}{
{
name: "intersect",
args: args{
av: []string{"alice"},
bv: []string{"alice", "bob"},
},
want: []string{"alice"},
want1: map[string]string{
"ALICE": "alice",
},
want2: map[string]string{
"ALICE": "alice",
"BOB": "bob",
},
},
{
name: "intersect-2",
args: args{
av: []string{"alice", "bob", "jane", "doe"},
bv: []string{"alice", "doe", "bert", "ernie", "bigbird"},
},
want: []string{"alice", "doe"},
want1: map[string]string{
"ALICE": "alice",
"BOB": "bob",
"JANE": "jane",
"DOE": "doe",
},
want2: map[string]string{
"ALICE": "alice",
"DOE": "doe",
"BERT": "bert",
"ERNIE": "ernie",
"BIGBIRD": "bigbird",
},
},
{
name: "intersect-mixed-case",
args: args{
av: []string{"AlicE"},
bv: []string{"alICe", "Bob"},
},
want: []string{"alice"},
want1: map[string]string{
"ALICE": "AlicE",
},
want2: map[string]string{
"ALICE": "alICe",
"BOB": "Bob",
},
},
{
name: "no-intersect-mixed-case",
args: args{
av: []string{"AliCe", "BOb", "jaNe", "DOE"},
bv: []string{"beRt", "ERnie", "bigBIRD"},
},
want: []string{},
want1: map[string]string{
"ALICE": "AliCe",
"BOB": "BOb",
"JANE": "jaNe",
"DOE": "DOE",
},
want2: map[string]string{
"BERT": "beRt",
"ERNIE": "ERnie",
"BIGBIRD": "bigBIRD",
},
},
{
name: "no-intersect-1",
args: args{
av: []string{"alice", "bob", "jane", "doe"},
bv: []string{"bert", "ernie", "bigbird"},
},
want: []string{},
want1: map[string]string{
"ALICE": "alice",
"BOB": "bob",
"JANE": "jane",
"DOE": "doe",
},
want2: map[string]string{
"BERT": "bert",
"ERNIE": "ernie",
"BIGBIRD": "bigbird",
},
},
{
name: "empty-av",
args: args{
av: []string{},
bv: []string{"bert", "ernie", "bigbird"},
},
want: []string{},
want1: map[string]string{},
want2: map[string]string{
"BERT": "bert",
"ERNIE": "ernie",
"BIGBIRD": "bigbird",
},
},
{
name: "empty-av-and-bv",
args: args{
av: []string{},
bv: []string{},
},
want: []string{},
want1: map[string]string{},
want2: map[string]string{},
},
{
name: "nil-av",
args: args{
av: nil,
bv: []string{"bert", "ernie", "bigbird"},
},
want: nil,
want1: nil,
want2: nil,
wantErr: true,
wantErrMsg: "av is missing: nil parameter",
},
{
name: "nil-bv",
args: args{
av: []string{},
bv: nil,
},
want: nil,
want1: nil,
want2: nil,
wantErr: true,
wantErrMsg: "bv is missing: nil parameter",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert := assert.New(t)
got, got1, got2, err := Intersection(tt.args.av, tt.args.bv)
if err == nil && tt.wantErr {
assert.Error(err)
}
if tt.wantErr {
assert.Error(err)
assert.Equal(tt.wantErrMsg, err.Error())
}
assert.Equal(tt.want, got)
assert.Equal(tt.want1, got1)
assert.Equal(tt.want2, got2)
})
}
}
func TestUpdateFields(t *testing.T) {
a := assert.New(t)
id, err := uuid.GenerateUUID()
a.NoError(err)
type args struct {
i interface{}
fieldMaskPaths []string
setToNullPaths []string
}
tests := []struct {
name string
args args
want map[string]interface{}
wantErr bool
wantErrMsg string
}{
{
name: "missing interface",
args: args{
i: nil,
fieldMaskPaths: []string{},
setToNullPaths: []string{},
},
want: nil,
wantErr: true,
wantErrMsg: "interface is missing: nil parameter",
},
{
name: "missing fieldmasks",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: nil,
setToNullPaths: []string{},
},
want: nil,
wantErr: true,
wantErrMsg: "both fieldMaskPaths and setToNullPaths are zero len",
},
{
name: "missing null fields",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{"Name"},
setToNullPaths: nil,
},
want: map[string]interface{}{
"Name": id,
},
wantErr: false,
},
{
name: "all zero len",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{},
setToNullPaths: nil,
},
wantErr: true,
wantErrMsg: "both fieldMaskPaths and setToNullPaths are zero len",
},
{
name: "not found masks",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{"invalidFieldName"},
setToNullPaths: []string{},
},
want: nil,
wantErr: true,
wantErrMsg: "field mask paths not found in resource: [invalidFieldName]",
},
{
name: "not found null paths",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{"name"},
setToNullPaths: []string{"invalidFieldName"},
},
want: nil,
wantErr: true,
wantErrMsg: "null paths not found in resource: [invalidFieldName]",
},
{
name: "intersection",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{"name"},
setToNullPaths: []string{"name"},
},
want: nil,
wantErr: true,
wantErrMsg: "fieldMashPaths and setToNullPaths cannot intersect",
},
{
name: "valid",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{"name"},
setToNullPaths: []string{"email"},
},
want: map[string]interface{}{
"name": id,
"email": gorm.Expr("NULL"),
},
wantErr: false,
wantErrMsg: "",
},
{
name: "valid-just-masks",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{"name", "email"},
setToNullPaths: []string{},
},
want: map[string]interface{}{
"name": id,
"email": id,
},
wantErr: false,
wantErrMsg: "",
},
{
name: "valid-just-nulls",
args: args{
i: testUser(t, id, id),
fieldMaskPaths: []string{},
setToNullPaths: []string{"name", "email"},
},
want: map[string]interface{}{
"name": gorm.Expr("NULL"),
"email": gorm.Expr("NULL"),
},
wantErr: false,
wantErrMsg: "",
},
{
name: "valid-not-embedded",
args: args{
i: db_test.StoreTestUser{
PublicId: testPublicId(t),
Name: id,
Email: "",
},
fieldMaskPaths: []string{"name"},
setToNullPaths: []string{"email"},
},
want: map[string]interface{}{
"name": id,
"email": gorm.Expr("NULL"),
},
wantErr: false,
wantErrMsg: "",
},
{
name: "valid-not-embedded-just-masks",
args: args{
i: db_test.StoreTestUser{
PublicId: testPublicId(t),
Name: id,
Email: "",
},
fieldMaskPaths: []string{"name"},
setToNullPaths: nil,
},
want: map[string]interface{}{
"name": id,
},
wantErr: false,
wantErrMsg: "",
},
{
name: "valid-not-embedded-just-nulls",
args: args{
i: db_test.StoreTestUser{
PublicId: testPublicId(t),
Name: id,
Email: "",
},
fieldMaskPaths: nil,
setToNullPaths: []string{"email"},
},
want: map[string]interface{}{
"email": gorm.Expr("NULL"),
},
wantErr: false,
wantErrMsg: "",
},
{
name: "not found null paths - not embedded",
args: args{
i: db_test.StoreTestUser{
PublicId: testPublicId(t),
Name: id,
Email: "",
},
fieldMaskPaths: []string{"name"},
setToNullPaths: []string{"invalidFieldName"},
},
want: nil,
wantErr: true,
wantErrMsg: "null paths not found in resource: [invalidFieldName]",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
assert := assert.New(t)
got, err := UpdateFields(tt.args.i, tt.args.fieldMaskPaths, tt.args.setToNullPaths)
if err == nil && tt.wantErr {
assert.Error(err)
}
if tt.wantErr {
assert.Error(err)
assert.Equal(tt.wantErrMsg, err.Error())
}
assert.Equal(tt.want, got)
})
}
}
func testUser(t *testing.T, name, email string) *db_test.TestUser {
t.Helper()
return &db_test.TestUser{
StoreTestUser: &db_test.StoreTestUser{
PublicId: testPublicId(t),
Name: name,
Email: email,
},
}
}
func testPublicId(t *testing.T) string {
t.Helper()
publicId, err := base62.Random(20)
assert.NoError(t, err)
return publicId
}