2017-02-07 15:03:05 +02:00
|
|
|
// +build go1.8
|
|
|
|
|
|
|
|
package sqlmock
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
2019-11-28 13:51:27 +03:00
|
|
|
"database/sql/driver"
|
2017-02-07 15:03:05 +02:00
|
|
|
"fmt"
|
|
|
|
"reflect"
|
|
|
|
)
|
|
|
|
|
2017-02-08 17:35:32 +02:00
|
|
|
// WillReturnRows specifies the set of resulting rows that will be returned
|
|
|
|
// by the triggered query
|
|
|
|
func (e *ExpectedQuery) WillReturnRows(rows ...*Rows) *ExpectedQuery {
|
|
|
|
sets := make([]*Rows, len(rows))
|
|
|
|
for i, r := range rows {
|
|
|
|
sets[i] = r
|
|
|
|
}
|
2018-12-11 17:38:12 +02:00
|
|
|
e.rows = &rowSets{sets: sets, ex: e}
|
2017-02-08 17:35:32 +02:00
|
|
|
return e
|
|
|
|
}
|
|
|
|
|
2019-11-28 13:51:27 +03:00
|
|
|
func (e *queryBasedExpectation) argsMatches(args []driver.NamedValue) error {
|
2017-02-07 15:03:05 +02:00
|
|
|
if nil == e.args {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
if len(args) != len(e.args) {
|
|
|
|
return fmt.Errorf("expected %d, but got %d arguments", len(e.args), len(args))
|
|
|
|
}
|
|
|
|
// @TODO should we assert either all args are named or ordinal?
|
|
|
|
for k, v := range args {
|
|
|
|
// custom argument matcher
|
|
|
|
matcher, ok := e.args[k].(Argument)
|
|
|
|
if ok {
|
|
|
|
if !matcher.Match(v.Value) {
|
|
|
|
return fmt.Errorf("matcher %T could not match %d argument %T - %+v", matcher, k, args[k], args[k])
|
|
|
|
}
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
dval := e.args[k]
|
|
|
|
if named, isNamed := dval.(sql.NamedArg); isNamed {
|
|
|
|
dval = named.Value
|
|
|
|
if v.Name != named.Name {
|
|
|
|
return fmt.Errorf("named argument %d: name: \"%s\" does not match expected: \"%s\"", k, v.Name, named.Name)
|
|
|
|
}
|
2017-02-16 22:33:12 +02:00
|
|
|
} else if k+1 != v.Ordinal {
|
|
|
|
return fmt.Errorf("argument %d: ordinal position: %d does not match expected: %d", k, k+1, v.Ordinal)
|
2017-02-07 15:03:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// convert to driver converter
|
2018-08-06 22:29:24 +02:00
|
|
|
darg, err := e.converter.ConvertValue(dval)
|
2017-02-07 15:03:05 +02:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
|
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
2019-12-02 14:39:36 +03:00
|
|
|
|
|
|
|
func (e *queryBasedExpectation) attemptArgMatch(args []driver.NamedValue) (err error) {
|
|
|
|
// catch panic
|
|
|
|
defer func() {
|
|
|
|
if e := recover(); e != nil {
|
|
|
|
_, ok := e.(error)
|
|
|
|
if !ok {
|
|
|
|
err = fmt.Errorf(e.(string))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
err = e.argsMatches(args)
|
|
|
|
return
|
|
|
|
}
|