From 954be1d4807a289166bbea21255f545728eca171 Mon Sep 17 00:00:00 2001 From: gezimbll Date: Tue, 8 Jul 2025 16:52:25 +0200 Subject: [PATCH] integration test for threshold events to ees --- general_tests/threshold_ees_it_test.go | 195 +++++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 general_tests/threshold_ees_it_test.go diff --git a/general_tests/threshold_ees_it_test.go b/general_tests/threshold_ees_it_test.go new file mode 100644 index 000000000..23ae002dc --- /dev/null +++ b/general_tests/threshold_ees_it_test.go @@ -0,0 +1,195 @@ +//go:build integration +// +build integration + +/* +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 general_tests + +import ( + "bytes" + "testing" + "time" + + "github.com/cgrates/birpc/context" + "github.com/cgrates/cgrates/engine" + "github.com/cgrates/cgrates/utils" +) + +func TestThresholdEES(t *testing.T) { + switch *utils.DBType { + case utils.MetaMySQL: + case utils.MetaPostgres, utils.MetaInternal, utils.MetaMongo: + t.SkipNow() + default: + t.Fatal("Unknown Database type") + } + + content := `{ +"logger": { + "level": 7 +}, +"data_db": { + "db_type": "redis", + "db_port": 6379, + "db_name": "10", +}, +"stor_db": { + "db_password": "CGRateS.org" +}, +"cdrs": { + "enabled": true, + "thresholds_conns":["*localhost"], +}, +"chargers": { + "enabled": true, + "attributes_conns": ["*localhost"] +}, +"attributes": { + "enabled": false, +}, +"thresholds": { + "enabled": true, + "store_interval": "-1", + "scheduled_ids": {}, + "indexed_selects": false, + "ees_conns": ["*localhost"], + +}, +"ees":{ + "enabled": true, + "exporters": [ + { + "id": "exporter1", + "type": "*virt", + "fields":[ + {"tag": "ID", "path": "*uch.ID", "type": "*variable", "value": "~*req.ID"}, + {"tag": "EventType", "path": "*uch.EventType", "type": "*variable", "value": "~*req.EventType"}, + {"tag": "FilterIDs", "path": "*uch.FilterIDs", "type": "*variable", "value": "~*req.Config.FilterIDs"}, + {"tag": "EeIDs", "path": "*uch.EeIDs", "type": "*variable", "value": "~*req.Config.EeIDs"}, + {"tag": "ActionProfileIDs", "path": "*uch.ActionProfileIDs", "type": "*variable", "value": "~*req.Config.ActionProfileIDs"}, + {"tag": "Hits", "path": "*uch.Hits", "type": "*variable", "value": "~*req.Hits"}, + ], + }, + ], +}, +"admins": { + "enabled": true +}}` + + ng := engine.TestEngine{ + ConfigJSON: content, + Encoding: utils.MetaJSON, + TpFiles: map[string]string{ + utils.ActionsCsv: `#Tenant,ID,FilterIDs,Weights,Blockers,Schedule,TargetType,TargetIDs,ActionID,ActionFilterIDs,ActionTTL,ActionType,ActionOpts,ActionPath,ActionValue +cgrates.org,*log,,,,,,,,,,,,,`, + utils.ThresholdsCsv: `#Tenant[0],Id[1],FilterIDs[2],Weight[3],MaxHits[4],MinHits[5],MinSleep[6],Blocker[7],ActionProfileIDs[8],Async[9],EeIDs[10] +cgrates.org,Threshold1,*string:~*opts.*account:1001;*string:~*req.RequestType:*prepaid,;20,1,0,1s,false,*log,true,exporter1`, + }, + LogBuffer: bytes.NewBuffer(nil), + } + client, _ := ng.Run(t) + time.Sleep(200 * time.Millisecond) + t.Run("ThresholdEES", func(t *testing.T) { + ev := &utils.CGREvent{ + Tenant: "cgrates.org", + ID: "Event1", + Event: map[string]any{ + utils.RequestType: utils.MetaPrepaid, + utils.AccountField: "1001", + utils.Destination: "1002", + utils.Usage: time.Minute, + }, + APIOpts: map[string]any{ + utils.MetaAccount: "1001", + utils.MetaThresholds: true, + }, + } + var rply string + if err := client.Call(context.Background(), utils.CDRsV1ProcessEvent, ev, &rply); err != nil { + t.Error(err) + } + }) + + t.Run("ThresholdEESCheck", func(t *testing.T) { + var thresholdID any + if err := client.Call(context.Background(), utils.CacheSv1GetItem, &utils.ArgsGetCacheItemWithAPIOpts{ + Tenant: "cgrates.org", + ArgsGetCacheItem: utils.ArgsGetCacheItem{ + CacheID: utils.CacheUCH, + ItemID: "ID", + }, + }, &thresholdID); err != nil { + t.Error(err) + } else if thresholdID != "Threshold1" { + t.Errorf("Expected threshold ID to be '%v'", thresholdID) + } + + var eventType any + if err := client.Call(context.Background(), utils.CacheSv1GetItem, &utils.ArgsGetCacheItemWithAPIOpts{ + Tenant: "cgrates.org", + ArgsGetCacheItem: utils.ArgsGetCacheItem{ + CacheID: utils.CacheUCH, + ItemID: "EventType", + }, + }, &eventType); err != nil { + t.Error(err) + } else if eventType != utils.ThresholdHit { + t.Errorf("Expected event type to be '%v'", eventType) + } + + var filterIDs any + if err := client.Call(context.Background(), utils.CacheSv1GetItem, &utils.ArgsGetCacheItemWithAPIOpts{ + Tenant: "cgrates.org", + ArgsGetCacheItem: utils.ArgsGetCacheItem{ + CacheID: utils.CacheUCH, + ItemID: "FilterIDs", + }, + }, &filterIDs); err != nil { + t.Error(err) + } else if filterIDs != "[\"*string:~*opts.*account:1001\",\"*string:~*req.RequestType:*prepaid\"]" { + t.Errorf("Expected filter IDs to be '%v'", filterIDs) + } + + var hits any + if err := client.Call(context.Background(), utils.CacheSv1GetItem, &utils.ArgsGetCacheItemWithAPIOpts{ + Tenant: "cgrates.org", + ArgsGetCacheItem: utils.ArgsGetCacheItem{ + CacheID: utils.CacheUCH, + ItemID: "Hits", + }, + }, &hits); err != nil { + t.Error(err) + } else if hits != "1" { + t.Errorf("Expected filter IDs to be '%v'", hits) + } + + var actionPrfs any + if err := client.Call(context.Background(), utils.CacheSv1GetItem, &utils.ArgsGetCacheItemWithAPIOpts{ + Tenant: "cgrates.org", + ArgsGetCacheItem: utils.ArgsGetCacheItem{ + CacheID: utils.CacheUCH, + ItemID: "ActionProfileIDs", + }, + }, &actionPrfs); err != nil { + t.Error(err) + } else if actionPrfs != "[\"*log\"]" { + t.Errorf("Expected filter IDs to be '%v'", hits) + } + }) +}