Skip to content

Commit 5a7ddb9

Browse files
author
Nikita Koryabkin
committed
added tests
1 parent e062dfc commit 5a7ddb9

File tree

7 files changed

+119
-14
lines changed

7 files changed

+119
-14
lines changed

sqlmock_go18.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ func (c *sqlmock) ExpectPing() *ExpectedPing {
161161
}
162162

163163
// Query meets http://golang.org/pkg/database/sql/driver/#Queryer
164+
// Deprecated: Drivers should implement QueryerContext instead.
164165
func (c *sqlmock) Query(query string, args []driver.Value) (driver.Rows, error) {
165166
namedArgs := make([]driver.NamedValue, len(args))
166167
for i, v := range args {
@@ -243,6 +244,7 @@ func (c *sqlmock) query(query string, args []driver.NamedValue) (*ExpectedQuery,
243244
}
244245

245246
// Exec meets http://golang.org/pkg/database/sql/driver/#Execer
247+
// Deprecated: Drivers should implement ExecerContext instead.
246248
func (c *sqlmock) Exec(query string, args []driver.Value) (driver.Result, error) {
247249
namedArgs := make([]driver.NamedValue, len(args))
248250
for i, v := range args {

sqlmock_go19.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import (
1010
// CheckNamedValue meets https://golang.org/pkg/database/sql/driver/#NamedValueChecker
1111
func (c *sqlmock) CheckNamedValue(nv *driver.NamedValue) (err error) {
1212
switch nv.Value.(type) {
13-
case sql.NamedArg:
14-
return nil
1513
case sql.Out:
1614
return nil
1715
default:

sqlmock_go19_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
package sqlmock
44

55
import (
6+
"database/sql"
7+
"database/sql/driver"
68
"errors"
79
"testing"
810
)
@@ -37,3 +39,32 @@ func TestStatementTX(t *testing.T) {
3739
t.Fatalf("unexpected result: %v", err)
3840
}
3941
}
42+
43+
func Test_sqlmock_CheckNamedValue(t *testing.T) {
44+
db, mock, err := New()
45+
if err != nil {
46+
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
47+
}
48+
defer db.Close()
49+
tests := []struct {
50+
name string
51+
arg *driver.NamedValue
52+
wantErr bool
53+
}{
54+
{
55+
arg: &driver.NamedValue{Name: "test", Value: "test"},
56+
wantErr: false,
57+
},
58+
{
59+
arg: &driver.NamedValue{Name: "test", Value: sql.Out{}},
60+
wantErr: false,
61+
},
62+
}
63+
for _, tt := range tests {
64+
t.Run(tt.name, func(t *testing.T) {
65+
if err := mock.(*sqlmock).CheckNamedValue(tt.arg); (err != nil) != tt.wantErr {
66+
t.Errorf("CheckNamedValue() error = %v, wantErr %v", err, tt.wantErr)
67+
}
68+
})
69+
}
70+
}

sqlmock_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package sqlmock
22

33
import (
44
"database/sql"
5+
"database/sql/driver"
56
"errors"
67
"fmt"
8+
"reflect"
79
"strconv"
810
"sync"
911
"testing"
@@ -1217,3 +1219,44 @@ func queryWithTimeout(t time.Duration, db *sql.DB, query string, args ...interfa
12171219
return nil, fmt.Errorf("query timed out after %v", t)
12181220
}
12191221
}
1222+
1223+
func Test_sqlmock_Prepare_and_Exec(t *testing.T) {
1224+
db, mock, err := New()
1225+
if err != nil {
1226+
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
1227+
}
1228+
defer db.Close()
1229+
query := "SELECT name, email FROM users WHERE name = ?"
1230+
1231+
mock.ExpectPrepare("SELECT (.+) FROM users WHERE (.+)")
1232+
expected := NewResult(1, 1)
1233+
mock.ExpectExec("SELECT (.+) FROM users WHERE (.+)").
1234+
WillReturnResult(expected)
1235+
expectedRows := mock.NewRows([]string{"id", "name", "email"}).AddRow(1, "test", "test@example.com")
1236+
mock.ExpectQuery("SELECT (.+) FROM users WHERE (.+)").WillReturnRows(expectedRows)
1237+
1238+
got, err := mock.(*sqlmock).Prepare(query)
1239+
if err != nil {
1240+
t.Error(err)
1241+
return
1242+
}
1243+
if got == nil {
1244+
t.Error("Prepare () stmt must not be nil")
1245+
return
1246+
}
1247+
result, err := got.Exec([]driver.Value{"test"})
1248+
if err != nil {
1249+
t.Error(err)
1250+
return
1251+
}
1252+
if !reflect.DeepEqual(result, expected) {
1253+
t.Errorf("Eesults not equal. Expected: %v, Actual: %v", expected, result)
1254+
return
1255+
}
1256+
rows, err := got.Query([]driver.Value{"test"})
1257+
if err != nil {
1258+
t.Error(err)
1259+
return
1260+
}
1261+
defer rows.Close()
1262+
}

statement.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package sqlmock
22

3-
import (
4-
"database/sql/driver"
5-
)
6-
73
type statement struct {
84
conn *sqlmock
95
ex *ExpectedPrepare
@@ -18,11 +14,3 @@ func (stmt *statement) Close() error {
1814
func (stmt *statement) NumInput() int {
1915
return -1
2016
}
21-
22-
func (stmt *statement) Exec(args []driver.Value) (driver.Result, error) {
23-
return stmt.conn.Exec(stmt.query, args)
24-
}
25-
26-
func (stmt *statement) Query(args []driver.Value) (driver.Rows, error) {
27-
return stmt.conn.Query(stmt.query, args)
28-
}

statement_before_go18.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// +build !go1.8
2+
3+
package sqlmock
4+
5+
import (
6+
"database/sql/driver"
7+
)
8+
9+
// Deprecated: Drivers should implement ExecerContext instead.
10+
func (stmt *statement) Exec(args []driver.Value) (driver.Result, error) {
11+
return stmt.conn.Exec(stmt.query, args)
12+
}
13+
14+
// Deprecated: Drivers should implement StmtQueryContext instead (or additionally).
15+
func (stmt *statement) Query(args []driver.Value) (driver.Rows, error) {
16+
return stmt.conn.Query(stmt.query, args)
17+
}

statement_go18.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// +build go1.8
2+
3+
package sqlmock
4+
5+
import (
6+
"context"
7+
"database/sql/driver"
8+
)
9+
10+
// Deprecated: Drivers should implement ExecerContext instead.
11+
func (stmt *statement) Exec(args []driver.Value) (driver.Result, error) {
12+
return stmt.conn.ExecContext(context.Background(), stmt.query, convertValueToNamedValue(args))
13+
}
14+
15+
// Deprecated: Drivers should implement StmtQueryContext instead (or additionally).
16+
func (stmt *statement) Query(args []driver.Value) (driver.Rows, error) {
17+
return stmt.conn.QueryContext(context.Background(), stmt.query, convertValueToNamedValue(args))
18+
}
19+
20+
func convertValueToNamedValue(args []driver.Value) []driver.NamedValue {
21+
namedArgs := make([]driver.NamedValue, len(args))
22+
for i, v := range args {
23+
namedArgs[i] = driver.NamedValue{Ordinal: i + 1, Value: v}
24+
}
25+
return namedArgs
26+
}

0 commit comments

Comments
 (0)