Files
3x-ui/internal/database/db_reopen_test.go
T
MHSanaei 18b337d131 fix(database): close the pool a second InitDB replaces
InitDB assigned the new pool over the old one without closing it. The
panel's own restore flows call CloseDB first, but any other re-init
leaked the replaced pool and its handle on the database file. On Windows
that handle blocks deleting the file, which is why the four GetApiToken
CLI tests failed their t.TempDir cleanup there: dbtest.InitDB opened the
store, then GetApiToken's own InitDB replaced it. InitDB now closes the
previous pool itself; sql.DB.Close is idempotent, so the restore flows
behave as before.
2026-09-27 15:32:17 +02:00

28 lines
726 B
Go

package database
import (
"path/filepath"
"testing"
)
// A replaced pool that stays open keeps its database file open; Windows then
// cannot delete or replace that file.
func TestInitDBClosesThePoolItReplaces(t *testing.T) {
dbPath := filepath.Join(t.TempDir(), "x-ui.db")
if err := InitDB(dbPath); err != nil {
t.Fatalf("first InitDB: %v", err)
}
t.Cleanup(func() { _ = CloseDB() })
replaced, err := GetDB().DB()
if err != nil {
t.Fatalf("first pool: %v", err)
}
if err := InitDB(dbPath); err != nil {
t.Fatalf("second InitDB: %v", err)
}
if err := replaced.Ping(); err == nil || err.Error() != "sql: database is closed" {
t.Fatalf("replaced pool Ping() = %v, want sql: database is closed", err)
}
}