# HG changeset patch
# User Christophe de Vienne <christophe@cdevienne.info>
# Date 1601383963 -7200
#      Tue Sep 29 14:52:43 2020 +0200
# Node ID 408c56d48ae9643de40e39f879eca656e6bcf989
# Parent  4b0f6e65fca9f35fdc979b02c3be75e128934344
Fix test db locking strategy

diff --git a/database/test.go b/database/test.go
--- a/database/test.go
+++ b/database/test.go
@@ -2,7 +2,6 @@
 
 import (
 	"context"
-	"database/sql"
 	"os"
 	"testing"
 
@@ -16,17 +15,12 @@
 
 const dbLockID = 15104
 
-func clearDB(t *testing.T, dsn string) {
+func clearDB(t *testing.T, c *sqlx.Conn, dsn string) {
 	// Drop all tables, and reinit
-	db, err := Open(dsn, 0)
-	if err != nil {
+	if _, err := c.ExecContext(context.Background(), "DROP SCHEMA IF EXISTS public CASCADE"); err != nil {
 		t.Fatal(err)
 	}
-	defer db.Close()
-	if _, err := db.Exec("DROP SCHEMA IF EXISTS public CASCADE"); err != nil {
-		t.Fatal(err)
-	}
-	if _, err := db.Exec("CREATE SCHEMA public"); err != nil {
+	if _, err := c.ExecContext(context.Background(), "CREATE SCHEMA public"); err != nil {
 		t.Fatal(err)
 	}
 }
@@ -35,7 +29,7 @@
 type TestDB struct {
 	*sqlx.DB
 	tb       testing.TB
-	lockConn *sql.Conn
+	lockConn *sqlx.Conn
 }
 
 // GetTestDB creates a db and returns it. It must be closed within the test.
@@ -45,8 +39,27 @@
 	if dsn == "" {
 		t.Fatal("Please define a TEST_DB_DSN environment variable")
 	}
+	db, err := Open(dsn, 0)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	c, err := db.Connx(context.Background())
+	if err != nil {
+		_ = db.Close()
+		t.Fatal(err)
+	}
+
+	if _, err := c.ExecContext(
+		context.Background(),
+		"SELECT pg_advisory_lock($1)", dbLockID,
+	); err != nil {
+		_ = db.Close()
+		t.Fatal(err)
+	}
+
 	if len(dbtablenames) == 0 {
-		clearDB(t, dsn)
+		clearDB(t, c, dsn)
 
 		m, err := NewMigrate(dsn, sourceDriver)
 		if err != nil {
@@ -59,10 +72,6 @@
 			t.Fatal(srcErr, dbErr)
 		}
 	}
-	db, err := Open(dsn, 0)
-	if err != nil {
-		t.Fatal(err)
-	}
 	if len(dbtablenames) == 0 {
 		if err := db.Select(&dbtablenames,
 			"SELECT tablename "+
@@ -98,21 +107,6 @@
 		}
 	}
 
-	c, err := db.Conn(context.Background())
-
-	if err != nil {
-		_ = db.Close()
-		t.Fatal(err)
-	}
-
-	if _, err := c.ExecContext(
-		context.Background(),
-		"SELECT pg_advisory_lock($1)", dbLockID,
-	); err != nil {
-		_ = db.Close()
-		t.Fatal(err)
-	}
-
 	return &TestDB{db, t, c}
 }
 
diff --git a/go.mod b/go.mod
--- a/go.mod
+++ b/go.mod
@@ -4,11 +4,12 @@
 
 require (
 	github.com/Masterminds/squirrel v1.4.0
+	github.com/fatih/structtag v1.2.0
 	github.com/getsentry/sentry-go v0.7.0
 	github.com/go-openapi/runtime v0.19.21
 	github.com/go-openapi/swag v0.19.9
 	github.com/golang-migrate/migrate/v4 v4.12.2
-	github.com/jmoiron/sqlx v1.2.0
+	github.com/jmoiron/sqlx v1.2.1-0.20200615141059-0794cb1f47ee
 	github.com/json-iterator/go v1.1.6
 	github.com/lann/builder v0.0.0-20180802200727-47ae307949d0
 	github.com/orus-io/go-flags v1.4.0
diff --git a/go.sum b/go.sum
--- a/go.sum
+++ b/go.sum
@@ -109,6 +109,8 @@
 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
 github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
+github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
+github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
 github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw=
@@ -334,6 +336,8 @@
 github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
 github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/jmoiron/sqlx v1.2.1-0.20200615141059-0794cb1f47ee h1:59lyMGvZusByi7Rvctn8cxdVAjhiOnqCv3G5DrYApYQ=
+github.com/jmoiron/sqlx v1.2.1-0.20200615141059-0794cb1f47ee/go.mod h1:ClpsPFzLpSBl7MvJ+BhV0JHz4vmKRBarpvZ9644v9Oo=
 github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=