diff --git a/engine/attributes_test.go b/engine/attributes_test.go index 1a8a86fa4..068f94492 100644 --- a/engine/attributes_test.go +++ b/engine/attributes_test.go @@ -1010,6 +1010,75 @@ func TestAttributesParseAttributeSIPCID(t *testing.T) { } else if _, err = ParseAttribute(dp, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaSum, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaMultiply, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDivide, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaUnixTimestamp, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaDateTime, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaPrefix, "`val", config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaSuffix, "`val", config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, utils.MetaCCUsage, "`val", config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, "default", utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to;~*req.from", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{}, "default", utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12345"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils.InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12345", "extra": "1003"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "0", "extra": "1003"}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{}}, utils.MetaUsageDifference, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"extra": "1003", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "val", "extra": "1003", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12233", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12232", "extra": "val", "to": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12233", "extra": "1001"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } else if _, err = ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "12232", "extra": "1001", "to": "val"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err == nil { + t.Errorf("received <%+v>", err) + } + expDur := 100000 * time.Nanosecond + if val, err := ParseAttribute(utils.MapStorage{utils.MetaReq: utils.MapStorage{"cid": "1000", "extra": "100", "to": "100"}}, utils.MetaCCUsage, utils.EmptyString, config.NewRSRParsersMustCompile("~*req.cid;~*req.extra;~*req.to", utils. + InfieldSep), 0, utils.EmptyString, utils.EmptyString, utils.InfieldSep); err != nil { + t.Errorf("received <%+v>", err) + } else if val != expDur { + t.Errorf("expected %v,received %v", expDur, val) } } func TestAttributesParseAttributeSIPCIDWrongPathErr(t *testing.T) { @@ -1148,6 +1217,10 @@ func TestAttributesV1ProcessEventMultipleRuns1(t *testing.T) { t.Errorf("expected: <%+v>, \nreceived: <%+v>", utils.ToJSON(exp), utils.ToJSON(reply)) } } + + if err := alS.V1ProcessEvent(nil, reply); err == nil { + t.Error("expected error") + } } func TestAttributesV1ProcessEventMultipleRuns2(t *testing.T) { diff --git a/engine/calldesc_test.go b/engine/calldesc_test.go index b8a8a7831..5e6a610be 100644 --- a/engine/calldesc_test.go +++ b/engine/calldesc_test.go @@ -1931,8 +1931,29 @@ func TestCallDescriptorUpdateFromCGREvent(t *testing.T) { t.Error(err) } else if err = cd.UpdateFromCGREvent(cgrEv, []string{utils.Subject}); err == nil { t.Error(err) + } else if err = cd.UpdateFromCGREvent(cgrEv, []string{"Extra"}); err == nil { + t.Error(err) + } + cgrEv = &utils.CGREvent{ + Event: map[string]interface{}{ + "Extra": "Value", + }, + } + cd = &CallDescriptor{ + ExtraFields: map[string]string{ + "Extra": "Value", + }, + } + cdExpected = &CallDescriptor{ + ExtraFields: map[string]string{ + "Extra": "Value", + }, + } + if err = cd.UpdateFromCGREvent(cgrEv, []string{"Extra"}); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(cd, cdExpected) { + t.Errorf("expected %v ,received %v", utils.ToJSON(cd), utils.ToJSON(cdExpected)) } - } func TestCallDescriptorAsCGREvent(t *testing.T) { @@ -2523,5 +2544,4 @@ func TestValidateCallData(t *testing.T) { if err = cd.ValidateCallData(); err != nil { t.Error(err) } - } diff --git a/engine/task_test.go b/engine/task_test.go index b837674d5..0f7f10bcc 100644 --- a/engine/task_test.go +++ b/engine/task_test.go @@ -124,4 +124,17 @@ func TestTaskFieldAsString(t *testing.T) { if !reflect.DeepEqual(eOut, rcv) { t.Errorf("Expecting: %q, received: %q", eOut, rcv) } + if _, err = task.FieldAsString([]string{"default"}); err == nil { + t.Error(err) + } +} + +func TestTaskExecute(t *testing.T) { + + task := &Task{ + AccountID: "accID", + } + if err := task.Execute(&FilterS{}); err == nil { + t.Error(err) + } } diff --git a/engine/timespans_test.go b/engine/timespans_test.go index b14e27ae3..3bd138b5c 100644 --- a/engine/timespans_test.go +++ b/engine/timespans_test.go @@ -1969,6 +1969,14 @@ func TestMerge(t *testing.T) { } else if !tss1.Equal(eMergedTSS) { t.Errorf("Expecting: %+v, received: %+v", eMergedTSS, tss1) } + tss1.TimeEnd = time.Date(2015, 1, 9, 16, 20, 0, 0, time.UTC) + if merged := tss1.Merge(tss2); merged { + t.Error("expected false") + } + tss1.MatchedSubject = "match_subj1" + if merged := tss1.Merge(tss2); merged { + t.Error("expected false") + } } func TestIncrementClone(t *testing.T) { @@ -1993,3 +2001,163 @@ func TestIncrementClone(t *testing.T) { t.Errorf("Expecting %+v, received: %+v", utils.ToJSON(eOut), utils.ToJSON(clone)) } } + +func TestTimeSpansMerge(t *testing.T) { + + tss := &TimeSpans{ + { + CompressFactor: 4, + DurationIndex: 1 * time.Hour, + Cost: 12, + TimeStart: time.Date(2022, 12, 1, 18, 0, 0, 0, time.UTC), + TimeEnd: time.Date(2022, 12, 1, 19, 0, 0, 0, time.UTC), + Increments: Increments{ + &Increment{ + Duration: 2 * time.Minute, + Cost: 23.22, + }, + { + Duration: 5 * time.Minute, + Cost: 12.32, + }, + }, + RateInterval: &RateInterval{ + Timing: &RITiming{ + ID: "id", + Years: utils.Years{2, 1, 3}, + }, + Rating: &RIRate{ + ConnectFee: 12.11, + RoundingMethod: "method", + RoundingDecimals: 13, + MaxCost: 494, + }, + Weight: 2.3, + }, + MatchedSubject: "subject", + MatchedPrefix: "match_prefix", + MatchedDestId: "dest_id", + RatingPlanId: "rate_id", + }, + { + CompressFactor: 4, + DurationIndex: 1 * time.Hour, + Cost: 12, + TimeStart: time.Date(2022, 12, 1, 19, 0, 0, 0, time.UTC), + TimeEnd: time.Date(2022, 12, 1, 20, 0, 0, 0, time.UTC), + Increments: Increments{ + &Increment{ + Duration: 2 * time.Minute, + Cost: 23.22, + }, + { + Duration: 5 * time.Minute, + Cost: 12.32, + }, + }, + RateInterval: &RateInterval{ + Timing: &RITiming{ + ID: "id", + Years: utils.Years{2, 1, 3}, + }, + Rating: &RIRate{ + ConnectFee: 12.11, + RoundingMethod: "method", + RoundingDecimals: 13, + MaxCost: 494, + }, + Weight: 2.3, + }, + MatchedSubject: "subject", + MatchedPrefix: "match_prefix", + MatchedDestId: "dest_id", + RatingPlanId: "rate_id", + }, { + Cost: 11, + DurationIndex: 1 * time.Hour, + CompressFactor: 4, + TimeStart: time.Date(2022, 12, 1, 20, 0, 0, 0, time.UTC), + TimeEnd: time.Date(2022, 12, 1, 21, 0, 0, 0, time.UTC), + Increments: Increments{ + &Increment{ + Duration: 2 * time.Minute, + Cost: 23.22, + }, + { + Duration: 5 * time.Minute, + Cost: 12.32, + }, + }, + RateInterval: &RateInterval{ + Timing: &RITiming{ + ID: "id", + Years: utils.Years{2, 1, 3}, + }, + Rating: &RIRate{ + ConnectFee: 12.11, + RoundingMethod: "method", + RoundingDecimals: 13, + MaxCost: 494, + }, + Weight: 2.3, + }, + MatchedSubject: "subject", + MatchedPrefix: "match_prefix", + MatchedDestId: "dest_id", + RatingPlanId: "rate_id", + }, + } + expMerge := &TimeSpans{{ + CompressFactor: 4, + DurationIndex: 1 * time.Hour, + Cost: 35, + TimeStart: time.Date(2022, 12, 1, 18, 0, 0, 0, time.UTC), + TimeEnd: time.Date(2022, 12, 1, 21, 0, 0, 0, time.UTC), + Increments: Increments{ + { + Duration: 2 * time.Minute, + Cost: 23.22, + }, + { + Duration: 5 * time.Minute, + Cost: 12.32, + }, + { + Duration: 2 * time.Minute, + Cost: 23.22, + }, + { + Duration: 5 * time.Minute, + Cost: 12.32, + }, + { + Duration: 2 * time.Minute, + Cost: 23.22, + }, + { + Duration: 5 * time.Minute, + Cost: 12.32, + }, + }, + RateInterval: &RateInterval{ + Timing: &RITiming{ + ID: "id", + Years: utils.Years{2, 1, 3}, + }, + Rating: &RIRate{ + ConnectFee: 12.11, + RoundingMethod: "method", + RoundingDecimals: 13, + MaxCost: 494, + }, + Weight: 2.3, + }, + MatchedSubject: "subject", + MatchedPrefix: "match_prefix", + MatchedDestId: "dest_id", + RatingPlanId: "rate_id", + }} + if tss.Merge(); !reflect.DeepEqual(tss, expMerge) { + t.Errorf("expected %v ,recived %v", utils.ToJSON(expMerge), utils.ToJSON(tss)) + } +}