package sqlmock import ( "fmt" "testing" "github.com/jinzhu/gorm" ) type void struct{} func (void) Print(...interface{}) {} 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 ExampleNewWithDSN() { _, mock, err := NewWithDSN("mydsn for gorm") if err != nil { fmt.Println("expected no error, but got:", err) return } // use the same dsn to initialize a connection db, err := gorm.Open("sqlmock", "mydsn for gorm") if err != nil { fmt.Println("expected no error from gorm, but got:", err) return } defer db.Close() db.SetLogger(void{}) // sad - nil panics // now we can expect operations performed on db mock.ExpectBegin().WillReturnError(fmt.Errorf("an error will occur on db.Begin() call")) txconn := db.Begin() for _, err := range txconn.GetErrors() { fmt.Println(err.Error()) } // Output: `sqlmock` is not officially supported, running under compatibility mode. // 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 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") } }