From 99e7623f51475e4ebf42e20ec8eeeb143c3ef11b Mon Sep 17 00:00:00 2001 From: porosnicuadrian Date: Thu, 26 Nov 2020 11:21:04 +0200 Subject: [PATCH] Tests in rates directory + updated computeRateSIntervals function --- engine/rateprofile.go | 2 +- rates/librates.go | 18 +---- rates/librates_test.go | 167 ++++++++++++++++++++++++++++++++++------- 3 files changed, 145 insertions(+), 42 deletions(-) diff --git a/engine/rateprofile.go b/engine/rateprofile.go index 99dd453e4..8999b4221 100644 --- a/engine/rateprofile.go +++ b/engine/rateprofile.go @@ -236,7 +236,7 @@ func (rIv *RateSInterval) CompressEquals(rIv2 *RateSInterval) (eq bool) { return } } - return + return true } func (rIv *RateSInterval) Cost() *decimal.Big { diff --git a/rates/librates.go b/rates/librates.go index 5da4f9913..468c8e0e8 100644 --- a/rates/librates.go +++ b/rates/librates.go @@ -202,12 +202,9 @@ func computeRateSIntervals(rts []*orderedRate, intervalStart, usage time.Duratio break } // make sure we bill from start - if iRt.IntervalStart > iRtUsageSIdx { - if j == 0 { - return nil, fmt.Errorf("intervalStart for rate: <%s> higher than usage: %v", - rt.UID(), iRtUsageSIdx) - } - break // we are pass the start + if iRt.IntervalStart > iRtUsageSIdx && j == 0 { + return nil, fmt.Errorf("intervalStart for rate: <%s> higher than usage: %v", + rt.UID(), iRtUsageSIdx) } isLastIRt := j == len(rt.IntervalRates)-1 if !isLastIRt && rt.IntervalRates[j+1].IntervalStart <= iRtUsageSIdx { @@ -220,9 +217,6 @@ func computeRateSIntervals(rts []*orderedRate, intervalStart, usage time.Duratio } else { iRtUsageEIdx = rt.IntervalRates[j+1].IntervalStart } - if iRtUsageEIdx == time.Duration(0) { - return nil, fmt.Errorf("zero usage to be charged with rate: <%s>", rt.UID()) - } if iRt.Increment == time.Duration(0) { return nil, fmt.Errorf("zero increment to be charged within rate: <%s>", rt.UID()) } @@ -249,11 +243,7 @@ func computeRateSIntervals(rts []*orderedRate, intervalStart, usage time.Duratio CompressFactor: cmpFactor, Usage: iRtUsage, } - if len(rIcmts) != 0 && rIcrm.CompressEquals(rIcmts[len(rIcmts)-1]) { - rIcmts[len(rIcmts)-1].CompressFactor += rIcrm.CompressFactor - } else { - rIcmts = append(rIcmts, rIcrm) - } + rIcmts = append(rIcmts, rIcrm) iRtUsageSIdx += iRtUsage } diff --git a/rates/librates_test.go b/rates/librates_test.go index 959882fea..1ee2cd31b 100644 --- a/rates/librates_test.go +++ b/rates/librates_test.go @@ -1593,7 +1593,6 @@ func TestComputeRateSIntervals(t *testing.T) { }, }, } - rt0.Compile() rt1 := &engine.Rate{ ID: "RATE1", @@ -1612,7 +1611,18 @@ func TestComputeRateSIntervals(t *testing.T) { }, }, } - rt1.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt0.ID: rt0, + rt1.ID: rt1, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } rts := []*orderedRate{ { @@ -1746,7 +1756,6 @@ func TestComputeRateSIntervals1(t *testing.T) { }, }, } - rt0.Compile() rt1 := &engine.Rate{ ID: "RATE1", @@ -1765,7 +1774,18 @@ func TestComputeRateSIntervals1(t *testing.T) { }, }, } - rt1.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt0.ID: rt0, + rt1.ID: rt1, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -1839,7 +1859,6 @@ func TestComputeRateSIntervalsWIthFixedFee(t *testing.T) { }, }, } - rt0.Compile() rt1 := &engine.Rate{ ID: "RATE1", @@ -1859,7 +1878,18 @@ func TestComputeRateSIntervalsWIthFixedFee(t *testing.T) { }, }, } - rt1.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt0.ID: rt0, + rt1.ID: rt1, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -2070,7 +2100,6 @@ func TestComputeRateSIntervalsEvery30Seconds(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -2095,7 +2124,19 @@ func TestComputeRateSIntervalsEvery30Seconds(t *testing.T) { }, }, } - rt1.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + }, + } + err := rp.Compile() + if err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -2223,7 +2264,6 @@ func TestComputeRateSIntervalsStartHigherThanUsage(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -2236,7 +2276,19 @@ func TestComputeRateSIntervalsStartHigherThanUsage(t *testing.T) { }, }, } - rt2.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } + ordRts := []*orderedRate{ { 0, @@ -2244,9 +2296,9 @@ func TestComputeRateSIntervalsStartHigherThanUsage(t *testing.T) { }, } - expected := "intervalStart for rate: <> higher than usage: 0s" + expected := "intervalStart for rate: higher than usage: 0s" if _, err := computeRateSIntervals(ordRts, 0, 3*time.Minute); err == nil || err.Error() != expected { - t.Errorf("Expected %+v, \nreceived %+v", expected, err) + t.Errorf("Expected %+v, \nreceived %+q", expected, err) } } @@ -2350,7 +2402,6 @@ func TestComputeRateSIntervalsSwitchingRates(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -2369,7 +2420,6 @@ func TestComputeRateSIntervalsSwitchingRates(t *testing.T) { }, }, } - rt2.Compile() rt3 := &engine.Rate{ ID: "RATE3", @@ -2388,7 +2438,19 @@ func TestComputeRateSIntervalsSwitchingRates(t *testing.T) { }, }, } - rt3.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + rt3.ID: rt3, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -2503,7 +2565,6 @@ func TestComputeRatesIntervalsAllInOne(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -2522,7 +2583,6 @@ func TestComputeRatesIntervalsAllInOne(t *testing.T) { }, }, } - rt2.Compile() rt3 := &engine.Rate{ ID: "RATE3", @@ -2535,7 +2595,20 @@ func TestComputeRatesIntervalsAllInOne(t *testing.T) { }, }, } - rt3.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + rt3.ID: rt3, + }, + } + err := rp.Compile() + if err != nil { + t.Fatal(err) + } ordRates := []*orderedRate{ { @@ -2656,7 +2729,6 @@ func TestOrderRatesIntervalsFullDay(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -2675,7 +2747,6 @@ func TestOrderRatesIntervalsFullDay(t *testing.T) { }, }, } - rt1.Compile() rtGH := &engine.Rate{ ID: "RATE_GOLDEN_HOUR", @@ -2694,7 +2765,19 @@ func TestOrderRatesIntervalsFullDay(t *testing.T) { }, }, } - rtGH.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFIOLE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + rtGH.ID: rtGH, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -2822,7 +2905,6 @@ func TestComputeRatesIntervalsEveryTwoSeconds(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -2847,7 +2929,18 @@ func TestComputeRatesIntervalsEveryTwoSeconds(t *testing.T) { }, }, } - rt2.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -2982,7 +3075,6 @@ func TestComputeRateSIntervalsOneHourRate(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -3007,7 +3099,18 @@ func TestComputeRateSIntervalsOneHourRate(t *testing.T) { }, }, } - rt2.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ { @@ -3105,7 +3208,6 @@ func TestComputeRateSIntervalsCompressIncrements(t *testing.T) { }, }, } - rt1.Compile() rt2 := &engine.Rate{ ID: "RATE2", @@ -3124,7 +3226,18 @@ func TestComputeRateSIntervalsCompressIncrements(t *testing.T) { }, }, } - rt2.Compile() + + rp := &engine.RateProfile{ + Tenant: "cgrates.org", + ID: "RATE_PROFILE", + Rates: map[string]*engine.Rate{ + rt1.ID: rt1, + rt2.ID: rt2, + }, + } + if err := rp.Compile(); err != nil { + t.Fatal(err) + } ordRts := []*orderedRate{ {