diff --git a/engine/chargers_test.go b/engine/chargers_test.go index ed744978e..f97f65245 100644 --- a/engine/chargers_test.go +++ b/engine/chargers_test.go @@ -486,3 +486,146 @@ func TestChargerProcessEvent(t *testing.T) { t.Errorf("Expecting: %+v, received: %+v ", utils.ToJSON(rpl[0]), utils.ToJSON(rcv[0])) } } + +func TestChargersmatchingChargerProfilesForEventChargerProfileNotFound(t *testing.T) { + defaultCfg := config.NewDefaultCGRConfig() + defaultCfg.ChargerSCfg().StringIndexedFields = &[]string{ + "string", + } + defaultCfg.ChargerSCfg().PrefixIndexedFields = &[]string{"prefix"} + defaultCfg.ChargerSCfg().SuffixIndexedFields = &[]string{"suffix"} + defaultCfg.ChargerSCfg().IndexedSelects = false + defaultCfg.ChargerSCfg().NestedFields = false + + dataDB := NewInternalDB(nil, nil, true) + dmCharger := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), nil) + cS := &ChargerService{ + dm: dmCharger, + filterS: &FilterS{ + dm: dmCharger, + cfg: defaultCfg, + }, + cfg: defaultCfg, + } + cgrEv := &utils.CGREvent{ + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + ID: "cgrEvID", + Event: map[string]interface{}{ + "Charger": "ChargerProfile1", + utils.AnswerTime: time.Date(2021, 4, 1, 10, 0, 0, 0, time.UTC), + "UsageInterval": "1s", + utils.Weight: "10.0", + }, + APIOpts: map[string]interface{}{ + utils.Subsys: utils.MetaChargers, + }, + } + + experr := utils.ErrNotFound + rcv, err := cS.matchingChargerProfilesForEvent("tnt", cgrEv) + + if err == nil || err != experr { + t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) + } + + if rcv != nil { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) + } +} + +func TestChargersmatchingChargerProfilesForEventDoesNotPass(t *testing.T) { + defaultCfg := config.NewDefaultCGRConfig() + defaultCfg.ChargerSCfg().StringIndexedFields = &[]string{ + "string", + } + defaultCfg.ChargerSCfg().PrefixIndexedFields = &[]string{"prefix"} + defaultCfg.ChargerSCfg().SuffixIndexedFields = &[]string{"suffix"} + defaultCfg.ChargerSCfg().IndexedSelects = false + defaultCfg.ChargerSCfg().NestedFields = false + + dataDB := NewInternalDB(nil, nil, true) + dmCharger := NewDataManager(dataDB, config.CgrConfig().CacheCfg(), nil) + cS := &ChargerService{ + dm: dmCharger, + filterS: &FilterS{ + dm: dmCharger, + cfg: defaultCfg, + }, + cfg: defaultCfg, + } + cgrEv := &utils.CGREvent{ + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + ID: "cgrEvID", + Event: map[string]interface{}{ + "Charger": "ChargerProfile1", + utils.AnswerTime: time.Date(2021, 4, 1, 10, 0, 0, 0, time.UTC), + "UsageInterval": "1s", + utils.Weight: "10.0", + }, + APIOpts: map[string]interface{}{ + utils.Subsys: utils.MetaChargers, + }, + } + + experr := utils.ErrNotFound + rcv, err := cS.matchingChargerProfilesForEvent(cgrEv.Tenant, cgrEv) + + if err == nil || err != experr { + t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) + } + + if rcv != nil { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) + } +} + +func TestChargersmatchingChargerProfilesForEventErrGetChPrf(t *testing.T) { + defaultCfg := config.NewDefaultCGRConfig() + defaultCfg.ChargerSCfg().StringIndexedFields = &[]string{ + "string", + } + defaultCfg.ChargerSCfg().PrefixIndexedFields = &[]string{"prefix"} + defaultCfg.ChargerSCfg().SuffixIndexedFields = &[]string{"suffix"} + defaultCfg.ChargerSCfg().IndexedSelects = false + defaultCfg.ChargerSCfg().NestedFields = false + + dbm := &DataDBMock{ + GetKeysForPrefixF: func(s string) ([]string, error) { + return []string{":"}, nil + }, + } + dmCharger := NewDataManager(dbm, defaultCfg.CacheCfg(), nil) + cS := &ChargerService{ + dm: dmCharger, + filterS: &FilterS{ + dm: dmCharger, + cfg: defaultCfg, + }, + cfg: defaultCfg, + } + cgrEv := &utils.CGREvent{ + Tenant: config.CgrConfig().GeneralCfg().DefaultTenant, + ID: "cgrEvID", + Event: map[string]interface{}{ + "Charger": "ChargerProfile1", + utils.AnswerTime: time.Date(2021, 4, 1, 10, 0, 0, 0, time.UTC), + "UsageInterval": "1s", + utils.Weight: "10.0", + }, + APIOpts: map[string]interface{}{ + utils.Subsys: utils.MetaChargers, + }, + } + + experr := utils.ErrNotImplemented + rcv, err := cS.matchingChargerProfilesForEvent(cgrEv.Tenant, cgrEv) + + if err == nil || err != experr { + t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) + } + + if rcv != nil { + t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) + } + +} diff --git a/engine/datadbmock.go b/engine/datadbmock.go index 377a4580b..ef7252e35 100644 --- a/engine/datadbmock.go +++ b/engine/datadbmock.go @@ -22,7 +22,11 @@ import ( "github.com/cgrates/cgrates/utils" ) -type DataDBMock struct{} +type DataDBMock struct { + GetKeysForPrefixF func(string) ([]string, error) + GetChargerProfileDrvF func(string, string) (*ChargerProfile, error) + GetFilterDrvF func(string, string) (*Filter, error) +} //Storage methods func (dbM *DataDBMock) Close() {} @@ -31,7 +35,10 @@ func (dbM *DataDBMock) Flush(string) error { return utils.ErrNotImplemented } -func (dbM *DataDBMock) GetKeysForPrefix(string) ([]string, error) { +func (dbM *DataDBMock) GetKeysForPrefix(prf string) ([]string, error) { + if dbM.GetKeysForPrefixF != nil { + return dbM.GetKeysForPrefixF(prf) + } return nil, utils.ErrNotImplemented } @@ -298,7 +305,10 @@ func (dbM *DataDBMock) RemoveThresholdDrv(string, string) error { return utils.ErrNotImplemented } -func (dbM *DataDBMock) GetFilterDrv(string, string) (*Filter, error) { +func (dbM *DataDBMock) GetFilterDrv(tnt string, id string) (*Filter, error) { + if dbM.GetFilterDrvF != nil { + return dbM.GetFilterDrvF(tnt, id) + } return nil, utils.ErrNotImplemented } @@ -334,7 +344,10 @@ func (dbM *DataDBMock) RemoveAttributeProfileDrv(string, string) error { return utils.ErrNotImplemented } -func (dbM *DataDBMock) GetChargerProfileDrv(string, string) (*ChargerProfile, error) { +func (dbM *DataDBMock) GetChargerProfileDrv(tnt string, id string) (*ChargerProfile, error) { + if dbM.GetChargerProfileDrvF != nil { + return dbM.GetChargerProfileDrvF(tnt, id) + } return nil, utils.ErrNotImplemented } diff --git a/engine/eventcost_test.go b/engine/eventcost_test.go index 65ab87ac8..9aabc1fd0 100644 --- a/engine/eventcost_test.go +++ b/engine/eventcost_test.go @@ -4524,41 +4524,6 @@ func TestECTrimFailDetectLastActiveChargingInterval(t *testing.T) { } } -// func TestECTrim2(t *testing.T) { -// ec := &EventCost{ -// Usage: utils.DurationPointer(30 * time.Second), -// AccountSummary: &AccountSummary{}, -// Charges: []*ChargingInterval{ -// { -// RatingID: "RT_ID1", -// cost: utils.Float64Pointer(10), -// ecUsageIdx: utils.DurationPointer(12 * time.Second), -// CompressFactor: 0, -// usage: utils.DurationPointer(45 * time.Second), -// }, -// { -// RatingID: "RT_ID2", -// cost: utils.Float64Pointer(10), -// ecUsageIdx: utils.DurationPointer(8 * time.Second), -// CompressFactor: 0, -// usage: utils.DurationPointer(45 * time.Second), -// }, -// }, -// } -// atUsage := 13 * time.Second - -// experr := "failed detecting last active ChargingInterval" -// rcv, err := ec.Trim(atUsage) - -// if err == nil || err.Error() != experr { -// t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", experr, err) -// } - -// if rcv != nil { -// t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) -// } -// } - func TestECFieldAsInterfaceEmptyFieldPath(t *testing.T) { ec := &EventCost{} fldPath := []string{} @@ -4604,18 +4569,3 @@ func TestECfieldAsInterfaceNilECCost(t *testing.T) { t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) } } - -// func TestECfieldAsInterfaceUnsupportedField(t *testing.T) { -// ec := &EventCost{} -// fldPath := []string{utils.Charges} - -// rcv, err := ec.fieldAsInterface(fldPath) - -// if err != nil { -// t.Fatalf("\nexpected: <%+v>, \nreceived: <%+v>", nil, err) -// } - -// if rcv != nil { -// t.Errorf("\nexpected: <%+v>, \nreceived: <%+v>", nil, rcv) -// } -// }