diff --git a/utils/struct.go b/utils/struct.go index 990a3ac1a..d60c7d161 100644 --- a/utils/struct.go +++ b/utils/struct.go @@ -51,11 +51,16 @@ func MissingMapFields(s map[string]interface{}, mandatories []string) []string { } else { fld := reflect.ValueOf(fldval) // sanitize the string fields before checking - if fld.Kind() == reflect.String && fld.CanSet() { - fld.SetString(strings.TrimSpace(fld.String())) + if fld.Kind() == reflect.String { + str := strings.TrimSpace(fld.String()) + s[fieldName] = str + if len(str) == 0 { + missing = append(missing, fieldName) + } + continue + //fld.SetString(strings.TrimSpace(fld.String())) } - if (fld.Kind() == reflect.String && fld.String() == "") || - ((fld.Kind() == reflect.Slice || fld.Kind() == reflect.Map) && fld.Len() == 0) || + if ((fld.Kind() == reflect.Slice || fld.Kind() == reflect.Map) && fld.Len() == 0) || (fld.Kind() == reflect.Int && fld.Int() == 0) { missing = append(missing, fieldName) } diff --git a/utils/struct_test.go b/utils/struct_test.go index 993af8e8b..e0b919624 100644 --- a/utils/struct_test.go +++ b/utils/struct_test.go @@ -18,6 +18,7 @@ along with this program. If not, see package utils import ( + "math/cmplx" "reflect" "sort" "testing" @@ -99,3 +100,139 @@ func TestMissingMapFields(t *testing.T) { t.Errorf("Expected %s ,received: %s", expected, missing) } } + +func TestMissingStructFieldsAppend(t *testing.T) { + var attr = struct { + Tenant string + Account string + Type string + ActionTimingsID string + }{"", "", META_PREPAID, ""} + missing := MissingStructFields(&attr, + []string{"Tenant", "Account", "Type", "ActionTimingsID"}) + if len(missing) == 0 { + t.Error("Required missing field not found") + } +} + +func TestMissingMapFieldsTrim(t *testing.T) { + var attr = map[string]interface{}{ + "Tenant": "cgrates.org", + "Account": "1001", + } + if missing := MissingMapFields(attr, + []string{"Tenant", "Account"}); len(missing) != 0 { + t.Error("Found missing field on correct struct", missing) + } +} + +func TestMissingMapFieldsMissing(t *testing.T) { + var attr = map[string]interface{}{ + "Tenant": 0, + "Account": 0, + } + missing := MissingMapFields(attr, []string{"Tenant", "Account"}) + if len(missing) == 0 { + t.Error("Required missing field not found") + } +} + +func TestUpdateStructWithIfaceMapValEmpty(t *testing.T) { + type myStruct struct { + String string + Bool bool + Float float64 + Int int64 + } + s := new(myStruct) + mp := map[string]interface{}{ + "String": "", + "Bool": "", + "Float": "", + "Int": "", + } + expectedStruct := &myStruct{ + String: "", + Bool: false, + Float: 0, + Int: 0, + } + UpdateStructWithIfaceMap(s, mp) + if !reflect.DeepEqual(s, expectedStruct) { + t.Errorf("Expected <%+v> ,received: <%+v>", expectedStruct, s) + } +} + +func TestUpdateStructWithIfaceMapErrorBol(t *testing.T) { + type myStruct struct { + String string + Bool bool + Float float64 + Int int64 + } + s := new(myStruct) + mp := map[string]interface{}{ + "String": "string", + "Bool": "cat", + "Float": 1.2, + "Int": 1, + } + err := UpdateStructWithIfaceMap(s, mp) + if err == nil || err.Error() != "strconv.ParseBool: parsing \"cat\": invalid syntax" { + t.Errorf("Expected ,received: <%+v>", err) + } +} + +func TestUpdateStructWithIfaceMapErrorInt(t *testing.T) { + type myStruct struct { + String string + Bool bool + Float float64 + Int int64 + } + s := new(myStruct) + mp := map[string]interface{}{ + "String": "string", + "Bool": true, + "Float": 1.2, + "Int": "cat", + } + err := UpdateStructWithIfaceMap(s, mp) + if err == nil || err.Error() != "strconv.ParseInt: parsing \"cat\": invalid syntax" { + t.Errorf("Expected ,received: <%+v>", err) + } +} + +func TestUpdateStructWithIfaceMapErrorFloat(t *testing.T) { + type myStruct struct { + String string + Bool bool + Float float64 + Int int64 + } + s := new(myStruct) + mp := map[string]interface{}{ + "String": "string", + "Bool": true, + "Float": "cat", + "Int": 2, + } + err := UpdateStructWithIfaceMap(s, mp) + if err == nil || err.Error() != "strconv.ParseFloat: parsing \"cat\": invalid syntax" { + t.Errorf("Expected ,received: <%+v>", err) + } +} + +func TestUpdateStructWithIfaceMapErrorDefault(t *testing.T) { + type myStruct struct { + wrongField1 complex128 + } + s := new(myStruct) + mp := map[string]interface{}{ + "wrongField1": cmplx.Sqrt(-5 + 12i), + } + err := UpdateStructWithIfaceMap(s, mp) + if err == nil || err.Error() != "cannot update unsupported struct field: (0+0i)" { + t.Errorf("Expected ,received: <%+v>", err) + } +}