diff --git a/config/objdp.go b/config/objdp.go index c8c43d187..3e19f002a 100644 --- a/config/objdp.go +++ b/config/objdp.go @@ -28,7 +28,10 @@ import ( //NewObjectDP constructs a utils.DataProvider func NewObjectDP(obj interface{}) (dP utils.DataProvider) { - dP = &ObjectDP{obj: obj, cache: make(map[string]interface{})} + dP = &ObjectDP{ + obj: obj, + cache: make(map[string]interface{}), + } return } diff --git a/config/objdp_test.go b/config/objdp_test.go new file mode 100644 index 000000000..b8c91d438 --- /dev/null +++ b/config/objdp_test.go @@ -0,0 +1,192 @@ +/* +Real-time Online/Offline Charging System (OCS) for Telecom & ISP environments +Copyright (C) ITsysCOM GmbH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package config + +import ( + "reflect" + "testing" + + "github.com/cgrates/cgrates/utils" +) + +func TestNewObjectDP(t *testing.T) { + object := "cgrates.org" + objDp := &ObjectDP{ + obj: "cgrates.org", + cache: make(map[string]interface{}), + } + if received := NewObjectDP(object); !reflect.DeepEqual(objDp, received) { + t.Errorf("Expected %+v, received %+v", objDp, received) + } +} + +func TestRemoteHostObjDP(t *testing.T) { + expected := utils.LocalAddr() + objDp := &ObjectDP{ + obj: "cgrates.org", + cache: make(map[string]interface{}), + } + if received := objDp.RemoteHost(); !reflect.DeepEqual(expected, received) { + t.Errorf("Expected %+v, received %+v", expected, received) + } +} + +func TestStringObjDP(t *testing.T) { + objDp := &ObjectDP{ + obj: "cgrates.org", + cache: make(map[string]interface{}), + } + expected := `"cgrates.org"` + if received := objDp.String(); !reflect.DeepEqual(expected, received) { + t.Errorf("Expected %+v, received %+v", expected, received) + } +} + +func TestFieldAsInterfaceObjDPSliceOfInt(t *testing.T) { + object := []string{"1"} + objDp := &ObjectDP{ + obj: []int{12, 13}, + cache: make(map[string]interface{}), + } + expected := 13 + if received, err := objDp.FieldAsInterface(object); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(received, expected) { + t.Errorf("Expected %+v, received %+v", expected, received) + } +} + +func TestFieldAsInterfaceObjDPInvalidSyntax(t *testing.T) { + object := []string{"1]"} + objDp := &ObjectDP{ + obj: []int{12, 13}, + cache: make(map[string]interface{}), + } + expected := "strconv.Atoi: parsing \"1]\": invalid syntax" + if _, err := objDp.FieldAsInterface(object); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } +} + +func TestFieldAsInterfaceObjDPInvalidFormat(t *testing.T) { + object := []string{"invalid[path"} + objDp := &ObjectDP{ + obj: []int{12, 13}, + cache: make(map[string]interface{}), + } + expected := "filter rule needs to end in ]" + if _, err := objDp.FieldAsInterface(object); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } +} + +func TestFieldAsInterfaceObjDPCache(t *testing.T) { + object := []string{"validPath"} + objDp := &ObjectDP{ + cache: map[string]interface{}{ + "validPath": "cgrates.org", + }, + } + expected := "cgrates.org" + if rcv, err := objDp.FieldAsInterface(object); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rcv) { + t.Errorf("Expected %+v, received %+v", expected, rcv) + } +} + +func TestFieldAsInterfaceObjDPChangedObject(t *testing.T) { + object := []string{"0[1]"} + objDp := &ObjectDP{ + obj: []int{1}, + cache: map[string]interface{}{}, + } + expected := "unsupported field kind: int" + if _, err := objDp.FieldAsInterface(object); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } +} + +func TestFieldAsInterfaceObjDPValid1(t *testing.T) { + object := []string{"0[1]"} + objDp := &ObjectDP{ + obj: []map[string]interface{}{ + { + "1": 1, + "2": 2, + }, + }, + cache: map[string]interface{}{}, + } + if rcv, err := objDp.FieldAsInterface(object); err != nil { + t.Error(err) + } else if rcv != 1 { + t.Errorf("Expected %+v, received %+v", 1, rcv) + } +} + +func TestFieldAsStringObjDP(t *testing.T) { + object := []string{"0[1]"} + objDp := &ObjectDP{ + obj: []map[string]interface{}{ + { + "1": 1, + "2": 2, + }, + }, + cache: map[string]interface{}{}, + } + if rcv, err := objDp.FieldAsString(object); err != nil { + t.Error(err) + } else if rcv != "1" { + t.Errorf("Expected %+v, received %+v", 1, rcv) + } +} + +func TestFieldAsStringError(t *testing.T) { + object := []string{"0[1]"} + objDp := &ObjectDP{ + obj: []int{1}, + cache: map[string]interface{}{}, + } + expected := "unsupported field kind: int" + if _, err := objDp.FieldAsString(object); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } +} + +func TestFieldAsInterfaceObjDPMultiplePaths(t *testing.T) { + type aNewStruct struct { + Field1 int + Field2 int + } + objDp := &ObjectDP{ + obj: []aNewStruct{ + { + Field1: 1, + Field2: 2, + }, + }, + cache: map[string]interface{}{}, + } + expected := "unsupported field kind: int" + if _, err := objDp.FieldAsString([]string{"0[Field1]", "a[Field2]"}); err == nil || err.Error() != expected { + t.Errorf("Expected %+v, received %+v", expected, err) + } +}