diff --git a/utils/coreutils_test.go b/utils/coreutils_test.go index c2b230194..b1a721d4a 100644 --- a/utils/coreutils_test.go +++ b/utils/coreutils_test.go @@ -1276,11 +1276,36 @@ func TestFFNNewFallbackFileNameFronString(t *testing.T) { } else if !reflect.DeepEqual(eFFN, ffn) { t.Errorf("Expecting: %+v, received: %+v", eFFN, ffn) } + fileName = "***|" + if _, err := NewFallbackFileNameFronString(fileName); err == nil || err.Error() != "unsupported module: ***" { + t.Error(err) + } + fileName = "act>*call_url|***|" + if _, err := NewFallbackFileNameFronString(fileName); err == nil || err.Error() != "unsupported transport in fallback file path: act>*call_url|***|" { + t.Error(err) + } + fileName = "act>*call_url|*http_json|***" + if _, err := NewFallbackFileNameFronString(fileName); err == nil || err.Error() != "cannot find request ID in fallback file path: act>*call_url|*http_json|***" { + t.Error(err) + } + fileName = "act>*call_url|*http_json|%|.json" + if _, err := NewFallbackFileNameFronString(fileName); err == nil || err.Error() != `invalid URL escape "%"` { + t.Error(err) + } + fileName = "act>*call_url|*http_json|http%3A%2F%2Flocalhost%3A2080%2Flog_warning|.test" + if _, err := NewFallbackFileNameFronString(fileName); err == nil || err.Error() != "unsupported suffix in fallback file path: act>*call_url|*http_json|http%3A%2F%2Flocalhost%3A2080%2Flog_warning|.test" { + t.Error(err) + } + } func TestFFNFallbackFileNameAsString(t *testing.T) { + ffn := &FallbackFileName{} + if rcv := ffn.AsString(); rcv != "|||" { + t.Errorf("Expecting |||, received: <%+q>", rcv) + } eFn := "cdr|*http_json_cdr|http%3A%2F%2F127.0.0.1%3A12080%2Finvalid_json|1acce2c9-3f2d-4774-8662-c28872dad515.json" - ffn := &FallbackFileName{ + ffn = &FallbackFileName{ Module: "cdr", Transport: MetaHTTPjsonCDR, Address: "http://127.0.0.1:12080/invalid_json", @@ -1290,3 +1315,58 @@ func TestFFNFallbackFileNameAsString(t *testing.T) { t.Errorf("Expecting: <%q>, received: <%q>", eFn, ffnStr) } } + +func TestReverseString(t *testing.T) { + if rcv := ReverseString(EmptyString); rcv != EmptyString { + t.Errorf("Expecting <%+q>, received: <%+q>", EmptyString, rcv) + } + if rcv := ReverseString("test"); rcv != "tset" { + t.Errorf("Expecting , received: <%+q>", rcv) + } +} + +func TestGetUrlRawArguments(t *testing.T) { + eOut := map[string]string{} + if rcv := GetUrlRawArguments(EmptyString); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } + if rcv := GetUrlRawArguments("test"); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } + if rcv := GetUrlRawArguments("test?"); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } + eOut = map[string]string{"test": "1"} + if rcv := GetUrlRawArguments("?test=1"); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } + eOut = map[string]string{"test": "1", "test2": "2"} + if rcv := GetUrlRawArguments("?test=1&test2=2"); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } + eOut = map[string]string{"test": "1", "test2": "2", EmptyString: "5"} + if rcv := GetUrlRawArguments("?test=1&test2=2&=5"); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } + eOut = map[string]string{"test": "1", "test2": "2"} + if rcv := GetUrlRawArguments("?test=1&test2=2&5"); !reflect.DeepEqual(rcv, eOut) { + t.Errorf("Expectinc: %+v, received: %+v", eOut, rcv) + } +} + +func TestWarnExecTime(t *testing.T) { + //without Log + WarnExecTime(time.Now(), "MyTestFunc", time.Duration(1*time.Second)) + //With Log + WarnExecTime(time.Now(), "MyTestFunc", time.Duration(1*time.Nanosecond)) +} + +func TestCastRPCErr(t *testing.T) { + err := errors.New("test") + if rcv := CastRPCErr(err); rcv != err { + t.Errorf("Expecting: %+q, received %+q", err, rcv) + } + if rcv := CastRPCErr(ErrNoMoreData); rcv.Error() != ErrNoMoreData.Error() { + t.Errorf("Expecting: %+v, received %+v", ErrNoMoreData.Error(), rcv) + } +} diff --git a/utils/dataconverter.go b/utils/dataconverter.go index 1fc3c20be..6e0f2cb77 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -48,8 +48,7 @@ type DataConverter interface { } // NewDataConverter is a factory of converters -func NewDataConverter(params string) ( - conv DataConverter, err error) { +func NewDataConverter(params string) (conv DataConverter, err error) { switch { case params == MetaDurationSeconds: return NewDurationSecondsConverter("") @@ -73,11 +72,12 @@ func NewDataConverter(params string) ( case params == MetaDuration: return NewDurationConverter("") case strings.HasPrefix(params, MetaLibPhoneNumber): + if len(params) == len(MetaLibPhoneNumber) { + return NewPhoneNumberConverter("") + } return NewPhoneNumberConverter(params[len(MetaLibPhoneNumber)+1:]) default: - return nil, - fmt.Errorf("unsupported converter definition: <%s>", - params) + return nil, fmt.Errorf("unsupported converter definition: <%s>", params) } } @@ -166,8 +166,7 @@ func (rnd *RoundConverter) Convert(in interface{}) ( return } -func NewMultiplyConverter(constructParams string) ( - hdlr DataConverter, err error) { +func NewMultiplyConverter(constructParams string) (hdlr DataConverter, err error) { if constructParams == "" { return nil, ErrMandatoryIeMissingNoCaps } diff --git a/utils/dataconverter_test.go b/utils/dataconverter_test.go index 2d2f99f98..1e1a00108 100644 --- a/utils/dataconverter_test.go +++ b/utils/dataconverter_test.go @@ -25,18 +25,128 @@ import ( "github.com/nyaruka/phonenumbers" ) +func TestDataConvertersConvertString(t *testing.T) { + dcs := &DataConverters{} + if rcv, err := dcs.ConvertString(EmptyString); err != nil { + t.Error(err) + } else if rcv != EmptyString { + t.Errorf("Expecting: <%+q>, received: <%+q>", EmptyString, rcv) + } + if rcv, err := dcs.ConvertString("test"); err != nil { + t.Error(err) + } else if rcv != "test" { + t.Errorf("Expecting: , received: <%+q>", rcv) + } +} + func TestNewDataConverter(t *testing.T) { a, err := NewDataConverter(MetaDurationSeconds) if err != nil { t.Error(err.Error()) } - b, err := NewDurationSecondsConverter("") + b, err := NewDurationSecondsConverter(EmptyString) if err != nil { t.Error(err.Error()) } if !reflect.DeepEqual(a, b) { t.Error("Error reflect") } + a, err = NewDataConverter(MetaDuration) + if err != nil { + t.Error(err) + } + b, err = NewDurationConverter(EmptyString) + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + a, err = NewDataConverter(MetaDurationNanoseconds) + if err != nil { + t.Error(err) + } + b, err = NewDurationNanosecondsConverter(EmptyString) + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + a, err = NewDataConverter(MetaRound) + if err != nil { + t.Error(err) + } + b, err = NewRoundConverter(EmptyString) + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + a, err = NewDataConverter("*round:07") + if err != nil { + t.Error(err) + } + b, err = NewRoundConverter("7") + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + if a, err = NewDataConverter(MetaMultiply); err == nil || err != ErrMandatoryIeMissingNoCaps { + t.Error(err) + } + a, err = NewDataConverter("*multiply:3.3") + if err != nil { + t.Error(err) + } + b, err = NewMultiplyConverter("3.3") + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + if a, err = NewDataConverter(MetaDivide); err == nil || err != ErrMandatoryIeMissingNoCaps { + t.Error(err) + } + a, err = NewDataConverter("*divide:3.3") + if err != nil { + t.Error(err) + } + b, err = NewDivideConverter("3.3") + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + if a, err = NewDataConverter(MetaLibPhoneNumber); err == nil || err.Error() != "unsupported *libphonenumber converter parameters: <>" { + t.Error(err) + } + a, err = NewDataConverter("*libphonenumber:US") + if err != nil { + t.Error(err) + } + b, err = NewPhoneNumberConverter("US") + if err != nil { + t.Error(err) + } + if !reflect.DeepEqual(a, b) { + t.Error("Error reflect") + } + if _, err := NewDataConverter("unsupported"); err == nil || err.Error() != "unsupported converter definition: " { + } + +} + +func TestNewDataConverterMustCompile(t *testing.T) { + eOut, _ := NewDataConverter(MetaDurationSeconds) + if rcv := NewDataConverterMustCompile(MetaDurationSeconds); rcv != eOut { + t.Errorf("Expecting: received: %+q", rcv) + } } func TestConvertFloatToSeconds(t *testing.T) { @@ -199,6 +309,9 @@ func TestDivideConverter(t *testing.T) { } else if !reflect.DeepEqual(expOut, out) { t.Errorf("expecting: %+v, received: %+v", expOut, out) } + if _, err := eDvd.Convert("strionmg"); err == nil || err.Error() != `strconv.ParseFloat: parsing "strionmg": invalid syntax` { + t.Error(err) + } } func TestDurationConverter(t *testing.T) {