db_test.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package db
  2. import (
  3. "context"
  4. "os"
  5. "testing"
  6. "time"
  7. )
  8. // TestOpen 需要真实的 PostgreSQL,未设置 HAVEN_TEST_DB_DSN 时跳过。
  9. //
  10. // 本地跑法:
  11. //
  12. // HAVEN_TEST_DB_DSN='postgres://haven:xxx@127.0.0.1:5432/haven?sslmode=disable' \
  13. // go test ./internal/db/... -v
  14. func TestOpen(t *testing.T) {
  15. dsn := os.Getenv("HAVEN_TEST_DB_DSN")
  16. if dsn == "" {
  17. t.Skip("未设置 HAVEN_TEST_DB_DSN,跳过数据库集成测试")
  18. }
  19. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  20. defer cancel()
  21. conn, err := Open(ctx, dsn)
  22. if err != nil {
  23. t.Fatalf("Open() 返回错误: %v", err)
  24. }
  25. defer conn.Close()
  26. var one int
  27. if err := conn.QueryRowContext(ctx, "SELECT 1").Scan(&one); err != nil {
  28. t.Fatalf("查询失败: %v", err)
  29. }
  30. if one != 1 {
  31. t.Errorf("SELECT 1 返回 %d", one)
  32. }
  33. }
  34. func TestOpenInvalidDSN(t *testing.T) {
  35. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  36. defer cancel()
  37. if _, err := Open(ctx, "postgres://nouser@127.0.0.1:1/nodb?sslmode=disable&connect_timeout=2"); err == nil {
  38. t.Fatal("无法连接的 DSN 应返回错误")
  39. }
  40. }
苏ICP备2026082406号
苏公网安备 待审核