| 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") |
| } |
| } |