forked from driftprogramming/pgxpoolmock
-
Notifications
You must be signed in to change notification settings - Fork 4
/
row.go
57 lines (47 loc) · 1.41 KB
/
row.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package pgxpoolmock
import (
"fmt"
"reflect"
)
// Row implements the pgx.Row interface and can be passed into pgxpoolmock.PgxPoolMock.QueryRow
// as the expected returned row.
//
// Usage: pgxMock.EXPECT().QueryRow(gomock.Any(), HasString("GetEntityByID")).Return(NewRow(1, "foo"))
type Row struct {
values []interface{}
err error
}
func NewRow(values ...interface{}) *Row {
return &Row{
values: values,
err: nil,
}
}
func (r *Row) WithError(err error) *Row {
r.err = err
return r
}
func (r *Row) Scan(dest ...interface{}) error {
if len(r.values) != len(dest) {
panic(fmt.Errorf("expected scan to be called with same number of arguments\ngot %d\n%+v\nwant %d\n%+v", len(dest), dest, len(r.values), r.values))
}
for i := range dest {
value := r.values[i]
valueType := reflect.TypeOf(value).String()
valueRV := reflect.ValueOf(value)
if dest[i] == nil {
panic(fmt.Errorf("unexpected nil value for arg %d, want type %s", i, valueType))
}
dstRV := reflect.ValueOf(dest[i])
if dstRV.Kind() != reflect.Ptr {
panic(fmt.Errorf("expected scan to be called with pointers: got %s, want %s", reflect.TypeOf(dest[i]).String(), valueType))
}
innerDstRV := reflect.Indirect(dstRV)
dstType := innerDstRV.Type().String()
if dstType != valueType {
panic(fmt.Errorf("scan with unexpected arg %d: got type %s, want type %s", i, dstType, valueType))
}
innerDstRV.Set(valueRV)
}
return r.err
}