(QOL) Improve test setup for logger, improve test coverage for database (#447)

* Improved test setup for logger, improved test coverage for database

* removed some new lines

* add new line

* removed database config detailS

* removed lines

* code cleanup
This commit is contained in:
Andrew
2020-02-17 11:29:26 +11:00
committed by GitHub
parent 72658dc987
commit f515a2bcbd
6 changed files with 272 additions and 233 deletions

View File

@@ -1,7 +1,9 @@
package tests
package audit
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sync"
"testing"
@@ -10,16 +12,35 @@ import (
"github.com/thrasher-corp/gocryptotrader/database"
"github.com/thrasher-corp/gocryptotrader/database/drivers"
"github.com/thrasher-corp/gocryptotrader/database/repository"
"github.com/thrasher-corp/gocryptotrader/database/repository/audit"
"github.com/thrasher-corp/gocryptotrader/database/testhelpers"
"github.com/thrasher-corp/goose"
)
func TestMain(m *testing.M) {
var err error
testhelpers.PostgresTestDatabase = testhelpers.GetConnectionDetails()
testhelpers.TempDir, err = ioutil.TempDir("", "gct-temp")
if err != nil {
fmt.Printf("failed to create temp file: %v", err)
os.Exit(1)
}
t := m.Run()
err = os.RemoveAll(testhelpers.TempDir)
if err != nil {
fmt.Printf("Failed to remove temp db file: %v", err)
}
os.Exit(t)
}
func TestAudit(t *testing.T) {
testCases := []struct {
name string
config *database.Config
runner func(t *testing.T)
closer func(t *testing.T, dbConn *database.Db) error
closer func(dbConn *database.Db) error
output interface{}
}{
{
@@ -30,7 +51,7 @@ func TestAudit(t *testing.T) {
},
writeAudit,
closeDatabase,
testhelpers.CloseDatabase,
nil,
},
{
@@ -41,19 +62,19 @@ func TestAudit(t *testing.T) {
},
readHelper,
closeDatabase,
testhelpers.CloseDatabase,
nil,
},
{
"Postgres-Write",
postgresTestDatabase,
testhelpers.PostgresTestDatabase,
writeAudit,
nil,
nil,
},
{
"Postgres-Read",
postgresTestDatabase,
testhelpers.PostgresTestDatabase,
readHelper,
nil,
nil,
@@ -62,18 +83,17 @@ func TestAudit(t *testing.T) {
for _, tests := range testCases {
test := tests
t.Run(test.name, func(t *testing.T) {
if !checkValidConfig(t, &test.config.ConnectionDetails) {
if !testhelpers.CheckValidConfig(&test.config.ConnectionDetails) {
t.Skip("database not configured skipping test")
}
dbConn, err := connectToDatabase(t, test.config)
dbConn, err := testhelpers.ConnectToDatabase(test.config)
if err != nil {
t.Fatal(err)
}
path := filepath.Join("..", "migrations")
path := filepath.Join("..", "..", "migrations")
err = goose.Run("up", dbConn.SQL, repository.GetSQLDialect(), path, "")
if err != nil {
t.Fatalf("failed to run migrations %v", err)
@@ -84,7 +104,7 @@ func TestAudit(t *testing.T) {
}
if test.closer != nil {
err = test.closer(t, dbConn)
err = test.closer(dbConn)
if err != nil {
t.Log(err)
}
@@ -103,7 +123,7 @@ func writeAudit(t *testing.T) {
go func(x int) {
defer wg.Done()
test := fmt.Sprintf("test-%v", x)
audit.Event(test, test, test)
Event(test, test, test)
}(x)
}
@@ -113,7 +133,7 @@ func writeAudit(t *testing.T) {
func readHelper(t *testing.T) {
t.Helper()
_, err := audit.GetEvent(time.Now().Add(-time.Hour*60), time.Now(), "asc", 1)
_, err := GetEvent(time.Now().Add(-time.Hour*60), time.Now(), "asc", 1)
if err != nil {
t.Error(err)
}

View File

@@ -1,7 +1,9 @@
package tests
package script
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sync"
"testing"
@@ -10,17 +12,36 @@ import (
"github.com/thrasher-corp/gocryptotrader/database"
"github.com/thrasher-corp/gocryptotrader/database/drivers"
"github.com/thrasher-corp/gocryptotrader/database/repository"
"github.com/thrasher-corp/gocryptotrader/database/repository/script"
"github.com/thrasher-corp/gocryptotrader/database/testhelpers"
"github.com/thrasher-corp/goose"
"github.com/volatiletech/null"
)
func TestMain(m *testing.M) {
var err error
testhelpers.PostgresTestDatabase = testhelpers.GetConnectionDetails()
testhelpers.TempDir, err = ioutil.TempDir("", "gct-temp")
if err != nil {
fmt.Printf("failed to create temp file: %v", err)
os.Exit(1)
}
t := m.Run()
err = os.RemoveAll(testhelpers.TempDir)
if err != nil {
fmt.Printf("Failed to remove temp db file: %v", err)
}
os.Exit(t)
}
func TestScript(t *testing.T) {
testCases := []struct {
name string
config *database.Config
runner func()
closer func(t *testing.T, dbConn *database.Db) error
closer func(dbConn *database.Db) error
output interface{}
}{
{
@@ -31,12 +52,12 @@ func TestScript(t *testing.T) {
},
writeScript,
closeDatabase,
testhelpers.CloseDatabase,
nil,
},
{
"Postgres-Write",
postgresTestDatabase,
testhelpers.PostgresTestDatabase,
writeScript,
nil,
nil,
@@ -45,18 +66,17 @@ func TestScript(t *testing.T) {
for _, tests := range testCases {
test := tests
t.Run(test.name, func(t *testing.T) {
if !checkValidConfig(t, &test.config.ConnectionDetails) {
if !testhelpers.CheckValidConfig(&test.config.ConnectionDetails) {
t.Skip("database not configured skipping test")
}
dbConn, err := connectToDatabase(t, test.config)
dbConn, err := testhelpers.ConnectToDatabase(test.config)
if err != nil {
t.Fatal(err)
}
path := filepath.Join("..", "migrations")
path := filepath.Join("..", "..", "migrations")
err = goose.Run("up", dbConn.SQL, repository.GetSQLDialect(), path, "")
if err != nil {
t.Fatalf("failed to run migrations %v", err)
@@ -67,7 +87,7 @@ func TestScript(t *testing.T) {
}
if test.closer != nil {
err = test.closer(t, dbConn)
err = test.closer(dbConn)
if err != nil {
t.Log(err)
}
@@ -85,7 +105,7 @@ func writeScript() {
defer wg.Done()
test := fmt.Sprintf("test-%v", x)
var data null.Bytes
script.Event(test, test, test, data, test, test, time.Now())
Event(test, test, test, data, test, test, time.Now())
}(x)
}
wg.Wait()

View File

@@ -0,0 +1,100 @@
package testhelpers
import (
"os"
"reflect"
"github.com/thrasher-corp/gocryptotrader/database"
"github.com/thrasher-corp/gocryptotrader/database/drivers"
psqlConn "github.com/thrasher-corp/gocryptotrader/database/drivers/postgres"
sqliteConn "github.com/thrasher-corp/gocryptotrader/database/drivers/sqlite3"
)
var (
// TempDir temp folder for sqlite database
TempDir string
// PostgresTestDatabase postgresql database config details
PostgresTestDatabase *database.Config
)
// GetConnectionDetails returns connection details for CI or test db instances
func GetConnectionDetails() *database.Config {
_, exists := os.LookupEnv("TRAVIS")
if exists {
return &database.Config{
Enabled: true,
Driver: "postgres",
ConnectionDetails: drivers.ConnectionDetails{
Host: "localhost",
Port: 5432,
Username: "postgres",
Password: "",
Database: "gct_dev_ci",
SSLMode: "",
},
}
}
_, exists = os.LookupEnv("APPVEYOR")
if exists {
return &database.Config{
Enabled: true,
Driver: "postgres",
ConnectionDetails: drivers.ConnectionDetails{
Host: "localhost",
Port: 5432,
Username: "postgres",
Password: "Password12!",
Database: "gct_dev_ci",
SSLMode: "",
},
}
}
return &database.Config{
Enabled: true,
Driver: "postgres",
ConnectionDetails: drivers.ConnectionDetails{
// Host: "",
// Port: 5432,
// Username: "",
// Password: "",
// Database: "",
// SSLMode: "",
},
}
}
// ConnectToDatabase opens connection to database and returns pointer to instance of database.DB
func ConnectToDatabase(conn *database.Config) (dbConn *database.Db, err error) {
database.DB.Config = conn
if conn.Driver == database.DBPostgreSQL {
dbConn, err = psqlConn.Connect()
if err != nil {
return nil, err
}
} else if conn.Driver == database.DBSQLite3 || conn.Driver == database.DBSQLite {
database.DB.DataPath = TempDir
dbConn, err = sqliteConn.Connect()
if err != nil {
return nil, err
}
}
database.DB.Connected = true
return
}
// CloseDatabase closes database connection
func CloseDatabase(conn *database.Db) (err error) {
if conn != nil {
return conn.SQL.Close()
}
return nil
}
// CheckValidConfig checks if database connection details are empty
func CheckValidConfig(config *drivers.ConnectionDetails) bool {
return !reflect.DeepEqual(drivers.ConnectionDetails{}, *config)
}

View File

@@ -0,0 +1,94 @@
package testhelpers
import (
"fmt"
"io/ioutil"
"os"
"testing"
"github.com/thrasher-corp/gocryptotrader/database"
"github.com/thrasher-corp/gocryptotrader/database/drivers"
)
func TestMain(m *testing.M) {
var err error
PostgresTestDatabase = GetConnectionDetails()
TempDir, err = ioutil.TempDir("", "gct-temp")
if err != nil {
fmt.Printf("failed to create temp file: %v", err)
os.Exit(1)
}
t := m.Run()
err = os.RemoveAll(TempDir)
if err != nil {
fmt.Printf("Failed to remove temp db file: %v", err)
}
os.Exit(t)
}
func TestDatabaseConnect(t *testing.T) {
testCases := []struct {
name string
config *database.Config
closer func(dbConn *database.Db) error
output interface{}
}{
{
"SQLite",
&database.Config{
Driver: database.DBSQLite3,
ConnectionDetails: drivers.ConnectionDetails{Database: "./testdb.db"},
},
CloseDatabase,
nil,
},
{
"SQliteNoDatabase",
&database.Config{
Driver: database.DBSQLite3,
ConnectionDetails: drivers.ConnectionDetails{
Host: "localhost",
},
},
nil,
database.ErrNoDatabaseProvided,
},
{
name: "Postgres",
config: PostgresTestDatabase,
output: nil,
},
}
for _, tests := range testCases {
test := tests
t.Run(test.name, func(t *testing.T) {
if !CheckValidConfig(&test.config.ConnectionDetails) {
t.Skip("database not configured skipping test")
}
dbConn, err := ConnectToDatabase(test.config)
if err != nil {
switch v := test.output.(type) {
case error:
if v.Error() != err.Error() {
t.Fatal(err)
}
return
default:
break
}
}
if test.closer != nil {
err = test.closer(dbConn)
if err != nil {
t.Log(err)
}
}
})
}
}

View File

@@ -1,186 +0,0 @@
package tests
import (
"fmt"
"io/ioutil"
"os"
"reflect"
"testing"
"github.com/thrasher-corp/gocryptotrader/database"
"github.com/thrasher-corp/gocryptotrader/database/drivers"
psqlConn "github.com/thrasher-corp/gocryptotrader/database/drivers/postgres"
sqliteConn "github.com/thrasher-corp/gocryptotrader/database/drivers/sqlite3"
)
var (
tempDir string
postgresTestDatabase *database.Config
)
func getConnectionDetails() *database.Config {
_, exists := os.LookupEnv("TRAVIS")
if exists {
return &database.Config{
Enabled: true,
Driver: "postgres",
ConnectionDetails: drivers.ConnectionDetails{
Host: "localhost",
Port: 5432,
Username: "postgres",
Password: "",
Database: "gct_dev_ci",
SSLMode: "",
},
}
}
_, exists = os.LookupEnv("APPVEYOR")
if exists {
return &database.Config{
Enabled: true,
Driver: "postgres",
ConnectionDetails: drivers.ConnectionDetails{
Host: "localhost",
Port: 5432,
Username: "postgres",
Password: "Password12!",
Database: "gct_dev_ci",
SSLMode: "",
},
}
}
return &database.Config{
Enabled: true,
Driver: "postgres",
ConnectionDetails: drivers.ConnectionDetails{
//Host: "",
//Port: 5432,
//Username: "",
//Password: "",
//Database: "",
//SSLMode: "",
},
}
}
func TestMain(m *testing.M) {
var err error
postgresTestDatabase = getConnectionDetails()
tempDir, err = ioutil.TempDir("", "gct-temp")
if err != nil {
fmt.Printf("failed to create temp file: %v", err)
os.Exit(1)
}
t := m.Run()
err = os.RemoveAll(tempDir)
if err != nil {
fmt.Printf("Failed to remove temp db file: %v", err)
}
os.Exit(t)
}
func TestDatabaseConnect(t *testing.T) {
testCases := []struct {
name string
config *database.Config
closer func(t *testing.T, dbConn *database.Db) error
output interface{}
}{
{
"SQLite",
&database.Config{
Driver: database.DBSQLite3,
ConnectionDetails: drivers.ConnectionDetails{Database: "./testdb.db"},
},
closeDatabase,
nil,
},
{
"SQliteNoDatabase",
&database.Config{
Driver: database.DBSQLite3,
ConnectionDetails: drivers.ConnectionDetails{
Host: "localhost",
},
},
nil,
database.ErrNoDatabaseProvided,
},
{
name: "Postgres",
config: postgresTestDatabase,
output: nil,
},
}
for _, tests := range testCases {
test := tests
t.Run(test.name, func(t *testing.T) {
if !checkValidConfig(t, &test.config.ConnectionDetails) {
t.Skip("database not configured skipping test")
}
dbConn, err := connectToDatabase(t, test.config)
if err != nil {
switch v := test.output.(type) {
case error:
if v.Error() != err.Error() {
t.Fatal(err)
}
return
default:
break
}
}
if test.closer != nil {
err = test.closer(t, dbConn)
if err != nil {
t.Log(err)
}
}
})
}
}
func connectToDatabase(t *testing.T, conn *database.Config) (dbConn *database.Db, err error) {
t.Helper()
database.DB.Config = conn
if conn.Driver == database.DBPostgreSQL {
dbConn, err = psqlConn.Connect()
if err != nil {
return nil, err
}
} else if conn.Driver == database.DBSQLite3 || conn.Driver == database.DBSQLite {
database.DB.DataPath = tempDir
dbConn, err = sqliteConn.Connect()
if err != nil {
return nil, err
}
}
database.DB.Connected = true
return
}
func closeDatabase(t *testing.T, conn *database.Db) (err error) {
t.Helper()
if conn != nil {
return conn.SQL.Close()
}
return nil
}
func checkValidConfig(t *testing.T, config *drivers.ConnectionDetails) bool {
t.Helper()
return !reflect.DeepEqual(drivers.ConnectionDetails{}, *config)
}

View File

@@ -6,22 +6,24 @@ import (
"os"
"strings"
"testing"
"github.com/thrasher-corp/gocryptotrader/common/convert"
)
var (
trueptr = func(b bool) *bool { return &b }(true)
falseptr = func(b bool) *bool { return &b }(false)
)
func TestMain(m *testing.M) {
setupTestLoggers()
os.Exit(m.Run())
}
func SetupTest() {
func setupTestLoggers() {
logTest := Config{
Enabled: trueptr,
Enabled: convert.BoolPtr(true),
SubLoggerConfig: SubLoggerConfig{
Output: "console",
Level: "INFO|WARN|DEBUG|ERROR",
},
AdvancedSettings: advancedSettings{
ShowLogSystemName: trueptr,
ShowLogSystemName: convert.BoolPtr(true),
Spacer: " | ",
TimeStampFormat: timestampFormat,
Headers: headers{
@@ -46,7 +48,7 @@ func SetupTest() {
func SetupDisabled() {
logTest := Config{
Enabled: falseptr,
Enabled: convert.BoolPtr(false),
}
GlobalLogConfig = &logTest
@@ -55,8 +57,6 @@ func SetupDisabled() {
}
func BenchmarkInfo(b *testing.B) {
SetupTest()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Info(Global, "Hello this is an info benchmark")
@@ -101,8 +101,6 @@ func TestRemoveWriter(t *testing.T) {
}
func TestLevel(t *testing.T) {
SetupTest()
_, err := Level("LOG")
if err != nil {
t.Errorf("Failed to get log %s levels skipping", err)
@@ -115,8 +113,6 @@ func TestLevel(t *testing.T) {
}
func TestSetLevel(t *testing.T) {
SetupTest()
newLevel, err := SetLevel("LOG", "ERROR")
if err != nil {
t.Skipf("Failed to get log %s levels skipping", err)
@@ -155,7 +151,7 @@ func TestCloseLogger(t *testing.T) {
}
func TestConfigureSubLogger(t *testing.T) {
err := configureSubLogger("log", "INFO", os.Stdin)
err := configureSubLogger("LOG", "INFO", os.Stdin)
if err != nil {
t.Skipf("configureSubLogger() returned unexpected error %v", err)
}
@@ -195,8 +191,6 @@ func BenchmarkInfoDisabled(b *testing.B) {
}
func BenchmarkInfof(b *testing.B) {
SetupTest()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Infof(Global, "Hello this is an infof benchmark %v %v %v\n", n, 1, 2)
@@ -204,8 +198,6 @@ func BenchmarkInfof(b *testing.B) {
}
func BenchmarkInfoln(b *testing.B) {
SetupTest()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Infoln(Global, "Hello this is an infoln benchmark")
@@ -253,7 +245,6 @@ func TestInfo(t *testing.T) {
}
func TestSubLoggerName(t *testing.T) {
SetupTest()
w := &bytes.Buffer{}
registerNewSubLogger("sublogger")
logger.newLogEvent("out", "header", "SUBLOGGER", w)