From 1e3a54611f5a1dd79283933002bc1d59097a7933 Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Sat, 23 Apr 2016 17:49:18 +0200 Subject: [PATCH 1/2] Add sqlite3 testing support --- .travis.yml | 4 ++- sqlhooks_fakedb_test.go | 11 +++++++ sqlhooks_sqlite3_test.go | 15 +++++++++ sqlhooks_test.go | 66 ++++++++++++++++++++++++++-------------- 4 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 sqlhooks_fakedb_test.go create mode 100644 sqlhooks_sqlite3_test.go diff --git a/.travis.yml b/.travis.yml index 7043978..88d0f15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,4 +10,6 @@ before_install: - go get github.com/mattn/goveralls - if ! go get github.com/golang/tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi script: - - $HOME/gopath/bin/goveralls -service=travis-ci \ No newline at end of file + - $HOME/gopath/bin/goveralls -service=travis-ci + - go test + - go test -tags sqlite3 -driver sqlite3 \ No newline at end of file diff --git a/sqlhooks_fakedb_test.go b/sqlhooks_fakedb_test.go new file mode 100644 index 0000000..050890d --- /dev/null +++ b/sqlhooks_fakedb_test.go @@ -0,0 +1,11 @@ +package sqlhooks + +func init() { + queries["test"] = ops{ + wipe: "WIPE", + create: "CREATE|t|f1=string,f2=string", + insert: "INSERT|t|f1=?,f2=?", + selectwhere: "SELECT|t|f1,f2|f1=?,f2=?", + selectall: "SELECT|t|f1,f2|", + } +} diff --git a/sqlhooks_sqlite3_test.go b/sqlhooks_sqlite3_test.go new file mode 100644 index 0000000..9fa5f50 --- /dev/null +++ b/sqlhooks_sqlite3_test.go @@ -0,0 +1,15 @@ +// +build sqlite3 + +package sqlhooks + +import _ "github.com/mattn/go-sqlite3" + +func init() { + queries["sqlite3"] = ops{ + wipe: "DROP TABLE IF EXISTS t", + create: "CREATE TABLE t(f1, f2)", + insert: "INSERT INTO t VALUES(?, ?)", + selectwhere: "SELECT f1, f2 FROM t WHERE f1=? AND f2=?", + selectall: "SELECT f1, f2 FROM t", + } +} diff --git a/sqlhooks_test.go b/sqlhooks_test.go index f56392d..8811184 100644 --- a/sqlhooks_test.go +++ b/sqlhooks_test.go @@ -2,35 +2,53 @@ package sqlhooks import ( "database/sql" + "flag" "fmt" "sort" "testing" "time" ) +var ( + driverFlag = flag.String("driver", "test", "SQL Driver") + dsnFlag = flag.String("dsn", "db", "DSN") +) + +type ops struct { + wipe string + create string + insert string + selectwhere string + selectall string +} + +var queries = make(map[string]ops) + func openDBWithHooks(t *testing.T, hooks *Hooks) *sql.DB { + q := queries[*driverFlag] + // First, we connect directly using `test` driver - if db, err := sql.Open("test", "db"); err != nil { + if db, err := sql.Open(*driverFlag, *dsnFlag); err != nil { t.Fatalf("sql.Open: %v", err) return nil } else { - if _, err := db.Exec("WIPE"); err != nil { + if _, err := db.Exec(q.wipe); err != nil { t.Fatalf("WIPE: %v", err) return nil } - if _, err := db.Exec("CREATE|t|f1=string,f2=string"); err != nil { + if _, err := db.Exec(q.create); err != nil { t.Fatalf("CREATE: %v", err) return nil } } // Now, return a db handler using hooked driver - driver := NewDriver("test", hooks) - driverName := fmt.Sprintf("test-%d", time.Now().UnixNano()) + driver := NewDriver(*driverFlag, hooks) + driverName := fmt.Sprintf("sqlhooks-%d", time.Now().UnixNano()) Register(driverName, driver) - db, err := sql.Open(driverName, "db") + db, err := sql.Open(driverName, *dsnFlag) if err != nil { t.Fatalf("sql.Open: %v", err) return nil @@ -40,18 +58,19 @@ func openDBWithHooks(t *testing.T, hooks *Hooks) *sql.DB { } func TestHooks(t *testing.T) { + q := queries[*driverFlag] tests := []struct { op string query string args []interface{} }{ - {"exec", "INSERT|t|f1=?,f2=?", []interface{}{"foo", "bar"}}, - {"query", "SELECT|t|f1|f1=?,f2=?", []interface{}{"foo", "bar"}}, - {"query", "SELECT|t|f1|", []interface{}{}}, - {"stmt.query", "SELECT|t|f1|", nil}, - {"stmt.exec", "INSERT|t|f1=?", []interface{}{"x"}}, - {"tx.query", "SELECT|t|f1|", nil}, - {"tx.exec", "INSERT|t|f1=?", []interface{}{"x"}}, + {"exec", q.insert, []interface{}{"foo", "bar"}}, + {"query", q.selectwhere, []interface{}{"foo", "bar"}}, + {"query", q.selectall, []interface{}{}}, + {"stmt.query", q.selectall, nil}, + {"stmt.exec", q.insert, []interface{}{"x", "y"}}, + {"tx.query", q.selectall, nil}, + {"tx.exec", q.insert, []interface{}{"x", "y"}}, } for _, test := range tests { @@ -139,30 +158,33 @@ func TestHooks(t *testing.T) { } func TestEmptyHooks(t *testing.T) { + q := queries[*driverFlag] db := openDBWithHooks(t, &Hooks{}) - if _, err := db.Exec("INSERT|t|f1=?", "foo"); err != nil { + if _, err := db.Exec(q.insert, "foo", "bar"); err != nil { t.Fatalf("Exec: %v\n", err) } - if _, err := db.Query("SELECT|t|f1|"); err != nil { + if _, err := db.Query(q.selectall); err != nil { t.Fatalf("Query: %v\n", err) } } func TestCreateInsertAndSelect(t *testing.T) { + q := queries[*driverFlag] db := openDBWithHooks(t, &Hooks{}) - db.Exec("INSERT|t|f1=?,f2=?", "a", "1") - db.Exec("INSERT|t|f1=?,f2=?", "b", "2") - db.Exec("INSERT|t|f1=?,f2=?", "c", "3") + db.Exec(q.insert, "a", "1") + db.Exec(q.insert, "b", "2") + db.Exec(q.insert, "c", "3") - rows, _ := db.Query("SELECT|t|f1|") + rows, _ := db.Query(q.selectall) var fs []string for rows.Next() { - var f string - rows.Scan(&f) - fs = append(fs, f) + var f1 string + var f2 string + rows.Scan(&f1, &f2) + fs = append(fs, f1) } sort.Strings(fs) if len(fs) != 3 { From ada5487ed1d8ae96e31dacdd2c98fa67d6b6ec93 Mon Sep 17 00:00:00 2001 From: Gustavo Chain Date: Sat, 23 Apr 2016 17:51:01 +0200 Subject: [PATCH 2/2] Add mattn/go-sqlite3 dep in travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 88d0f15..f2d2b50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ go: - 1.6 - tip before_install: + - go get github.com/mattn/go-sqlite3 - go get github.com/axw/gocov/gocov - go get github.com/mattn/goveralls - if ! go get github.com/golang/tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi