diff --git a/gorm_expect.go b/gorm_expect.go deleted file mode 100644 index df714201..00000000 --- a/gorm_expect.go +++ /dev/null @@ -1,114 +0,0 @@ -package gorm - -import ( - "database/sql" - "fmt" - - "gopkg.in/DATA-DOG/go-sqlmock.v1" -) - -// TestHelper is the exported struct used for setting expectations -type TestHelper struct { - gormDb *DB - mockDb *sql.DB - adapter Adapter - asserter Asserter -} - -// Close closes the DB connection -func (h *TestHelper) Close() error { - return h.adapter.Close() -} - -func (h *TestHelper) ExpectFirst(model interface{}) Query { - fmt.Printf("Expecting query: %s", "some query\n") - return h.asserter.Query("some sql") -} - -func (h *TestHelper) ExpectFind(model interface{}) { - fmt.Println("Expecting query: %s", "some query involving Find") -} - -type Query interface { - Return(model interface{}) Query -} - -type SqlmockQuery struct { - query *sqlmock.ExpectedQuery -} - -func (q *SqlmockQuery) getRowsForOutType(out interface{}) *sqlmock.Rows { - rows := sqlmock.NewRows([]string{"column1", "column2", "column3"}) - rows = rows.AddRow("someval1", "someval2", "someval3") - - return rows -} - -func (q *SqlmockQuery) Return(out interface{}) Query { - rows := q.getRowsForOutType(out) - q.query = q.query.WillReturnRows(rows) - - return q -} - -type Exec interface { - Return(args ...interface{}) -} - -type Adapter interface { - Open() (error, *sql.DB, *DB, Asserter) - Close() error -} - -type Asserter interface { - Query(query string) Query - // Exec(stmt string) Exec -} - -type SqlmockAdapter struct { - mockDb *sql.DB - mock *sqlmock.Sqlmock -} - -// Open returns the raw sql.DB and a gorm DB instance -func (adapter *SqlmockAdapter) Open() (error, *sql.DB, *DB, Asserter) { - mockDb, mock, err := sqlmock.NewWithDSN("mock_gorm_dsn") - - if err != nil { - return err, nil, nil, nil - } - - gormDb, err := Open("sqlmock", "mock_gorm_dsn") - - if err != nil { - return err, nil, nil, nil - } - - return nil, mockDb, gormDb, &SqlmockAsserter{mock: mock, sqlmockDB: mockDb} -} - -func (adapter *SqlmockAdapter) Close() error { - return adapter.mockDb.Close() -} - -type SqlmockAsserter struct { - sqlmockDB *sql.DB - mock sqlmock.Sqlmock -} - -func (a *SqlmockAsserter) Query(query string) Query { - q := a.mock.ExpectQuery(query) - - return &SqlmockQuery{q} -} - -// NewTestHelper returns a fresh TestHelper -func NewTestHelper(adapter Adapter) (error, *DB, *TestHelper) { - err, mockDb, gormDb, asserter := adapter.Open() - - if err != nil { - return err, nil, nil - } - - return nil, gormDb, &TestHelper{gormDb: gormDb, mockDb: mockDb, adapter: adapter, asserter: asserter} -} diff --git a/test_helper.go b/test_helper.go new file mode 100644 index 00000000..c1419f11 --- /dev/null +++ b/test_helper.go @@ -0,0 +1,39 @@ +package gorm + +import ( + "database/sql" + "fmt" +) + +// TestHelper is the exported struct used for setting expectations +type TestHelper struct { + gormDb *DB + mockDb *sql.DB + adapter Adapter + asserter Asserter +} + +// Close closes the DB connection +func (h *TestHelper) Close() error { + return h.adapter.Close() +} + +func (h *TestHelper) ExpectFirst(model interface{}) Query { + fmt.Printf("Expecting query: %s", "some query\n") + return h.asserter.Query("some sql") +} + +func (h *TestHelper) ExpectFind(model interface{}) { + fmt.Println("Expecting query: %s", "some query involving Find") +} + +// NewTestHelper returns a fresh TestHelper +func NewTestHelper(adapter Adapter) (error, *DB, *TestHelper) { + err, mockDb, gormDb, asserter := adapter.Open() + + if err != nil { + return err, nil, nil + } + + return nil, gormDb, &TestHelper{gormDb: gormDb, mockDb: mockDb, adapter: adapter, asserter: asserter} +} diff --git a/test_helper_adapter.go b/test_helper_adapter.go new file mode 100644 index 00000000..595edf22 --- /dev/null +++ b/test_helper_adapter.go @@ -0,0 +1,49 @@ +package gorm + +import ( + "database/sql" + + sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1" +) + +type Adapter interface { + Open() (error, *sql.DB, *DB, Asserter) + Close() error +} + +type SqlmockAdapter struct { + mockDb *sql.DB + mock *sqlmock.Sqlmock +} + +// Open returns the raw sql.DB and a gorm DB instance +func (adapter *SqlmockAdapter) Open() (error, *sql.DB, *DB, Asserter) { + mockDb, mock, err := sqlmock.NewWithDSN("mock_gorm_dsn") + + if err != nil { + return err, nil, nil, nil + } + + gormDb, err := Open("sqlmock", "mock_gorm_dsn") + + if err != nil { + return err, nil, nil, nil + } + + return nil, mockDb, gormDb, &SqlmockAsserter{mock: mock, sqlmockDB: mockDb} +} + +func (adapter *SqlmockAdapter) Close() error { + return adapter.mockDb.Close() +} + +type SqlmockAsserter struct { + sqlmockDB *sql.DB + mock sqlmock.Sqlmock +} + +func (a *SqlmockAsserter) Query(query string) Query { + q := a.mock.ExpectQuery(query) + + return &SqlmockQuery{q} +} diff --git a/test_helper_assserter.go b/test_helper_assserter.go new file mode 100644 index 00000000..79123b14 --- /dev/null +++ b/test_helper_assserter.go @@ -0,0 +1,35 @@ +package gorm + +import sqlmock "gopkg.in/DATA-DOG/go-sqlmock.v1" + +type Query interface { + Return(model interface{}) Query +} + +type Exec interface { + Return(args ...interface{}) Exec +} + +type Asserter interface { + Query(query string) Query + // Exec(stmt string) Exec +} + +// SqlmockQuery implements Query for asserter go-sqlmock +type SqlmockQuery struct { + query *sqlmock.ExpectedQuery +} + +func (q *SqlmockQuery) getRowsForOutType(out interface{}) *sqlmock.Rows { + rows := sqlmock.NewRows([]string{"column1", "column2", "column3"}) + rows = rows.AddRow("someval1", "someval2", "someval3") + + return rows +} + +func (q *SqlmockQuery) Return(out interface{}) Query { + rows := q.getRowsForOutType(out) + q.query = q.query.WillReturnRows(rows) + + return q +} diff --git a/gorm_expect_test.go b/test_helper_test.go similarity index 100% rename from gorm_expect_test.go rename to test_helper_test.go