96 lines
1.6 KiB
Go
96 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"path"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func newTestDB(t *testing.T) DB {
|
|
ctx, can := context.WithTimeout(context.Background(), time.Minute)
|
|
defer can()
|
|
conn := path.Join(t.TempDir(), "db")
|
|
|
|
db, err := NewDB(ctx, "sqlite", conn)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return db
|
|
}
|
|
|
|
func TestDB(t *testing.T) {
|
|
ctx := context.Background()
|
|
db := newTestDB(t)
|
|
|
|
t.Run("with lock", func(t *testing.T) {
|
|
var called [2]bool
|
|
if err := db.WithLock(func() error {
|
|
for i := range called {
|
|
if err := db.Query(ctx, func(rows *sql.Rows) error {
|
|
return rows.Scan(&called[i])
|
|
}, `SELECT true`); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
return nil
|
|
}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !called[0] {
|
|
t.Error(0)
|
|
}
|
|
if !called[1] {
|
|
t.Error(1)
|
|
}
|
|
})
|
|
|
|
t.Run("exec, query", func(t *testing.T) {
|
|
if err := db.Exec(ctx, `
|
|
CREATE TABLE IF NOT EXISTS my_table (
|
|
text TEXT,
|
|
datetime DATETIME,
|
|
number NUMBER
|
|
)
|
|
`); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := db.Exec(ctx, `
|
|
INSERT INTO my_table (
|
|
text,
|
|
datetime,
|
|
number
|
|
) VALUES (?, ?, ?)
|
|
`, "text", time.Now(), 1); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
var text string
|
|
var datetime time.Time
|
|
var number int
|
|
if err := db.Query(ctx, func(rows *sql.Rows) error {
|
|
return rows.Scan(&text, &datetime, &number)
|
|
}, `
|
|
SELECT
|
|
text,
|
|
datetime,
|
|
number
|
|
FROM my_table
|
|
`); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if text != "text" {
|
|
t.Error(text)
|
|
}
|
|
if datetime.IsZero() {
|
|
t.Error(datetime)
|
|
}
|
|
if number != 1 {
|
|
t.Error(number)
|
|
}
|
|
})
|
|
}
|