check / check (push) Waiting to run
The server binary carried exported names that only tests call, including raw SQL access and a way to weaken the password hash. Delete testing.go, GetDB and SetBcryptCost from the shipped code, so passwords always hash at bcrypt.DefaultCost. Move GetDB, GetOrCreateChannel, JoinChannel and HasChannelInvite into export_test.go. Delete GetClientHostInfo, whose remaining check GetLatestClientForSession covers. Tests in other packages now build the database with db.New and run raw SQL through dbtest.Exec. Handler tests and the relay tests' aliceWithHTTPClient helper need a password only to log in, so they store one hashed at bcrypt.MinCost. Tests of PASS itself keep the real cost. Model: opus-5-5
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
// Package dbtest gives each test a database of its own and runs raw
|
|
// SQL on it. Only tests may import it.
|
|
package dbtest
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"database/sql"
|
|
"testing"
|
|
|
|
_ "modernc.org/sqlite" // registers the sqlite driver
|
|
)
|
|
|
|
// NewURL returns the URL of a new, empty in-memory database for one
|
|
// test. SQLite deletes an in-memory database when its last connection
|
|
// closes. A pool closes a connection when a query on it is cancelled
|
|
// while it runs. So this function holds a connection of its own open
|
|
// until the test ends.
|
|
func NewURL(tb testing.TB) string {
|
|
tb.Helper()
|
|
|
|
// A random name, so that no other test can share the database.
|
|
dbURL := "file:" + rand.Text() + "?mode=memory&cache=shared"
|
|
|
|
pool, err := sql.Open("sqlite", dbURL)
|
|
if err != nil {
|
|
tb.Fatalf("open test database: %v", err)
|
|
}
|
|
|
|
tb.Cleanup(func() { _ = pool.Close() })
|
|
|
|
conn, err := pool.Conn(tb.Context())
|
|
if err != nil {
|
|
tb.Fatalf("connect to test database: %v", err)
|
|
}
|
|
|
|
tb.Cleanup(func() { _ = conn.Close() })
|
|
|
|
return dbURL
|
|
}
|
|
|
|
// Exec runs one raw SQL statement on the database at dbURL, over a
|
|
// connection of its own. A test uses it for what the methods of
|
|
// db.Database cannot do, such as creating a trigger that makes a
|
|
// write fail.
|
|
func Exec(tb testing.TB, dbURL, statement string) {
|
|
tb.Helper()
|
|
|
|
pool, err := sql.Open("sqlite", dbURL)
|
|
if err != nil {
|
|
tb.Fatalf("open test database: %v", err)
|
|
}
|
|
|
|
defer func() { _ = pool.Close() }()
|
|
|
|
_, err = pool.ExecContext(tb.Context(), statement)
|
|
if err != nil {
|
|
tb.Fatalf("run %q: %v", statement, err)
|
|
}
|
|
}
|