From 1cbbbe3f56e855bbaed706bc871a77b5b25e1c5e Mon Sep 17 00:00:00 2001 From: Andrew Moon Date: Tue, 18 Aug 2015 15:49:09 -0500 Subject: [PATCH 1/4] Fix an issue with a nil pointer access on the inserts and updates. --- dataset.go | 22 ++++++++++++++++++++++ dataset_insert.go | 3 +-- dataset_insert_test.go | 35 ++++++++++++++++++++++++++++++----- dataset_update.go | 3 +-- dataset_update_test.go | 5 +++-- 5 files changed, 57 insertions(+), 11 deletions(-) diff --git a/dataset.go b/dataset.go index 4c144a06..185de0f4 100644 --- a/dataset.go +++ b/dataset.go @@ -289,3 +289,25 @@ func (me *Dataset) expressionSql(buf *SqlBuilder, expression Expression) error { } return NewGoquError("Unsupported expression type %T", expression) } + +func (me *Dataset) isValueNil(value reflect.Value, kind reflect.Kind) bool { + switch kind { + case reflect.Ptr, reflect.Interface: + return value.IsNil() + default: + return false + } +} + +func (me *Dataset) isSpecialType(value reflect.Value) bool { + i := value.Interface() + if _, ok := i.(time.Time); ok { + return true + } else if _, ok := i.(*time.Time); ok { + return true + } else if _, ok := i.(driver.Valuer); ok { + return true + } + + return false +} diff --git a/dataset_insert.go b/dataset_insert.go index 8832e60d..c8beb812 100644 --- a/dataset_insert.go +++ b/dataset_insert.go @@ -3,7 +3,6 @@ package goqu import ( "reflect" "sort" - "time" ) //Generates the default INSERT statement. If Prepared has been called with true then the statement will not be interpolated. See examples. @@ -113,7 +112,7 @@ func (me *Dataset) getFieldsValues(value reflect.Value) (rowCols []interface{}, v := value.Field(i) kind := v.Kind() - if (reflect.TypeOf(v.Interface()).Name() == reflect.TypeOf((*time.Time)(nil)).Elem().Name()) || ((kind != reflect.Struct) && (kind != reflect.Ptr)) { + if me.isSpecialType(v) || ((kind != reflect.Struct) && (kind != reflect.Ptr)) { t := value.Type().Field(i) if me.canInsertField(t) { rowCols = append(rowCols, t.Tag.Get("db")) diff --git a/dataset_insert_test.go b/dataset_insert_test.go index 84700183..fe37233d 100644 --- a/dataset_insert_test.go +++ b/dataset_insert_test.go @@ -4,6 +4,7 @@ import ( "github.com/DATA-DOG/go-sqlmock" "github.com/c2fo/testify/assert" + "database/sql" "time" ) @@ -92,12 +93,13 @@ func (me *datasetTest) TestInsertSqlWithEmbeddedStructPtr() { } type item struct { *phone - Address string `db:"address"` - Name string `db:"name"` + Address string `db:"address"` + Name string `db:"name"` + Valuer sql.NullInt64 `db:"valuer"` } - sql, _, err := ds1.ToInsertSql(item{Name: "Test", Address: "111 Test Addr", phone: &phone{Home: "123123", Primary: "456456"}}) + sql, _, err := ds1.ToInsertSql(item{Name: "Test", Address: "111 Test Addr", Valuer: sql.NullInt64{Int64: 10, Valid: true}, phone: &phone{Home: "123123", Primary: "456456"}}) assert.NoError(t, err) - assert.Equal(t, sql, `INSERT INTO "items" ("primary_phone", "home_phone", "address", "name") VALUES ('456456', '123123', '111 Test Addr', 'Test')`) + assert.Equal(t, sql, `INSERT INTO "items" ("primary_phone", "home_phone", "address", "name", "valuer") VALUES ('456456', '123123', '111 Test Addr', 'Test', 10)`) sql, _, err = ds1.ToInsertSql( item{Address: "111 Test Addr", Name: "Test1", phone: &phone{Home: "123123", Primary: "456456"}}, @@ -106,7 +108,30 @@ func (me *datasetTest) TestInsertSqlWithEmbeddedStructPtr() { item{Address: "411 Test Addr", Name: "Test4", phone: &phone{Home: "123123", Primary: "456456"}}, ) assert.NoError(t, err) - assert.Equal(t, sql, `INSERT INTO "items" ("primary_phone", "home_phone", "address", "name") VALUES ('456456', '123123', '111 Test Addr', 'Test1'), ('456456', '123123', '211 Test Addr', 'Test2'), ('456456', '123123', '311 Test Addr', 'Test3'), ('456456', '123123', '411 Test Addr', 'Test4')`) + assert.Equal(t, sql, `INSERT INTO "items" ("primary_phone", "home_phone", "address", "name", "valuer") VALUES ('456456', '123123', '111 Test Addr', 'Test1', NULL), ('456456', '123123', '211 Test Addr', 'Test2', NULL), ('456456', '123123', '311 Test Addr', 'Test3', NULL), ('456456', '123123', '411 Test Addr', 'Test4', NULL)`) +} + +func (me *datasetTest) TestInsertSqlWithValuer() { + t := me.T() + ds1 := From("items") + + type item struct { + Address string `db:"address"` + Name string `db:"name"` + Valuer sql.NullInt64 `db:"valuer"` + } + sqlString, _, err := ds1.ToInsertSql(item{Name: "Test", Address: "111 Test Addr", Valuer: sql.NullInt64{Int64: 10, Valid: true}}) + assert.NoError(t, err) + assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test', 10)`) + + sqlString, _, err = ds1.ToInsertSql( + item{Address: "111 Test Addr", Name: "Test1", Valuer: sql.NullInt64{Int64: 10, Valid: true}}, + item{Address: "211 Test Addr", Name: "Test2", Valuer: sql.NullInt64{Int64: 10, Valid: true}}, + item{Address: "311 Test Addr", Name: "Test3", Valuer: sql.NullInt64{Int64: 10, Valid: true}}, + item{Address: "411 Test Addr", Name: "Test4", Valuer: sql.NullInt64{Int64: 10, Valid: true}}, + ) + assert.NoError(t, err) + assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test1', 10), ('211 Test Addr', 'Test2', 10), ('311 Test Addr', 'Test3', 10), ('411 Test Addr', 'Test4', 10)`) } func (me *datasetTest) TestInsertSqlWithMaps() { diff --git a/dataset_update.go b/dataset_update.go index faed5aa1..405bc7d4 100644 --- a/dataset_update.go +++ b/dataset_update.go @@ -3,7 +3,6 @@ package goqu import ( "reflect" "sort" - "time" ) func (me *Dataset) canUpdateField(field reflect.StructField) bool { @@ -81,7 +80,7 @@ func (me *Dataset) getUpdateExpressions(value reflect.Value) (updates []UpdateEx for i := 0; i < value.NumField(); i++ { v := value.Field(i) kind := v.Kind() - if reflect.TypeOf(v.Interface()).Name() == reflect.TypeOf((*time.Time)(nil)).Elem().Name() || (kind != reflect.Struct && kind != reflect.Ptr) { + if me.isSpecialType(v) || ((kind != reflect.Struct) && (kind != reflect.Ptr)) { t := value.Type().Field(i) if me.canUpdateField(t) { updates = append(updates, I(t.Tag.Get("db")).Set(v.Interface())) diff --git a/dataset_update_test.go b/dataset_update_test.go index 569bf18b..0f374548 100644 --- a/dataset_update_test.go +++ b/dataset_update_test.go @@ -287,6 +287,7 @@ func (me *datasetTest) TestPreparedUpdateSqlWithEmbeddedStruct() { Address string `db:"address" goqu:"skipupdate"` Name string `db:"name"` Created time.Time `db:"created"` + NilPointer interface{} `db:"nil_pointer"` } created, _ := time.Parse("2006-01-02", "2015-01-01") @@ -296,8 +297,8 @@ func (me *datasetTest) TestPreparedUpdateSqlWithEmbeddedStruct() { Created: created, }}) assert.NoError(t, err) - assert.Equal(t, args, []interface{}{"456456", "123123", created, "Test", created}) - assert.Equal(t, sql, `UPDATE "items" SET "primary_phone"=?,"home_phone"=?,"phone_created"=?,"name"=?,"created"=?`) + assert.Equal(t, args, []interface{}{"456456", "123123", created, "Test", created, interface{}(nil)}) + assert.Equal(t, sql, `UPDATE "items" SET "primary_phone"=?,"home_phone"=?,"phone_created"=?,"name"=?,"created"=?,"nil_pointer"=?`) } func (me *datasetTest) TestPreparedUpdateSqlWithEmbeddedStructPtr() { From 978191047b8f1a758cd59a1c5d41b853363ac0ef Mon Sep 17 00:00:00 2001 From: Andrew Moon Date: Tue, 25 Aug 2015 15:03:11 -0500 Subject: [PATCH 2/4] Allowing ScanStructs to take a struct with an embedded pointer to a struck. --- crud_exec.go | 25 +++++++++++++++++++++---- dataset.go | 9 --------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/crud_exec.go b/crud_exec.go index 95238f09..6b0dfbe9 100644 --- a/crud_exec.go +++ b/crud_exec.go @@ -220,7 +220,7 @@ func assignVals(i interface{}, results []Record, cm columnMap) error { val := reflect.Indirect(reflect.ValueOf(i)) t, _, isSliceOfPointers := getTypeInfo(i, val) switch val.Kind() { - case reflect.Struct: + case reflect.Struct: result := results[0] for name, data := range cm { src, ok := result[name] @@ -234,9 +234,10 @@ func assignVals(i interface{}, results []Record, cm columnMap) error { } } } - case reflect.Slice: + case reflect.Slice: for _, result := range results { row := reflect.Indirect(reflect.New(t)) + initEmbeddedPtr(row) for name, data := range cm { src, ok := result[name] if ok { @@ -259,6 +260,18 @@ func assignVals(i interface{}, results []Record, cm columnMap) error { return nil } +func initEmbeddedPtr(value reflect.Value) { + for i := 0; i < value.NumField(); i++ { + v := value.Field(i) + kind := v.Kind() + t := value.Type().Field(i) + if t.Anonymous && kind == reflect.Ptr { + z := reflect.New(t.Type.Elem()) + v.Set(z) + } + } +} + func getColumnMap(i interface{}) (columnMap, error) { val := reflect.Indirect(reflect.ValueOf(i)) t, valKind, _ := getTypeInfo(i, val) @@ -276,8 +289,12 @@ func createColumnMap(t reflect.Type) columnMap { var subColMaps []columnMap for i := 0; i < n; i++ { f := t.Field(i) - if f.Anonymous && f.Type.Kind() == reflect.Struct { - subColMaps = append(subColMaps, createColumnMap(f.Type)) + if f.Anonymous && (f.Type.Kind() == reflect.Struct || f.Type.Kind() == reflect.Ptr) { + if f.Type.Kind() == reflect.Ptr { + subColMaps = append(subColMaps, createColumnMap(f.Type.Elem())) + } else { + subColMaps = append(subColMaps, createColumnMap(f.Type)) + } } else { columnName := f.Tag.Get("db") if columnName == "" { diff --git a/dataset.go b/dataset.go index 185de0f4..d2c104ee 100644 --- a/dataset.go +++ b/dataset.go @@ -290,15 +290,6 @@ func (me *Dataset) expressionSql(buf *SqlBuilder, expression Expression) error { return NewGoquError("Unsupported expression type %T", expression) } -func (me *Dataset) isValueNil(value reflect.Value, kind reflect.Kind) bool { - switch kind { - case reflect.Ptr, reflect.Interface: - return value.IsNil() - default: - return false - } -} - func (me *Dataset) isSpecialType(value reflect.Value) bool { i := value.Interface() if _, ok := i.(time.Time); ok { From ee6e8185f9ad90a7948e5e7f86c226ef69341663 Mon Sep 17 00:00:00 2001 From: Andrew Moon Date: Fri, 28 Aug 2015 11:50:06 -0500 Subject: [PATCH 3/4] Change to check if struct is Anonymous when recursing through an embedded struct. --- dataset.go | 15 +------------ dataset_insert.go | 6 ++---- dataset_insert_test.go | 23 ++++++++++++++++++++ dataset_update.go | 5 ++--- dataset_update_test.go | 49 +++++++++++++++++++++++++++++++++++++----- 5 files changed, 72 insertions(+), 26 deletions(-) diff --git a/dataset.go b/dataset.go index d2c104ee..7d12ab3b 100644 --- a/dataset.go +++ b/dataset.go @@ -288,17 +288,4 @@ func (me *Dataset) expressionSql(buf *SqlBuilder, expression Expression) error { return me.adapter.ExpressionOrMapSql(buf, e) } return NewGoquError("Unsupported expression type %T", expression) -} - -func (me *Dataset) isSpecialType(value reflect.Value) bool { - i := value.Interface() - if _, ok := i.(time.Time); ok { - return true - } else if _, ok := i.(*time.Time); ok { - return true - } else if _, ok := i.(driver.Valuer); ok { - return true - } - - return false -} +} \ No newline at end of file diff --git a/dataset_insert.go b/dataset_insert.go index c8beb812..5a7dccb0 100644 --- a/dataset_insert.go +++ b/dataset_insert.go @@ -110,10 +110,8 @@ func (me *Dataset) getFieldsValues(value reflect.Value) (rowCols []interface{}, if value.IsValid() { for i := 0; i < value.NumField(); i++ { v := value.Field(i) - - kind := v.Kind() - if me.isSpecialType(v) || ((kind != reflect.Struct) && (kind != reflect.Ptr)) { - t := value.Type().Field(i) + t := value.Type().Field(i) + if !t.Anonymous { if me.canInsertField(t) { rowCols = append(rowCols, t.Tag.Get("db")) rowVals = append(rowVals, v.Interface()) diff --git a/dataset_insert_test.go b/dataset_insert_test.go index fe37233d..b187889f 100644 --- a/dataset_insert_test.go +++ b/dataset_insert_test.go @@ -134,6 +134,29 @@ func (me *datasetTest) TestInsertSqlWithValuer() { assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test1', 10), ('211 Test Addr', 'Test2', 10), ('311 Test Addr', 'Test3', 10), ('411 Test Addr', 'Test4', 10)`) } +func (me *datasetTest) TestInsertSqlWithValuerNull() { + t := me.T() + ds1 := From("items") + + type item struct { + Address string `db:"address"` + Name string `db:"name"` + Valuer sql.NullInt64 `db:"valuer"` + } + sqlString, _, err := ds1.ToInsertSql(item{Name: "Test", Address: "111 Test Addr"}) + assert.NoError(t, err) + assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test', NULL)`) + + sqlString, _, err = ds1.ToInsertSql( + item{Address: "111 Test Addr", Name: "Test1"}, + item{Address: "211 Test Addr", Name: "Test2"}, + item{Address: "311 Test Addr", Name: "Test3"}, + item{Address: "411 Test Addr", Name: "Test4"}, + ) + assert.NoError(t, err) + assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test1', NULL), ('211 Test Addr', 'Test2', NULL), ('311 Test Addr', 'Test3', NULL), ('411 Test Addr', 'Test4', NULL)`) +} + func (me *datasetTest) TestInsertSqlWithMaps() { t := me.T() ds1 := From("items") diff --git a/dataset_update.go b/dataset_update.go index 405bc7d4..27f09906 100644 --- a/dataset_update.go +++ b/dataset_update.go @@ -79,9 +79,8 @@ func (me *Dataset) ToUpdateSql(update interface{}) (string, []interface{}, error func (me *Dataset) getUpdateExpressions(value reflect.Value) (updates []UpdateExpression) { for i := 0; i < value.NumField(); i++ { v := value.Field(i) - kind := v.Kind() - if me.isSpecialType(v) || ((kind != reflect.Struct) && (kind != reflect.Ptr)) { - t := value.Type().Field(i) + t := value.Type().Field(i) + if !t.Anonymous { if me.canUpdateField(t) { updates = append(updates, I(t.Tag.Get("db")).Set(v.Interface())) } diff --git a/dataset_update_test.go b/dataset_update_test.go index 0f374548..2e24eef3 100644 --- a/dataset_update_test.go +++ b/dataset_update_test.go @@ -1,6 +1,7 @@ package goqu import ( + "database/sql" "database/sql/driver" "fmt" "time" @@ -97,7 +98,7 @@ func (j valuerType) Value() (driver.Value, error) { return []byte(fmt.Sprintf("%s World", string(j))), nil } -func (me *datasetTest) TestUpdateSqlWithValuer() { +func (me *datasetTest) TestUpdateSqlWithCustomValuer() { t := me.T() ds1 := From("items") type item struct { @@ -109,6 +110,31 @@ func (me *datasetTest) TestUpdateSqlWithValuer() { assert.Equal(t, sql, `UPDATE "items" SET "name"='Test',"data"='Hello World' RETURNING "items".*`) } +func (me *datasetTest) TestUpdateSqlWithValuer() { + t := me.T() + ds1 := From("items") + type item struct { + Name string `db:"name"` + Data sql.NullString `db:"data"` + } + + sql, _, err := ds1.Returning(I("items").All()).ToUpdateSql(item{Name: "Test", Data: sql.NullString{String: "Hello World", Valid: true}}) + assert.NoError(t, err) + assert.Equal(t, sql, `UPDATE "items" SET "name"='Test',"data"='Hello World' RETURNING "items".*`) +} + +func (me *datasetTest) TestUpdateSqlWithValuerNull() { + t := me.T() + ds1 := From("items") + type item struct { + Name string `db:"name"` + Data sql.NullString `db:"data"` + } + sql, _, err := ds1.Returning(I("items").All()).ToUpdateSql(item{Name: "Test"}) + assert.NoError(t, err) + assert.Equal(t, sql, `UPDATE "items" SET "name"='Test',"data"=NULL RETURNING "items".*`) +} + func (me *datasetTest) TestUpdateSqlWithEmbeddedStruct() { t := me.T() ds1 := From("items") @@ -248,7 +274,7 @@ func (me *datasetTest) TestPreparedUpdateSqlWithByteSlice() { assert.Equal(t, sql, `UPDATE "items" SET "name"=?,"data"=? RETURNING "items".*`) } -func (me *datasetTest) TestPreparedUpdateSqlWithValuer() { +func (me *datasetTest) TestPreparedUpdateSqlWithCustomValuer() { t := me.T() ds1 := From("items") type item struct { @@ -261,6 +287,19 @@ func (me *datasetTest) TestPreparedUpdateSqlWithValuer() { assert.Equal(t, sql, `UPDATE "items" SET "name"=?,"data"=? RETURNING "items".*`) } +func (me *datasetTest) TestPreparedUpdateSqlWithValuer() { + t := me.T() + ds1 := From("items") + type item struct { + Name string `db:"name"` + Data sql.NullString `db:"data"` + } + sql, args, err := ds1.Returning(I("items").All()).Prepared(true).ToUpdateSql(item{Name: "Test", Data: sql.NullString{String: "Hello World", Valid: true}}) + assert.NoError(t, err) + assert.Equal(t, args, []interface{}{"Test", "Hello World"}) + assert.Equal(t, sql, `UPDATE "items" SET "name"=?,"data"=? RETURNING "items".*`) +} + func (me *datasetTest) TestPreparedUpdateSqlWithSkipupdateTag() { t := me.T() ds1 := From("items") @@ -284,9 +323,9 @@ func (me *datasetTest) TestPreparedUpdateSqlWithEmbeddedStruct() { } type item struct { phone - Address string `db:"address" goqu:"skipupdate"` - Name string `db:"name"` - Created time.Time `db:"created"` + Address string `db:"address" goqu:"skipupdate"` + Name string `db:"name"` + Created time.Time `db:"created"` NilPointer interface{} `db:"nil_pointer"` } created, _ := time.Parse("2006-01-02", "2015-01-01") From 1d3b96d3ee5496652100f925fdee255e8a5245fd Mon Sep 17 00:00:00 2001 From: Andrew Moon Date: Fri, 28 Aug 2015 12:45:49 -0500 Subject: [PATCH 4/4] Updated to use the lastest version of github.com/DATA-DOG/go-sqlmock. --- HISTORY.md | 8 ++ crud_exec.go | 4 +- crud_exec_test.go | 42 +++++----- database_test.go | 170 ++++++++++++++++++++-------------------- dataset.go | 2 +- dataset_actions_test.go | 86 ++++++++++---------- dataset_delete_test.go | 8 +- dataset_insert_test.go | 14 ++-- dataset_update_test.go | 8 +- example_test.go | 4 +- 10 files changed, 177 insertions(+), 169 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 4d0af85d..9a936f1e 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,11 @@ +## v3.1.0 + +* Version 3.1 [#14](https://github.com/doug-martin/goqu/pull/14) - [@andymoon](https://github.com/andymoon) + * Fix an issue with a nil pointer access on the inserts and updates. + * Allowing ScanStructs to take a struct with an embedded pointer to a struct. + * Change to check if struct is Anonymous when recursing through an embedded struct. + * Updated to use the lastest version of github.com/DATA-DOG/go-sqlmock. + ## v3.0.1 * Add literal bytes and update to c2fo testify [#15](https://github.com/doug-martin/goqu/pull/15) - [@TechnotronicOz](https://github.com/TechnotronicOz) diff --git a/crud_exec.go b/crud_exec.go index 6b0dfbe9..605bd7c5 100644 --- a/crud_exec.go +++ b/crud_exec.go @@ -220,7 +220,7 @@ func assignVals(i interface{}, results []Record, cm columnMap) error { val := reflect.Indirect(reflect.ValueOf(i)) t, _, isSliceOfPointers := getTypeInfo(i, val) switch val.Kind() { - case reflect.Struct: + case reflect.Struct: result := results[0] for name, data := range cm { src, ok := result[name] @@ -234,7 +234,7 @@ func assignVals(i interface{}, results []Record, cm columnMap) error { } } } - case reflect.Slice: + case reflect.Slice: for _, result := range results { row := reflect.Indirect(reflect.New(t)) initEmbeddedPtr(row) diff --git a/crud_exec_test.go b/crud_exec_test.go index 1eba025b..30d43fe7 100644 --- a/crud_exec_test.go +++ b/crud_exec_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "github.com/c2fo/testify/assert" "github.com/c2fo/testify/suite" ) @@ -31,7 +31,7 @@ type crudExecTest struct { func (me *crudExecTest) TestWithError() { t := me.T() - mDb, err := sqlmock.New() + mDb, _, err := sqlmock.New() assert.NoError(t, err) db := New("db-mock", mDb) expectedErr := fmt.Errorf("crud exec error") @@ -51,29 +51,29 @@ func (me *crudExecTest) TestWithError() { func (me *crudExecTest) TestScanStructs() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WillReturnError(fmt.Errorf("query error")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name", "phone_number", "age"}).FromCSVString("111 Test Addr,Test1,111-111-1111,20\n211 Test Addr,Test2,222-222-2222,30")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name", "phone_number", "age"}).FromCSVString("111 Test Addr,Test1,111-111-1111,20\n211 Test Addr,Test2,222-222-2222,30")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) @@ -141,21 +141,21 @@ func (me *crudExecTest) TestScanStructs() { func (me *crudExecTest) TestScanStruct() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WillReturnError(fmt.Errorf("query error")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name", "phone_number", "age"}).FromCSVString("111 Test Addr,Test1,111-111-1111,20")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) @@ -199,17 +199,17 @@ func (me *crudExecTest) TestScanStruct() { func (me *crudExecTest) TestScanVals() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WillReturnError(fmt.Errorf("query error")) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1\n2")) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1\n2")) @@ -234,13 +234,13 @@ func (me *crudExecTest) TestScanVals() { func (me *crudExecTest) TestScanVal() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WillReturnError(fmt.Errorf("query error")) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1")) diff --git a/database_test.go b/database_test.go index 9c5876a2..5439eb54 100644 --- a/database_test.go +++ b/database_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "github.com/c2fo/testify/assert" "github.com/c2fo/testify/suite" ) @@ -32,13 +32,13 @@ type databaseTest struct { func (me *databaseTest) TestLogger() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectExec(`SELECT \* FROM "items" WHERE "id" = ?`). + mock.ExpectExec(`SELECT \* FROM "items" WHERE "id" = ?`). WithArgs(1). WillReturnResult(sqlmock.NewResult(0, 0)) @@ -59,13 +59,13 @@ func (me *databaseTest) TestLogger() { func (me *databaseTest) TestScanStructs() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items"`). + mock.ExpectQuery(`SELECT "test" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) @@ -87,13 +87,13 @@ func (me *databaseTest) TestScanStructs() { func (me *databaseTest) TestScanStruct() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT \* FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) @@ -115,9 +115,9 @@ func (me *databaseTest) TestScanStruct() { func (me *databaseTest) TestScanVals() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1\n2\n3\n4\n5")) @@ -132,9 +132,9 @@ func (me *databaseTest) TestScanVals() { func (me *databaseTest) TestScanVal() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("10")) @@ -153,13 +153,13 @@ func (me *databaseTest) TestScanVal() { func (me *databaseTest) TestExec() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). + mock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). WithArgs(). WillReturnResult(sqlmock.NewResult(0, 0)) - sqlmock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). + mock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). WithArgs(). WillReturnError(NewGoquError("mock error")) @@ -172,13 +172,13 @@ func (me *databaseTest) TestExec() { func (me *databaseTest) TestQuery() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnError(NewGoquError("mock error")) @@ -192,13 +192,13 @@ func (me *databaseTest) TestQuery() { func (me *databaseTest) TestQueryRow() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnError(NewGoquError("mock error")) @@ -214,9 +214,9 @@ func (me *databaseTest) TestQueryRow() { func (me *databaseTest) TestPrepare() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectPrepare() + mock.ExpectPrepare("SELECT * FROM test WHERE id = ?") db := New("mock", mDb) stmt, err := db.Prepare("SELECT * FROM test WHERE id = ?") assert.NoError(t, err) @@ -225,10 +225,10 @@ func (me *databaseTest) TestPrepare() { func (me *databaseTest) TestBegin() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectBegin().WillReturnError(NewGoquError("transaction error")) + mock.ExpectBegin() + mock.ExpectBegin().WillReturnError(NewGoquError("transaction error")) db := New("mock", mDb) tx, err := db.Begin() assert.NoError(t, err) @@ -248,17 +248,17 @@ type txDatabaseTest struct { func (me *txDatabaseTest) TestLogger() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectExec(`SELECT \* FROM "items" WHERE "id" = ?`). + mock.ExpectExec(`SELECT \* FROM "items" WHERE "id" = ?`). WithArgs(1). WillReturnResult(sqlmock.NewResult(0, 0)) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("db-mock", mDb).Begin() assert.NoError(t, err) @@ -278,17 +278,17 @@ func (me *txDatabaseTest) TestLogger() { func (me *txDatabaseTest) TestLogger_FromDb() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectExec(`SELECT \* FROM "items" WHERE "id" = ?`). + mock.ExpectExec(`SELECT \* FROM "items" WHERE "id" = ?`). WithArgs(1). WillReturnResult(sqlmock.NewResult(0, 0)) - sqlmock.ExpectCommit() + mock.ExpectCommit() db := New("db-mock", mDb) logger := new(dbTestMockLogger) @@ -310,10 +310,10 @@ func (me *txDatabaseTest) TestLogger_FromDb() { func (me *txDatabaseTest) TestCommit() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectCommit() db := New("mock", mDb) tx, err := db.Begin() assert.NoError(t, err) @@ -322,10 +322,10 @@ func (me *txDatabaseTest) TestCommit() { func (me *txDatabaseTest) TestRollback() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectRollback() + mock.ExpectBegin() + mock.ExpectRollback() db := New("mock", mDb) tx, err := db.Begin() assert.NoError(t, err) @@ -334,10 +334,10 @@ func (me *txDatabaseTest) TestRollback() { func (me *txDatabaseTest) TestFrom() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectCommit() db := New("mock", mDb) tx, err := db.Begin() assert.NoError(t, err) @@ -347,17 +347,17 @@ func (me *txDatabaseTest) TestFrom() { func (me *txDatabaseTest) TestScanStructs() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items"`). + mock.ExpectQuery(`SELECT "test" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("db-mock", mDb).Begin() assert.NoError(t, err) var items []testActionItem @@ -378,17 +378,17 @@ func (me *txDatabaseTest) TestScanStructs() { func (me *txDatabaseTest) TestScanStruct() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT \* FROM "items" LIMIT 1`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT \* FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) var item testActionItem @@ -409,13 +409,13 @@ func (me *txDatabaseTest) TestScanStruct() { func (me *txDatabaseTest) TestScanVals() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1\n2\n3\n4\n5")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) var ids []uint32 @@ -429,13 +429,13 @@ func (me *txDatabaseTest) TestScanVals() { func (me *txDatabaseTest) TestScanVal() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("10")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) var id int64 @@ -453,17 +453,17 @@ func (me *txDatabaseTest) TestScanVal() { func (me *txDatabaseTest) TestExec() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). + mock.ExpectBegin() + mock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). WithArgs(). WillReturnResult(sqlmock.NewResult(0, 0)) - sqlmock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). + mock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). WithArgs(). WillReturnError(NewGoquError("mock error")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) _, err = tx.Exec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE ("name" IS NULL)`) @@ -475,17 +475,17 @@ func (me *txDatabaseTest) TestExec() { func (me *txDatabaseTest) TestQuery() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnError(NewGoquError("mock error")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) _, err = tx.Query(`SELECT * FROM "items"`) @@ -498,17 +498,17 @@ func (me *txDatabaseTest) TestQuery() { func (me *txDatabaseTest) TestQueryRow() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectBegin() + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT \* FROM "items"`). + mock.ExpectQuery(`SELECT \* FROM "items"`). WithArgs(). WillReturnError(NewGoquError("mock error")) - sqlmock.ExpectCommit() + mock.ExpectCommit() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) rows := tx.QueryRow(`SELECT * FROM "items"`) @@ -523,12 +523,12 @@ func (me *txDatabaseTest) TestQueryRow() { func (me *txDatabaseTest) TestWrap() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectBegin() - sqlmock.ExpectCommit() - sqlmock.ExpectBegin() - sqlmock.ExpectRollback() + mock.ExpectBegin() + mock.ExpectCommit() + mock.ExpectBegin() + mock.ExpectRollback() tx, err := New("mock", mDb).Begin() assert.NoError(t, err) assert.NoError(t, tx.Wrap(func() error { diff --git a/dataset.go b/dataset.go index 7d12ab3b..4c144a06 100644 --- a/dataset.go +++ b/dataset.go @@ -288,4 +288,4 @@ func (me *Dataset) expressionSql(buf *SqlBuilder, expression Expression) error { return me.adapter.ExpressionOrMapSql(buf, e) } return NewGoquError("Unsupported expression type %T", expression) -} \ No newline at end of file +} diff --git a/dataset_actions_test.go b/dataset_actions_test.go index 20a95c63..fd9dace2 100644 --- a/dataset_actions_test.go +++ b/dataset_actions_test.go @@ -1,7 +1,7 @@ package goqu import ( - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "github.com/c2fo/testify/assert" ) @@ -12,17 +12,17 @@ type dsTestActionItem struct { func (me *datasetTest) TestScanStructs() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "address", "name" FROM "items"`). + mock.ExpectQuery(`SELECT "address", "name" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT DISTINCT "name" FROM "items"`). + mock.ExpectQuery(`SELECT DISTINCT "name" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items"`). + mock.ExpectQuery(`SELECT "test" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) @@ -53,13 +53,13 @@ func (me *datasetTest) TestScanStructs() { func (me *datasetTest) TestScanStructs_WithPreparedStatements() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "address", "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). + mock.ExpectQuery(`SELECT "address", "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy"). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1\n211 Test Addr,Test2")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). + mock.ExpectQuery(`SELECT "test" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy"). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) @@ -85,17 +85,17 @@ func (me *datasetTest) TestScanStructs_WithPreparedStatements() { func (me *datasetTest) TestScanStruct() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "address", "name" FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT "address", "name" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) - sqlmock.ExpectQuery(`SELECT DISTINCT "name" FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT DISTINCT "name" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT "test" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) @@ -124,13 +124,13 @@ func (me *datasetTest) TestScanStruct() { func (me *datasetTest) TestScanStruct_WithPreparedStatements() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "address", "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT \?`). + mock.ExpectQuery(`SELECT "address", "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT \?`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"address", "name"}).FromCSVString("111 Test Addr,Test1")) - sqlmock.ExpectQuery(`SELECT "test" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT \?`). + mock.ExpectQuery(`SELECT "test" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT \?`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"test"}).FromCSVString("test1\ntest2")) @@ -156,9 +156,9 @@ func (me *datasetTest) TestScanStruct_WithPreparedStatements() { func (me *datasetTest) TestScanVals() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items"`). + mock.ExpectQuery(`SELECT "id" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1\n2\n3\n4\n5")) @@ -173,9 +173,9 @@ func (me *datasetTest) TestScanVals() { func (me *datasetTest) TestScanVals_WithPreparedStatment() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). + mock.ExpectQuery(`SELECT "id" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy"). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("1\n2\n3\n4\n5")) @@ -194,9 +194,9 @@ func (me *datasetTest) TestScanVals_WithPreparedStatment() { func (me *datasetTest) TestScanVal() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items" LIMIT 1`). + mock.ExpectQuery(`SELECT "id" FROM "items" LIMIT 1`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("10")) @@ -215,9 +215,9 @@ func (me *datasetTest) TestScanVal() { func (me *datasetTest) TestScanVal_WithPreparedStatement() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "id" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT ?`). + mock.ExpectQuery(`SELECT "id" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\) LIMIT ?`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"id"}).FromCSVString("10")) @@ -240,9 +240,9 @@ func (me *datasetTest) TestScanVal_WithPreparedStatement() { func (me *datasetTest) TestCount() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT COUNT\(\*\) AS "count" FROM "items"`). + mock.ExpectQuery(`SELECT COUNT\(\*\) AS "count" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"count"}).FromCSVString("10")) @@ -254,9 +254,9 @@ func (me *datasetTest) TestCount() { func (me *datasetTest) TestCount_WithPreparedStatement() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT COUNT\(\*\) AS "count" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). + mock.ExpectQuery(`SELECT COUNT\(\*\) AS "count" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy", 1). WillReturnRows(sqlmock.NewRows([]string{"count"}).FromCSVString("10")) @@ -271,9 +271,9 @@ func (me *datasetTest) TestCount_WithPreparedStatement() { func (me *datasetTest) TestPluck() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "name" FROM "items"`). + mock.ExpectQuery(`SELECT "name" FROM "items"`). WithArgs(). WillReturnRows(sqlmock.NewRows([]string{"name"}).FromCSVString("test1\ntest2\ntest3\ntest4\ntest5")) @@ -285,9 +285,9 @@ func (me *datasetTest) TestPluck() { func (me *datasetTest) TestPluck_WithPreparedStatement() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectQuery(`SELECT "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). + mock.ExpectQuery(`SELECT "name" FROM "items" WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). WithArgs("111 Test Addr", "Bob", "Sally", "Billy"). WillReturnRows(sqlmock.NewRows([]string{"name"}).FromCSVString("Bob\nSally\nBilly")) @@ -302,9 +302,9 @@ func (me *datasetTest) TestPluck_WithPreparedStatement() { func (me *datasetTest) TestUpdate() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). + mock.ExpectExec(`UPDATE "items" SET "address"='111 Test Addr',"name"='Test1' WHERE \("name" IS NULL\)`). WithArgs(). WillReturnResult(sqlmock.NewResult(0, 0)) @@ -315,9 +315,9 @@ func (me *datasetTest) TestUpdate() { func (me *datasetTest) TestUpdate_WithPreparedStatement() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`UPDATE "items" SET "address"=\?,"name"=\? WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). + mock.ExpectExec(`UPDATE "items" SET "address"=\?,"name"=\? WHERE \(\("address" = \?\) AND \("name" IN \(\?, \?, \?\)\)\)`). WithArgs("112 Test Addr", "Test1", "111 Test Addr", "Bob", "Sally", "Billy"). WillReturnResult(sqlmock.NewResult(0, 0)) @@ -332,9 +332,9 @@ func (me *datasetTest) TestUpdate_WithPreparedStatement() { func (me *datasetTest) TestInsert() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`INSERT INTO "items" \("address", "name"\) VALUES \('111 Test Addr', 'Test1'\)`). + mock.ExpectExec(`INSERT INTO "items" \("address", "name"\) VALUES \('111 Test Addr', 'Test1'\)`). WithArgs(). WillReturnResult(sqlmock.NewResult(0, 0)) @@ -345,9 +345,9 @@ func (me *datasetTest) TestInsert() { func (me *datasetTest) TestInsert_WithPreparedStatment() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`INSERT INTO "items" \("address", "name"\) VALUES \(\?, \?\), \(\?, \?\)`). + mock.ExpectExec(`INSERT INTO "items" \("address", "name"\) VALUES \(\?, \?\), \(\?, \?\)`). WithArgs("111 Test Addr", "Test1", "112 Test Addr", "Test2"). WillReturnResult(sqlmock.NewResult(0, 0)) @@ -364,9 +364,9 @@ func (me *datasetTest) TestInsert_WithPreparedStatment() { func (me *datasetTest) TestDelete() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`DELETE FROM "items" WHERE \("id" > 10\)`). + mock.ExpectExec(`DELETE FROM "items" WHERE \("id" > 10\)`). WithArgs(). WillReturnResult(sqlmock.NewResult(0, 0)) @@ -377,9 +377,9 @@ func (me *datasetTest) TestDelete() { func (me *datasetTest) TestDelete_WithPreparedStatment() { t := me.T() - mDb, err := sqlmock.New() + mDb, mock, err := sqlmock.New() assert.NoError(t, err) - sqlmock.ExpectExec(`DELETE FROM "items" WHERE \("id" > \?\)`). + mock.ExpectExec(`DELETE FROM "items" WHERE \("id" > \?\)`). WithArgs(10). WillReturnResult(sqlmock.NewResult(0, 0)) diff --git a/dataset_delete_test.go b/dataset_delete_test.go index 3f4105a9..7efd5eb1 100644 --- a/dataset_delete_test.go +++ b/dataset_delete_test.go @@ -1,13 +1,13 @@ package goqu import ( - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "github.com/c2fo/testify/assert" ) func (me *datasetTest) TestDeleteSqlNoReturning() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("no-return", mDb).From("items") type item struct { Address string `db:"address"` @@ -19,7 +19,7 @@ func (me *datasetTest) TestDeleteSqlNoReturning() { func (me *datasetTest) TestDeleteSqlWithLimit() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("limit", mDb).From("items") sql, _, err := ds1.Limit(10).ToDeleteSql() assert.Nil(t, err) @@ -28,7 +28,7 @@ func (me *datasetTest) TestDeleteSqlWithLimit() { func (me *datasetTest) TestDeleteSqlWithOrder() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("order", mDb).From("items") sql, _, err := ds1.Order(I("name").Desc()).ToDeleteSql() assert.Nil(t, err) diff --git a/dataset_insert_test.go b/dataset_insert_test.go index b187889f..2c6a2a8c 100644 --- a/dataset_insert_test.go +++ b/dataset_insert_test.go @@ -1,7 +1,7 @@ package goqu import ( - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "github.com/c2fo/testify/assert" "database/sql" @@ -10,7 +10,7 @@ import ( func (me *datasetTest) TestInsertSqlNoReturning() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("no-return", mDb).From("items") type item struct { Address string `db:"address"` @@ -25,7 +25,7 @@ func (me *datasetTest) TestInsertSqlNoReturning() { func (me *datasetTest) TestInsert_InvalidValue() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("no-return", mDb).From("items") type item struct { Address string `db:"address"` @@ -148,10 +148,10 @@ func (me *datasetTest) TestInsertSqlWithValuerNull() { assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test', NULL)`) sqlString, _, err = ds1.ToInsertSql( - item{Address: "111 Test Addr", Name: "Test1"}, - item{Address: "211 Test Addr", Name: "Test2"}, - item{Address: "311 Test Addr", Name: "Test3"}, - item{Address: "411 Test Addr", Name: "Test4"}, + item{Address: "111 Test Addr", Name: "Test1"}, + item{Address: "211 Test Addr", Name: "Test2"}, + item{Address: "311 Test Addr", Name: "Test3"}, + item{Address: "411 Test Addr", Name: "Test4"}, ) assert.NoError(t, err) assert.Equal(t, sqlString, `INSERT INTO "items" ("address", "name", "valuer") VALUES ('111 Test Addr', 'Test1', NULL), ('211 Test Addr', 'Test2', NULL), ('311 Test Addr', 'Test3', NULL), ('411 Test Addr', 'Test4', NULL)`) diff --git a/dataset_update_test.go b/dataset_update_test.go index 2e24eef3..94b8863e 100644 --- a/dataset_update_test.go +++ b/dataset_update_test.go @@ -6,7 +6,7 @@ import ( "fmt" "time" - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "github.com/c2fo/testify/assert" ) @@ -23,7 +23,7 @@ func (me *datasetTest) TestUpdateSqlWithNoSources() { func (me *datasetTest) TestUpdateSqlNoReturning() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("no-return", mDb).From("items") type item struct { Address string `db:"address"` @@ -35,7 +35,7 @@ func (me *datasetTest) TestUpdateSqlNoReturning() { func (me *datasetTest) TestUpdateSqlWithLimit() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("limit", mDb).From("items") type item struct { Address string `db:"address"` @@ -48,7 +48,7 @@ func (me *datasetTest) TestUpdateSqlWithLimit() { func (me *datasetTest) TestUpdateSqlWithOrder() { t := me.T() - mDb, _ := sqlmock.New() + mDb, _, _ := sqlmock.New() ds1 := New("order", mDb).From("items") type item struct { Address string `db:"address"` diff --git a/example_test.go b/example_test.go index 63b7d51e..a82c85fd 100644 --- a/example_test.go +++ b/example_test.go @@ -5,14 +5,14 @@ import ( "fmt" "regexp" - "github.com/DATA-DOG/go-sqlmock" + "gopkg.in/DATA-DOG/go-sqlmock.v1" "gopkg.in/doug-martin/goqu.v3" ) var driver *sql.DB func init() { - db, _ := sqlmock.New() + db, _, _ := sqlmock.New() driver = db }