299 lines
6.4 KiB
Go
299 lines
6.4 KiB
Go
package testing
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"b612.me/stardb"
|
|
_ "modernc.org/sqlite"
|
|
)
|
|
|
|
func TestDefaultPoolConfig(t *testing.T) {
|
|
config := stardb.DefaultPoolConfig()
|
|
|
|
if config.MaxOpenConns != 25 {
|
|
t.Errorf("Expected MaxOpenConns 25, got %d", config.MaxOpenConns)
|
|
}
|
|
|
|
if config.MaxIdleConns != 5 {
|
|
t.Errorf("Expected MaxIdleConns 5, got %d", config.MaxIdleConns)
|
|
}
|
|
|
|
if config.ConnMaxLifetime != time.Hour {
|
|
t.Errorf("Expected ConnMaxLifetime 1 hour, got %v", config.ConnMaxLifetime)
|
|
}
|
|
|
|
if config.ConnMaxIdleTime != 10*time.Minute {
|
|
t.Errorf("Expected ConnMaxIdleTime 10 minutes, got %v", config.ConnMaxIdleTime)
|
|
}
|
|
}
|
|
|
|
func TestStarDB_SetPoolConfig(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
err := db.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: 50,
|
|
MaxIdleConns: 10,
|
|
ConnMaxLifetime: 30 * time.Minute,
|
|
ConnMaxIdleTime: 5 * time.Minute,
|
|
}
|
|
|
|
db.SetPoolConfig(config)
|
|
|
|
stats := db.Stats()
|
|
if stats.MaxOpenConnections != 50 {
|
|
t.Errorf("Expected MaxOpenConnections 50, got %d", stats.MaxOpenConnections)
|
|
}
|
|
}
|
|
|
|
func TestStarDB_SetPoolConfig_Partial(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
err := db.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Only set MaxOpenConns
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: 100,
|
|
}
|
|
|
|
db.SetPoolConfig(config)
|
|
|
|
stats := db.Stats()
|
|
if stats.MaxOpenConnections != 100 {
|
|
t.Errorf("Expected MaxOpenConnections 100, got %d", stats.MaxOpenConnections)
|
|
}
|
|
}
|
|
|
|
func TestStarDB_SetPoolConfig_Zero(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
err := db.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Zero values should be ignored
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: 0,
|
|
MaxIdleConns: 0,
|
|
}
|
|
|
|
db.SetPoolConfig(config)
|
|
|
|
// Should not panic or error
|
|
err = db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Ping failed after SetPoolConfig with zero values: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStarDB_SetPoolConfig_NilConfig(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
err := db.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
db.SetPoolConfig(nil)
|
|
|
|
err = db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Ping failed after SetPoolConfig(nil): %v", err)
|
|
}
|
|
}
|
|
|
|
func TestStarDB_SetPoolConfig_BeforeOpen(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
|
|
db.SetPoolConfig(&stardb.PoolConfig{
|
|
MaxOpenConns: 10,
|
|
})
|
|
|
|
// should not panic when called before Open
|
|
}
|
|
|
|
func TestOpenWithPool_Default(t *testing.T) {
|
|
db, err := stardb.OpenWithPool("sqlite", ":memory:", nil)
|
|
if err != nil {
|
|
t.Fatalf("OpenWithPool failed: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
err = db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Ping failed: %v", err)
|
|
}
|
|
|
|
stats := db.Stats()
|
|
if stats.MaxOpenConnections != 25 {
|
|
t.Errorf("Expected default MaxOpenConnections 25, got %d", stats.MaxOpenConnections)
|
|
}
|
|
}
|
|
|
|
func TestOpenWithPool_Custom(t *testing.T) {
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: 15,
|
|
MaxIdleConns: 3,
|
|
ConnMaxLifetime: 20 * time.Minute,
|
|
ConnMaxIdleTime: 3 * time.Minute,
|
|
}
|
|
|
|
db, err := stardb.OpenWithPool("sqlite", ":memory:", config)
|
|
if err != nil {
|
|
t.Fatalf("OpenWithPool failed: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
err = db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Ping failed: %v", err)
|
|
}
|
|
|
|
stats := db.Stats()
|
|
if stats.MaxOpenConnections != 15 {
|
|
t.Errorf("Expected MaxOpenConnections 15, got %d", stats.MaxOpenConnections)
|
|
}
|
|
}
|
|
|
|
func TestOpenWithPool_InvalidDriver(t *testing.T) {
|
|
config := stardb.DefaultPoolConfig()
|
|
|
|
db, err := stardb.OpenWithPool("invalid_driver", "invalid_conn", config)
|
|
if err == nil {
|
|
db.Close()
|
|
t.Error("Expected error with invalid driver, got nil")
|
|
}
|
|
}
|
|
|
|
func TestOpenWithPool_Query(t *testing.T) {
|
|
db, err := stardb.OpenWithPool("sqlite", ":memory:", nil)
|
|
if err != nil {
|
|
t.Fatalf("OpenWithPool failed: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Create table
|
|
_, err = db.Exec(`CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)`)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create table: %v", err)
|
|
}
|
|
|
|
// Insert data
|
|
_, err = db.Exec(`INSERT INTO test (name) VALUES (?)`, "Alice")
|
|
if err != nil {
|
|
t.Fatalf("Failed to insert data: %v", err)
|
|
}
|
|
|
|
// Query data
|
|
rows, err := db.Query("SELECT * FROM test")
|
|
if err != nil {
|
|
t.Fatalf("Query failed: %v", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
if rows.Length() != 1 {
|
|
t.Errorf("Expected 1 row, got %d", rows.Length())
|
|
}
|
|
}
|
|
|
|
func TestPoolConfig_AllFields(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
err := db.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: 30,
|
|
MaxIdleConns: 8,
|
|
ConnMaxLifetime: 45 * time.Minute,
|
|
ConnMaxIdleTime: 7 * time.Minute,
|
|
}
|
|
|
|
db.SetPoolConfig(config)
|
|
|
|
// Verify by checking stats
|
|
stats := db.Stats()
|
|
if stats.MaxOpenConnections != 30 {
|
|
t.Errorf("Expected MaxOpenConnections 30, got %d", stats.MaxOpenConnections)
|
|
}
|
|
|
|
// Test that connections work
|
|
err = db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Ping failed after SetPoolConfig: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestPoolConfig_NegativeValues(t *testing.T) {
|
|
db := stardb.NewStarDB()
|
|
err := db.Open("sqlite", ":memory:")
|
|
if err != nil {
|
|
t.Fatalf("Failed to open database: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Negative values should be ignored
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: -1,
|
|
MaxIdleConns: -1,
|
|
}
|
|
|
|
db.SetPoolConfig(config)
|
|
|
|
// Should not panic or error
|
|
err = db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Ping failed after SetPoolConfig with negative values: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestOpenWithPool_MultipleConnections(t *testing.T) {
|
|
config := &stardb.PoolConfig{
|
|
MaxOpenConns: 5,
|
|
MaxIdleConns: 2,
|
|
}
|
|
|
|
db, err := stardb.OpenWithPool("sqlite", ":memory:", config)
|
|
if err != nil {
|
|
t.Fatalf("OpenWithPool failed: %v", err)
|
|
}
|
|
defer db.Close()
|
|
|
|
// Create table
|
|
_, err = db.Exec(`CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)`)
|
|
if err != nil {
|
|
t.Fatalf("Failed to create table: %v", err)
|
|
}
|
|
|
|
// Perform multiple operations
|
|
for i := 0; i < 10; i++ {
|
|
_, err = db.Exec(`INSERT INTO test (value) VALUES (?)`, "test")
|
|
if err != nil {
|
|
t.Errorf("Insert %d failed: %v", i, err)
|
|
}
|
|
}
|
|
|
|
// Verify
|
|
rows, err := db.Query("SELECT COUNT(*) as count FROM test")
|
|
if err != nil {
|
|
t.Fatalf("Query failed: %v", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
count := rows.Row(0).MustInt("count")
|
|
if count != 10 {
|
|
t.Errorf("Expected 10 rows, got %d", count)
|
|
}
|
|
}
|