mirror of
https://github.com/zhashkevych/go-sqlxmock.git
synced 2024-11-24 08:12:13 +02:00
Mikemacd patch 1 (#2)
* Update sqlmock.go Permit prepares to obey MatchExpectationsInOrder flag, allowing prepared statements to be prepared in a different order than they were added to the expectations. * Update sqlmock_test.go Add test case for unordered prepared statements.
This commit is contained in:
parent
18ab7ac1c7
commit
ca83e31de6
22
sqlmock.go
22
sqlmock.go
@ -309,6 +309,9 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
|
|||||||
var expected *ExpectedPrepare
|
var expected *ExpectedPrepare
|
||||||
var fulfilled int
|
var fulfilled int
|
||||||
var ok bool
|
var ok bool
|
||||||
|
|
||||||
|
query = stripQuery(query)
|
||||||
|
|
||||||
for _, next := range c.expected {
|
for _, next := range c.expected {
|
||||||
next.Lock()
|
next.Lock()
|
||||||
if next.fulfilled() {
|
if next.fulfilled() {
|
||||||
@ -317,17 +320,24 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if expected, ok = next.(*ExpectedPrepare); ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
next.Unlock()
|
|
||||||
if c.ordered {
|
if c.ordered {
|
||||||
|
if expected, ok = next.(*ExpectedPrepare); ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
next.Unlock()
|
||||||
return nil, fmt.Errorf("call to Prepare statement with query '%s', was not expected, next expectation is: %s", query, next)
|
return nil, fmt.Errorf("call to Prepare statement with query '%s', was not expected, next expectation is: %s", query, next)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if pr, ok := next.(*ExpectedPrepare); ok {
|
||||||
|
if pr.sqlRegex.MatchString(query) {
|
||||||
|
expected = pr
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
next.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
query = stripQuery(query)
|
|
||||||
if expected == nil {
|
if expected == nil {
|
||||||
msg := "call to Prepare '%s' query was not expected"
|
msg := "call to Prepare '%s' query was not expected"
|
||||||
if fulfilled == len(c.expected) {
|
if fulfilled == len(c.expected) {
|
||||||
|
@ -354,6 +354,48 @@ func TestPreparedQueryExecutions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func TestUnorderedPreparedQueryExecutions(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
db, mock, err := New()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
|
mock.MatchExpectationsInOrder(false)
|
||||||
|
|
||||||
|
mock.ExpectPrepare("SELECT (.+) FROM articles WHERE id = ?").
|
||||||
|
ExpectQuery().
|
||||||
|
WithArgs(5).
|
||||||
|
WillReturnRows(
|
||||||
|
NewRows([]string{"id", "title"}).FromCSVString("5,The quick brown fox"),
|
||||||
|
)
|
||||||
|
mock.ExpectPrepare("SELECT (.+) FROM authors WHERE id = ?").
|
||||||
|
ExpectQuery().
|
||||||
|
WithArgs(1).
|
||||||
|
WillReturnRows(
|
||||||
|
NewRows([]string{"id", "title"}).FromCSVString("1,Betty B."),
|
||||||
|
)
|
||||||
|
|
||||||
|
var id int
|
||||||
|
var name string
|
||||||
|
|
||||||
|
stmt, err := db.Prepare("SELECT id, name FROM authors WHERE id = ?")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error '%s' was not expected while creating a prepared statement", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = stmt.QueryRow(1).Scan(&id, &name)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error '%s' was not expected querying row from statement and scanning", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if name != "Betty B." {
|
||||||
|
t.Errorf("expected mocked name to be 'Betty B.', but got '%s' instead", name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnexpectedOperations(t *testing.T) {
|
func TestUnexpectedOperations(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
db, mock, err := New()
|
db, mock, err := New()
|
||||||
|
Loading…
Reference in New Issue
Block a user