Keep each test database when the pool replaces its connection (closes #209)
check / check (push) Waiting to run
check / check (push) Waiting to run
SQLite deletes a shared in-memory database when its last connection closes. A query cancelled while it runs makes the pool close its connection, so a test could lose all its tables and rows at random. The new package internal/dbtest has NewURL. It returns the URL of a new in-memory database with a random name and holds one connection to it open until the test ends. The db, handlers, ircserver, server and service tests take their database URL from it. The test-support lint rule keeps the package out of the server binary. A new test cancels a query on such a database, checks with a TEMP table that the connection was replaced, and checks that a row is still there. Model: opus-5-5
This commit was merged in pull request #210.
This commit is contained in:
@@ -5,21 +5,16 @@ import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
|
||||
"sneak.berlin/go/neoirc/internal/dbtest"
|
||||
)
|
||||
|
||||
//nolint:gochecknoglobals // test counter
|
||||
var testDBCounter atomic.Int64
|
||||
|
||||
// NewTestDatabase creates an in-memory database for testing.
|
||||
func NewTestDatabase() (*Database, error) {
|
||||
counter := testDBCounter.Add(1)
|
||||
func NewTestDatabase(tb testing.TB) (*Database, error) {
|
||||
tb.Helper()
|
||||
|
||||
dsn := fmt.Sprintf(
|
||||
"file:testdb%d?mode=memory"+
|
||||
"&cache=shared&_pragma=foreign_keys(1)",
|
||||
counter,
|
||||
)
|
||||
dsn := dbtest.NewURL(tb) + "&_pragma=foreign_keys(1)"
|
||||
|
||||
conn, err := sql.Open("sqlite", dsn)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user