Tests - cdrc/RecordAsRatedCdr ratedcdr/AsRawCdrHttpForm

This commit is contained in:
DanB
2014-01-26 09:45:51 +01:00
parent 1bbe5a0a88
commit 21b4c10836
4 changed files with 91 additions and 42 deletions

View File

@@ -26,7 +26,6 @@ import (
"io"
"io/ioutil"
"net/http"
"net/url"
"os"
"path"
"strconv"
@@ -118,33 +117,8 @@ func (self *Cdrc) parseFieldsConfig() error {
}
// Takes the record out of csv and turns it into http form which can be posted
func (self *Cdrc) cdrAsHttpForm(record []string) (url.Values, error) {
// engine.Logger.Info(fmt.Sprintf("Processing record %v", record))
v := url.Values{}
v.Set(utils.CDRSOURCE, self.cgrCfg.CdrcSourceId)
for cfgFieldName, cfgFieldVal := range self.cfgCdrFields {
var fieldVal string
if strings.HasPrefix(cfgFieldVal, utils.STATIC_VALUE_PREFIX) {
fieldVal = cfgFieldVal[1:]
} else if utils.IsSliceMember([]string{CSV, FS_CSV}, self.cgrCfg.CdrcCdrType) {
if cfgFieldIdx, err := strconv.Atoi(cfgFieldVal); err != nil { // Should in theory never happen since we have already parsed config
return nil, err
} else if len(record) <= cfgFieldIdx {
return nil, fmt.Errorf("Ignoring record: %v - cannot extract field %s", record, cfgFieldName)
} else {
fieldVal = record[cfgFieldIdx]
}
} else { // Modify here when we add more supported cdr formats
fieldVal = "UNKNOWN"
}
v.Set(cfgFieldName, fieldVal)
}
return v, nil
}
// Takes the record out of csv and turns it into http form which can be posted
func (self *Cdrc) cdrAsRatedCdr(record []string) (*utils.RatedCDR, error) {
ratedCdr := &utils.RatedCDR{CdrSource: self.cgrCfg.CdrcSourceId}
func (self *Cdrc) recordAsRatedCdr(record []string) (*utils.RatedCDR, error) {
ratedCdr := &utils.RatedCDR{CdrSource: self.cgrCfg.CdrcSourceId, ExtraFields: map[string]string{}, Cost: -1}
var err error
for cfgFieldName, cfgFieldVal := range self.cfgCdrFields {
var fieldVal string
@@ -254,7 +228,7 @@ func (self *Cdrc) processFile(filePath string) error {
engine.Logger.Err(fmt.Sprintf("<Cdrc> Error in csv file: %s", err.Error()))
continue // Other csv related errors, ignore
}
rawCdr, err := self.cdrAsRatedCdr(record)
rawCdr, err := self.recordAsRatedCdr(record)
if err != nil {
engine.Logger.Err(fmt.Sprintf("<Cdrc> Error in csv file: %s", err.Error()))
continue

View File

@@ -21,7 +21,9 @@ package cdrc
import (
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
"reflect"
"testing"
"time"
)
func TestParseFieldsConfig(t *testing.T) {
@@ -54,29 +56,51 @@ func TestParseFieldsConfig(t *testing.T) {
}
}
func TestCdrAsHttpForm(t *testing.T) {
func TestRecordAsRatedCdr(t *testing.T) {
cgrConfig, _ := config.NewDefaultCGRConfig()
cgrConfig.CdrcExtraFields = []string{"supplier:10"}
cdrc := &Cdrc{cgrCfg: cgrConfig}
if err := cdrc.parseFieldsConfig(); err != nil {
t.Error("Failed parsing default fieldIndexesFromConfig", err)
}
cdrRow := []string{"firstField", "secondField"}
_, err := cdrc.cdrAsHttpForm(cdrRow)
_, err := cdrc.recordAsRatedCdr(cdrRow)
if err == nil {
t.Error("Failed to corectly detect missing fields from record")
}
cdrRow = []string{"acc1", "prepaid", "*out", "cgrates.org", "call", "1001", "1001", "+4986517174963", "2013-02-03 19:54:00", "62", "supplier1", "172.16.1.1"}
cdrAsForm, err := cdrc.cdrAsHttpForm(cdrRow)
rtCdr, err := cdrc.recordAsRatedCdr(cdrRow)
if err != nil {
t.Error("Failed to parse CDR in form", err)
t.Error("Failed to parse CDR in rated cdr", err)
}
if cdrAsForm.Get(utils.CDRSOURCE) != cgrConfig.CdrcSourceId {
t.Error("Unexpected cdrsource received", cdrAsForm.Get(utils.CDRSOURCE))
expectedCdr := &utils.RatedCDR{
CgrId: utils.FSCgrId(cdrRow[0]),
AccId: cdrRow[0],
CdrSource: cgrConfig.CdrcSourceId,
ReqType: cdrRow[1],
Direction: cdrRow[2],
Tenant: cdrRow[3],
TOR: cdrRow[4],
Account: cdrRow[5],
Subject: cdrRow[6],
Destination: cdrRow[7],
AnswerTime: time.Date(2013, 2, 3, 19, 54, 0, 0, time.UTC),
Duration: time.Duration(62) * time.Second,
ExtraFields: map[string]string{"supplier": "supplier1"},
Cost: -1,
}
if cdrAsForm.Get(utils.REQTYPE) != "prepaid" {
t.Error("Unexpected CDR value received", cdrAsForm.Get(utils.REQTYPE))
if !reflect.DeepEqual(expectedCdr, rtCdr) {
t.Errorf("Expected: \n%v, \nreceived: \n%v", expectedCdr, rtCdr)
}
//if cdrAsForm.Get("supplier") != "supplier1" {
// t.Error("Unexpected CDR value received", cdrAsForm.Get("supplier"))
//}
/*
if cdrAsForm.Get(utils.CDRSOURCE) != cgrConfig.CdrcSourceId {
t.Error("Unexpected cdrsource received", cdrAsForm.Get(utils.CDRSOURCE))
}
if cdrAsForm.Get(utils.REQTYPE) != "prepaid" {
t.Error("Unexpected CDR value received", cdrAsForm.Get(utils.REQTYPE))
}
if cdrAsForm.Get("supplier") != "supplier1" {
t.Error("Unexpected CDR value received", cdrAsForm.Get("supplier"))
}
*/
}

View File

@@ -19,8 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package utils
import (
"time"
"net/url"
"strconv"
"time"
)
func NewRatedCDRFromRawCDR(rawcdr RawCDR) (*RatedCDR, error) {
@@ -143,7 +144,7 @@ func (ratedCdr *RatedCDR) AsRawCdrHttpForm() url.Values {
v.Set(SUBJECT, ratedCdr.Subject)
v.Set(DESTINATION, ratedCdr.Destination)
v.Set(ANSWER_TIME, ratedCdr.AnswerTime.String())
//v.Set(DURATION, string(ratedCdr.Duration.Seconds()))
v.Set(DURATION, strconv.FormatFloat(ratedCdr.Duration.Seconds(), 'f', -1, 64))
for fld, val := range ratedCdr.ExtraFields {
v.Set(fld, val)
}

View File

@@ -98,3 +98,53 @@ func TestRatedCdrFields(t *testing.T) {
t.Error("Error parsing cdr: ", ratedCdr)
}
}
func TestAsRawCdrHttpForm(t *testing.T) {
ratedCdr := RatedCDR{CgrId: FSCgrId("dsafdsaf"), AccId: "dsafdsaf", CdrHost: "192.168.1.1", CdrSource: "test", ReqType: "rated", Direction: "*out", Tenant: "cgrates.org",
TOR: "call", Account: "1001", Subject: "1001", Destination: "1002", AnswerTime: time.Date(2013, 11, 7, 8, 42, 26, 0, time.UTC),
Duration: time.Duration(10) * time.Second, ExtraFields: map[string]string{"field_extr1": "val_extr1", "fieldextr2": "valextr2"}, Cost: 1.01,
}
cdrForm := ratedCdr.AsRawCdrHttpForm()
if cdrForm.Get(ACCID) != ratedCdr.AccId {
t.Errorf("Expected: %s, received: %s", ratedCdr.AccId, cdrForm.Get(ACCID))
}
if cdrForm.Get(CDRHOST) != ratedCdr.CdrHost {
t.Errorf("Expected: %s, received: %s", ratedCdr.CdrHost, cdrForm.Get(CDRHOST))
}
if cdrForm.Get(CDRSOURCE) != ratedCdr.CdrSource {
t.Errorf("Expected: %s, received: %s", ratedCdr.CdrSource, cdrForm.Get(CDRSOURCE))
}
if cdrForm.Get(REQTYPE) != ratedCdr.ReqType {
t.Errorf("Expected: %s, received: %s", ratedCdr.ReqType, cdrForm.Get(REQTYPE))
}
if cdrForm.Get(DIRECTION) != ratedCdr.Direction {
t.Errorf("Expected: %s, received: %s", ratedCdr.Direction, cdrForm.Get(DIRECTION))
}
if cdrForm.Get(TENANT) != ratedCdr.Tenant {
t.Errorf("Expected: %s, received: %s", ratedCdr.Tenant, cdrForm.Get(TENANT))
}
if cdrForm.Get(TOR) != ratedCdr.TOR {
t.Errorf("Expected: %s, received: %s", ratedCdr.TOR, cdrForm.Get(TOR))
}
if cdrForm.Get(ACCOUNT) != ratedCdr.Account {
t.Errorf("Expected: %s, received: %s", ratedCdr.Account, cdrForm.Get(ACCOUNT))
}
if cdrForm.Get(SUBJECT) != ratedCdr.Subject {
t.Errorf("Expected: %s, received: %s", ratedCdr.Subject, cdrForm.Get(SUBJECT))
}
if cdrForm.Get(DESTINATION) != ratedCdr.Destination {
t.Errorf("Expected: %s, received: %s", ratedCdr.Destination, cdrForm.Get(DESTINATION))
}
if cdrForm.Get(ANSWER_TIME) != "2013-11-07 08:42:26 +0000 UTC" {
t.Errorf("Expected: %s, received: %s", "2013-11-07 08:42:26 +0000 UTC", cdrForm.Get(ANSWER_TIME))
}
if cdrForm.Get(DURATION) != "10" {
t.Errorf("Expected: %s, received: %s", "10", cdrForm.Get(DURATION))
}
if cdrForm.Get("field_extr1") != ratedCdr.ExtraFields["field_extr1"] {
t.Errorf("Expected: %s, received: %s", ratedCdr.ExtraFields["field_extr1"], cdrForm.Get("field_extr1"))
}
if cdrForm.Get("fieldextr2") != ratedCdr.ExtraFields["fieldextr2"] {
t.Errorf("Expected: %s, received: %s", ratedCdr.ExtraFields["fieldextr2"], cdrForm.Get("fieldextr2"))
}
}