gorm/expecter.go
2017-11-18 16:37:14 +08:00

72 lines
1.8 KiB
Go

package gorm
import (
"fmt"
)
// AdapterFactory is a generic interface for arbitrary adapters that satisfy
// the interface. variadic args are passed to gorm.Open.
type AdapterFactory func(dialect string, args ...interface{}) (*DB, Adapter, error)
// Expecter is the exported struct used for setting expectations
type Expecter struct {
Value interface{}
adapter Adapter
search *search
values map[string]interface{}
// globally scoped expecter
root *Expecter
}
// NewDefaultExpecter returns a Expecter powered by go-sqlmock
func NewDefaultExpecter() (*DB, *Expecter, error) {
gormDb, adapter, err := NewSqlmockAdapter("sqlmock", "mock_gorm_dsn")
if err != nil {
return nil, nil, err
}
return gormDb, &Expecter{adapter: adapter}, nil
}
// NewExpecter returns an Expecter for arbitrary adapters
func NewExpecter(fn AdapterFactory, dialect string, args ...interface{}) (*DB, *Expecter, error) {
gormDb, adapter, err := fn(dialect, args...)
if err != nil {
return nil, nil, err
}
return gormDb, &Expecter{adapter: adapter}, nil
}
/* PUBLIC METHODS */
// First triggers a Query
func (h *Expecter) First(model interface{}) ExpectedQuery {
fmt.Printf("Expecting query: %s", "some query\n")
return h.adapter.ExpectQuery("some sql")
}
// Find triggers a Query
func (h *Expecter) Find(model interface{}) ExpectedQuery {
fmt.Printf("Expecting query: %s\n", "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
}