From 323646602c5ad74c033d03a98edb8acd6f663318 Mon Sep 17 00:00:00 2001 From: nickolasdaniel Date: Tue, 8 Jun 2021 11:53:12 +0300 Subject: [PATCH] Finished unit testing in config --- config/configsanity.go | 3 +- config/configsanity_test.go | 81 +++++++++++++++++++++++++++++++++++++ config/erscfg_test.go | 60 ++++++++++++++++++++++++--- config/objdp_test.go | 29 +++++++++++++ 4 files changed, 167 insertions(+), 6 deletions(-) diff --git a/config/configsanity.go b/config/configsanity.go index e6ccea23b..55967d7c4 100644 --- a/config/configsanity.go +++ b/config/configsanity.go @@ -646,7 +646,8 @@ func (cfg *CGRConfig) checkConfigSanity() error { utils.IfaceAsString(fldSep) == utils.EmptyString { return fmt.Errorf("<%s> empty %s for reader with ID: %s", utils.ERs, utils.PartialOrderFieldOpt, rdr.ID) } - } else if pAct == utils.MetaDumpToFile { // only if the action is *dump_to_file + } + if pAct == utils.MetaDumpToFile { // only if the action is *dump_to_file if path, has := rdr.Opts[utils.PartialPathOpt]; has { // the path from options needs to exists if overwriten by reader if _, err := os.Stat(utils.IfaceAsString(path)); err != nil && os.IsNotExist(err) { return fmt.Errorf("<%s> nonexistent partial folder: %s for reader with ID: %s", utils.ERs, path, rdr.ID) diff --git a/config/configsanity_test.go b/config/configsanity_test.go index 0f90e834a..bc57b0bc6 100644 --- a/config/configsanity_test.go +++ b/config/configsanity_test.go @@ -1772,3 +1772,84 @@ func TestConfigSanityFilterS(t *testing.T) { t.Errorf("Expecting: %+q received: %+q", expected, err) } } + +func TestConfigSanityErs(t *testing.T) { + cfg = NewDefaultCGRConfig() + cfg.ersCfg.Enabled = true + + expected := " wrong partial expiry action" + cfg.ersCfg.PartialCacheAction = utils.MetaAny + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.PartialCacheAction = utils.MetaNone + cfg.ersCfg.PartialPath = "test" + expected = " nonexistent partial folder: test" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.PartialPath = utils.EmptyString + cfg.ersCfg.SessionSConns = []string{} + cfg.ersCfg.PartialCacheAction = utils.MetaPostCDR + cfg.ersCfg.Readers = []*EventReaderCfg{ + { + Type: utils.MetaNone, + ID: "rdrID", + Opts: map[string]interface{}{ + utils.PartialCacheActionOpt: utils.MetaAny, + }, + }, + } + expected = " wrong partial expiry action for reader with ID: rdrID" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.Readers[0].Opts = map[string]interface{}{ + utils.PartialOrderFieldOpt: utils.EmptyString, + } + cfg.ersCfg.PartialCacheAction = utils.MetaPostCDR + expected = " empty partialOrderField for reader with ID: rdrID" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.PartialCacheAction = utils.MetaDumpToFile + cfg.ersCfg.Readers[0].Opts = map[string]interface{}{ + utils.PartialOrderFieldOpt: "non_empty", + utils.PartialPathOpt: "path", + } + expected = " nonexistent partial folder: path for reader with ID: rdrID" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.Readers[0].Opts = map[string]interface{}{ + utils.PartialCSVFieldSepartorOpt: utils.EmptyString, + } + expected = " empty partialcsvFieldSeparator for reader with ID: rdrID" + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.Readers[0].Type = utils.MetaFileCSV + cfg.ersCfg.Readers[0].ProcessedPath = utils.EmptyString + cfg.ersCfg.Readers[0].SourcePath = "/tmp" + cfg.ersCfg.Readers[0].ID = utils.MetaDefault + cfg.ersCfg.Readers[0].Opts = map[string]interface{}{ + utils.CSVRowLengthOpt: "can't convert", + utils.CSVLazyQuotes: "can't convert", + } + expected = ` error when converting csvRowLength: for reader with ID: *default` + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } + + cfg.ersCfg.Readers[0].Opts[utils.CSVRowLengthOpt] = "2" + expected = ` error when converting csvLazyQuotes: for reader with ID: *default` + if err := cfg.checkConfigSanity(); err == nil || err.Error() != expected { + t.Errorf("Expected %v \n but received \n %v", expected, err) + } +} diff --git a/config/erscfg_test.go b/config/erscfg_test.go index c5c36316c..48b7c4629 100644 --- a/config/erscfg_test.go +++ b/config/erscfg_test.go @@ -53,6 +53,13 @@ func TestERSClone(t *testing.T) { "cache_dump_fields": [ {"tag": "ToR", "path": "*cgreq.ToR", "type": "*variable", "value": "~*req.2", "mandatory": true}, ], + "partial_commit_fields": [{ + "mandatory": true, + "path": "*cgreq.ToR", + "tag": "ToR", + "type": "*variable", + "value": "~*req.2" + }], "failed_calls_prefix": "randomPrefix", "partial_record_cache": "1s", "partial_cache_expiry_action": "randomAction", @@ -130,7 +137,16 @@ func TestERSClone(t *testing.T) { {Tag: utils.ToR, Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, Type: utils.MetaVariable, Value: NewRSRParsersMustCompile("~*req.2", utils.InfieldSep), Mandatory: true, Layout: time.RFC3339}, }, - PartialCommitFields: make([]*FCTemplate, 0), + PartialCommitFields: []*FCTemplate{ + { + Type: utils.MetaVariable, + Value: NewRSRParsersMustCompile("~*req.2", utils.InfieldSep), + Tag: utils.ToR, + Path: utils.MetaCgreq + utils.NestingSep + utils.ToR, + Mandatory: true, + Layout: time.RFC3339, + }, + }, Opts: map[string]interface{}{ utils.MetaDefault: "randomVal", "csvFieldSeparator": ",", @@ -151,6 +167,9 @@ func TestERSClone(t *testing.T) { for _, v := range profile.CacheDumpFields { v.ComputePath() } + for _, v := range profile.PartialCommitFields { + v.ComputePath() + } } if jsonCfg, err := NewCGRConfigFromJSONStringWithDefaults(cfgJSONStr); err != nil { t.Error(err) @@ -1015,8 +1034,15 @@ func TestERSCfgAsMapInterfaceCase2(t *testing.T) { "partial_record_cache": "1s", "processed_path": "/tmp/ers/out", "cache_dump_fields": [ - {"tag": "ToR", "path": "*cgreq.ToR", "type": "*variable", "value": "~*req.2", "mandatory": true} + {"tag": "ToR", "path": "*cgreq.ToR", "type": "*variable", "value": "~*req.2", "mandatory": true} ], + "partial_commit_fields": [{ + "mandatory": true, + "path": "*cgreq.ToR", + "tag": "ToR", + "type": "*variable", + "value": "~*req.2" + }], "opts":{ "kafkaGroupID": "test", }, @@ -1066,9 +1092,17 @@ func TestERSCfgAsMapInterfaceCase2(t *testing.T) { utils.CacheDumpFieldsCfg: []map[string]interface{}{ {utils.MandatoryCfg: true, utils.PathCfg: "*cgreq.ToR", utils.TagCfg: "ToR", utils.TypeCfg: "*variable", utils.ValueCfg: "~*req.2"}, }, - utils.PartialCommitFieldsCfg: []map[string]interface{}{}, - utils.ConcurrentRequestsCfg: 1024, - utils.TypeCfg: "*file_csv", + utils.PartialCommitFieldsCfg: []map[string]interface{}{ + { + "mandatory": true, + "path": "*cgreq.ToR", + "tag": "ToR", + "type": "*variable", + "value": "~*req.2", + }, + }, + utils.ConcurrentRequestsCfg: 1024, + utils.TypeCfg: "*file_csv", utils.FieldsCfg: []map[string]interface{}{ {utils.MandatoryCfg: true, utils.PathCfg: "*cgreq.ToR", utils.TagCfg: "ToR", utils.TypeCfg: "*variable", utils.ValueCfg: "~*req.2"}, {utils.MandatoryCfg: true, utils.PathCfg: "*cgreq.OriginID", utils.TagCfg: "OriginID", utils.TypeCfg: "*variable", utils.ValueCfg: "~*req.3"}, @@ -1371,6 +1405,14 @@ func TestDiffEventReaderJsonCfg(t *testing.T) { Value: utils.StringPointer("~*req.3"), }, }, + Partial_commit_fields: &[]*FcTemplateJsonCfg{ + { + Tag: utils.StringPointer("ToR3"), + Path: utils.StringPointer("*cgreq.ToR3"), + Type: utils.StringPointer(utils.MetaTemplate), + Value: utils.StringPointer("~*req.4"), + }, + }, } expected = &EventReaderJsonCfg{ @@ -1391,6 +1433,14 @@ func TestDiffEventReaderJsonCfg(t *testing.T) { Value: utils.StringPointer("~*req.3"), }, }, + Partial_commit_fields: &[]*FcTemplateJsonCfg{ + { + Tag: utils.StringPointer("ToR3"), + Path: utils.StringPointer("*cgreq.ToR3"), + Type: utils.StringPointer(utils.MetaTemplate), + Value: utils.StringPointer("~*req.4"), + }, + }, } rcv = diffEventReaderJsonCfg(d, v1, v2, ";") if !reflect.DeepEqual(rcv, expected) { diff --git a/config/objdp_test.go b/config/objdp_test.go index 1a8821955..04230f5c2 100644 --- a/config/objdp_test.go +++ b/config/objdp_test.go @@ -204,3 +204,32 @@ func TestFieldAsInterfaceObjDPMultiplePaths(t *testing.T) { t.Errorf("Expected %+v, received %+v", "1", rcv) } } + +func TestFieldAsInterface(t *testing.T) { + type aNewStruct struct { + Field1 int + Field2 int + } + type pNewStruct struct { + Field3 aNewStruct + Field4 int + Field5 []string + } + objDp := &ObjectDP{ + obj: pNewStruct{ + Field3: aNewStruct{ + Field1: 2, + Field2: 4, + }, + Field4: 2, + Field5: []string{""}, + }, + cache: map[string]interface{}{ + "field1": nil, + }, + } + _, err := objDp.FieldAsInterface([]string{"field1"}) + if err == nil || err != utils.ErrNotFound { + t.Error(err) + } +}