Skip to content

Commit 42ab7c3

Browse files
committed
implements Pinger (without expectation yet) and prepared stmt Context methods
1 parent 6bbe187 commit 42ab7c3

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

sqlmock_go18.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,21 @@ func (c *sqlmock) PrepareContext(ctx context.Context, query string) (driver.Stmt
8181
}
8282
}
8383

84+
// Implement the "Pinger" interface
85+
// for now we do not have a Ping expectation
86+
// may be something for the future
87+
func (c *sqlmock) Ping(ctx context.Context) error {
88+
return nil
89+
}
90+
91+
// Implement the "StmtExecContext" interface
92+
func (stmt *statement) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) {
93+
return stmt.conn.ExecContext(ctx, stmt.query, args)
94+
}
95+
96+
// Implement the "StmtQueryContext" interface
97+
func (stmt *statement) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) {
98+
return stmt.conn.QueryContext(ctx, stmt.query, args)
99+
}
100+
84101
// @TODO maybe add ExpectedBegin.WithOptions(driver.TxOptions)

sqlmock_go18_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,50 @@ func TestContextExecCancel(t *testing.T) {
4747
}
4848
}
4949

50+
func TestPreparedStatementContextExecCancel(t *testing.T) {
51+
t.Parallel()
52+
db, mock, err := New()
53+
if err != nil {
54+
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
55+
}
56+
defer db.Close()
57+
58+
mock.ExpectPrepare("DELETE FROM users").
59+
ExpectExec().
60+
WillDelayFor(time.Second).
61+
WillReturnResult(NewResult(1, 1))
62+
63+
ctx, cancel := context.WithCancel(context.Background())
64+
65+
go func() {
66+
time.Sleep(time.Millisecond * 10)
67+
cancel()
68+
}()
69+
70+
stmt, err := db.Prepare("DELETE FROM users")
71+
if err != nil {
72+
t.Errorf("error was not expected, but got: %v", err)
73+
}
74+
75+
_, err = stmt.ExecContext(ctx)
76+
if err == nil {
77+
t.Error("error was expected, but there was none")
78+
}
79+
80+
if err != ErrCancelled {
81+
t.Errorf("was expecting cancel error, but got: %v", err)
82+
}
83+
84+
_, err = stmt.ExecContext(ctx)
85+
if err != context.Canceled {
86+
t.Error("error was expected since context was already done, but there was none")
87+
}
88+
89+
if err := mock.ExpectationsWereMet(); err != nil {
90+
t.Errorf("there were unfulfilled expections: %s", err)
91+
}
92+
}
93+
5094
func TestContextExecWithNamedArg(t *testing.T) {
5195
t.Parallel()
5296
db, mock, err := New()
@@ -164,6 +208,53 @@ func TestContextQueryCancel(t *testing.T) {
164208
}
165209
}
166210

211+
func TestPreparedStatementContextQueryCancel(t *testing.T) {
212+
t.Parallel()
213+
db, mock, err := New()
214+
if err != nil {
215+
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
216+
}
217+
defer db.Close()
218+
219+
rs := NewRows([]string{"id", "title"}).AddRow(5, "hello world")
220+
221+
mock.ExpectPrepare("SELECT (.+) FROM articles WHERE id = ?").
222+
ExpectQuery().
223+
WithArgs(5).
224+
WillDelayFor(time.Second).
225+
WillReturnRows(rs)
226+
227+
ctx, cancel := context.WithCancel(context.Background())
228+
229+
go func() {
230+
time.Sleep(time.Millisecond * 10)
231+
cancel()
232+
}()
233+
234+
stmt, err := db.Prepare("SELECT id, title FROM articles WHERE id = ?")
235+
if err != nil {
236+
t.Errorf("error was not expected, but got: %v", err)
237+
}
238+
239+
_, err = stmt.QueryContext(ctx, 5)
240+
if err == nil {
241+
t.Error("error was expected, but there was none")
242+
}
243+
244+
if err != ErrCancelled {
245+
t.Errorf("was expecting cancel error, but got: %v", err)
246+
}
247+
248+
_, err = stmt.QueryContext(ctx, 5)
249+
if err != context.Canceled {
250+
t.Error("error was expected since context was already done, but there was none")
251+
}
252+
253+
if err := mock.ExpectationsWereMet(); err != nil {
254+
t.Errorf("there were unfulfilled expections: %s", err)
255+
}
256+
}
257+
167258
func TestContextQuery(t *testing.T) {
168259
t.Parallel()
169260
db, mock, err := New()

0 commit comments

Comments
 (0)