internal: skip tests if no DB

Fixes golang/go#39598.

Change-Id: Iae5a4174ca392009a9c3290c096eb8711e6ad522
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/238177
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
diff --git a/internal/database/database_test.go b/internal/database/database_test.go
index cb6acbd..42d363f 100644
--- a/internal/database/database_test.go
+++ b/internal/database/database_test.go
@@ -7,6 +7,7 @@
 import (
 	"context"
 	"database/sql"
+	"errors"
 	"fmt"
 	"log"
 	"os"
@@ -16,6 +17,7 @@
 	"time"
 
 	"github.com/google/go-cmp/cmp"
+	"golang.org/x/pkgsite/internal/derrors"
 	"golang.org/x/pkgsite/internal/testing/dbtest"
 )
 
@@ -27,12 +29,16 @@
 	const dbName = "discovery_postgres_test"
 
 	if err := dbtest.CreateDBIfNotExists(dbName); err != nil {
+		if errors.Is(err, derrors.NotFound) {
+			log.Printf("SKIPPING: could not connect to DB: %v", err)
+			return
+		}
 		log.Fatal(err)
 	}
 	var err error
 	testDB, err = Open("postgres", dbtest.DBConnURI(dbName))
 	if err != nil {
-		log.Fatal(err)
+		log.Fatalf("Open: %v %[1]T", err)
 	}
 	code := m.Run()
 	if err := testDB.Close(); err != nil {
diff --git a/internal/postgres/test_helper.go b/internal/postgres/test_helper.go
index b68b2e6..40e46ef 100644
--- a/internal/postgres/test_helper.go
+++ b/internal/postgres/test_helper.go
@@ -7,6 +7,7 @@
 import (
 	"context"
 	"database/sql"
+	"errors"
 	"fmt"
 	"log"
 	"os"
@@ -76,7 +77,7 @@
 	defer derrors.Wrap(&err, "SetupTestDB(%q)", dbName)
 
 	if err := dbtest.CreateDBIfNotExists(dbName); err != nil {
-		return nil, fmt.Errorf("createDBIfNotExists(%q): %v", dbName, err)
+		return nil, fmt.Errorf("CreateDBIfNotExists(%q): %w", dbName, err)
 	}
 	if isMigrationError, err := tryToMigrate(dbName); err != nil {
 		if isMigrationError {
@@ -131,6 +132,10 @@
 	database.QueryLoggingDisabled = true
 	db, err := SetupTestDB(dbName)
 	if err != nil {
+		if errors.Is(err, derrors.NotFound) {
+			log.Printf("SKIPPING: could not connect to DB: %v", err)
+			return
+		}
 		log.Fatal(err)
 	}
 	*testDB = db
diff --git a/internal/testing/dbtest/dbtest.go b/internal/testing/dbtest/dbtest.go
index 18bc50f..31da0c7 100644
--- a/internal/testing/dbtest/dbtest.go
+++ b/internal/testing/dbtest/dbtest.go
@@ -13,6 +13,7 @@
 	"os"
 	"strings"
 
+	"golang.org/x/pkgsite/internal/derrors"
 	// imported to register the postgres migration driver
 	_ "github.com/golang-migrate/migrate/v4/database/postgres"
 	// imported to register the file source migration driver
@@ -61,10 +62,14 @@
 
 // ConnectAndExecute connects to the postgres database specified by uri and
 // executes dbFunc, then cleans up the database connection.
+// It returns an error that Is derrors.NotFound if no connection could be made.
 func ConnectAndExecute(uri string, dbFunc func(*sql.DB) error) (outerErr error) {
 	pg, err := sql.Open("postgres", uri)
+	if err == nil {
+		err = pg.Ping()
+	}
 	if err != nil {
-		return err
+		return fmt.Errorf("%w: %v", derrors.NotFound, err)
 	}
 	defer func() {
 		if err := pg.Close(); err != nil {