Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions expectations_go18.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package sqlmock

import (
"database/sql"
"database/sql/driver"
"fmt"
"reflect"
)
Expand Down Expand Up @@ -54,10 +53,6 @@ func (e *queryBasedExpectation) argsMatches(args []namedValue) error {
return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
}

if !driver.IsValue(darg) {
return fmt.Errorf("argument %d: non-subset type %T returned from Value", k, darg)
}

if !reflect.DeepEqual(darg, v.Value) {
return fmt.Errorf("argument %d expected [%T - %+v] does not match actual [%T - %+v]", k, darg, darg, v.Value, v.Value)
}
Expand Down
43 changes: 43 additions & 0 deletions expectations_go19_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// +build go1.9

package sqlmock

import (
"context"
"testing"
)

func TestCustomValueConverterExec(t *testing.T) {
db, mock, _ := New(ValueConverterOption(CustomConverter{}))
expectedQuery := "INSERT INTO tags \\(name,email,age,hobbies\\) VALUES \\(\\?,\\?,\\?,\\?\\)"
query := "INSERT INTO tags (name,email,age,hobbies) VALUES (?,?,?,?)"
name := "John"
email := "j@jj.j"
age := 12
hobbies := []string{"soccer", "netflix"}
mock.ExpectBegin()
mock.ExpectPrepare(expectedQuery)
mock.ExpectExec(expectedQuery).WithArgs(name, email, age, hobbies).WillReturnResult(NewResult(1, 1))
mock.ExpectCommit()

ctx := context.Background()
tx, e := db.BeginTx(ctx, nil)
if e != nil {
t.Error(e)
return
}
stmt, e := db.PrepareContext(ctx, query)
if e != nil {
t.Error(e)
return
}
_, e = stmt.Exec(name, email, age, hobbies)
if e != nil {
t.Error(e)
return
}
tx.Commit()
if err := mock.ExpectationsWereMet(); err != nil {
t.Error(err)
}
}
56 changes: 56 additions & 0 deletions expectations_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package sqlmock

import (
"database/sql/driver"
"errors"
"fmt"
"reflect"
"testing"
"time"
)
Expand Down Expand Up @@ -137,3 +139,57 @@ func TestBuildQuery(t *testing.T) {
t.Error(err)
}
}

type CustomConverter struct{}

func (s CustomConverter) ConvertValue(v interface{}) (driver.Value, error) {
switch v.(type) {
case string:
return v.(string), nil
case []string:
return v.([]string), nil
case int:
return v.(int), nil
default:
return nil, errors.New(fmt.Sprintf("cannot convert %T with value %v", v, v))
}
}
func TestCustomValueConverterQueryScan(t *testing.T) {
db, mock, _ := New(ValueConverterOption(CustomConverter{}))
query := `
SELECT
name,
email,
address,
anotherfield
FROM user
where
name = 'John'
and
address = 'Jakarta'

`
expectedStringValue := "ValueOne"
expectedIntValue := 2
expectedArrayValue := []string{"Three", "Four"}
mock.ExpectQuery(query).WillReturnRows(mock.NewRows([]string{"One", "Two", "Three"}).AddRow(expectedStringValue, expectedIntValue, []string{"Three", "Four"}))
row := db.QueryRow(query)
var stringValue string
var intValue int
var arrayValue []string
if e := row.Scan(&stringValue, &intValue, &arrayValue); e != nil {
t.Error(e)
}
if stringValue != expectedStringValue {
t.Errorf("Expectation %s does not met: %s", expectedStringValue, stringValue)
}
if intValue != expectedIntValue {
t.Errorf("Expectation %d does not met: %d", expectedIntValue, intValue)
}
if !reflect.DeepEqual(expectedArrayValue, arrayValue) {
t.Errorf("Expectation %v does not met: %v", expectedArrayValue, arrayValue)
}
if err := mock.ExpectationsWereMet(); err != nil {
t.Error(err)
}
}