Reorganise code structure

This commit is contained in:
Ian Tan 2017-11-17 11:55:19 +08:00
parent eb418da347
commit c3e927ba8b
5 changed files with 123 additions and 114 deletions

View File

@ -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}
}

39
test_helper.go Normal file
View File

@ -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}
}

49
test_helper_adapter.go Normal file
View File

@ -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}
}

35
test_helper_assserter.go Normal file
View File

@ -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
}