diff --git a/config/erscfg_test.go b/config/erscfg_test.go
index 91eb254f9..3442296c3 100644
--- a/config/erscfg_test.go
+++ b/config/erscfg_test.go
@@ -1006,7 +1006,7 @@ func TestERSCfgAsMapInterfaceCase2(t *testing.T) {
"natsClientCertificateProcessed":"ClientCertificate",
"natsClientKeyProcessed":"ClientKey",
"natsJetStreamMaxWaitProcessed":"1m",
-
+
},
},
],
diff --git a/engine/account_test.go b/engine/account_test.go
index df0541c53..2291b181e 100644
--- a/engine/account_test.go
+++ b/engine/account_test.go
@@ -18,6 +18,7 @@ along with this program. If not, see
package engine
import (
+ "encoding/json"
"reflect"
"testing"
"time"
@@ -2419,3 +2420,195 @@ func BenchmarkGetSecondsForPrefix(b *testing.B) {
ub1.getCreditForPrefix(cd)
}
}
+
+func TestAccountSummaryFieldAsInterface(t *testing.T) {
+ as := AccountSummary{
+ BalanceSummaries: BalanceSummaries{
+ &BalanceSummary{
+ UUID: "uId",
+ ID: "id",
+ Type: "*data",
+ Initial: 20.54,
+ Value: 1,
+ }},
+ Tenant: "tenant",
+ ID: "accID",
+ }
+
+ if _, err := as.FieldAsInterface(nil); err == nil {
+ t.Error(err)
+ } else if _, err := as.FieldAsInterface([]string{"test"}); err == nil {
+ t.Error(err)
+ }
+ if val, err := as.FieldAsInterface([]string{"BalanceSummaries[0]"}); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, as.BalanceSummaries[0]) {
+ t.Errorf("expected %v ,received %v", utils.ToJSON(val), utils.ToJSON(as.BalanceSummaries[0]))
+ } else if _, err = as.FieldAsInterface([]string{"Tenant"}); err != nil {
+ t.Error(err)
+ } else if _, err = as.FieldAsInterface([]string{"Tenant", "Value"}); err == nil {
+ t.Error(err)
+ } else if _, err = as.FieldAsInterface([]string{"ID"}); err != nil {
+ t.Error(err)
+ } else if _, err = as.FieldAsInterface([]string{"ID", "test"}); err == nil {
+ t.Error(err)
+ }
+ if val, err := as.FieldAsInterface([]string{"BalanceSummaries"}); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, as.BalanceSummaries) {
+ t.Errorf("expected %v ,received %v ", utils.ToJSON(val), utils.ToJSON(as.BalanceSummaries))
+ }
+ as.BalanceSummaries = BalanceSummaries{
+ &BalanceSummary{
+
+ UUID: "uId",
+ ID: "id",
+ Type: "*data",
+ Initial: 20.54,
+ Value: 1,
+ },
+ &BalanceSummary{
+ UUID: "uId2",
+ ID: "id2",
+ Type: "*data",
+ Initial: 20.54,
+ Value: 1,
+ }}
+ if _, err := as.FieldAsInterface([]string{"BalanceSummaries", "id3"}); err == nil {
+ t.Error(err)
+
+ } else if val, err := as.FieldAsInterface([]string{"BalanceSummaries", "id2"}); err != nil {
+ t.Error(err)
+
+ } else if !reflect.DeepEqual(val, as.BalanceSummaries[1]) {
+ t.Errorf("expected %v ,received %v", utils.ToJSON(val), utils.ToJSON(as.BalanceSummaries[1]))
+ }
+ if _, err = as.FieldAsInterface([]string{"AllowNegative"}); err != nil {
+ t.Error(err)
+ } else if _, err = as.FieldAsInterface([]string{"AllowNegative", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = as.FieldAsInterface([]string{"Disabled"}); err != nil {
+ t.Error(err)
+ } else if _, err = as.FieldAsInterface([]string{"Disabled", "test"}); err == nil {
+ t.Error(err)
+ }
+
+}
+
+func TestAccountSummaryFieldAsString(t *testing.T) {
+ as := AccountSummary{
+ BalanceSummaries: BalanceSummaries{
+ &BalanceSummary{
+ UUID: "uId",
+ ID: "id",
+ Type: "*data",
+ Initial: 20.54,
+ Value: 1,
+ }},
+ }
+ rec := &BalanceSummary{}
+ if _, err := as.FieldAsString([]string{}); err == nil {
+ t.Error(err)
+ }
+ if val, err := as.FieldAsString([]string{"BalanceSummaries[0]"}); err != nil {
+ t.Error(err)
+ } else if err := json.Unmarshal([]byte(val), rec); err != nil {
+ t.Error("Error converting value")
+ } else if !reflect.DeepEqual(rec, as.BalanceSummaries[0]) {
+ t.Errorf("expected %v ,received %v", utils.ToJSON(as.BalanceSummaries[0]), utils.ToJSON(rec))
+ }
+
+}
+func TestAccountFieldAsInterface(t *testing.T) {
+ var acc *Account
+ if _, err := acc.FieldAsInterface([]string{}); err != nil {
+ t.Error(err)
+ } else if _, err := acc.FieldAsInterface([]string{"test"}); err == nil {
+ t.Error(err)
+ }
+ acc = &Account{
+ ID: "id",
+ BalanceMap: map[string]Balances{
+ "first": {
+ &Balance{
+ Uuid: "uuid1",
+ ID: "id",
+ Value: 20.44,
+ },
+ &Balance{
+ Uuid: "uuid2",
+ ID: "id2",
+ Value: 12.2,
+ },
+ }},
+ UnitCounters: UnitCounters{
+ "first": []*UnitCounter{
+ {
+ CounterType: "balance",
+ Counters: CounterFilters{
+ {
+ Value: 20.44,
+ Filter: &BalanceFilter{
+ Uuid: utils.StringPointer("filterUuid"),
+ ID: utils.StringPointer("filterId"),
+ Type: utils.StringPointer("type"),
+ },
+ },
+ },
+ }}},
+ ActionTriggers: ActionTriggers{
+ {
+ UniqueID: "uniId",
+ ID: "id",
+ ThresholdType: "*min_event_counter",
+ ThresholdValue: 20.55,
+ },
+ {
+ UniqueID: "uniId2",
+ ID: "id2",
+ ThresholdType: "*max_event_counter",
+ ThresholdValue: 19.22,
+ Recurrent: true,
+ },
+ },
+ }
+ if _, err := acc.FieldAsInterface([]string{"Balance"}); err == nil {
+ t.Error(err)
+ } else if _, err = acc.FieldAsInterface([]string{"BalanceMap[second]"}); err == nil {
+ t.Error(err)
+ } else if val, err := acc.FieldAsInterface([]string{"BalanceMap[first]"}); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(acc.BalanceMap["first"], val) {
+ t.Errorf("expected %v ,received %v", utils.ToJSON(val), utils.ToJSON(acc.BalanceMap["first"]))
+ } else if _, err := acc.FieldAsInterface([]string{"BalanceMap[first]", "UnitCounters[test]"}); err == nil {
+ t.Error(err)
+ } else if _, err := acc.FieldAsInterface([]string{"UnitCounters[test]"}); err == nil {
+ t.Error(err)
+ } else if val, err := acc.FieldAsInterface([]string{"UnitCounters[first]"}); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, acc.UnitCounters["first"]) {
+ t.Errorf("expected %v ,received %v", val, acc.UnitCounters["first"])
+ }
+ if _, err := acc.FieldAsInterface([]string{"ActionTriggers[3]"}); err == nil {
+ t.Error(err)
+ } else if _, err := acc.FieldAsInterface([]string{"ActionTriggers[three]"}); err == nil {
+ t.Error(err)
+ } else if val, err := acc.FieldAsInterface([]string{"ActionTriggers[0]"}); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, acc.ActionTriggers[0]) {
+ t.Errorf("expected %v ,received %v", utils.ToJSON(acc.ActionTriggers[0]), utils.ToJSON(val))
+ } else if _, err = acc.FieldAsInterface([]string{"ActionTriggers[0]", "test"}); err == nil {
+ t.Error(err)
+ }
+
+ if _, err := acc.FieldAsInterface([]string{"ID"}); err != nil {
+ t.Error(err)
+ } else if _, err = acc.FieldAsInterface([]string{"ID", "test"}); err == nil {
+ t.Error(err)
+ }
+ if _, err := acc.FieldAsInterface([]string{"BalanceMap"}); err != nil {
+ t.Error(err)
+ } else if _, err = acc.FieldAsInterface([]string{"BalanceMap", "first[0]"}); err != nil {
+ t.Error(err)
+ }
+}
diff --git a/engine/action_trigger_test.go b/engine/action_trigger_test.go
index f03185f0c..dcb7068c3 100644
--- a/engine/action_trigger_test.go
+++ b/engine/action_trigger_test.go
@@ -116,3 +116,100 @@ func TestActionTriggersClone(t *testing.T) {
}
}
+
+func TestActionTriggerFieldAsInterface(t *testing.T) {
+ at := &ActionTrigger{}
+ if _, err := at.FieldAsInterface([]string{}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"test"}); err == nil {
+ t.Error(err)
+ }
+ at = &ActionTrigger{
+ ID: "id",
+ UniqueID: "unId",
+ ThresholdType: "*max_balance_counter",
+ ThresholdValue: 16.1,
+ Recurrent: true,
+ MinSleep: 1 * time.Second,
+ ExpirationDate: time.Date(2023, 02, 22, 1, 0, 0, 0, time.UTC),
+ ActivationDate: time.Date(2022, 02, 22, 1, 0, 0, 0, time.UTC),
+ Balance: &BalanceFilter{},
+ Weight: 1.02,
+ ActionsID: "acID",
+ MinQueuedItems: 5,
+ Executed: true,
+ LastExecutionTime: time.Date(2022, 2, 22, 1, 0, 0, 0, time.UTC),
+ }
+ if _, err := at.FieldAsInterface([]string{"ID"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ID", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"UniqueID"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"UniqueID", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ThresholdType"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ThresholdType", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ThresholdValue"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ThresholdValue", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Recurrent"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Recurrent", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"MinSleep"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"MinSleep", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ExpirationDate"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ExpirationDate", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ActivationDate"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ActivationDate", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Balance"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Balance", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Weight"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Weight", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ActionsID"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"ActionsID", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"MinQueuedItems"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"MinQueuedItems", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Executed"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"Executed", "test"}); err == nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"LastExecutionTime"}); err != nil {
+ t.Error(err)
+ } else if _, err = at.FieldAsInterface([]string{"LastExecutionTime", "test"}); err == nil {
+ t.Error(err)
+ }
+
+}
+
+func TestActionTriggerFieldAsString(t *testing.T) {
+ at := &ActionTrigger{
+ ThresholdValue: 2.6,
+ }
+ if _, err := at.FieldAsString([]string{}); err == nil {
+ t.Error(err)
+ } else if val, err := at.FieldAsString([]string{"ThresholdValue"}); err != nil {
+ t.Error(err)
+ } else if val != "2.6" {
+ t.Errorf("received %v", val)
+ }
+
+}
diff --git a/engine/calldesc_test.go b/engine/calldesc_test.go
index 37c5c9f5e..6f4712304 100644
--- a/engine/calldesc_test.go
+++ b/engine/calldesc_test.go
@@ -1868,6 +1868,9 @@ func TestCallDescriptorUpdateFromCGREvent(t *testing.T) {
TimeStart: time.Date(2015, 3, 23, 6, 0, 0, 0, time.UTC),
TimeEnd: time.Date(2015, 3, 23, 6, 30, 0, 0, time.UTC),
MaxCostSoFar: 0,
+ ExtraFields: map[string]string{
+ "Extra": "Value",
+ },
}
cdExpected := &CallDescriptor{
Category: "call",
@@ -1878,8 +1881,11 @@ func TestCallDescriptorUpdateFromCGREvent(t *testing.T) {
TimeStart: time.Date(2015, 3, 23, 6, 0, 0, 0, time.UTC),
TimeEnd: time.Date(2015, 3, 23, 6, 30, 0, 0, time.UTC),
MaxCostSoFar: 0,
+ ExtraFields: map[string]string{
+ "Extra": "Value",
+ },
}
- if err := cd.UpdateFromCGREvent(cgrEv, []string{utils.AccountField, utils.Subject}); err != nil {
+ if err := cd.UpdateFromCGREvent(cgrEv, []string{utils.Usage, utils.AnswerTime, utils.Destination, utils.Category, utils.ToR, utils.Tenant, utils.AccountField, utils.Subject}); err != nil {
t.Error(err)
} else {
if !reflect.DeepEqual(cd, cdExpected) {
@@ -1907,6 +1913,24 @@ func TestCallDescriptorUpdateFromCGREvent(t *testing.T) {
t.Errorf("Expecting: %+v, received: %+v", cdExpected, cd)
}
}
+ cgrEv = &utils.CGREvent{}
+ if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.Usage}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.AnswerTime}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.Destination}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.Category}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.ToR}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.Tenant}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.AccountField}); err == nil {
+ t.Error(err)
+ } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.Subject}); err == nil {
+ t.Error(err)
+ }
}
@@ -2478,3 +2502,24 @@ func TestCDRefundIncrementspanic(t *testing.T) {
t.Error("Error refunding money: ", utils.ToIJSON(ub.BalanceMap))
}
}
+func TestValidateCallData(t *testing.T) {
+
+ cd := &CallDescriptor{
+
+ TimeStart: time.Date(2022, 07, 02, 20, 0, 0, 0, time.UTC),
+ TimeEnd: time.Date(2022, 07, 02, 20, 0, 0, 0, time.UTC),
+ }
+ if err := cd.ValidateCallData(); err == nil {
+ t.Error(err)
+ }
+ cd.TimeEnd = time.Date(2022, 07, 02, 21, 0, 0, 0, time.UTC)
+ cd.DurationIndex = 62 * time.Minute
+ if err := cd.ValidateCallData(); err == nil {
+ t.Error(err)
+ }
+ cd.DurationIndex = 60 * time.Minute
+ if err = cd.ValidateCallData(); err != nil {
+ t.Error(err)
+ }
+
+}
diff --git a/engine/rateinterval_test.go b/engine/rateinterval_test.go
index d44776e09..da62f9d98 100644
--- a/engine/rateinterval_test.go
+++ b/engine/rateinterval_test.go
@@ -814,3 +814,11 @@ func TestRGRateCloneNil(t *testing.T) {
t.Errorf("\nExpecting: ,\n Received: <%+v>", result)
}
}
+
+func RITimingAsFieldInterface(t *testing.T) {
+ ri := &RateInterval{}
+ if _, err := ri.Timing.FieldAsInterface([]string{}); err == nil {
+ t.Error(err)
+ }
+
+}
diff --git a/engine/units_counter_test.go b/engine/units_counter_test.go
index 9e3b37732..dc28a000e 100644
--- a/engine/units_counter_test.go
+++ b/engine/units_counter_test.go
@@ -901,9 +901,51 @@ func TestUnitCounterFieldAsString(t *testing.T) {
Weight: utils.Float64Pointer(15),
}}},
}
- if _, err := uc.FieldAsString(fldPath); err == nil {
+ if _, err := uc.FieldAsString(fldPath); err == nil || err != utils.ErrNotFound {
t.Error(err)
} else if _, err := uc.FieldAsString([]string{utils.Counters}); err != nil {
t.Error(err)
}
}
+
+func TestUnitCounterFilterFieldAsInterFace(t *testing.T) {
+ cfs := &CounterFilter{
+ Value: 2.3,
+ Filter: &BalanceFilter{
+ ID: utils.StringPointer("testID2"),
+ Type: utils.StringPointer("kind"),
+ Weight: utils.Float64Pointer(15),
+ }}
+ if _, err := cfs.FieldAsInterface([]string{}); err == nil {
+ t.Error(err)
+ } else if _, err = cfs.FieldAsInterface([]string{"test"}); err == nil {
+ t.Error(err)
+ } else if _, err = cfs.FieldAsInterface([]string{utils.Value}); err != nil {
+ t.Error(err)
+ } else if _, err = cfs.FieldAsInterface([]string{utils.Value, "test"}); err == nil {
+ t.Error(err)
+ } else if val, err := cfs.FieldAsInterface([]string{utils.Filter}); err != nil {
+ t.Error(err)
+ } else if !reflect.DeepEqual(val, cfs.Filter) {
+ t.Errorf("expected %v ,received %v", utils.ToJSON(cfs.Filter), utils.ToJSON(val))
+ } else if _, err = cfs.FieldAsInterface([]string{utils.Filter, "test"}); err == nil {
+ t.Error(err)
+ }
+}
+
+func TestUnitCounterFilterFieldAsString(t *testing.T) {
+ cfs := &CounterFilter{
+ Value: 2.3,
+ Filter: &BalanceFilter{
+ ID: utils.StringPointer("testID2"),
+ Type: utils.StringPointer("kind"),
+ Weight: utils.Float64Pointer(15),
+ },
+ }
+ if _, err := cfs.FieldAsString([]string{}); err == nil {
+ t.Error(err)
+ } else if _, err = cfs.FieldAsString([]string{utils.Value}); err != nil {
+ t.Error(err)
+ }
+
+}
diff --git a/utils/reflect.go b/utils/reflect.go
index 8751a1181..5dcec2bd5 100644
--- a/utils/reflect.go
+++ b/utils/reflect.go
@@ -678,9 +678,6 @@ func Difference(tm string, items ...interface{}) (diff interface{}, err error) {
}
items[i] = diff
return Difference(tm, items[i:]...)
- } else {
-
- fmt.Println(err)
}
if itmVal, err := IfaceAsDuration(item); err != nil {