out/cmd/server/db_test.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)
}
})
}