mirror of
https://github.com/DATA-DOG/go-sqlmock.git
synced 2025-05-17 22:13:06 +02:00
Add test that replicates parallel problem in issue 285
This commit is contained in:
parent
f46c9e9974
commit
05bf53329f
127
sqlmock_test.go
127
sqlmock_test.go
@ -394,6 +394,50 @@ func TestUnorderedPreparedQueryExecutions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParallelPreparedQueryExecutions(t *testing.T) {
|
||||||
|
db, mock, err := New()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("an error '%s' was not expected when opening a stub database connection", err)
|
||||||
|
}
|
||||||
|
mock.MatchExpectationsInOrder(false)
|
||||||
|
|
||||||
|
mock.ExpectPrepare("INSERT INTO authors \\((.+)\\) VALUES \\((.+)\\)").
|
||||||
|
ExpectExec().
|
||||||
|
WithArgs(1, "Jane Doe").
|
||||||
|
WillReturnResult(NewResult(1, 1))
|
||||||
|
|
||||||
|
mock.ExpectPrepare("INSERT INTO authors \\((.+)\\) VALUES \\((.+)\\)").
|
||||||
|
ExpectExec().
|
||||||
|
WithArgs(0, "John Doe").
|
||||||
|
WillReturnResult(NewResult(0, 1))
|
||||||
|
|
||||||
|
t.Run("Parallel1", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
stmt, err := db.Prepare("INSERT INTO authors (id, name) VALUES (?, ?)")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error '%s' was not expected while creating a prepared statement", err)
|
||||||
|
} else {
|
||||||
|
_, err = stmt.Exec(0, "John Doe")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("Parallel2", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
stmt, err := db.Prepare("INSERT INTO authors (id, name) VALUES (?, ?)")
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error '%s' was not expected while creating a prepared statement", err)
|
||||||
|
} else {
|
||||||
|
_, err = stmt.Exec(1, "Jane Doe")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Cleanup(func() {
|
||||||
|
db.Close()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestUnexpectedOperations(t *testing.T) {
|
func TestUnexpectedOperations(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
db, mock, err := New()
|
db, mock, err := New()
|
||||||
@ -632,6 +676,89 @@ func TestGoroutineExecutionWithUnorderedExpectationMatching(t *testing.T) {
|
|||||||
// note this line is important for unordered expectation matching
|
// note this line is important for unordered expectation matching
|
||||||
mock.MatchExpectationsInOrder(false)
|
mock.MatchExpectationsInOrder(false)
|
||||||
|
|
||||||
|
data := []interface{}{
|
||||||
|
1,
|
||||||
|
"John Doe",
|
||||||
|
2,
|
||||||
|
"Jane Doe",
|
||||||
|
}
|
||||||
|
rows := NewRows([]string{"id", "name"})
|
||||||
|
rows.AddRow(data[0], data[1])
|
||||||
|
rows.AddRow(data[2], data[3])
|
||||||
|
|
||||||
|
mock.ExpectExec("DROP TABLE IF EXISTS author").WillReturnResult(NewResult(0, 0))
|
||||||
|
mock.ExpectExec("TRUNCATE TABLE").WillReturnResult(NewResult(0, 0))
|
||||||
|
|
||||||
|
mock.ExpectExec("CREATE TABLE IF NOT EXISTS author").WillReturnResult(NewResult(0, 0))
|
||||||
|
|
||||||
|
mock.ExpectQuery("SELECT").WillReturnRows(rows).WithArgs()
|
||||||
|
|
||||||
|
mock.ExpectPrepare("INSERT INTO").
|
||||||
|
ExpectExec().
|
||||||
|
WithArgs(
|
||||||
|
data[0],
|
||||||
|
data[1],
|
||||||
|
data[2],
|
||||||
|
data[3],
|
||||||
|
).
|
||||||
|
WillReturnResult(NewResult(0, 2))
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
queries := []func() error{
|
||||||
|
func() error {
|
||||||
|
_, err := db.Exec("CREATE TABLE IF NOT EXISTS author (a varchar(255)")
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
func() error {
|
||||||
|
_, err := db.Exec("TRUNCATE TABLE author")
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
func() error {
|
||||||
|
stmt, err := db.Prepare("INSERT INTO author (id,name) VALUES (?,?),(?,?)")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = stmt.Exec(1, "John Doe", 2, "Jane Doe")
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
func() error {
|
||||||
|
_, err := db.Query("SELECT * FROM author")
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
func() error {
|
||||||
|
_, err := db.Exec("DROP TABLE IF EXISTS author")
|
||||||
|
return err
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Add(len(queries))
|
||||||
|
for _, f := range queries {
|
||||||
|
go func(f func() error) {
|
||||||
|
if err := f(); err != nil {
|
||||||
|
t.Errorf("error was not expected: %s", err)
|
||||||
|
}
|
||||||
|
wg.Done()
|
||||||
|
}(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
|
if err := mock.ExpectationsWereMet(); err != nil {
|
||||||
|
t.Errorf("there were unfulfilled expectations: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGoroutineExecutionMultiTypes(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()
|
||||||
|
|
||||||
|
// note this line is important for unordered expectation matching
|
||||||
|
mock.MatchExpectationsInOrder(false)
|
||||||
|
|
||||||
result := NewResult(1, 1)
|
result := NewResult(1, 1)
|
||||||
|
|
||||||
mock.ExpectExec("^UPDATE one").WithArgs("one").WillReturnResult(result)
|
mock.ExpectExec("^UPDATE one").WithArgs("one").WillReturnResult(result)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user