2021-02-06 19:08:01 +03:00
package wrapper_test
import (
2021-10-27 01:24:35 +03:00
"bytes"
2021-02-06 19:08:01 +03:00
"context"
2021-10-27 01:24:35 +03:00
"database/sql"
2023-01-07 19:16:48 +03:00
//"fmt"
2021-02-06 19:08:01 +03:00
"testing"
2021-10-27 01:24:35 +03:00
"time"
2021-02-06 19:08:01 +03:00
"github.com/jmoiron/sqlx"
2021-10-27 01:24:35 +03:00
vmeter "go.unistack.org/micro-meter-victoriametrics/v3"
wrapper "go.unistack.org/micro-wrapper-sql/v3"
2023-01-07 19:16:48 +03:00
"go.unistack.org/micro/v3/logger"
2021-10-27 01:24:35 +03:00
"go.unistack.org/micro/v3/meter"
"modernc.org/sqlite"
2021-02-06 19:08:01 +03:00
)
2021-10-27 01:24:35 +03:00
var schema = `
2021-02-06 19:08:01 +03:00
CREATE TABLE IF NOT EXISTS person (
first_name text ,
last_name text ,
email text
) ; `
type Person struct {
FirstName string ` db:"first_name" `
LastName string ` db:"last_name" `
Email string ` db:"email" `
}
func TestWrapper ( t * testing . T ) {
2023-01-07 19:16:48 +03:00
ctx := context . Background ( )
2021-10-27 01:24:35 +03:00
wrapper . DefaultMeterStatsInterval = 100 * time . Millisecond
meter . DefaultMeter = vmeter . NewMeter ( )
2023-01-07 19:16:48 +03:00
buf := bytes . NewBuffer ( nil )
logger . DefaultLogger = logger . NewLogger ( logger . WithLevel ( logger . DebugLevel ) , logger . WithOutput ( buf ) )
if err := logger . DefaultLogger . Init ( ) ; err != nil {
t . Fatal ( err )
}
2021-10-27 01:24:35 +03:00
2023-01-07 19:16:48 +03:00
sql . Register ( "micro-wrapper-sql" , wrapper . NewWrapper ( & sqlite . Driver { } ,
wrapper . DatabaseHost ( "localhost" ) ,
wrapper . DatabaseName ( "memory" ) ,
wrapper . LoggerLevel ( logger . DebugLevel ) ,
wrapper . LoggerEnabled ( true ) ,
) )
2021-10-27 01:24:35 +03:00
wdb , err := sql . Open ( "micro-wrapper-sql" , ":memory:" )
2021-02-06 19:08:01 +03:00
if err != nil {
t . Fatal ( err )
}
2021-10-27 01:24:35 +03:00
db := sqlx . NewDb ( wdb , "sqlite" )
2023-01-07 19:16:48 +03:00
var cancel func ( )
ctx , cancel = context . WithCancel ( ctx )
2021-10-27 01:24:35 +03:00
defer cancel ( )
wrapper . NewStatsMeter ( ctx , db , wrapper . DatabaseHost ( "localhost" ) , wrapper . DatabaseName ( "memory" ) )
2023-01-07 19:16:48 +03:00
if _ , err := db . ExecContext ( ctx , schema ) ; err != nil {
2021-10-27 01:24:35 +03:00
t . Fatal ( err )
}
tx , err := db . BeginTxx ( ctx , nil )
if err != nil {
t . Fatal ( err )
}
2021-02-06 19:08:01 +03:00
2023-01-07 19:16:48 +03:00
if _ , err := tx . NamedExecContext ( ctx , "INSERT OR REPLACE INTO person (first_name, last_name, email) VALUES (:first_name, :last_name, :email)" , & Person { "Fist1" , "Last1" , "Email1" } ) ; err != nil {
2021-10-27 01:24:35 +03:00
t . Fatal ( err )
}
2023-01-07 19:16:48 +03:00
if _ , err := tx . NamedExecContext ( ctx , "INSERT OR REPLACE INTO person (first_name, last_name, email) VALUES (:first_name, :last_name, :email)" , & Person { "Fist2" , "Last2" , "Email2" } ) ; err != nil {
2021-10-27 01:24:35 +03:00
t . Fatal ( err )
}
2021-02-06 19:08:01 +03:00
2021-10-27 01:24:35 +03:00
if err := tx . Commit ( ) ; err != nil {
t . Fatal ( err )
}
2021-02-06 19:08:01 +03:00
2021-10-27 01:24:35 +03:00
var peoples [ ] * Person
2023-01-07 19:16:48 +03:00
if err := sqlx . SelectContext ( wrapper . QueryName ( ctx , "get_all_person" ) , db , & peoples , "SELECT * FROM person limit 2" ) ; err != nil {
2021-02-06 19:08:01 +03:00
t . Fatal ( err )
}
2021-10-27 01:24:35 +03:00
_ = peoples
time . Sleep ( 1 * time . Second )
2023-01-07 19:16:48 +03:00
mbuf := bytes . NewBuffer ( nil )
_ = meter . DefaultMeter . Write ( mbuf , meter . WriteProcessMetrics ( true ) )
if ! bytes . Contains ( mbuf . Bytes ( ) , [ ] byte ( ` micro_sql_idle_connections ` ) ) {
t . Fatalf ( "micro-wrapper-sql meter output contains invalid output: %s" , buf . Bytes ( ) )
}
2021-10-27 01:24:35 +03:00
2023-01-07 19:16:48 +03:00
for _ , tcase := range [ ] [ ] byte {
[ ] byte ( ` "method":"ExecContext" ` ) ,
[ ] byte ( ` "method":"Open" ` ) ,
[ ] byte ( ` "method":"BeginTx" ` ) ,
[ ] byte ( ` "method":"Commit" ` ) ,
[ ] byte ( ` "method":"QueryContext" ` ) ,
[ ] byte ( ` "query":"get_all_person" ` ) ,
[ ] byte ( ` "took": ` ) ,
} {
if ! bytes . Contains ( buf . Bytes ( ) , tcase ) {
t . Fatalf ( "micro-wrapper-sql logger output contains invalid output: %s" , buf . Bytes ( ) )
}
2021-10-27 01:24:35 +03:00
}
2021-02-06 19:08:01 +03:00
}