package db import ( "context" "database/sql" "fmt" "log/slog" "sync/atomic" ) //nolint:gochecknoglobals // test counter var testDBCounter atomic.Int64 // NewTestDatabase creates an in-memory database for testing. func NewTestDatabase() (*Database, error) { counter := testDBCounter.Add(1) dsn := fmt.Sprintf( "file:testdb%d?mode=memory"+ "&cache=shared&_pragma=foreign_keys(1)", counter, ) conn, err := sql.Open("sqlite", dsn) if err != nil { return nil, fmt.Errorf("open test db: %w", err) } database := &Database{ //nolint:exhaustruct // test helper, params not needed conn: conn, log: slog.Default(), } err = database.runMigrations(context.Background()) if err != nil { closeErr := conn.Close() if closeErr != nil { return nil, fmt.Errorf( "close after migration failure: %w", closeErr, ) } return nil, fmt.Errorf( "run test migrations: %w", err, ) } return database, nil } // Close closes the underlying database connection. func (database *Database) Close() error { err := database.conn.Close() if err != nil { return fmt.Errorf("close database: %w", err) } return nil }