From 0d7c5666e886a2a406d983f15244a4eb46013aa8 Mon Sep 17 00:00:00 2001 From: armirveliaj Date: Mon, 16 Feb 2026 11:13:56 -0500 Subject: [PATCH] add slices.compact for filterids on chargers --- apis/loaders_it_test.go | 24 +++++++++++++- loaders/loader.go | 4 ++- loaders/loader_test.go | 70 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/apis/loaders_it_test.go b/apis/loaders_it_test.go index 84e9de8e4..04f55c056 100644 --- a/apis/loaders_it_test.go +++ b/apis/loaders_it_test.go @@ -225,6 +225,7 @@ cgrates.org,Charger1,*string:~*req.Account:1001,;20,;true,, cgrates.org,Charger1,,,,*rated,ATTR_1001_SIMPLEAUTH cgrates.org,Charger2,,,,*rated,ATTR_1002_SIMPLEAUTH cgrates.org,Charger2,*string:~*req.Account:1002,;15,;false,, +cgrates.org,Charger3,*string:~*req.Account:1001;*string:~*req.Account:1001;*string:~*req.Account:1002;*string:~*req.Account:1001;*string:~*req.Account:1003,;10,;false,*rated,ATTR_TEST `); err != nil { t.Fatal(err) } @@ -709,7 +710,6 @@ func testLoadersGetAttributeProfiles(t *testing.T) { } } } - func testLoadersGetChargerProfiles(t *testing.T) { expChrgs := []*utils.ChargerProfile{ { @@ -746,6 +746,28 @@ func testLoadersGetChargerProfiles(t *testing.T) { }, }, }, + { + Tenant: "cgrates.org", + ID: "Charger3", + FilterIDs: []string{ + "*string:~*req.Account:1001", + "*string:~*req.Account:1002", + "*string:~*req.Account:1001", + "*string:~*req.Account:1003", + }, + RunID: "*rated", + AttributeIDs: []string{"ATTR_TEST"}, + Weights: utils.DynamicWeights{ + { + Weight: 10, + }, + }, + Blockers: utils.DynamicBlockers{ + { + Blocker: false, + }, + }, + }, } var chrgs []*utils.ChargerProfile if err := ldrRPC.Call(context.Background(), utils.AdminSv1GetChargerProfiles, diff --git a/loaders/loader.go b/loaders/loader.go index 8ab327405..d01f158c5 100644 --- a/loaders/loader.go +++ b/loaders/loader.go @@ -102,7 +102,9 @@ func setToDB(ctx *context.Context, dm *engine.DataManager, lType string, data pr case utils.MetaRoutes: return dm.SetRouteProfile(ctx, data.(*utils.RouteProfile), withIndex) case utils.MetaChargers: - return dm.SetChargerProfile(ctx, data.(*utils.ChargerProfile), withIndex) + cp := data.(*utils.ChargerProfile) + cp.FilterIDs = slices.Compact(cp.FilterIDs) + return dm.SetChargerProfile(ctx, cp, withIndex) case utils.MetaRateProfiles: rpl := data.(*utils.RateProfile) rpl.FilterIDs = slices.Compact(rpl.FilterIDs) diff --git a/loaders/loader_test.go b/loaders/loader_test.go index 9f8ec2d0c..d53304b81 100644 --- a/loaders/loader_test.go +++ b/loaders/loader_test.go @@ -1476,3 +1476,73 @@ func TestSetToDBRateProfileDuplicateSequentialFilterIDs(t *testing.T) { t.Errorf("Expected FilterIDs in DB: %v, received: %v", expectedFilterIDs, retrieved.FilterIDs) } } + +func TestSetToDBChargerProfileDuplicateSequentialFilterIDs(t *testing.T) { + cfg := config.NewDefaultCGRConfig() + idb, err := engine.NewInternalDB(nil, nil, nil, cfg.DbCfg().Items) + if err != nil { + t.Fatal(err) + } + dbCM := engine.NewDBConnManager(map[string]engine.DataDB{utils.MetaDefault: idb}, cfg.DbCfg()) + dm := engine.NewDataManager(dbCM, cfg, nil) + + cp := &utils.ChargerProfile{ + Tenant: "cgrates.org", + ID: "cp1", + FilterIDs: []string{ + "*string:~*req.Account:1001", "*string:~*req.Account:1001", + "*string:~*req.Subject:1002", "*string:~*req.Subject:1002", "*string:~*req.Subject:1002", + "*string:~*req.Destination:1001", + }, + RunID: "*rated", + AttributeIDs: []string{"ATTR_TEST"}, + Weights: utils.DynamicWeights{ + { + Weight: 20, + }, + }, + Blockers: utils.DynamicBlockers{ + { + Blocker: false, + }, + }, + } + + if len(cp.FilterIDs) != 6 { + t.Fatalf("Expected 6 FilterIDs before setToDB, got %d", len(cp.FilterIDs)) + } + + if err := setToDB(context.Background(), dm, utils.MetaChargers, cp, true, false); err != nil { + t.Fatal(err) + } + + expectedFilterIDs := []string{ + "*string:~*req.Account:1001", + "*string:~*req.Subject:1002", + "*string:~*req.Destination:1001", + } + + if !reflect.DeepEqual(cp.FilterIDs, expectedFilterIDs) { + t.Errorf("Expected FilterIDs after setToDB: %v, received: %v", expectedFilterIDs, cp.FilterIDs) + } + + if len(cp.FilterIDs) != 3 { + t.Errorf("Expected 3 FilterIDs after compacting, got %d", len(cp.FilterIDs)) + } + + retrieved, err := dm.GetChargerProfile( + context.Background(), + "cgrates.org", + "cp1", + true, + true, + utils.NonTransactional, + ) + if err != nil { + t.Fatal(err) + } + + if !reflect.DeepEqual(retrieved.FilterIDs, expectedFilterIDs) { + t.Errorf("Expected FilterIDs in DB: %v, received: %v", expectedFilterIDs, retrieved.FilterIDs) + } +}