You've already forked go-sqlmock
							
							
				mirror of
				https://github.com/DATA-DOG/go-sqlmock.git
				synced 2025-10-30 23:47:46 +02:00 
			
		
		
		
	documentation update based on lint
This commit is contained in:
		| @@ -1,10 +1,11 @@ | |||||||
| [](https://travis-ci.org/DATA-DOG/go-sqlmock) | [](https://travis-ci.org/DATA-DOG/go-sqlmock) | ||||||
|  | [](https://godoc.org/github.com/DATA-DOG/go-sqlmock) | ||||||
|  |  | ||||||
| # Sql driver mock for Golang | # Sql driver mock for Golang | ||||||
|  |  | ||||||
| This is a **mock** driver as **database/sql/driver** which is very flexible and pragmatic to | This is a **mock** driver as **database/sql/driver** which is very flexible and pragmatic to | ||||||
| manage and mock expected queries. All the expectations should be met and all queries and actions | manage and mock expected queries. All the expectations should be met and all queries and actions | ||||||
| triggered should be mocked in order to pass a test. See exported [api on godoc](http://godoc.org/github.com/DATA-DOG/go-sqlmock) | triggered should be mocked in order to pass a test. | ||||||
|  |  | ||||||
| ## Install | ## Install | ||||||
|  |  | ||||||
| @@ -289,7 +290,7 @@ to compare them correctly, this may be improved. | |||||||
|  |  | ||||||
| ## Documentation | ## Documentation | ||||||
|  |  | ||||||
| See it on [godoc](http://godoc.org/github.com/DATA-DOG/go-sqlmock) | Visit [godoc](http://godoc.org/github.com/DATA-DOG/go-sqlmock) | ||||||
|  |  | ||||||
| ## TODO | ## TODO | ||||||
|  |  | ||||||
|   | |||||||
| @@ -10,13 +10,13 @@ type conn struct { | |||||||
| 	active       expectation | 	active       expectation | ||||||
| } | } | ||||||
|  |  | ||||||
| // closes a mock database driver connection. It should | // Close a mock database driver connection. It should | ||||||
| // be always called to ensure that all expectations | // be always called to ensure that all expectations | ||||||
| // were met successfully | // were met successfully. Returns error if there is any | ||||||
| func (c *conn) Close() (err error) { | func (c *conn) Close() (err error) { | ||||||
| 	for _, e := range mock.conn.expectations { | 	for _, e := range mock.conn.expectations { | ||||||
| 		if !e.fulfilled() { | 		if !e.fulfilled() { | ||||||
| 			err = fmt.Errorf("There is a remaining expectation %T which was not matched yet", e) | 			err = fmt.Errorf("there is a remaining expectation %T which was not matched yet", e) | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -28,12 +28,12 @@ func (c *conn) Close() (err error) { | |||||||
| func (c *conn) Begin() (driver.Tx, error) { | func (c *conn) Begin() (driver.Tx, error) { | ||||||
| 	e := c.next() | 	e := c.next() | ||||||
| 	if e == nil { | 	if e == nil { | ||||||
| 		return nil, fmt.Errorf("All expectations were already fulfilled, call to Begin transaction was not expected") | 		return nil, fmt.Errorf("all expectations were already fulfilled, call to begin transaction was not expected") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	etb, ok := e.(*expectedBegin) | 	etb, ok := e.(*expectedBegin) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, fmt.Errorf("Call to Begin transaction, was not expected, next expectation is %T as %+v", e, e) | 		return nil, fmt.Errorf("call to begin transaction, was not expected, next expectation is %T as %+v", e, e) | ||||||
| 	} | 	} | ||||||
| 	etb.triggered = true | 	etb.triggered = true | ||||||
| 	return &transaction{c}, etb.err | 	return &transaction{c}, etb.err | ||||||
| @@ -53,12 +53,12 @@ func (c *conn) Exec(query string, args []driver.Value) (driver.Result, error) { | |||||||
| 	e := c.next() | 	e := c.next() | ||||||
| 	query = stripQuery(query) | 	query = stripQuery(query) | ||||||
| 	if e == nil { | 	if e == nil { | ||||||
| 		return nil, fmt.Errorf("All expectations were already fulfilled, call to Exec '%s' query with args %+v was not expected", query, args) | 		return nil, fmt.Errorf("all expectations were already fulfilled, call to exec '%s' query with args %+v was not expected", query, args) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	eq, ok := e.(*expectedExec) | 	eq, ok := e.(*expectedExec) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, fmt.Errorf("Call to Exec query '%s' with args %+v, was not expected, next expectation is %T as %+v", query, args, e, e) | 		return nil, fmt.Errorf("call to exec query '%s' with args %+v, was not expected, next expectation is %T as %+v", query, args, e, e) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	eq.triggered = true | 	eq.triggered = true | ||||||
| @@ -67,15 +67,15 @@ func (c *conn) Exec(query string, args []driver.Value) (driver.Result, error) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if eq.result == nil { | 	if eq.result == nil { | ||||||
| 		return nil, fmt.Errorf("Exec query '%s' with args %+v, must return a database/sql/driver.Result, but it was not set for expectation %T as %+v", query, args, eq, eq) | 		return nil, fmt.Errorf("exec query '%s' with args %+v, must return a database/sql/driver.result, but it was not set for expectation %T as %+v", query, args, eq, eq) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !eq.queryMatches(query) { | 	if !eq.queryMatches(query) { | ||||||
| 		return nil, fmt.Errorf("Exec query '%s', does not match regex '%s'", query, eq.sqlRegex.String()) | 		return nil, fmt.Errorf("exec query '%s', does not match regex '%s'", query, eq.sqlRegex.String()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !eq.argsMatches(args) { | 	if !eq.argsMatches(args) { | ||||||
| 		return nil, fmt.Errorf("Exec query '%s', args %+v does not match expected %+v", query, args, eq.args) | 		return nil, fmt.Errorf("exec query '%s', args %+v does not match expected %+v", query, args, eq.args) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return eq.result, nil | 	return eq.result, nil | ||||||
| @@ -89,12 +89,12 @@ func (c *conn) Query(query string, args []driver.Value) (driver.Rows, error) { | |||||||
| 	e := c.next() | 	e := c.next() | ||||||
| 	query = stripQuery(query) | 	query = stripQuery(query) | ||||||
| 	if e == nil { | 	if e == nil { | ||||||
| 		return nil, fmt.Errorf("All expectations were already fulfilled, call to Query '%s' with args %+v was not expected", query, args) | 		return nil, fmt.Errorf("all expectations were already fulfilled, call to query '%s' with args %+v was not expected", query, args) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	eq, ok := e.(*expectedQuery) | 	eq, ok := e.(*expectedQuery) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, fmt.Errorf("Call to Query '%s' with args %+v, was not expected, next expectation is %T as %+v", query, args, e, e) | 		return nil, fmt.Errorf("call to query '%s' with args %+v, was not expected, next expectation is %T as %+v", query, args, e, e) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	eq.triggered = true | 	eq.triggered = true | ||||||
| @@ -103,15 +103,15 @@ func (c *conn) Query(query string, args []driver.Value) (driver.Rows, error) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if eq.rows == nil { | 	if eq.rows == nil { | ||||||
| 		return nil, fmt.Errorf("Query '%s' with args %+v, must return a database/sql/driver.Rows, but it was not set for expectation %T as %+v", query, args, eq, eq) | 		return nil, fmt.Errorf("query '%s' with args %+v, must return a database/sql/driver.rows, but it was not set for expectation %T as %+v", query, args, eq, eq) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !eq.queryMatches(query) { | 	if !eq.queryMatches(query) { | ||||||
| 		return nil, fmt.Errorf("Query '%s', does not match regex [%s]", query, eq.sqlRegex.String()) | 		return nil, fmt.Errorf("query '%s', does not match regex [%s]", query, eq.sqlRegex.String()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !eq.argsMatches(args) { | 	if !eq.argsMatches(args) { | ||||||
| 		return nil, fmt.Errorf("Query '%s', args %+v does not match expected %+v", query, args, eq.args) | 		return nil, fmt.Errorf("query '%s', args %+v does not match expected %+v", query, args, eq.args) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return eq.rows, nil | 	return eq.rows, nil | ||||||
|   | |||||||
| @@ -13,22 +13,22 @@ func TestQueryExpectationArgComparison(t *testing.T) { | |||||||
| 	against := []driver.Value{5} | 	against := []driver.Value{5} | ||||||
|  |  | ||||||
| 	if e.argsMatches(against) { | 	if e.argsMatches(against) { | ||||||
| 		t.Error("Arguments should not match, since the size is not the same") | 		t.Error("arguments should not match, since the size is not the same") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	against = []driver.Value{3, "str"} | 	against = []driver.Value{3, "str"} | ||||||
| 	if e.argsMatches(against) { | 	if e.argsMatches(against) { | ||||||
| 		t.Error("Arguments should not match, since the first argument (int value) is different") | 		t.Error("arguments should not match, since the first argument (int value) is different") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	against = []driver.Value{5, "st"} | 	against = []driver.Value{5, "st"} | ||||||
| 	if e.argsMatches(against) { | 	if e.argsMatches(against) { | ||||||
| 		t.Error("Arguments should not match, since the second argument (string value) is different") | 		t.Error("arguments should not match, since the second argument (string value) is different") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	against = []driver.Value{5, "str"} | 	against = []driver.Value{5, "str"} | ||||||
| 	if !e.argsMatches(against) { | 	if !e.argsMatches(against) { | ||||||
| 		t.Error("Arguments should match, but it did not") | 		t.Error("arguments should match, but it did not") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e.args = []driver.Value{5, time.Now()} | 	e.args = []driver.Value{5, time.Now()} | ||||||
| @@ -38,6 +38,6 @@ func TestQueryExpectationArgComparison(t *testing.T) { | |||||||
|  |  | ||||||
| 	against = []driver.Value{5, tm} | 	against = []driver.Value{5, tm} | ||||||
| 	if !e.argsMatches(against) { | 	if !e.argsMatches(against) { | ||||||
| 		t.Error("Arguments should match (time will be compared only by type), but it did not") | 		t.Error("arguments should match (time will be compared only by type), but it did not") | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								result.go
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								result.go
									
									
									
									
									
								
							| @@ -1,27 +1,30 @@ | |||||||
| package sqlmock | package sqlmock | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  |     "database/sql/driver" | ||||||
|  | ) | ||||||
|  |  | ||||||
| // Result satisfies sql driver Result, which | // Result satisfies sql driver Result, which | ||||||
| // holds last insert id and rows affected | // holds last insert id and rows affected | ||||||
| // by Exec queries | // by Exec queries | ||||||
| type Result struct { | type result struct { | ||||||
| 	lastInsertId int64 | 	insertID int64 | ||||||
| 	rowsAffected int64 | 	rowsAffected int64 | ||||||
| } | } | ||||||
|  |  | ||||||
| // Creates a new Result for Exec based query mocks | // NewResult creates a new sql driver Result | ||||||
| func NewResult(lastInsertId int64, rowsAffected int64) *Result { | // for Exec based query mocks. | ||||||
| 	return &Result{ | func NewResult(lastInsertID int64, rowsAffected int64) driver.Result { | ||||||
| 		lastInsertId, | 	return &result{ | ||||||
|  | 		lastInsertID, | ||||||
| 		rowsAffected, | 		rowsAffected, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // Retrieve last inserted id | func (r *result) LastInsertId() (int64, error) { | ||||||
| func (res *Result) LastInsertId() (int64, error) { | 	return r.insertID, nil | ||||||
| 	return res.lastInsertId, nil |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // Retrieve number rows affected | func (r *result) RowsAffected() (int64, error) { | ||||||
| func (res *Result) RowsAffected() (int64, error) { | 	return r.rowsAffected, nil | ||||||
| 	return res.rowsAffected, nil |  | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								rows.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								rows.go
									
									
									
									
									
								
							| @@ -40,8 +40,8 @@ func (r *rows) Next(dest []driver.Value) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Create Rows from CSV string | // RowsFromCSVString creates Rows from CSV string | ||||||
| // to be used for mocked queries. Satisfies sql driver Rows interface | // to be used for mocked queries. Returns sql driver Rows interface | ||||||
| func RowsFromCSVString(columns []string, s string) driver.Rows { | func RowsFromCSVString(columns []string, s string) driver.Rows { | ||||||
| 	rs := &rows{} | 	rs := &rows{} | ||||||
| 	rs.cols = columns | 	rs.cols = columns | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								sqlmock.go
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								sqlmock.go
									
									
									
									
									
								
							| @@ -85,7 +85,7 @@ func init() { | |||||||
| 	sql.Register("mock", mock) | 	sql.Register("mock", mock) | ||||||
| } | } | ||||||
|  |  | ||||||
| // Expect transaction to be started | // ExpectBegin expects transaction to be started | ||||||
| func ExpectBegin() Mock { | func ExpectBegin() Mock { | ||||||
| 	e := &expectedBegin{} | 	e := &expectedBegin{} | ||||||
| 	mock.conn.expectations = append(mock.conn.expectations, e) | 	mock.conn.expectations = append(mock.conn.expectations, e) | ||||||
| @@ -93,7 +93,7 @@ func ExpectBegin() Mock { | |||||||
| 	return mock.conn | 	return mock.conn | ||||||
| } | } | ||||||
|  |  | ||||||
| // Expect transaction to be commited | // ExpectCommit expects transaction to be commited | ||||||
| func ExpectCommit() Mock { | func ExpectCommit() Mock { | ||||||
| 	e := &expectedCommit{} | 	e := &expectedCommit{} | ||||||
| 	mock.conn.expectations = append(mock.conn.expectations, e) | 	mock.conn.expectations = append(mock.conn.expectations, e) | ||||||
| @@ -101,7 +101,7 @@ func ExpectCommit() Mock { | |||||||
| 	return mock.conn | 	return mock.conn | ||||||
| } | } | ||||||
|  |  | ||||||
| // Expect transaction to be rolled back | // ExpectRollback expects transaction to be rolled back | ||||||
| func ExpectRollback() Mock { | func ExpectRollback() Mock { | ||||||
| 	e := &expectedRollback{} | 	e := &expectedRollback{} | ||||||
| 	mock.conn.expectations = append(mock.conn.expectations, e) | 	mock.conn.expectations = append(mock.conn.expectations, e) | ||||||
| @@ -109,13 +109,13 @@ func ExpectRollback() Mock { | |||||||
| 	return mock.conn | 	return mock.conn | ||||||
| } | } | ||||||
|  |  | ||||||
| // The expectation will return an error | // WillReturnError the expectation will return an error | ||||||
| func (c *conn) WillReturnError(err error) Mock { | func (c *conn) WillReturnError(err error) Mock { | ||||||
| 	c.active.setError(err) | 	c.active.setError(err) | ||||||
| 	return c | 	return c | ||||||
| } | } | ||||||
|  |  | ||||||
| // Expect database Exec to be triggered, which will match | // ExpectExec expects database Exec to be triggered, which will match | ||||||
| // the given query string as a regular expression | // the given query string as a regular expression | ||||||
| func ExpectExec(sqlRegexStr string) Mock { | func ExpectExec(sqlRegexStr string) Mock { | ||||||
| 	e := &expectedExec{} | 	e := &expectedExec{} | ||||||
| @@ -125,7 +125,7 @@ func ExpectExec(sqlRegexStr string) Mock { | |||||||
| 	return mock.conn | 	return mock.conn | ||||||
| } | } | ||||||
|  |  | ||||||
| // Expect database Query to be triggered, which will match | // ExpectQuery database Query to be triggered, which will match | ||||||
| // the given query string as a regular expression | // the given query string as a regular expression | ||||||
| func ExpectQuery(sqlRegexStr string) Mock { | func ExpectQuery(sqlRegexStr string) Mock { | ||||||
| 	e := &expectedQuery{} | 	e := &expectedQuery{} | ||||||
| @@ -136,14 +136,14 @@ func ExpectQuery(sqlRegexStr string) Mock { | |||||||
| 	return mock.conn | 	return mock.conn | ||||||
| } | } | ||||||
|  |  | ||||||
| // The expectation should be called with given arguments. | // WithArgs expectation should be called with given arguments. | ||||||
| // Works with Exec and Query expectations | // Works with Exec and Query expectations | ||||||
| func (c *conn) WithArgs(args ...driver.Value) Mock { | func (c *conn) WithArgs(args ...driver.Value) Mock { | ||||||
| 	eq, ok := c.active.(*expectedQuery) | 	eq, ok := c.active.(*expectedQuery) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		ee, ok := c.active.(*expectedExec) | 		ee, ok := c.active.(*expectedExec) | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			panic(fmt.Sprintf("Arguments may be expected only with query based expectations, current is %T", c.active)) | 			panic(fmt.Sprintf("arguments may be expected only with query based expectations, current is %T", c.active)) | ||||||
| 		} | 		} | ||||||
| 		ee.args = args | 		ee.args = args | ||||||
| 	} else { | 	} else { | ||||||
| @@ -152,23 +152,23 @@ func (c *conn) WithArgs(args ...driver.Value) Mock { | |||||||
| 	return c | 	return c | ||||||
| } | } | ||||||
|  |  | ||||||
| // The expectation will return a Result. | // WillReturnResult expectation will return a Result. | ||||||
| // Works only with Exec expectations | // Works only with Exec expectations | ||||||
| func (c *conn) WillReturnResult(result driver.Result) Mock { | func (c *conn) WillReturnResult(result driver.Result) Mock { | ||||||
| 	eq, ok := c.active.(*expectedExec) | 	eq, ok := c.active.(*expectedExec) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		panic(fmt.Sprintf("driver.Result may be returned only by Exec expectations, current is %T", c.active)) | 		panic(fmt.Sprintf("driver.result may be returned only by exec expectations, current is %T", c.active)) | ||||||
| 	} | 	} | ||||||
| 	eq.result = result | 	eq.result = result | ||||||
| 	return c | 	return c | ||||||
| } | } | ||||||
|  |  | ||||||
| // The expectation will return Rows. | // WillReturnRows expectation will return Rows. | ||||||
| // Works only with Query expectations | // Works only with Query expectations | ||||||
| func (c *conn) WillReturnRows(rows driver.Rows) Mock { | func (c *conn) WillReturnRows(rows driver.Rows) Mock { | ||||||
| 	eq, ok := c.active.(*expectedQuery) | 	eq, ok := c.active.(*expectedQuery) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		panic(fmt.Sprintf("driver.Rows may be returned only by Query expectations, current is %T", c.active)) | 		panic(fmt.Sprintf("driver.rows may be returned only by query expectations, current is %T", c.active)) | ||||||
| 	} | 	} | ||||||
| 	eq.rows = rows | 	eq.rows = rows | ||||||
| 	return c | 	return c | ||||||
|   | |||||||
| @@ -2,14 +2,14 @@ package sqlmock | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"database/sql" | 	"database/sql" | ||||||
| 	"errors" | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestMockQuery(t *testing.T) { | func TestMockQuery(t *testing.T) { | ||||||
| 	db, err := sql.Open("mock", "") | 	db, err := sql.Open("mock", "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when opening a stub database connection", err) | 		t.Errorf("an error '%s' was not expected when opening a stub database connection", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rs := RowsFromCSVString([]string{"id", "title"}, "5,hello world") | 	rs := RowsFromCSVString([]string{"id", "title"}, "5,hello world") | ||||||
| @@ -20,11 +20,11 @@ func TestMockQuery(t *testing.T) { | |||||||
|  |  | ||||||
| 	rows, err := db.Query("SELECT (.+) FROM articles WHERE id = ?", 5) | 	rows, err := db.Query("SELECT (.+) FROM articles WHERE id = ?", 5) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while retrieving mock rows", err) | 		t.Errorf("error '%s' was not expected while retrieving mock rows", err) | ||||||
| 	} | 	} | ||||||
| 	defer rows.Close() | 	defer rows.Close() | ||||||
| 	if !rows.Next() { | 	if !rows.Next() { | ||||||
| 		t.Error("It must have had one row as result, but got empty result set instead") | 		t.Error("it must have had one row as result, but got empty result set instead") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var id int | 	var id int | ||||||
| @@ -32,26 +32,26 @@ func TestMockQuery(t *testing.T) { | |||||||
|  |  | ||||||
| 	err = rows.Scan(&id, &title) | 	err = rows.Scan(&id, &title) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while trying to scan row", err) | 		t.Errorf("error '%s' was not expected while trying to scan row", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if id != 5 { | 	if id != 5 { | ||||||
| 		t.Errorf("Expected mocked id to be 5, but got %d instead", id) | 		t.Errorf("expected mocked id to be 5, but got %d instead", id) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if title != "hello world" { | 	if title != "hello world" { | ||||||
| 		t.Errorf("Expected mocked title to be 'hello world', but got '%s' instead", title) | 		t.Errorf("expected mocked title to be 'hello world', but got '%s' instead", title) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = db.Close(); err != nil { | 	if err = db.Close(); err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while closing the database", err) | 		t.Errorf("error '%s' was not expected while closing the database", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestTransactionExpectations(t *testing.T) { | func TestTransactionExpectations(t *testing.T) { | ||||||
| 	db, err := sql.Open("mock", "") | 	db, err := sql.Open("mock", "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when opening a stub database connection", err) | 		t.Errorf("an error '%s' was not expected when opening a stub database connection", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// begin and commit | 	// begin and commit | ||||||
| @@ -60,12 +60,12 @@ func TestTransactionExpectations(t *testing.T) { | |||||||
|  |  | ||||||
| 	tx, err := db.Begin() | 	tx, err := db.Begin() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when beginning a transaction", err) | 		t.Errorf("an error '%s' was not expected when beginning a transaction", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = tx.Commit() | 	err = tx.Commit() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when commiting a transaction", err) | 		t.Errorf("an error '%s' was not expected when commiting a transaction", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// begin and rollback | 	// begin and rollback | ||||||
| @@ -74,31 +74,31 @@ func TestTransactionExpectations(t *testing.T) { | |||||||
|  |  | ||||||
| 	tx, err = db.Begin() | 	tx, err = db.Begin() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when beginning a transaction", err) | 		t.Errorf("an error '%s' was not expected when beginning a transaction", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = tx.Rollback() | 	err = tx.Rollback() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when rolling back a transaction", err) | 		t.Errorf("an error '%s' was not expected when rolling back a transaction", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// begin with an error | 	// begin with an error | ||||||
| 	ExpectBegin().WillReturnError(errors.New("Some err")) | 	ExpectBegin().WillReturnError(fmt.Errorf("some err")) | ||||||
|  |  | ||||||
| 	tx, err = db.Begin() | 	tx, err = db.Begin() | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		t.Error("An error was expected when beginning a transaction, but got none") | 		t.Error("an error was expected when beginning a transaction, but got none") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = db.Close(); err != nil { | 	if err = db.Close(); err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while closing the database", err) | 		t.Errorf("error '%s' was not expected while closing the database", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestPreparedQueryExecutions(t *testing.T) { | func TestPreparedQueryExecutions(t *testing.T) { | ||||||
| 	db, err := sql.Open("mock", "") | 	db, err := sql.Open("mock", "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when opening a stub database connection", err) | 		t.Errorf("an error '%s' was not expected when opening a stub database connection", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rs1 := RowsFromCSVString([]string{"id", "title"}, "5,hello world") | 	rs1 := RowsFromCSVString([]string{"id", "title"}, "5,hello world") | ||||||
| @@ -113,7 +113,7 @@ func TestPreparedQueryExecutions(t *testing.T) { | |||||||
|  |  | ||||||
| 	stmt, err := db.Prepare("SELECT (.+) FROM articles WHERE id = ?") | 	stmt, err := db.Prepare("SELECT (.+) FROM articles WHERE id = ?") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while creating a prepared statement", err) | 		t.Errorf("error '%s' was not expected while creating a prepared statement", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var id int | 	var id int | ||||||
| @@ -121,44 +121,44 @@ func TestPreparedQueryExecutions(t *testing.T) { | |||||||
|  |  | ||||||
| 	err = stmt.QueryRow(5).Scan(&id, &title) | 	err = stmt.QueryRow(5).Scan(&id, &title) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected querying row from statement and scanning", err) | 		t.Errorf("error '%s' was not expected querying row from statement and scanning", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if id != 5 { | 	if id != 5 { | ||||||
| 		t.Errorf("Expected mocked id to be 5, but got %d instead", id) | 		t.Errorf("expected mocked id to be 5, but got %d instead", id) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if title != "hello world" { | 	if title != "hello world" { | ||||||
| 		t.Errorf("Expected mocked title to be 'hello world', but got '%s' instead", title) | 		t.Errorf("expected mocked title to be 'hello world', but got '%s' instead", title) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = stmt.QueryRow(2).Scan(&id, &title) | 	err = stmt.QueryRow(2).Scan(&id, &title) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected querying row from statement and scanning", err) | 		t.Errorf("error '%s' was not expected querying row from statement and scanning", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if id != 2 { | 	if id != 2 { | ||||||
| 		t.Errorf("Expected mocked id to be 2, but got %d instead", id) | 		t.Errorf("expected mocked id to be 2, but got %d instead", id) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if title != "whoop" { | 	if title != "whoop" { | ||||||
| 		t.Errorf("Expected mocked title to be 'whoop', but got '%s' instead", title) | 		t.Errorf("expected mocked title to be 'whoop', but got '%s' instead", title) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = db.Close(); err != nil { | 	if err = db.Close(); err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while closing the database", err) | 		t.Errorf("error '%s' was not expected while closing the database", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestUnexpectedOperations(t *testing.T) { | func TestUnexpectedOperations(t *testing.T) { | ||||||
| 	db, err := sql.Open("mock", "") | 	db, err := sql.Open("mock", "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when opening a stub database connection", err) | 		t.Errorf("an error '%s' was not expected when opening a stub database connection", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	stmt, err := db.Prepare("SELECT (.+) FROM articles WHERE id = ?") | 	stmt, err := db.Prepare("SELECT (.+) FROM articles WHERE id = ?") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while creating a prepared statement", err) | 		t.Errorf("error '%s' was not expected while creating a prepared statement", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var id int | 	var id int | ||||||
| @@ -166,21 +166,21 @@ func TestUnexpectedOperations(t *testing.T) { | |||||||
|  |  | ||||||
| 	err = stmt.QueryRow(5).Scan(&id, &title) | 	err = stmt.QueryRow(5).Scan(&id, &title) | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		t.Error("Error was expected querying row, since there was no such expectation") | 		t.Error("error was expected querying row, since there was no such expectation") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ExpectRollback() | 	ExpectRollback() | ||||||
|  |  | ||||||
| 	err = db.Close() | 	err = db.Close() | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		t.Error("Error was expected while closing the database, expectation was not fulfilled", err) | 		t.Error("error was expected while closing the database, expectation was not fulfilled", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestWrongExpectations(t *testing.T) { | func TestWrongExpectations(t *testing.T) { | ||||||
| 	db, err := sql.Open("mock", "") | 	db, err := sql.Open("mock", "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when opening a stub database connection", err) | 		t.Errorf("an error '%s' was not expected when opening a stub database connection", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ExpectBegin() | 	ExpectBegin() | ||||||
| @@ -190,12 +190,12 @@ func TestWrongExpectations(t *testing.T) { | |||||||
| 		WithArgs(5). | 		WithArgs(5). | ||||||
| 		WillReturnRows(rs1) | 		WillReturnRows(rs1) | ||||||
|  |  | ||||||
| 	ExpectCommit().WillReturnError(errors.New("Deadlock occured")) | 	ExpectCommit().WillReturnError(fmt.Errorf("deadlock occured")) | ||||||
| 	ExpectRollback() // won't be triggered | 	ExpectRollback() // won't be triggered | ||||||
|  |  | ||||||
| 	stmt, err := db.Prepare("SELECT (.+) FROM articles WHERE id = ? FOR UPDATE") | 	stmt, err := db.Prepare("SELECT (.+) FROM articles WHERE id = ? FOR UPDATE") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while creating a prepared statement", err) | 		t.Errorf("error '%s' was not expected while creating a prepared statement", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	var id int | 	var id int | ||||||
| @@ -203,35 +203,35 @@ func TestWrongExpectations(t *testing.T) { | |||||||
|  |  | ||||||
| 	err = stmt.QueryRow(5).Scan(&id, &title) | 	err = stmt.QueryRow(5).Scan(&id, &title) | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		t.Error("Error was expected while querying row, since there Begin transaction expectation is not fulfilled") | 		t.Error("error was expected while querying row, since there begin transaction expectation is not fulfilled") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// lets go around and start transaction | 	// lets go around and start transaction | ||||||
| 	tx, err := db.Begin() | 	tx, err := db.Begin() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when beginning a transaction", err) | 		t.Errorf("an error '%s' was not expected when beginning a transaction", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = stmt.QueryRow(5).Scan(&id, &title) | 	err = stmt.QueryRow(5).Scan(&id, &title) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while querying row, since transaction was started", err) | 		t.Errorf("error '%s' was not expected while querying row, since transaction was started", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = tx.Commit() | 	err = tx.Commit() | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		t.Error("A deadlock error was expected when commiting a transaction", err) | 		t.Error("a deadlock error was expected when commiting a transaction", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err = db.Close() | 	err = db.Close() | ||||||
| 	if err == nil { | 	if err == nil { | ||||||
| 		t.Error("Error was expected while closing the database, expectation was not fulfilled", err) | 		t.Error("error was expected while closing the database, expectation was not fulfilled", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestExecExpectations(t *testing.T) { | func TestExecExpectations(t *testing.T) { | ||||||
| 	db, err := sql.Open("mock", "") | 	db, err := sql.Open("mock", "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("An error '%s' was not expected when opening a stub database connection", err) | 		t.Errorf("an error '%s' was not expected when opening a stub database connection", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	result := NewResult(1, 1) | 	result := NewResult(1, 1) | ||||||
| @@ -241,28 +241,28 @@ func TestExecExpectations(t *testing.T) { | |||||||
|  |  | ||||||
| 	res, err := db.Exec("INSERT INTO articles (title) VALUES (?)", "hello") | 	res, err := db.Exec("INSERT INTO articles (title) VALUES (?)", "hello") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected, while inserting a row", err) | 		t.Errorf("error '%s' was not expected, while inserting a row", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	id, err := res.LastInsertId() | 	id, err := res.LastInsertId() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected, while getting a last insert id", err) | 		t.Errorf("error '%s' was not expected, while getting a last insert id", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	affected, err := res.RowsAffected() | 	affected, err := res.RowsAffected() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected, while getting affected rows", err) | 		t.Errorf("error '%s' was not expected, while getting affected rows", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if id != 1 { | 	if id != 1 { | ||||||
| 		t.Errorf("Expected last insert id to be 1, but got %d instead", id) | 		t.Errorf("expected last insert id to be 1, but got %d instead", id) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if affected != 1 { | 	if affected != 1 { | ||||||
| 		t.Errorf("Expected affected rows to be 1, but got %d instead", affected) | 		t.Errorf("expected affected rows to be 1, but got %d instead", affected) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err = db.Close(); err != nil { | 	if err = db.Close(); err != nil { | ||||||
| 		t.Errorf("Error '%s' was not expected while closing the database", err) | 		t.Errorf("error '%s' was not expected while closing the database", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| package sqlmock | package sqlmock | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"errors" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -12,12 +11,12 @@ type transaction struct { | |||||||
| func (tx *transaction) Commit() error { | func (tx *transaction) Commit() error { | ||||||
| 	e := tx.conn.next() | 	e := tx.conn.next() | ||||||
| 	if e == nil { | 	if e == nil { | ||||||
| 		return errors.New("All expectations were already fulfilled, call to Commit transaction was not expected") | 		return fmt.Errorf("all expectations were already fulfilled, call to commit transaction was not expected") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	etc, ok := e.(*expectedCommit) | 	etc, ok := e.(*expectedCommit) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return errors.New(fmt.Sprintf("Call to Commit transaction, was not expected, next expectation was %v", e)) | 		return fmt.Errorf("call to commit transaction, was not expected, next expectation was %v", e) | ||||||
| 	} | 	} | ||||||
| 	etc.triggered = true | 	etc.triggered = true | ||||||
| 	return etc.err | 	return etc.err | ||||||
| @@ -26,12 +25,12 @@ func (tx *transaction) Commit() error { | |||||||
| func (tx *transaction) Rollback() error { | func (tx *transaction) Rollback() error { | ||||||
| 	e := tx.conn.next() | 	e := tx.conn.next() | ||||||
| 	if e == nil { | 	if e == nil { | ||||||
| 		return errors.New("All expectations were already fulfilled, call to Rollback transaction was not expected") | 		return fmt.Errorf("all expectations were already fulfilled, call to rollback transaction was not expected") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	etr, ok := e.(*expectedRollback) | 	etr, ok := e.(*expectedRollback) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return errors.New(fmt.Sprintf("Call to Rollback transaction, was not expected, next expectation was %v", e)) | 		return fmt.Errorf("call to rollback transaction, was not expected, next expectation was %v", e) | ||||||
| 	} | 	} | ||||||
| 	etr.triggered = true | 	etr.triggered = true | ||||||
| 	return etr.err | 	return etr.err | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user