diff --git a/engine/callcost_test.go b/engine/callcost_test.go
index f352fd8b7..6eca80429 100644
--- a/engine/callcost_test.go
+++ b/engine/callcost_test.go
@@ -18,6 +18,7 @@ along with this program. If not, see
package engine
import (
+ "reflect"
"testing"
"time"
@@ -198,3 +199,121 @@ func TestCallCostToDataCostError(t *testing.T) {
t.Error("Failed to throw error on call to datacost!")
}
}
+
+func TestCallCostGetStartTime(t *testing.T) {
+ cc := CallCost{}
+
+ rcv := cc.GetStartTime()
+
+ if rcv.Minute() != time.Now().Minute() {
+ t.Error(rcv)
+ }
+
+ cc2 := CallCost{
+ Timespans: TimeSpans{{TimeStart: time.Now()}},
+ }
+
+ rcv = cc2.GetStartTime()
+
+ if rcv.Minute() != time.Now().Minute() {
+ t.Error(rcv)
+ }
+}
+
+func TestCallCostGetEndTime(t *testing.T) {
+ cc := CallCost{}
+
+ rcv := cc.GetEndTime()
+
+ if rcv.Minute() != time.Now().Minute() {
+ t.Error(rcv)
+ }
+}
+
+func TestCallCostIsPaid(t *testing.T) {
+ cc := CallCost{}
+
+ rcv := cc.IsPaid()
+
+ if rcv != true {
+ t.Error(rcv)
+ }
+
+ cc2 := CallCost{
+ Timespans: TimeSpans{{Increments: Increments{}}},
+ }
+
+ rcv = cc2.IsPaid()
+
+ if rcv != false {
+ t.Error(rcv)
+ }
+}
+
+func TestCallCostToDataCost(t *testing.T) {
+ str := "test"
+ bl := false
+ fl := 1.2
+ cc := CallCost{
+ Category: str,
+ Tenant: str,
+ Subject: str,
+ Account: str,
+ Destination: str,
+ ToR: str,
+ Cost: fl,
+ Timespans: TimeSpans{{
+ Increments: Increments{{}},
+ }},
+ RatedUsage: fl,
+ AccountSummary: &AccountSummary{},
+ deductConnectFee: bl,
+ negativeConnectFee: bl,
+ maxCostDisconect: bl,
+ }
+
+ exp := &DataCost{
+ Category: cc.Category,
+ Tenant: cc.Tenant,
+ Subject: cc.Subject,
+ Account: cc.Account,
+ Destination: cc.Destination,
+ ToR: cc.ToR,
+ Cost: cc.Cost,
+ deductConnectFee: cc.deductConnectFee,
+ DataSpans: []*DataSpan{{
+ DataStart: 0,
+ DataEnd: 0,
+ Cost: 0,
+ ratingInfo: nil,
+ RateInterval: nil,
+ DataIndex: 0,
+ Increments: []*DataIncrement{{}},
+ MatchedSubject: "",
+ MatchedPrefix: "",
+ MatchedDestId: "",
+ RatingPlanId: "",
+ }},
+ }
+
+ rcv, err := cc.ToDataCost()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if !reflect.DeepEqual(rcv, exp) {
+ t.Errorf("expected %v\n received %v\n", exp, rcv)
+ }
+}
+
+func TestCallCostUpdateCost(t *testing.T) {
+ cc := CallCost{
+ deductConnectFee: false,
+ }
+
+ cc.UpdateCost()
+
+ if cc.deductConnectFee != true {
+ t.Error("didn't update")
+ }
+}
\ No newline at end of file
diff --git a/engine/cdre_test.go b/engine/cdre_test.go
new file mode 100644
index 000000000..5e74585ca
--- /dev/null
+++ b/engine/cdre_test.go
@@ -0,0 +1,69 @@
+/*
+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 engine
+
+import (
+ "testing"
+
+ "github.com/cgrates/cgrates/config"
+)
+
+func TestCDRENewCDRExporter(t *testing.T) {
+ _, err := NewCDRExporter([]*CDR{}, &config.CdreCfg{}, "test", "test", "test", "test", false, 1, 'a', false, []string{}, &FilterS{})
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+func TestCDREmetaHandler(t *testing.T) {
+ cdre := CDRExporter{}
+
+ rcv, err := cdre.metaHandler("test", "test")
+
+ if err != nil {
+ if err.Error() != "Unsupported METATAG: test" {
+ t.Fatal(err)
+ }
+ }
+
+ if rcv != "" {
+ t.Error(rcv)
+ }
+}
+
+func TestCDREcomposeHeader(t *testing.T) {
+ cdre := CDRExporter{
+ exportTemplate: &config.CdreCfg{
+ Fields: []*config.FCTemplate{
+ {
+ Type: "*filler",
+ Value: config.RSRParsers{{Rules: "test()"}},
+ },
+ },
+ },
+ }
+
+ err := cdre.composeHeader()
+
+ if err != nil {
+ if err.Error() != "err" {
+ t.Error(err)
+ }
+ }
+}
diff --git a/engine/libeventcost_test.go b/engine/libeventcost_test.go
index 1a1c089fc..2feb1a207 100644
--- a/engine/libeventcost_test.go
+++ b/engine/libeventcost_test.go
@@ -1224,51 +1224,51 @@ func TestLibeventcostChargedTimingFieldAsInterface(t *testing.T) {
tests := []struct {
name string
- arg []string
- exp any
- err string
+ arg []string
+ exp any
+ err string
}{
{
- name: "empty filepath",
- arg: []string{},
- exp: nil,
- err: "NOT_FOUND",
+ name: "empty filepath",
+ arg: []string{},
+ exp: nil,
+ err: "NOT_FOUND",
},
{
- name: "empty filepath",
- arg: []string{"test"},
- exp: nil,
- err: "unsupported field prefix: ",
+ name: "empty filepath",
+ arg: []string{"test"},
+ exp: nil,
+ err: "unsupported field prefix: ",
},
{
- name: "Years case",
- arg: []string{"Years"},
- exp: utils.Years{1999},
- err: "",
+ name: "Years case",
+ arg: []string{"Years"},
+ exp: utils.Years{1999},
+ err: "",
},
{
- name: "Months case",
- arg: []string{"Months"},
- exp: utils.Months{time.August},
- err: "",
+ name: "Months case",
+ arg: []string{"Months"},
+ exp: utils.Months{time.August},
+ err: "",
},
{
- name: "MonthDays case",
- arg: []string{"MonthDays"},
- exp: utils.MonthDays{28},
- err: "",
+ name: "MonthDays case",
+ arg: []string{"MonthDays"},
+ exp: utils.MonthDays{28},
+ err: "",
},
{
- name: "WeekDays case",
- arg: []string{"WeekDays"},
- exp: utils.WeekDays{time.Friday},
- err: "",
+ name: "WeekDays case",
+ arg: []string{"WeekDays"},
+ exp: utils.WeekDays{time.Friday},
+ err: "",
},
{
- name: "StartTime case",
- arg: []string{"StartTime"},
- exp: "00:00:00",
- err: "",
+ name: "StartTime case",
+ arg: []string{"StartTime"},
+ exp: "00:00:00",
+ err: "",
},
}
@@ -1306,69 +1306,69 @@ func TestLibeventcostRatingUnitFieldAsInterface(t *testing.T) {
tests := []struct {
name string
- arg []string
- exp any
- err string
+ arg []string
+ exp any
+ err string
}{
{
- name: "empty filepath",
- arg: []string{},
- exp: nil,
- err: "NOT_FOUND",
+ name: "empty filepath",
+ arg: []string{},
+ exp: nil,
+ err: "NOT_FOUND",
},
{
name: "empty filepath",
- arg: []string{"test"},
- exp: nil,
- err: "unsupported field prefix: ",
+ arg: []string{"test"},
+ exp: nil,
+ err: "unsupported field prefix: ",
},
{
- name: "ConnectFee case",
- arg: []string{"ConnectFee"},
- exp: fl,
- err: "",
+ name: "ConnectFee case",
+ arg: []string{"ConnectFee"},
+ exp: fl,
+ err: "",
},
{
- name: "RoundingMethod case",
- arg: []string{"RoundingMethod"},
- exp: str,
- err: "",
+ name: "RoundingMethod case",
+ arg: []string{"RoundingMethod"},
+ exp: str,
+ err: "",
},
{
- name: "RoundingDecimals case",
- arg: []string{"RoundingDecimals"},
- exp: nm,
- err: "",
+ name: "RoundingDecimals case",
+ arg: []string{"RoundingDecimals"},
+ exp: nm,
+ err: "",
},
{
- name: "MaxCost case",
- arg: []string{"MaxCost"},
- exp: fl,
- err: "",
+ name: "MaxCost case",
+ arg: []string{"MaxCost"},
+ exp: fl,
+ err: "",
},
{
- name: "MaxCostStrategy case",
- arg: []string{"MaxCostStrategy"},
- exp: str,
- err: "",
+ name: "MaxCostStrategy case",
+ arg: []string{"MaxCostStrategy"},
+ exp: str,
+ err: "",
},
{
- name: "TimingID case",
- arg: []string{"TimingID"},
- exp: str,
- err: "",
+ name: "TimingID case",
+ arg: []string{"TimingID"},
+ exp: str,
+ err: "",
},
{
- name: "RatesID case",
- arg: []string{"RatesID"},
- exp: str,
- err: "",
+ name: "RatesID case",
+ arg: []string{"RatesID"},
+ exp: str,
+ err: "",
},
{
- name: "RatingFiltersID case",
- arg: []string{"RatingFiltersID"},
- exp: str,
- err: "",
+ name: "RatingFiltersID case",
+ arg: []string{"RatingFiltersID"},
+ exp: str,
+ err: "",
},
}
@@ -1508,9 +1508,9 @@ func TestLibeventcostChargedRatesFieldAsInterface(t *testing.T) {
}},
}
- tests := []struct{
- name string
- arg []string
+ tests := []struct {
+ name string
+ arg []string
val any
err string
}{
@@ -1535,24 +1535,24 @@ func TestLibeventcostChargedRatesFieldAsInterface(t *testing.T) {
{
name: "found",
arg: []string{"test"},
- val: RateGroups{{
- GroupIntervalStart: tm,
- Value: 1.2,
- RateIncrement: tm,
- RateUnit: tm,
- }},
- err: "",
+ val: RateGroups{{
+ GroupIntervalStart: tm,
+ Value: 1.2,
+ RateIncrement: tm,
+ RateUnit: tm,
+ }},
+ err: "",
},
{
name: "found",
arg: []string{"test[0]"},
- val: &Rate{
- GroupIntervalStart: tm,
- Value: 1.2,
- RateIncrement: tm,
- RateUnit: tm,
- },
- err: "",
+ val: &Rate{
+ GroupIntervalStart: tm,
+ Value: 1.2,
+ RateIncrement: tm,
+ RateUnit: tm,
+ },
+ err: "",
},
{
name: "found",
@@ -1577,4 +1577,171 @@ func TestLibeventcostChargedRatesFieldAsInterface(t *testing.T) {
}
})
}
-}
\ No newline at end of file
+}
+
+func TestLibeventcostChargedTimingsFieldAsInterface(t *testing.T) {
+ ct := ChargedTiming{
+ Years: utils.Years{1999},
+ Months: utils.Months{time.August},
+ MonthDays: utils.MonthDays{28},
+ WeekDays: utils.WeekDays{time.Friday},
+ StartTime: "00:00:00",
+ }
+ c := ChargedTimings{
+ "test1": &ct,
+ }
+ tests := []struct {
+ name string
+ arg []string
+ val any
+ err string
+ }{
+ {
+ name: "empty filepath",
+ arg: []string{},
+ val: nil,
+ err: "NOT_FOUND",
+ },
+ {
+ name: "keyword not found",
+ arg: []string{"test"},
+ val: nil,
+ err: "NOT_FOUND",
+ },
+ {
+ name: "found",
+ arg: []string{"test1"},
+ val: &ct,
+ err: "",
+ },
+ {
+ name: "found",
+ arg: []string{"test1", "StartTime"},
+ val: "00:00:00",
+ err: "",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ rcv, err := c.FieldAsInterface(tt.arg)
+
+ if err != nil {
+ if err.Error() != tt.err {
+ t.Error(err)
+ }
+ }
+
+ if !reflect.DeepEqual(rcv, tt.val) {
+ t.Errorf("expected %v, received %v", tt.val, rcv)
+ }
+ })
+ }
+}
+
+func TestLibeventcostAccountingFieldAsInterface(t *testing.T) {
+ bc := BalanceCharge{
+ AccountID: "test",
+ }
+ ac := Accounting{
+ "test1": &bc,
+ }
+ tests := []struct {
+ name string
+ arg []string
+ val any
+ err string
+ }{
+ {
+ name: "empty filepath",
+ arg: []string{},
+ val: nil,
+ err: "NOT_FOUND",
+ },
+ {
+ name: "keyword not found",
+ arg: []string{"test"},
+ val: nil,
+ err: "NOT_FOUND",
+ },
+ {
+ name: "found",
+ arg: []string{"test1"},
+ val: &bc,
+ err: "",
+ },
+ {
+ name: "found",
+ arg: []string{"test1", "AccountID"},
+ val: "test",
+ err: "",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ rcv, err := ac.FieldAsInterface(tt.arg)
+
+ if err != nil {
+ if err.Error() != tt.err {
+ t.Error(err)
+ }
+ }
+
+ if !reflect.DeepEqual(rcv, tt.val) {
+ t.Errorf("expected %v, received %v", tt.val, rcv)
+ }
+ })
+ }
+}
+
+func TestLibeventcostIfaceAsEventCost(t *testing.T) {
+ e := EventCost{
+ CGRID: "test",
+ }
+ mp := map[string]any{
+ "CGRID": "test",
+ }
+
+ tests := []struct {
+ name string
+ arg any
+ exp *EventCost
+ err string
+ }{
+ {
+ name: "EventCost case",
+ arg: &e,
+ exp: &e,
+ err: "",
+ },
+ {
+ name: "map string interface case",
+ arg: mp,
+ exp: &e,
+ err: "",
+ },
+ {
+ name: "default case",
+ arg: 1,
+ exp: nil,
+ err: "not convertible : from: int to:*EventCost",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ rcv, err := IfaceAsEventCost(tt.arg)
+
+ if err != nil {
+ if err.Error() != tt.err {
+ t.Error(err)
+ }
+ }
+
+ if !reflect.DeepEqual(rcv, tt.exp) {
+ t.Errorf("expected %v, received %v", tt.exp, rcv)
+ }
+ })
+ }
+}