From 1b443b5abb8df1db65dd489793845f163d83fe95 Mon Sep 17 00:00:00 2001 From: nickolasdaniel Date: Fri, 19 Mar 2021 17:09:38 +0200 Subject: [PATCH] Coverage tests for ees --- ees/sql.go | 29 +++++++++----- ees/sql_test.go | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 10 deletions(-) diff --git a/ees/sql.go b/ees/sql.go index badb8295b..c0d5ffd6a 100644 --- a/ees/sql.go +++ b/ees/sql.go @@ -34,33 +34,30 @@ import ( "github.com/cgrates/cgrates/utils" ) -func NewSQLEe(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.FilterS, - dc utils.MapStorage) (sqlEe *SQLEe, err error) { - sqlEe = &SQLEe{id: cgrCfg.EEsCfg().Exporters[cfgIdx].ID, - cgrCfg: cgrCfg, cfgIdx: cfgIdx, filterS: filterS, dc: dc} - +func (sqlEe *SQLEe) NewSQLEeUrl(cgrCfg *config.CGRConfig) (dialect gorm.Dialector, err error) { var u *url.URL - if u, err = url.Parse(strings.TrimPrefix(cgrCfg.EEsCfg().Exporters[cfgIdx].ExportPath, utils.Meta)); err != nil { + // var err error + if u, err = url.Parse(strings.TrimPrefix(cgrCfg.EEsCfg().Exporters[0].ExportPath, utils.Meta)); err != nil { return } password, _ := u.User.Password() dbname := utils.SQLDefaultDBName - if vals, has := cgrCfg.EEsCfg().Exporters[cfgIdx].Opts[utils.SQLDBName]; has { + if vals, has := cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLDBName]; has { dbname = utils.IfaceAsString(vals) } ssl := utils.SQLDefaultSSLMode - if vals, has := cgrCfg.EEsCfg().Exporters[cfgIdx].Opts[utils.SQLSSLMode]; has { + if vals, has := cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLSSLMode]; has { ssl = utils.IfaceAsString(vals) } // tableName is mandatory in opts - if iface, has := cgrCfg.EEsCfg().Exporters[cfgIdx].Opts[utils.SQLTableName]; !has { + if iface, has := cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLTableName]; !has { return nil, utils.NewErrMandatoryIeMissing(utils.SQLTableName) } else { sqlEe.tableName = utils.IfaceAsString(iface) } - var dialect gorm.Dialector + // var dialect gorm.Dialector switch u.Scheme { case utils.MySQL: dialect = mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&loc=Local&parseTime=true&sql_mode='ALLOW_INVALID_DATES'", @@ -70,6 +67,18 @@ func NewSQLEe(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.FilterS, default: return nil, fmt.Errorf("db type <%s> not supported", u.Scheme) } + return +} + +func NewSQLEe(cgrCfg *config.CGRConfig, cfgIdx int, filterS *engine.FilterS, + dc utils.MapStorage) (sqlEe *SQLEe, err error) { + sqlEe = &SQLEe{id: cgrCfg.EEsCfg().Exporters[cfgIdx].ID, + cgrCfg: cgrCfg, cfgIdx: cfgIdx, filterS: filterS, dc: dc} + + dialect, err := sqlEe.NewSQLEeUrl(cgrCfg) + if err != nil { + return + } var db *gorm.DB if db, err = gorm.Open(dialect, &gorm.Config{AllowGlobalUpdate: true}); err != nil { return diff --git a/ees/sql_test.go b/ees/sql_test.go index e9092732b..9193d8d10 100644 --- a/ees/sql_test.go +++ b/ees/sql_test.go @@ -19,10 +19,15 @@ along with this program. If not, see package ees import ( + "fmt" "reflect" "testing" + "github.com/cgrates/cgrates/config" + "github.com/cgrates/cgrates/engine" "github.com/cgrates/cgrates/utils" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" ) func TestSqlID(t *testing.T) { @@ -50,3 +55,102 @@ func TestSqlGetMetrics(t *testing.T) { t.Errorf("Expected %+v but got %+v", utils.ToJSON(rcv), utils.ToJSON(sqlEe.dc)) } } + +func TestNewSQLeUrl(t *testing.T) { + cgrCfg := config.NewDefaultCGRConfig() + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLTableName] = "expTable" + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLDBName] = "postgres" + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLSSLMode] = "test" + newIDb := engine.NewInternalDB(nil, nil, true) + newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil) + filterS := engine.NewFilterS(cgrCfg, nil, newDM) + dc, err := newEEMetrics(utils.FirstNonEmpty( + "Local", + utils.EmptyString, + )) + if err != nil { + t.Error(err) + } + sqlEe := &SQLEe{id: cgrCfg.EEsCfg().Exporters[0].ID, + cgrCfg: cgrCfg, cfgIdx: 0, filterS: filterS, dc: dc} + _, err = sqlEe.NewSQLEeUrl(cgrCfg) + errExpect := "db type <> not supported" + if err == nil || err.Error() != errExpect { + t.Errorf("Expected %v but received %v", errExpect, err) + } +} + +func TestNewSQLeUrlSQL(t *testing.T) { + cgrCfg := config.NewDefaultCGRConfig() + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLTableName] = "expTable" + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLDBName] = "mysql" + cgrCfg.EEsCfg().Exporters[0].ExportPath = `mysql://cgrates:CGRateS.org@127.0.0.1:3306` + newIDb := engine.NewInternalDB(nil, nil, true) + newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil) + filterS := engine.NewFilterS(cgrCfg, nil, newDM) + dc, err := newEEMetrics(utils.FirstNonEmpty( + "Local", + utils.EmptyString, + )) + if err != nil { + t.Error(err) + } + sqlEe := &SQLEe{id: cgrCfg.EEsCfg().Exporters[0].ID, + cgrCfg: cgrCfg, cfgIdx: 0, filterS: filterS, dc: dc} + dialectExpect := mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&loc=Local&parseTime=true&sql_mode='ALLOW_INVALID_DATES'", + "cgrates", "CGRateS.org", "127.0.0.1", "3306", "mysql")) + if dialect, err := sqlEe.NewSQLEeUrl(cgrCfg); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(dialect, dialectExpect) { + t.Errorf("Expected %v but received %v", utils.ToJSON(dialectExpect), utils.ToJSON(dialect)) + } +} + +func TestNewSQLeUrlPostgres(t *testing.T) { + cgrCfg := config.NewDefaultCGRConfig() + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLTableName] = "expTable" + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLDBName] = "postgres" + cgrCfg.EEsCfg().Exporters[0].ExportPath = `postgres://cgrates:CGRateS.org@127.0.0.1:3306` + newIDb := engine.NewInternalDB(nil, nil, true) + newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil) + filterS := engine.NewFilterS(cgrCfg, nil, newDM) + dc, err := newEEMetrics(utils.FirstNonEmpty( + "Local", + utils.EmptyString, + )) + if err != nil { + t.Error(err) + } + sqlEe := &SQLEe{id: cgrCfg.EEsCfg().Exporters[0].ID, + cgrCfg: cgrCfg, cfgIdx: 0, filterS: filterS, dc: dc} + dialectExpect := postgres.Open(fmt.Sprintf("host=%s port=%s dbname=%s user=%s password=%s sslmode=%s", + "127.0.0.1", "3306", "postgres", "cgrates", "CGRateS.org", utils.SQLDefaultSSLMode)) + if dialect, err := sqlEe.NewSQLEeUrl(cgrCfg); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(dialect, dialectExpect) { + t.Errorf("Expected %v but received %v", utils.ToJSON(dialectExpect), utils.ToJSON(dialect)) + } +} + +func TestNewSQLeExportPathError(t *testing.T) { + cgrCfg := config.NewDefaultCGRConfig() + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLTableName] = "expTable" + cgrCfg.EEsCfg().Exporters[0].Opts[utils.SQLDBName] = "postgres" + cgrCfg.EEsCfg().Exporters[0].ExportPath = ":foo" + newIDb := engine.NewInternalDB(nil, nil, true) + newDM := engine.NewDataManager(newIDb, cgrCfg.CacheCfg(), nil) + filterS := engine.NewFilterS(cgrCfg, nil, newDM) + dc, err := newEEMetrics(utils.FirstNonEmpty( + "Local", + utils.EmptyString, + )) + if err != nil { + t.Error(err) + } + sqlEe := &SQLEe{id: cgrCfg.EEsCfg().Exporters[0].ID, + cgrCfg: cgrCfg, cfgIdx: 0, filterS: filterS, dc: dc} + errExpect := `parse ":foo": missing protocol scheme` + if _, err := sqlEe.NewSQLEeUrl(cgrCfg); err == nil || err.Error() != errExpect { + t.Errorf("Expected %v but received %v", errExpect, err) + } +}