1
0
mirror of https://github.com/DATA-DOG/go-sqlmock.git synced 2025-06-16 23:57:35 +02:00

delay for WillDelayFor() duration, before returning error set by WillReturnError()

If both WillDelayFor() and WillReturnError() are called, there should
be a delay before the error is returned.  Applied to Begin, Exec,
Query, and Prepare.  Also, the context versions of same.

And a couple of unit tests.
This commit is contained in:
Wachowski
2018-02-20 17:30:20 -07:00
parent a7b3087be7
commit 32675e3ad1
4 changed files with 158 additions and 38 deletions

View File

@ -2,6 +2,7 @@ package sqlmock
import (
"database/sql"
"errors"
"fmt"
"strconv"
"sync"
@ -1063,3 +1064,52 @@ func TestPreparedStatementCloseExpectation(t *testing.T) {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}
func TestExecExpectationErrorDelay(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()
// test that return of error is delayed
var delay time.Duration
delay = 100 * time.Millisecond
mock.ExpectExec("^INSERT INTO articles").
WillReturnError(errors.New("slow fail")).
WillDelayFor(delay)
start := time.Now()
res, err := db.Exec("INSERT INTO articles (title) VALUES (?)", "hello")
stop := time.Now()
if res != nil {
t.Errorf("result was not expected, was expecting nil")
}
if err == nil {
t.Errorf("error was expected, was not expecting nil")
}
if err.Error() != "slow fail" {
t.Errorf("error '%s' was not expected, was expecting '%s'", err.Error(), "slow fail")
}
elapsed := stop.Sub(start)
if elapsed < delay {
t.Errorf("expecting a delay of %v before error, actual delay was %v", delay, elapsed)
}
// also test that return of error is not delayed
mock.ExpectExec("^INSERT INTO articles").WillReturnError(errors.New("fast fail"))
start = time.Now()
db.Exec("INSERT INTO articles (title) VALUES (?)", "hello")
stop = time.Now()
elapsed = stop.Sub(start)
if elapsed > delay {
t.Errorf("expecting a delay of less than %v before error, actual delay was %v", delay, elapsed)
}
}