mirror of
https://github.com/zhashkevych/go-sqlxmock.git
synced 2024-11-24 08:12:13 +02:00
133 lines
3.2 KiB
Go
133 lines
3.2 KiB
Go
package sqlmock
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"errors"
|
|
"fmt"
|
|
"testing"
|
|
)
|
|
|
|
type void struct{}
|
|
|
|
func (void) Print(...interface{}) {}
|
|
|
|
type converter struct{}
|
|
|
|
func (c *converter) ConvertValue(v interface{}) (driver.Value, error) {
|
|
return nil, errors.New("converter disabled")
|
|
}
|
|
|
|
func ExampleNew() {
|
|
db, mock, err := New()
|
|
if err != nil {
|
|
fmt.Println("expected no error, but got:", err)
|
|
return
|
|
}
|
|
defer db.Close()
|
|
// now we can expect operations performed on db
|
|
mock.ExpectBegin().WillReturnError(fmt.Errorf("an error will occur on db.Begin() call"))
|
|
}
|
|
|
|
func TestShouldOpenConnectionIssue15(t *testing.T) {
|
|
db, mock, err := New()
|
|
if err != nil {
|
|
t.Errorf("expected no error, but got: %s", err)
|
|
}
|
|
if len(pool.conns) != 1 {
|
|
t.Errorf("expected 1 connection in pool, but there is: %d", len(pool.conns))
|
|
}
|
|
|
|
smock, _ := mock.(*sqlmock)
|
|
if smock.opened != 1 {
|
|
t.Errorf("expected 1 connection on mock to be opened, but there is: %d", smock.opened)
|
|
}
|
|
|
|
// defer so the rows gets closed first
|
|
defer func() {
|
|
if smock.opened != 0 {
|
|
t.Errorf("expected no connections on mock to be opened, but there is: %d", smock.opened)
|
|
}
|
|
}()
|
|
|
|
mock.ExpectQuery("SELECT").WillReturnRows(NewRows([]string{"one", "two"}).AddRow("val1", "val2"))
|
|
rows, err := db.Query("SELECT")
|
|
if err != nil {
|
|
t.Errorf("unexpected error: %s", err)
|
|
}
|
|
defer rows.Close()
|
|
|
|
mock.ExpectExec("UPDATE").WillReturnResult(NewResult(1, 1))
|
|
if _, err = db.Exec("UPDATE"); err != nil {
|
|
t.Errorf("unexpected error: %s", err)
|
|
}
|
|
|
|
// now there should be two connections open
|
|
if smock.opened != 2 {
|
|
t.Errorf("expected 2 connection on mock to be opened, but there is: %d", smock.opened)
|
|
}
|
|
|
|
mock.ExpectClose()
|
|
if err = db.Close(); err != nil {
|
|
t.Errorf("expected no error on close, but got: %s", err)
|
|
}
|
|
|
|
// one is still reserved for rows
|
|
if smock.opened != 1 {
|
|
t.Errorf("expected 1 connection on mock to be still reserved for rows, but there is: %d", smock.opened)
|
|
}
|
|
}
|
|
|
|
func TestTwoOpenConnectionsOnTheSameDSN(t *testing.T) {
|
|
db, mock, err := New()
|
|
if err != nil {
|
|
t.Errorf("expected no error, but got: %s", err)
|
|
}
|
|
db2, mock2, err := New()
|
|
if err != nil {
|
|
t.Errorf("expected no error, but got: %s", err)
|
|
}
|
|
if len(pool.conns) != 2 {
|
|
t.Errorf("expected 2 connection in pool, but there is: %d", len(pool.conns))
|
|
}
|
|
|
|
if db == db2 {
|
|
t.Errorf("expected not the same database instance, but it is the same")
|
|
}
|
|
if mock == mock2 {
|
|
t.Errorf("expected not the same mock instance, but it is the same")
|
|
}
|
|
}
|
|
|
|
func TestWithOptions(t *testing.T) {
|
|
c := &converter{}
|
|
_, mock, err := New(ValueConverterOption(c))
|
|
if err != nil {
|
|
t.Errorf("expected no error, but got: %s", err)
|
|
}
|
|
smock, _ := mock.(*sqlmock)
|
|
if smock.converter.(*converter) != c {
|
|
t.Errorf("expected a custom converter to be set")
|
|
}
|
|
}
|
|
|
|
func TestWrongDSN(t *testing.T) {
|
|
t.Parallel()
|
|
db, _, _ := New()
|
|
defer db.Close()
|
|
if _, err := db.Driver().Open("wrong_dsn"); err == nil {
|
|
t.Error("expected error on Open")
|
|
}
|
|
}
|
|
|
|
func TestNewDSN(t *testing.T) {
|
|
if _, _, err := NewWithDSN("sqlmock_db_99"); err != nil {
|
|
t.Errorf("expected no error on NewWithDSN, but got: %s", err)
|
|
}
|
|
}
|
|
|
|
func TestDuplicateNewDSN(t *testing.T) {
|
|
if _, _, err := NewWithDSN("sqlmock_db_1"); err == nil {
|
|
t.Error("expected error on NewWithDSN")
|
|
}
|
|
}
|