Skip to content

Commit 98b917b

Browse files
authored
Merge pull request #81 from mikemacd/master
Permit prepares to obey MatchExpectationsInOrder flag
2 parents 178a157 + ca83e31 commit 98b917b

File tree

2 files changed

+58
-6
lines changed

2 files changed

+58
-6
lines changed

sqlmock.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,9 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
309309
var expected *ExpectedPrepare
310310
var fulfilled int
311311
var ok bool
312+
313+
query = stripQuery(query)
314+
312315
for _, next := range c.expected {
313316
next.Lock()
314317
if next.fulfilled() {
@@ -317,17 +320,24 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
317320
continue
318321
}
319322

320-
if expected, ok = next.(*ExpectedPrepare); ok {
321-
break
322-
}
323-
324-
next.Unlock()
325323
if c.ordered {
324+
if expected, ok = next.(*ExpectedPrepare); ok {
325+
break
326+
}
327+
328+
next.Unlock()
326329
return nil, fmt.Errorf("call to Prepare statement with query '%s', was not expected, next expectation is: %s", query, next)
327330
}
331+
332+
if pr, ok := next.(*ExpectedPrepare); ok {
333+
if pr.sqlRegex.MatchString(query) {
334+
expected = pr
335+
break
336+
}
337+
}
338+
next.Unlock()
328339
}
329340

330-
query = stripQuery(query)
331341
if expected == nil {
332342
msg := "call to Prepare '%s' query was not expected"
333343
if fulfilled == len(c.expected) {

sqlmock_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,48 @@ func TestPreparedQueryExecutions(t *testing.T) {
354354
}
355355
}
356356

357+
358+
func TestUnorderedPreparedQueryExecutions(t *testing.T) {
359+
t.Parallel()
360+
db, mock, err := New()
361+
if err != nil {
362+
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
363+
}
364+
defer db.Close()
365+
366+
mock.MatchExpectationsInOrder(false)
367+
368+
mock.ExpectPrepare("SELECT (.+) FROM articles WHERE id = ?").
369+
ExpectQuery().
370+
WithArgs(5).
371+
WillReturnRows(
372+
NewRows([]string{"id", "title"}).FromCSVString("5,The quick brown fox"),
373+
)
374+
mock.ExpectPrepare("SELECT (.+) FROM authors WHERE id = ?").
375+
ExpectQuery().
376+
WithArgs(1).
377+
WillReturnRows(
378+
NewRows([]string{"id", "title"}).FromCSVString("1,Betty B."),
379+
)
380+
381+
var id int
382+
var name string
383+
384+
stmt, err := db.Prepare("SELECT id, name FROM authors WHERE id = ?")
385+
if err != nil {
386+
t.Errorf("error '%s' was not expected while creating a prepared statement", err)
387+
}
388+
389+
err = stmt.QueryRow(1).Scan(&id, &name)
390+
if err != nil {
391+
t.Errorf("error '%s' was not expected querying row from statement and scanning", err)
392+
}
393+
394+
if name != "Betty B." {
395+
t.Errorf("expected mocked name to be 'Betty B.', but got '%s' instead", name)
396+
}
397+
}
398+
357399
func TestUnexpectedOperations(t *testing.T) {
358400
t.Parallel()
359401
db, mock, err := New()

0 commit comments

Comments
 (0)