Skip to content

Commit 008d884

Browse files
committed
Merge remote-tracking branch 'hebo/typed_rows'
* hebo/typed_rows: Allow for multiple rows by manually creating each row Create a single row from an interface list - #1
2 parents c33b881 + 517a41f commit 008d884

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

result.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package sqlmock
22

33
import (
4-
"database/sql/driver"
4+
"database/sql/driver"
55
)
66

77
// Result satisfies sql driver Result, which
88
// holds last insert id and rows affected
99
// by Exec queries
1010
type result struct {
11-
insertID int64
11+
insertID int64
1212
rowsAffected int64
1313
}
1414

rows.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,27 @@ func (r *rows) Next(dest []driver.Value) error {
4040
return nil
4141
}
4242

43+
func (r *rows) AddRow(values ...interface{}) {
44+
if len(values) != len(r.cols) {
45+
panic("Expected number of values to match number of columns")
46+
}
47+
48+
row := make([]driver.Value, len(r.cols))
49+
for i, v := range values {
50+
row[i] = v
51+
}
52+
53+
r.rows = append(r.rows, row)
54+
}
55+
56+
// NewRows allows Rows to be created manually to use
57+
// any of the types sql/driver.Value supports
58+
func NewRows(columns []string) *rows {
59+
rs := &rows{}
60+
rs.cols = columns
61+
return rs
62+
}
63+
4364
// RowsFromCSVString creates Rows from CSV string
4465
// to be used for mocked queries. Returns sql driver Rows interface
4566
func RowsFromCSVString(columns []string, s string) driver.Rows {

sqlmock_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"database/sql"
55
"fmt"
66
"testing"
7+
"time"
78
)
89

910
func TestMockQuery(t *testing.T) {
@@ -48,6 +49,57 @@ func TestMockQuery(t *testing.T) {
4849
}
4950
}
5051

52+
func TestMockQueryTypes(t *testing.T) {
53+
db, err := sql.Open("mock", "")
54+
if err != nil {
55+
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
56+
}
57+
58+
columns := []string{"id", "timestamp", "sold"}
59+
60+
timestamp := time.Now()
61+
rs := NewRows(columns)
62+
rs.AddRow(5, timestamp, true)
63+
64+
ExpectQuery("SELECT (.+) FROM sales WHERE id = ?").
65+
WithArgs(5).
66+
WillReturnRows(rs)
67+
68+
rows, err := db.Query("SELECT (.+) FROM sales WHERE id = ?", 5)
69+
if err != nil {
70+
t.Errorf("error '%s' was not expected while retrieving mock rows", err)
71+
}
72+
defer rows.Close()
73+
if !rows.Next() {
74+
t.Error("it must have had one row as result, but got empty result set instead")
75+
}
76+
77+
var id int
78+
var time time.Time
79+
var sold bool
80+
81+
err = rows.Scan(&id, &time, &sold)
82+
if err != nil {
83+
t.Errorf("error '%s' was not expected while trying to scan row", err)
84+
}
85+
86+
if id != 5 {
87+
t.Errorf("expected mocked id to be 5, but got %d instead", id)
88+
}
89+
90+
if time != timestamp {
91+
t.Errorf("expected mocked time to be %s, but got '%s' instead", timestamp, time)
92+
}
93+
94+
if sold != true {
95+
t.Errorf("expected mocked boolean to be true, but got %v instead", sold)
96+
}
97+
98+
if err = db.Close(); err != nil {
99+
t.Errorf("error '%s' was not expected while closing the database", err)
100+
}
101+
}
102+
51103
func TestTransactionExpectations(t *testing.T) {
52104
db, err := sql.Open("mock", "")
53105
if err != nil {

0 commit comments

Comments
 (0)