diff --git a/config/rjreader_test.go b/config/rjreader_test.go index b21705c4f..729de2004 100644 --- a/config/rjreader_test.go +++ b/config/rjreader_test.go @@ -18,6 +18,11 @@ along with this program. If not, see package config import ( + "bufio" + "encoding/json" + "errors" + "fmt" + "io" "os" "reflect" "testing" @@ -350,3 +355,229 @@ func TestGetErrorLine2(t *testing.T) { } } + +type reader struct { +} + +func (r *reader) Read(p []byte) (n int, err error) { + return 0, fmt.Errorf("test error: %v", n) +} + +func TestRjReaderNewRjReader(t *testing.T) { + r := &reader{} + + rcv, err := NewRjReader(r) + + if err != nil { + if err.Error() != "test error: 0" { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } + + if rcv != nil { + t.Error(rcv) + } +} + +func TestRjReaderUnreadByte(t *testing.T) { + val := "val1" + mrsh, err := json.Marshal(val) + if err != nil { + t.Error(err) + } + rjr := &rjReader{ + buf: mrsh, + isInString: true, + indx: 0, + } + + err = rjr.UnreadByte() + + if err != nil { + if err.Error() != bufio.ErrInvalidUnreadByte.Error() { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } +} + +func TestRjReaderconsumeComent(t *testing.T) { + val := "1" + mrsh, err := json.Marshal(val) + if err != nil { + t.Error(err) + } + rjr := &rjReader{ + buf: mrsh, + isInString: true, + indx: 20, + } + + rcv, err := rjr.consumeComent('*') + + if err != nil { + if err.Error() != utils.ErrJsonIncompleteComment.Error() { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } + + if rcv != true { + t.Error(rcv) + } +} + +func TestRjReaderPeekByteWC(t *testing.T) { + val := "1" + mrsh, err := json.Marshal(val) + if err != nil { + t.Error(err) + } + rjr := &rjReader{ + buf: mrsh, + isInString: true, + indx: 20, + } + + rcv, err := rjr.PeekByteWC() + + if err != nil { + if err.Error() != io.EOF.Error() { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } + + if rcv != 0 { + t.Error(rcv) + } +} + +func TestRjReaderreadEnvName(t *testing.T) { + val := "val1" + mrsh, err := json.Marshal(val) + if err != nil { + t.Error(err) + } + rjr := &rjReader{ + buf: mrsh, + isInString: true, + indx: 0, + } + + rcv1, rcv2, err := rjr.readEnvName(20) + + if err != nil { + if err.Error() != io.EOF.Error() { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } + + if rcv1 != nil { + t.Error(rcv1) + } + + if rcv2 != 20 { + t.Error(rcv2) + } +} + +func TestRjReaderReplaceEnv(t *testing.T) { + val := "val1" + mrsh, err := json.Marshal(val) + if err != nil { + t.Error(err) + } + rjr := &rjReader{ + buf: mrsh, + isInString: true, + indx: 0, + } + + err = rjr.replaceEnv(20) + + if err != nil { + if err.Error() != "NOT_FOUND:ENV_VAR:" { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } +} + +func TestRjReaderHandleJSONError(t *testing.T) { + err1 := &json.InvalidUTF8Error{ + S: "test err1", + } + err2 := &json.InvalidUnmarshalError{ + Type: reflect.TypeOf(fmt.Errorf("error %s", "test")), + } + err3 := &json.UnmarshalTypeError{ + Type: reflect.TypeOf(fmt.Errorf("error %s", "test")), + } + val := "val1" + mrsh, err := json.Marshal(val) + if err != nil { + t.Error(err) + } + rjr := &rjReader{ + buf: mrsh, + isInString: true, + indx: 0, + } + + tests := []struct { + name string + arg error + exp string + }{ + { + name: "case nil", + arg: nil, + exp: "", + }, + { + name: "case *json.InvalidUTF8Error, *json.UnmarshalFieldError", + arg: err1, + exp: `json: invalid UTF-8 in string: "test err1"`, + }, + { + name: "case *json.InvalidUnmarshalError", + arg: err2, + exp: `json: Unmarshal(nil *errors.errorString)`, + }, + { + name: "case *json.UnmarshalTypeError", + arg: err3, + exp: `json: cannot unmarshal into Go value of type *errors.errorString at line 0 around position 0`, + }, + { + name: "case default", + arg: errors.New("test error"), + exp: `test error`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := rjr.HandleJSONError(tt.arg) + + if tt.exp != "" { + if err != nil { + if err.Error() != tt.exp { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } + } + }) + } +} diff --git a/engine/cgrsafev_test.go b/engine/cgrsafev_test.go new file mode 100644 index 000000000..de288bd89 --- /dev/null +++ b/engine/cgrsafev_test.go @@ -0,0 +1,55 @@ +/* +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 ( + "reflect" + "testing" + "time" + + "github.com/cgrates/cgrates/utils" +) + +func TestCGRSafEventNewCGRSafEventFromCGREventAsCGREvent(t *testing.T) { + tm := time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local) + cgrEv := &utils.CGREvent{ + Tenant: "test", + ID: "test", + Time: &tm, + Event: map[string]any{"test": 1}, + } + + exp := &CGRSafEvent{ + Tenant: cgrEv.Tenant, + ID: cgrEv.ID, + Time: cgrEv.Time, + Event: NewSafEvent(cgrEv.Event), + } + rcv := NewCGRSafEventFromCGREvent(cgrEv) + + if !reflect.DeepEqual(exp, rcv) { + t.Errorf("\nexpected: %s\nreceived: %s\n", utils.ToJSON(exp), utils.ToJSON(rcv)) + } + + rcv2 := rcv.AsCGREvent() + + if !reflect.DeepEqual(cgrEv, rcv2) { + t.Errorf("\nexpected: %s\nreceived: %s\n", utils.ToJSON(cgrEv), utils.ToJSON(rcv2)) + } +} diff --git a/engine/chargers_test.go b/engine/chargers_test.go index 4909c2d48..a1836980f 100644 --- a/engine/chargers_test.go +++ b/engine/chargers_test.go @@ -356,6 +356,21 @@ func TestChargerV1ProcessEvent(t *testing.T) { } +func TestChargersV1ProcessEvent(t *testing.T) { + cS := &ChargerService{} + args := &utils.CGREventWithArgDispatcher{} + + err := cS.V1ProcessEvent(args, nil) + + if err != nil { + if err.Error() != utils.NewErrMandatoryIeMissing("Event").Error() { + t.Error(err) + } + } else { + t.Error("was expecting an error") + } +} + // func TestChSListenAndServe(t *testing.T) { // cfg, _ := config.NewDefaultCGRConfig() // db := NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) diff --git a/engine/eventcost_test.go b/engine/eventcost_test.go index 84bf45b94..c6a20f9bf 100644 --- a/engine/eventcost_test.go +++ b/engine/eventcost_test.go @@ -3679,3 +3679,80 @@ func TestEventCostnewChargingIncrement(t *testing.T) { t.Errorf("expected %v, received %v", exp, rcv) } } + +func TestEventCostAsRefundIncrements(t *testing.T) { + str := "test" + td := 1 * time.Second + ec := &EventCost{ + CGRID: str, + RunID: str, + StartTime: time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local), + Usage: &td, + } + + rcv := ec.AsRefundIncrements(str) + exp := &CallDescriptor{ + CgrID: ec.CGRID, + RunID: ec.RunID, + ToR: str, + TimeStart: ec.StartTime, + TimeEnd: ec.StartTime.Add(ec.GetUsage()), + DurationIndex: ec.GetUsage(), + } + + if !reflect.DeepEqual(exp, rcv) { + t.Errorf("\nexpected: %s\nreceived: %s\n", utils.ToJSON(exp), utils.ToJSON(rcv)) + } +} + +func TestEventCostappendChargingIntervalFromEventCost(t *testing.T) { + str := "test" + td := 1 * time.Second + fl := 1.2 + str2 := "test2" + td2 := 2 * time.Millisecond + ec := &EventCost{ + CGRID: str, + RunID: str, + StartTime: time.Date(2021, 8, 15, 14, 30, 45, 100, time.Local), + Usage: &td, + Charges: []*ChargingInterval{{ + RatingID: str, + Increments: []*ChargingIncrement{{ + Usage: td, + Cost: fl, + AccountingID: str, + CompressFactor: 1, + }}, + CompressFactor: 1, + usage: &td, + ecUsageIdx: &td, + cost: &fl, + }, + }} + oEC := &EventCost{ + CGRID: str2, + RunID: str2, + StartTime: time.Date(2022, 8, 15, 14, 30, 45, 100, time.Local), + Usage: &td2, + Charges: []*ChargingInterval{{ + RatingID: str, + Increments: []*ChargingIncrement{{ + Usage: td, + Cost: fl, + AccountingID: str, + CompressFactor: 1, + }}, + CompressFactor: 1, + usage: &td, + ecUsageIdx: &td, + cost: &fl, + }}, + } + + ec.appendChargingIntervalFromEventCost(oEC, 0) + + if ec.Charges[0].CompressFactor != 2 { + t.Error("didn't append charging interval from event cost") + } +}