From 9adacc8a54226b9911ff52df7daa795105d4b2d5 Mon Sep 17 00:00:00 2001 From: andronache Date: Thu, 29 Apr 2021 17:10:58 +0300 Subject: [PATCH] Implemented *datetime type in AgentRequest and EventRequest and added tests for them --- agents/agentreq.go | 11 +++++++ agents/agentreq_test.go | 59 +++++++++++++++++++++++++++++++++++++ engine/eventrequest.go | 11 +++++++ engine/eventrequest_test.go | 58 ++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 engine/eventrequest_test.go diff --git a/agents/agentreq.go b/agents/agentreq.go index 707fd772f..0b47eb23b 100644 --- a/agents/agentreq.go +++ b/agents/agentreq.go @@ -461,6 +461,17 @@ func (ar *AgentRequest) ParseField( return } out = strconv.Itoa(int(t1.Unix())) + case utils.MetaDateTime: // Convert the requested field value into datetime with layout + var val string + if val, err = cfgFld.Value.ParseDataProvider(ar); err != nil { + return + } + var dtFld time.Time + dtFld, err = utils.ParseTimeDetectLayout(val, utils.FirstNonEmpty(cfgFld.Timezone, config.CgrConfig().GeneralCfg().DefaultTimezone)) + if err != nil { + return + } + out = dtFld.Format(cfgFld.Layout) } if err != nil && diff --git a/agents/agentreq_test.go b/agents/agentreq_test.go index a1a9429be..ab666a610 100644 --- a/agents/agentreq_test.go +++ b/agents/agentreq_test.go @@ -2190,3 +2190,62 @@ func TestAgReqSetFieldsFromCfg(t *testing.T) { } } + +func TestFieldAsInterface(t *testing.T) { + fldPath := []string{utils.MetaOpts, utils.AccountField} + ar := &AgentRequest{ + Request: nil, + Vars: &utils.DataNode{}, + CGRRequest: &utils.OrderedNavigableMap{}, + diamreq: nil, + tmp: &utils.DataNode{}, + Opts: utils.MapStorage{ + utils.AccountField: "Field1", + }, + } + + rcv, err := ar.FieldAsInterface(fldPath) + rcvExpect := ar.Opts[utils.AccountField] + if err != nil { + t.Error(err) + } else if rcv != rcvExpect { + t.Errorf("Expected %v but received %v", rcvExpect, rcv) + } + + //default case + fldPath = []string{utils.MetaNone} + _, err = ar.FieldAsInterface(fldPath) + errExpect := "unsupported field prefix: <*none>" + if err == nil || err.Error() != errExpect { + t.Errorf("Expected %v but received %v", errExpect, err) + } +} + +func TestAgentRequestParseFieldDateTime(t *testing.T) { + tntTpl := config.NewRSRParsersMustCompile("*daily", utils.InfieldSep) + AgentReq := NewAgentRequest(utils.MapStorage{}, nil, nil, nil, nil, tntTpl, "", "", nil, nil, nil) + fctTemp := &config.FCTemplate{ + Type: utils.MetaDateTime, + Value: config.NewRSRParsersMustCompile("*daily", utils.InfieldSep), + Layout: "“Mon Jan _2 15:04:05 2006”", + Timezone: "", + } + + result, err := AgentReq.ParseField(fctTemp) + if err != nil { + t.Errorf("Expected %v but received %v", nil, err) + } + + expected, err := utils.ParseTimeDetectLayout("*daily", utils.FirstNonEmpty(fctTemp.Timezone, config.CgrConfig().GeneralCfg().DefaultTimezone)) + if err != nil { + t.Errorf("Expected %v but received %v", nil, err) + } + strRes := fmt.Sprintf("%v", result) + finRes, err := time.Parse("“Mon Jan _2 15:04:05 2006”", strRes) + if err != nil { + t.Errorf("Expected %v but received %v", nil, err) + } + if !reflect.DeepEqual(finRes.Day(), expected.Day()) { + t.Errorf("Expected %v but received %v", finRes.Day(), expected.Day()) + } +} diff --git a/engine/eventrequest.go b/engine/eventrequest.go index cd235f90e..47ea03482 100644 --- a/engine/eventrequest.go +++ b/engine/eventrequest.go @@ -332,6 +332,17 @@ func (eeR *EventRequest) ParseField( return } out = strconv.Itoa(int(t1.Unix())) + case utils.MetaDateTime: // Convert the requested field value into datetime with layout + var val string + if val, err = cfgFld.Value.ParseDataProvider(eeR); err != nil { + return + } + var dtFld time.Time + dtFld, err = utils.ParseTimeDetectLayout(val, utils.FirstNonEmpty(cfgFld.Timezone, config.CgrConfig().GeneralCfg().DefaultTimezone)) + if err != nil { + return + } + out = dtFld.Format(cfgFld.Layout) case utils.MetaMaskedDestination: //check if we have destination in the event var dst string diff --git a/engine/eventrequest_test.go b/engine/eventrequest_test.go new file mode 100644 index 000000000..ace86336d --- /dev/null +++ b/engine/eventrequest_test.go @@ -0,0 +1,58 @@ +/* +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 ( + "fmt" + "reflect" + "testing" + "time" + + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/utils" +) + +func TestAgentRequestParseFieldDateTime(t *testing.T) { + tntTpl := config.NewRSRParsersMustCompile("*daily", utils.InfieldSep) + AgentReq := NewEventRequest(utils.MapStorage{}, nil, nil, tntTpl, "", "", nil, nil) + fctTemp := &config.FCTemplate{ + Type: utils.MetaDateTime, + Value: config.NewRSRParsersMustCompile("*daily", utils.InfieldSep), + Layout: "“Mon Jan _2 15:04:05 2006”", + Timezone: "", + } + + result, err := AgentReq.ParseField(fctTemp) + if err != nil { + t.Errorf("Expected %v but received %v", nil, err) + } + + expected, err := utils.ParseTimeDetectLayout("*daily", utils.FirstNonEmpty(fctTemp.Timezone, config.CgrConfig().GeneralCfg().DefaultTimezone)) + if err != nil { + t.Errorf("Expected %v but received %v", nil, err) + } + strRes := fmt.Sprintf("%v", result) + finRes, err := time.Parse("“Mon Jan _2 15:04:05 2006”", strRes) + if err != nil { + t.Errorf("Expected %v but received %v", nil, err) + } + if !reflect.DeepEqual(finRes.Day(), expected.Day()) { + t.Errorf("Expected %v but received %v", expected, result) + } +}