From c39002296527eb96f5ff62d59996159f8ebafe30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net> Date: Mon, 23 Jun 2014 12:24:33 -0500 Subject: [PATCH] Adding tests for raw queries for PostgreSQL and MySQL. --- mysql/database_test.go | 48 +++++++++++++++++++++++++++++++++++++ postgresql/database_test.go | 48 +++++++++++++++++++++++++++++++++++++ util/sqlutil/main.go | 4 ++++ 3 files changed, 100 insertions(+) diff --git a/mysql/database_test.go b/mysql/database_test.go index 9f395fb8..3a22d56b 100644 --- a/mysql/database_test.go +++ b/mysql/database_test.go @@ -39,6 +39,7 @@ import ( "menteslibres.net/gosexy/to" "upper.io/db" + "upper.io/db/util/sqlutil" ) const ( @@ -767,6 +768,53 @@ func TestRawRelations(t *testing.T) { } +func TestRawQuery(t *testing.T) { + var sess db.Database + var rows *sql.Rows + var err error + var drv *sql.DB + + type publication_t struct { + Id int64 `db:"id,omitempty"` + Title string `db:"title"` + AuthorId int64 `db:"author_id"` + } + + if sess, err = db.Open(Adapter, settings); err != nil { + t.Fatal(err) + } + + defer sess.Close() + + drv = sess.Driver().(*sql.DB) + + rows, err = drv.Query(` + SELECT + p.id, + p.title AS publication_title, + a.name AS artist_name + FROM + artist AS a, + publication AS p + WHERE + a.id = p.author_id + `) + + if err != nil { + t.Fatal(err) + } + + var all []publication_t + + if err = sqlutil.FetchRows(rows, &all); err != nil { + t.Fatal(err) + } + + if len(all) != 9 { + t.Fatalf("Expecting some rows.") + } +} + // Attempts to test database transactions. func TestTransactionsAndRollback(t *testing.T) { var sess db.Database diff --git a/postgresql/database_test.go b/postgresql/database_test.go index ce1b11c1..1480d1e3 100644 --- a/postgresql/database_test.go +++ b/postgresql/database_test.go @@ -39,6 +39,7 @@ import ( "menteslibres.net/gosexy/to" "upper.io/db" + "upper.io/db/util/sqlutil" ) const ( @@ -790,6 +791,53 @@ func TestRawRelations(t *testing.T) { } +func TestRawQuery(t *testing.T) { + var sess db.Database + var rows *sql.Rows + var err error + var drv *sql.DB + + type publication_t struct { + Id int64 `db:"id,omitempty"` + Title string `db:"title"` + AuthorId int64 `db:"author_id"` + } + + if sess, err = db.Open(Adapter, settings); err != nil { + t.Fatal(err) + } + + defer sess.Close() + + drv = sess.Driver().(*sql.DB) + + rows, err = drv.Query(` + SELECT + p.id, + p.title AS publication_title, + a.name AS artist_name + FROM + artist AS a, + publication AS p + WHERE + a.id = p.author_id + `) + + if err != nil { + t.Fatal(err) + } + + var all []publication_t + + if err = sqlutil.FetchRows(rows, &all); err != nil { + t.Fatal(err) + } + + if len(all) != 9 { + t.Fatalf("Expecting some rows.") + } +} + // Attempts to test database transactions. func TestTransactionsAndRollback(t *testing.T) { var sess db.Database diff --git a/util/sqlutil/main.go b/util/sqlutil/main.go index 35e55eee..c28f99b0 100644 --- a/util/sqlutil/main.go +++ b/util/sqlutil/main.go @@ -182,6 +182,8 @@ func getRowColumns(rows *sql.Rows) ([]string, error) { return columns, nil } +// FetchRow() receives a *sql.Rows value and tries to map all the rows into a +// single struct given by the pointer `dst`. func FetchRow(rows *sql.Rows, dst interface{}) error { dstv := reflect.ValueOf(dst) @@ -220,6 +222,8 @@ func FetchRow(rows *sql.Rows, dst interface{}) error { return nil } +// FetchRow() receives a *sql.Rows value and tries to map all the rows into a +// slice of structs given by the pointer `dst`. func FetchRows(rows *sql.Rows, dst interface{}) error { // Destination. -- GitLab