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) } }) }