From fb65f6708c82f9b87e8ce36fa5c049197665293f Mon Sep 17 00:00:00 2001 From: Ian Tan Date: Thu, 16 Nov 2017 18:40:49 +0800 Subject: [PATCH] Groundwork for TestHelper --- gorm_expect.go | 108 ++++++++++++++++++++++++++++++++++++++++++++ gorm_expect_test.go | 26 +++++++++++ 2 files changed, 134 insertions(+) create mode 100644 gorm_expect.go create mode 100644 gorm_expect_test.go diff --git a/gorm_expect.go b/gorm_expect.go new file mode 100644 index 00000000..4c29231f --- /dev/null +++ b/gorm_expect.go @@ -0,0 +1,108 @@ +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 + asserter Asserter +} + +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, asserter: asserter} +} diff --git a/gorm_expect_test.go b/gorm_expect_test.go new file mode 100644 index 00000000..9e726c50 --- /dev/null +++ b/gorm_expect_test.go @@ -0,0 +1,26 @@ +package gorm_test + +import ( + "testing" + + "github.com/iantanwx/gorm" +) + +func TestOpenWithSqlmock(t *testing.T) { + err, _, _ := gorm.NewTestHelper(&gorm.SqlmockAdapter{}) + + if err != nil { + t.Error(err) + } +} + +func TestQuery(t *testing.T) { + err, db, helper := gorm.NewTestHelper(&gorm.SqlmockAdapter{}) + + if err != nil { + t.Fatal(err.Error()) + } + + helper.ExpectFirst(&User{}).Return(&User{}) + db.First(&User{}) +}