TestData-Factory [WIP]
This commit is contained in:
parent
edfcdd1135
commit
06788c3e12
@ -5,6 +5,8 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
var SuppressGinLogs = false
|
||||
|
||||
func NewEngine(cfg scn.Config) *gin.Engine {
|
||||
engine := gin.New()
|
||||
|
||||
@ -14,7 +16,13 @@ func NewEngine(cfg scn.Config) *gin.Engine {
|
||||
engine.Use(CorsMiddleware())
|
||||
|
||||
if cfg.GinDebug {
|
||||
engine.Use(gin.Logger())
|
||||
ginlogger := gin.Logger()
|
||||
engine.Use(func(context *gin.Context) {
|
||||
if SuppressGinLogs {
|
||||
return
|
||||
}
|
||||
ginlogger(context)
|
||||
})
|
||||
}
|
||||
|
||||
return engine
|
||||
|
@ -56,7 +56,7 @@ var configLocHost = func() Config {
|
||||
DBFile: ".run-data/db.sqlite3",
|
||||
DBJournal: "WAL",
|
||||
DBTimeout: 5 * time.Second,
|
||||
DBCheckForeignKeys: true,
|
||||
DBCheckForeignKeys: false,
|
||||
DBMaxOpenConns: 5,
|
||||
DBMaxIdleConns: 5,
|
||||
DBConnMaxLifetime: 60 * time.Minute,
|
||||
@ -90,7 +90,7 @@ var configLocDocker = func() Config {
|
||||
DBFile: "/data/scn_docker.sqlite3",
|
||||
DBJournal: "WAL",
|
||||
DBTimeout: 5 * time.Second,
|
||||
DBCheckForeignKeys: true,
|
||||
DBCheckForeignKeys: false,
|
||||
DBMaxOpenConns: 5,
|
||||
DBMaxIdleConns: 5,
|
||||
DBConnMaxLifetime: 60 * time.Minute,
|
||||
@ -124,7 +124,7 @@ var configDev = func() Config {
|
||||
DBFile: "/data/scn.sqlite3",
|
||||
DBJournal: "WAL",
|
||||
DBTimeout: 5 * time.Second,
|
||||
DBCheckForeignKeys: true,
|
||||
DBCheckForeignKeys: false,
|
||||
DBMaxOpenConns: 5,
|
||||
DBMaxIdleConns: 5,
|
||||
DBConnMaxLifetime: 60 * time.Minute,
|
||||
@ -158,7 +158,7 @@ var configStag = func() Config {
|
||||
DBFile: "/data/scn.sqlite3",
|
||||
DBJournal: "WAL",
|
||||
DBTimeout: 5 * time.Second,
|
||||
DBCheckForeignKeys: true,
|
||||
DBCheckForeignKeys: false,
|
||||
DBMaxOpenConns: 5,
|
||||
DBMaxIdleConns: 5,
|
||||
DBConnMaxLifetime: 60 * time.Minute,
|
||||
@ -192,7 +192,7 @@ var configProd = func() Config {
|
||||
DBFile: "/data/scn.sqlite3",
|
||||
DBJournal: "WAL",
|
||||
DBTimeout: 5 * time.Second,
|
||||
DBCheckForeignKeys: true,
|
||||
DBCheckForeignKeys: false,
|
||||
DBMaxOpenConns: 5,
|
||||
DBMaxIdleConns: 5,
|
||||
DBConnMaxLifetime: 60 * time.Minute,
|
||||
|
@ -4,6 +4,7 @@ import (
|
||||
"blackforestbytes.com/simplecloudnotifier/logic"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/rs/zerolog/log"
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/timeext"
|
||||
"gopkg.in/loremipsum.v1"
|
||||
"testing"
|
||||
@ -266,6 +267,17 @@ var messageExamples = []msgex{
|
||||
}
|
||||
|
||||
func InitDefaultData(t *testing.T, ws *logic.Application) {
|
||||
|
||||
// set logger to buffer, only output if error occured
|
||||
success := false
|
||||
SetBufLogger()
|
||||
defer func() {
|
||||
ClearBufLogger(!success)
|
||||
if success {
|
||||
log.Info().Msgf("Succesfully initialized default data (%d messages, %d users)", len(messageExamples), len(userExamples))
|
||||
}
|
||||
}()
|
||||
|
||||
baseUrl := "http://127.0.0.1:" + ws.Port
|
||||
|
||||
users := make([]userdat, 0, len(userExamples))
|
||||
@ -347,6 +359,8 @@ func InitDefaultData(t *testing.T, ws *logic.Application) {
|
||||
|
||||
RequestPost[gin.H](t, baseUrl, "/", body)
|
||||
}
|
||||
|
||||
success = true
|
||||
}
|
||||
|
||||
func lipsum(seed int64, paracount int) string {
|
||||
|
@ -4,24 +4,32 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
func InitTests() {
|
||||
cw := zerolog.ConsoleWriter{
|
||||
log.Logger = createLogger(createConsoleWriter())
|
||||
|
||||
gin.SetMode(gin.TestMode)
|
||||
zerolog.SetGlobalLevel(zerolog.DebugLevel)
|
||||
}
|
||||
|
||||
func createConsoleWriter() *zerolog.ConsoleWriter {
|
||||
return &zerolog.ConsoleWriter{
|
||||
Out: os.Stdout,
|
||||
TimeFormat: "2006-01-02 15:04:05.000 Z07:00",
|
||||
}
|
||||
}
|
||||
|
||||
func createLogger(cw io.Writer) zerolog.Logger {
|
||||
zerolog.TimeFieldFormat = zerolog.TimeFormatUnixMs
|
||||
|
||||
multi := zerolog.MultiLevelWriter(cw)
|
||||
logger := zerolog.New(multi).With().
|
||||
Timestamp().
|
||||
Caller().
|
||||
Logger()
|
||||
|
||||
log.Logger = logger
|
||||
|
||||
gin.SetMode(gin.TestMode)
|
||||
zerolog.SetGlobalLevel(zerolog.DebugLevel)
|
||||
return logger
|
||||
}
|
||||
|
47
server/test/util/log.go
Normal file
47
server/test/util/log.go
Normal file
@ -0,0 +1,47 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"blackforestbytes.com/simplecloudnotifier/common/ginext"
|
||||
"fmt"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
var buflogger *BufferWriter = nil
|
||||
|
||||
func SetBufLogger() {
|
||||
buflogger = &BufferWriter{cw: createConsoleWriter()}
|
||||
log.Logger = createLogger(buflogger)
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
ginext.SuppressGinLogs = true
|
||||
}
|
||||
|
||||
func ClearBufLogger(dump bool) {
|
||||
size := len(buflogger.buffer)
|
||||
if dump {
|
||||
buflogger.Dump()
|
||||
}
|
||||
log.Logger = createLogger(createConsoleWriter())
|
||||
buflogger = nil
|
||||
gin.SetMode(gin.TestMode)
|
||||
ginext.SuppressGinLogs = false
|
||||
if !dump {
|
||||
log.Info().Msgf("Suppressed %d logmessages / printf-statements", size)
|
||||
}
|
||||
}
|
||||
|
||||
func TPrintf(format string, a ...any) {
|
||||
if buflogger != nil {
|
||||
buflogger.Printf(format, a...)
|
||||
} else {
|
||||
fmt.Printf(format, a...)
|
||||
}
|
||||
}
|
||||
|
||||
func TPrintln(a ...any) {
|
||||
if buflogger != nil {
|
||||
buflogger.Println(a...)
|
||||
} else {
|
||||
fmt.Println(a...)
|
||||
}
|
||||
}
|
38
server/test/util/logbuffer.go
Normal file
38
server/test/util/logbuffer.go
Normal file
@ -0,0 +1,38 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/rs/zerolog"
|
||||
)
|
||||
|
||||
type BufferWriter struct {
|
||||
cw *zerolog.ConsoleWriter
|
||||
|
||||
buffer []func(cw *zerolog.ConsoleWriter)
|
||||
}
|
||||
|
||||
func (b *BufferWriter) Write(p []byte) (n int, err error) {
|
||||
b.buffer = append(b.buffer, func(cw *zerolog.ConsoleWriter) {
|
||||
_, _ = cw.Write(p)
|
||||
})
|
||||
return len(p), nil
|
||||
}
|
||||
|
||||
func (b *BufferWriter) Dump() {
|
||||
for _, v := range b.buffer {
|
||||
v(b.cw)
|
||||
}
|
||||
b.buffer = nil
|
||||
}
|
||||
|
||||
func (b *BufferWriter) Println(a ...any) {
|
||||
b.buffer = append(b.buffer, func(cw *zerolog.ConsoleWriter) {
|
||||
fmt.Println(a...)
|
||||
})
|
||||
}
|
||||
|
||||
func (b *BufferWriter) Printf(format string, a ...any) {
|
||||
b.buffer = append(b.buffer, func(cw *zerolog.ConsoleWriter) {
|
||||
fmt.Printf(format, a...)
|
||||
})
|
||||
}
|
@ -89,7 +89,7 @@ func RequestAuthDeleteShouldFail(t *testing.T, akey string, baseURL string, urlS
|
||||
func RequestAny[TResult any](t *testing.T, akey string, method string, baseURL string, urlSuffix string, body any) TResult {
|
||||
client := http.Client{}
|
||||
|
||||
fmt.Printf("[-> REQUEST] (%s) %s%s [%s] [%s]\n", method, baseURL, urlSuffix, langext.Conditional(akey == "", "NO AUTH", "AUTH"), langext.Conditional(body == nil, "NO BODY", "BODY"))
|
||||
TPrintf("[-> REQUEST] (%s) %s%s [%s] [%s]\n", method, baseURL, urlSuffix, langext.Conditional(akey == "", "NO AUTH", "AUTH"), langext.Conditional(body == nil, "NO BODY", "BODY"))
|
||||
|
||||
bytesbody := make([]byte, 0)
|
||||
contentType := ""
|
||||
@ -144,12 +144,12 @@ func RequestAny[TResult any](t *testing.T, akey string, method string, baseURL s
|
||||
TestFailErr(t, err)
|
||||
}
|
||||
|
||||
fmt.Println("")
|
||||
fmt.Printf("---------------- RESPONSE (%d) ----------------\n", resp.StatusCode)
|
||||
fmt.Println(langext.TryPrettyPrintJson(string(respBodyBin)))
|
||||
TPrintln("")
|
||||
TPrintf("---------------- RESPONSE (%d) ----------------\n", resp.StatusCode)
|
||||
TPrintln(langext.TryPrettyPrintJson(string(respBodyBin)))
|
||||
TryPrintTraceObj("---------------- -------- ----------------", respBodyBin, "")
|
||||
fmt.Println("---------------- -------- ----------------")
|
||||
fmt.Println("")
|
||||
TPrintln("---------------- -------- ----------------")
|
||||
TPrintln("")
|
||||
|
||||
if resp.StatusCode != 200 {
|
||||
TestFail(t, "Statuscode != 200")
|
||||
@ -166,7 +166,7 @@ func RequestAny[TResult any](t *testing.T, akey string, method string, baseURL s
|
||||
func RequestAuthAnyShouldFail(t *testing.T, akey string, method string, baseURL string, urlSuffix string, body any, statusCode int, errcode apierr.APIError) {
|
||||
client := http.Client{}
|
||||
|
||||
fmt.Printf("[-> REQUEST] (%s) %s%s [%s] (should-fail with %d/%d)\n", method, baseURL, urlSuffix, langext.Conditional(akey == "", "NO AUTH", "AUTH"), statusCode, errcode)
|
||||
TPrintf("[-> REQUEST] (%s) %s%s [%s] (should-fail with %d/%d)\n", method, baseURL, urlSuffix, langext.Conditional(akey == "", "NO AUTH", "AUTH"), statusCode, errcode)
|
||||
|
||||
bytesbody := make([]byte, 0)
|
||||
contentType := ""
|
||||
@ -221,14 +221,14 @@ func RequestAuthAnyShouldFail(t *testing.T, akey string, method string, baseURL
|
||||
TestFailErr(t, err)
|
||||
}
|
||||
|
||||
fmt.Println("")
|
||||
fmt.Printf("---------------- RESPONSE (%d) ----------------\n", resp.StatusCode)
|
||||
fmt.Println(langext.TryPrettyPrintJson(string(respBodyBin)))
|
||||
TPrintln("")
|
||||
TPrintf("---------------- RESPONSE (%d) ----------------\n", resp.StatusCode)
|
||||
TPrintln(langext.TryPrettyPrintJson(string(respBodyBin)))
|
||||
if (statusCode != 0 && resp.StatusCode != statusCode) || (statusCode == 0 && resp.StatusCode == 200) {
|
||||
TryPrintTraceObj("---------------- -------- ----------------", respBodyBin, "")
|
||||
}
|
||||
fmt.Println("---------------- -------- ----------------")
|
||||
fmt.Println("")
|
||||
TPrintln("---------------- -------- ----------------")
|
||||
TPrintln("")
|
||||
|
||||
if statusCode != 0 && resp.StatusCode != statusCode {
|
||||
TestFailFmt(t, "Statuscode != %d (expected failure)", statusCode)
|
||||
@ -267,13 +267,13 @@ func TryPrintTraceObj(prefix string, body []byte, suffix string) {
|
||||
if v2, ok := v1["traceObj"]; ok {
|
||||
if v3, ok := v2.(string); ok {
|
||||
if prefix != "" {
|
||||
fmt.Println(prefix)
|
||||
TPrintln(prefix)
|
||||
}
|
||||
|
||||
fmt.Println(strings.TrimSpace(v3))
|
||||
TPrintln(strings.TrimSpace(v3))
|
||||
|
||||
if suffix != "" {
|
||||
fmt.Println(suffix)
|
||||
TPrintln(suffix)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ import (
|
||||
"blackforestbytes.com/simplecloudnotifier/jobs"
|
||||
"blackforestbytes.com/simplecloudnotifier/logic"
|
||||
"blackforestbytes.com/simplecloudnotifier/push"
|
||||
"fmt"
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/langext"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@ -45,7 +44,7 @@ func StartSimpleWebserver(t *testing.T) (*logic.Application, func()) {
|
||||
TestFailErr(t, err)
|
||||
}
|
||||
|
||||
fmt.Println("DatabaseFile: " + dbfile)
|
||||
TPrintln("DatabaseFile: " + dbfile)
|
||||
|
||||
conf := scn.Config{
|
||||
Namespace: "test",
|
||||
|
Loading…
Reference in New Issue
Block a user