From 58f5b1b1f379c66cc3e68f6acd1acf4d95aa74a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Treter?= Date: Thu, 25 Feb 2021 10:16:38 +0100 Subject: [PATCH 1/3] Fix accessing fields in composed structs --- validator_instance.go | 5 ++++- validator_test.go | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/validator_instance.go b/validator_instance.go index fe6a48775..21668f952 100644 --- a/validator_instance.go +++ b/validator_instance.go @@ -409,7 +409,10 @@ func (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields . if len(flds) > 0 { vd.misc = append(vd.misc[0:0], name...) - vd.misc = append(vd.misc, '.') + // Don't append empty name for composed structs + if string(vd.misc) != "" { + vd.misc = append(vd.misc, '.') + } for _, s := range flds { diff --git a/validator_test.go b/validator_test.go index 683a2dddb..ba9c62d56 100644 --- a/validator_test.go +++ b/validator_test.go @@ -949,6 +949,28 @@ func TestStructPartial(t *testing.T) { NotEqual(t, errs, nil) AssertError(t, errs, "TestPartial.Anonymous.SubAnonStruct[0].Test", "TestPartial.Anonymous.SubAnonStruct[0].Test", "Test", "Test", "required") + // Test for composed struct + testStruct := &TestStruct{ + String: "test", + } + composedStruct := struct{ *TestStruct }{&TestStruct{String: "test"}} + + errs = validate.StructPartial(testStruct, "String") + Equal(t, errs, nil) + + errs = validate.StructPartial(composedStruct, "TestStruct.String") + Equal(t, errs, nil) + + testStruct.String = "" + + errs = validate.StructPartial(testStruct, "String") + NotEqual(t, errs, nil) + AssertError(t, errs, "TestStruct.String", "TestStruct.String", "String", "String", "required") + + composedStruct.String = "" + errs = validate.StructPartial(composedStruct, "TestStruct.String") + NotEqual(t, errs, nil) + AssertError(t, errs, "TestStruct.String", "TestStruct.String", "String", "String", "required") } func TestCrossStructLteFieldValidation(t *testing.T) { From c12569bdf9ec6c464e37f7c8ca39d9c3b050f927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Treter?= Date: Thu, 25 Feb 2021 21:43:55 +0100 Subject: [PATCH 2/3] Don't allocate additional memory in order to check if array is empty --- validator_instance.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/validator_instance.go b/validator_instance.go index 21668f952..7584584fb 100644 --- a/validator_instance.go +++ b/validator_instance.go @@ -409,8 +409,8 @@ func (v *Validate) StructPartialCtx(ctx context.Context, s interface{}, fields . if len(flds) > 0 { vd.misc = append(vd.misc[0:0], name...) - // Don't append empty name for composed structs - if string(vd.misc) != "" { + // Don't append empty name for unnamed structs + if len(vd.misc) != 0 { vd.misc = append(vd.misc, '.') } From d6c143c2ebd3db865b64d64ff76048ba7678a215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Treter?= Date: Thu, 25 Feb 2021 21:44:55 +0100 Subject: [PATCH 3/3] Change test description and add test for unnamed struct --- validator_test.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/validator_test.go b/validator_test.go index ba9c62d56..c98b98d6a 100644 --- a/validator_test.go +++ b/validator_test.go @@ -949,26 +949,36 @@ func TestStructPartial(t *testing.T) { NotEqual(t, errs, nil) AssertError(t, errs, "TestPartial.Anonymous.SubAnonStruct[0].Test", "TestPartial.Anonymous.SubAnonStruct[0].Test", "Test", "Test", "required") - // Test for composed struct + // Test for unnamed struct testStruct := &TestStruct{ String: "test", } - composedStruct := struct{ *TestStruct }{&TestStruct{String: "test"}} + unnamedStruct := struct { + String string `validate:"required" json:"StringVal"` + }{String: "test"} + composedUnnamedStruct := struct{ *TestStruct }{&TestStruct{String: "test"}} errs = validate.StructPartial(testStruct, "String") Equal(t, errs, nil) - errs = validate.StructPartial(composedStruct, "TestStruct.String") + errs = validate.StructPartial(unnamedStruct, "String") Equal(t, errs, nil) - testStruct.String = "" + errs = validate.StructPartial(composedUnnamedStruct, "TestStruct.String") + Equal(t, errs, nil) + testStruct.String = "" errs = validate.StructPartial(testStruct, "String") NotEqual(t, errs, nil) AssertError(t, errs, "TestStruct.String", "TestStruct.String", "String", "String", "required") - composedStruct.String = "" - errs = validate.StructPartial(composedStruct, "TestStruct.String") + unnamedStruct.String = "" + errs = validate.StructPartial(unnamedStruct, "String") + NotEqual(t, errs, nil) + AssertError(t, errs, "String", "String", "String", "String", "required") + + composedUnnamedStruct.String = "" + errs = validate.StructPartial(composedUnnamedStruct, "TestStruct.String") NotEqual(t, errs, nil) AssertError(t, errs, "TestStruct.String", "TestStruct.String", "String", "String", "required") }