Implement private clone method to support fluent API

This commit is contained in:
Ian Tan 2017-11-17 18:29:31 +08:00
parent b9fc77cb77
commit 90528be927

View File

@ -4,23 +4,19 @@ import (
"fmt" "fmt"
) )
// Expecter is the exported struct used for setting expectations
type Expecter struct {
adapter Adapter
}
// AdapterFactory is a generic interface for arbitrary adapters that satisfy // AdapterFactory is a generic interface for arbitrary adapters that satisfy
// the interface. variadic args are passed to gorm.Open. // the interface. variadic args are passed to gorm.Open.
type AdapterFactory func(dialect string, args ...interface{}) (error, *DB, Adapter) type AdapterFactory func(dialect string, args ...interface{}) (error, *DB, Adapter)
func (h *Expecter) ExpectFirst(model interface{}) ExpectedQuery { // Expecter is the exported struct used for setting expectations
fmt.Printf("Expecting query: %s", "some query\n") type Expecter struct {
return h.adapter.ExpectQuery("some sql") Value interface{}
} adapter Adapter
search *search
values map[string]interface{}
func (h *Expecter) ExpectFind(model interface{}) ExpectedQuery { // globally scoped expecter
fmt.Println("Expecting query: %s", "some query involving Find") root *Expecter
return h.adapter.ExpectQuery("some find condition")
} }
// NewDefaultExpecter returns a Expecter powered by go-sqlmock // NewDefaultExpecter returns a Expecter powered by go-sqlmock
@ -44,3 +40,30 @@ func NewExpecter(fn AdapterFactory, dialect string, args ...interface{}) (error,
return nil, gormDb, &Expecter{adapter: adapter} return nil, gormDb, &Expecter{adapter: adapter}
} }
/* PUBLIC METHODS */
func (h *Expecter) ExpectFirst(model interface{}) ExpectedQuery {
fmt.Printf("Expecting query: %s", "some query\n")
return h.adapter.ExpectQuery("some sql")
}
func (h *Expecter) ExpectFind(model interface{}) ExpectedQuery {
fmt.Println("Expecting query: %s", "some query involving Find")
return h.adapter.ExpectQuery("some find condition")
}
/* PRIVATE METHODS */
// clone is similar to DB.clone, and ensures that the root Expecter is not
// polluted with subsequent search constraints
func (h *Expecter) clone() *Expecter {
expecterCopy := &Expecter{
adapter: h.adapter,
root: h.root,
values: map[string]interface{}{},
Value: h.Value,
}
return expecterCopy
}