diff --git a/engine/cgrcdr_test.go b/engine/cgrcdr_test.go index a6b97f6fb..0b909560a 100644 --- a/engine/cgrcdr_test.go +++ b/engine/cgrcdr_test.go @@ -18,6 +18,9 @@ along with this program. If not, see package engine import ( + "errors" + "net/http" + "net/url" "reflect" "testing" "time" @@ -97,3 +100,58 @@ func TestReplicatedCgrCdrAsCDR(t *testing.T) { t.Errorf("Expecting %v, received: %v", expctRtCdr, CDR) } } + +func TestNewCgrCdrFromHttpReq(t *testing.T) { + testCases := []struct { + name string + httpRequest *http.Request + timezone string + expectedCgrCdr CgrCdr + expectedError error + }{ + { + name: "Valid request", + httpRequest: &http.Request{ + RemoteAddr: "127.0.0.1:2040", + Form: url.Values{ + "key1": {"value1"}, + "key2": {"value2"}, + }, + }, + timezone: "UTC", + expectedCgrCdr: CgrCdr{ + utils.Source: "127.0.0.1:2040", + "key1": "value1", + "key2": "value2", + }, + expectedError: nil, + }, + { + name: "Error parsing form", + httpRequest: &http.Request{ + RemoteAddr: "127.0.0.1", + Form: nil, + }, + timezone: "UTC", + expectedCgrCdr: nil, + expectedError: errors.New("unable to parse form"), + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + httpRequestCopy := new(http.Request) + *httpRequestCopy = *tc.httpRequest + result, err := NewCgrCdrFromHttpReq(httpRequestCopy, tc.timezone) + if err != nil { + if tc.expectedError.Error() != err.Error() { + t.Error(err) + } + } else if tc.expectedCgrCdr != nil { + if !reflect.DeepEqual(tc.expectedCgrCdr, result) { + t.Errorf("Expected %v,Received %v", tc.expectedCgrCdr, result) + } + } + }) + } +} diff --git a/engine/datamanager_test.go b/engine/datamanager_test.go index 4a48cd213..b57259f50 100644 --- a/engine/datamanager_test.go +++ b/engine/datamanager_test.go @@ -803,8 +803,10 @@ func TestDMReplicateMultipleIds(t *testing.T) { for i, acc := range accs { dm.SetAccount(acc) connIds[i] = acc.ID + //UpdateReplicationFilters(utils.ACCOUNT_PREFIX, connIds[i], utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)) } - if err := replicateMultipleIDs(connMgr, connIds, true, utils.ACCOUNT_PREFIX, connIds, utils.ReplicatorSv1RemoveAccount, "cgrates.org"); err != nil { + + if err := replicateMultipleIDs(connMgr, []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)}, true, utils.ACCOUNT_PREFIX, connIds, utils.ReplicatorSv1RemoveAccount, "cgrates.org"); err != nil { t.Error(err) } else if ids, err := dm.DataDB().GetKeysForPrefix("cgrates"); len(ids) > 0 || err != nil { t.Error(err) @@ -1668,28 +1670,51 @@ func TestDmRemoveFilter(t *testing.T) { } } -// func TestDMGetSupplierProfile(t *testing.T) { -// cfg, _ := config.NewDefaultCGRConfig() -// cfg.DataDbCfg().Items[utils.MetaSupplierProfiles].Remote = true -// cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)} -// defer func() { -// cfg2, _ := config.NewDefaultCGRConfig() -// config.SetCgrConfig(cfg2) -// }() -// clientConn := make(chan rpcclient.ClientConnector, 1) -// clientConn <- clMock(func(serviceMethod string, _, _ interface{}) error { -// if serviceMethod == utils.ReplicatorSv1GetSupplierProfile { -// return nil -// } -// return utils.ErrNotFound -// }) -// db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) -// dm := NewDataManager(db, cfg.CacheCfg(), NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ -// utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): clientConn, -// })) -// config.SetCgrConfig(cfg) -// if _, err := dm.GetSupplierProfile("cgrates.org", "SPL1", false, false, ""); err != nil { -// t.Error(err) -// } +func TestDMGetSupplierProfile(t *testing.T) { + cfg, _ := config.NewDefaultCGRConfig() + Cache.Clear(nil) + cfg.DataDbCfg().Items[utils.MetaSupplierProfiles].Remote = true + cfg.DataDbCfg().RmtConns = []string{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1)} + defer func() { + cfg2, _ := config.NewDefaultCGRConfig() + config.SetCgrConfig(cfg2) + }() + clientConn := make(chan rpcclient.ClientConnector, 1) + clientConn <- clMock(func(serviceMethod string, _, reply interface{}) error { + if serviceMethod == utils.ReplicatorSv1GetSupplierProfile { + rpl := &SupplierProfile{} + *reply.(**SupplierProfile) = rpl + return nil + } + return utils.ErrNotFound + }) + db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := NewDataManager(db, cfg.CacheCfg(), NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{ + utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): clientConn, + })) + config.SetCgrConfig(cfg) + if _, err := dm.GetSupplierProfile("cgrates.org", "SPL1", false, false, ""); err != nil { + t.Error(err) + } +} -// } +func TestConnManagerCallWithConnIDs(t *testing.T) { + cfg, _ := config.NewDefaultCGRConfig() + connId := utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1) + cfg.RPCConns()[connId] = &config.RPCConn{ + Conns: []*config.RemoteHost{ + { + ID: connId, + Address: "127.0.0.1:2012", + Transport: utils.MetaJSON, + TLS: true, + }, + }, + } + connMgr := NewConnManager(cfg, map[string]chan rpcclient.ClientConnector{}) + + if err := connMgr.CallWithConnIDs([]string{connId}, utils.StringSet{utils.ConcatenatedKey(utils.MetaInternal, utils.ReplicatorSv1): {}}, utils.ReplicatorSv1GetAccount, nil, nil); err == nil { + + t.Error(err) + } +} diff --git a/engine/storage_test.go b/engine/storage_test.go index 2001f4c79..7d444262f 100644 --- a/engine/storage_test.go +++ b/engine/storage_test.go @@ -18,7 +18,10 @@ along with this program. If not, see package engine import ( + "bytes" "fmt" + "log" + "os" "reflect" "testing" "time" @@ -1310,3 +1313,138 @@ func TestTpRLoadAll(t *testing.T) { t.Error(err) } } + +func TestTpReaderIsValid(t *testing.T) { + cfg, _ := config.NewDefaultCGRConfig() + dataDb := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + storDb := NewInternalDB(nil, nil, false, cfg.StorDbCfg().Items) + tpId := "TP1" + tpr, err := NewTpReader(dataDb, storDb, tpId, "UTC", nil, nil) + if err != nil { + t.Error(err) + } + var buf bytes.Buffer + log.SetOutput(&buf) + defer func() { + + log.SetOutput(os.Stderr) + }() + dests := []*utils.TPDestination{ + { + TPid: tpId, + ID: "DEST", + Prefixes: []string{ + "1001", "1002", "1003", + }, + }, + } + dest := &Destination{ + Id: "DEST", + Prefixes: []string{ + "1001", "1002", "1003", + }, + } + rates := []*utils.TPRate{ + { + TPid: tpId, + ID: "RATE1", + RateSlots: []*utils.RateSlot{ + {ConnectFee: 12, + Rate: 3, + RateUnit: "4s", + RateIncrement: "6s", + GroupIntervalStart: "1s"}, + }, + }} + destRates := []*utils.TPDestinationRate{ + { + TPid: tpId, + ID: "DR_FREESWITCH_USERS", + DestinationRates: []*utils.DestinationRate{ + { + DestinationId: "DEST", + RateId: "RATE1", + RoundingMethod: "*up", + RoundingDecimals: 4}, + }, + }, + } + timings := []*utils.ApierTPTiming{ + { + TPid: tpId, + ID: "ALWAYS", + Years: "*any", + Months: "*any", + MonthDays: "*any", + WeekDays: "*any", + Time: "00:00:00", + }, + } + + ratingPlans := []*utils.TPRatingPlan{ + { + TPid: tpId, + ID: "RP_1", + RatingPlanBindings: []*utils.TPRatingPlanBinding{ + { + DestinationRatesId: "DR_FREESWITCH_USERS", + TimingId: "ALWAYS", + Weight: 10, + }, + }, + }, + } + if err := storDb.SetTPDestinations(dests); err != nil { + t.Error(err) + } + + if err := dataDb.SetDestinationDrv(dest, utils.NonTransactional); err != nil { + t.Error(err) + } + + if err := storDb.SetTPRates(rates); err != nil { + t.Error(err) + } + + if err := storDb.SetTPDestinationRates(destRates); err != nil { + t.Error(err) + } + + if err := storDb.SetTPTimings(timings); err != nil { + t.Error(err) + } + if err := storDb.SetTPRatingPlans(ratingPlans); err != nil { + t.Error(err) + } + + if err := tpr.LoadAll(); err != nil { + t.Error(err) + } + + if valid := tpr.IsValid(); !valid { + t.Error("RatingPlan is not continous") + } + + timings = []*utils.ApierTPTiming{ + { + TPid: tpId, + ID: "ALWAYS", + Years: "*any", + Months: "*any", + MonthDays: "*any", + WeekDays: "1;2;3;4;5", + Time: "00:00:00", + }, + } + if err := storDb.SetTPTimings(timings); err != nil { + t.Error(err) + } + if err := tpr.LoadAll(); err != nil { + t.Error(err) + } + + if valid := tpr.IsValid(); !valid { + t.Error("RatingPlan is not continous") + } + +}