...
1
2
3
4 package sqlmock
5
6 import (
7 "database/sql"
8 "database/sql/driver"
9 "fmt"
10 "reflect"
11 )
12
13
14
15 func (e *ExpectedQuery) WillReturnRows(rows ...*Rows) *ExpectedQuery {
16 defs := 0
17 sets := make([]*Rows, len(rows))
18 for i, r := range rows {
19 sets[i] = r
20 if r.def != nil {
21 defs++
22 }
23 }
24 if defs > 0 && defs == len(sets) {
25 e.rows = &rowSetsWithDefinition{&rowSets{sets: sets, ex: e}}
26 } else {
27 e.rows = &rowSets{sets: sets, ex: e}
28 }
29 return e
30 }
31
32 func (e *queryBasedExpectation) argsMatches(args []driver.NamedValue) error {
33 if nil == e.args {
34 if e.noArgs && len(args) > 0 {
35 return fmt.Errorf("expected 0, but got %d arguments", len(args))
36 }
37 return nil
38 }
39 if len(args) != len(e.args) {
40 return fmt.Errorf("expected %d, but got %d arguments", len(e.args), len(args))
41 }
42
43 for k, v := range args {
44
45 matcher, ok := e.args[k].(Argument)
46 if ok {
47 if !matcher.Match(v.Value) {
48 return fmt.Errorf("matcher %T could not match %d argument %T - %+v", matcher, k, args[k], args[k])
49 }
50 continue
51 }
52
53 dval := e.args[k]
54 if named, isNamed := dval.(sql.NamedArg); isNamed {
55 dval = named.Value
56 if v.Name != named.Name {
57 return fmt.Errorf("named argument %d: name: \"%s\" does not match expected: \"%s\"", k, v.Name, named.Name)
58 }
59 } else if k+1 != v.Ordinal {
60 return fmt.Errorf("argument %d: ordinal position: %d does not match expected: %d", k, k+1, v.Ordinal)
61 }
62
63
64 darg, err := e.converter.ConvertValue(dval)
65 if err != nil {
66 return fmt.Errorf("could not convert %d argument %T - %+v to driver value: %s", k, e.args[k], e.args[k], err)
67 }
68
69 if !reflect.DeepEqual(darg, v.Value) {
70 return fmt.Errorf("argument %d expected [%T - %+v] does not match actual [%T - %+v]", k, darg, darg, v.Value, v.Value)
71 }
72 }
73 return nil
74 }
75
76 func (e *queryBasedExpectation) attemptArgMatch(args []driver.NamedValue) (err error) {
77
78 defer func() {
79 if e := recover(); e != nil {
80 _, ok := e.(error)
81 if !ok {
82 err = fmt.Errorf(e.(string))
83 }
84 }
85 }()
86
87 err = e.argsMatches(args)
88 return
89 }
90
View as plain text