Proof of concept using DB.logger
This commit is contained in:
		
							parent
							
								
									5520530799
								
							
						
					
					
						commit
						475ba3db3e
					
				
							
								
								
									
										113
									
								
								expecter.go
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								expecter.go
									
									
									
									
									
								
							@ -1,22 +1,84 @@
 | 
			
		||||
package gorm
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"database/sql"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Recorder struct {
 | 
			
		||||
	stmt string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *Recorder) Print(args ...interface{}) {
 | 
			
		||||
	msgs := LogFormatter(args...)
 | 
			
		||||
	if len(msgs) >= 4 {
 | 
			
		||||
		if v, ok := msgs[3].(string); ok {
 | 
			
		||||
			r.stmt = v
 | 
			
		||||
		}
 | 
			
		||||
		// for i, msg := range msgs {
 | 
			
		||||
		// 	switch v := msg.(type) {
 | 
			
		||||
		// 	case string:
 | 
			
		||||
		// 	case []byte:
 | 
			
		||||
		// 		r.buf.Read([]byte(v))
 | 
			
		||||
		// 	default:
 | 
			
		||||
		// 		return
 | 
			
		||||
		// 	}
 | 
			
		||||
		// }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
	adapter  Adapter
 | 
			
		||||
	noop     NoopDB
 | 
			
		||||
	gorm     *DB
 | 
			
		||||
	recorder *Recorder
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NoopDB interface {
 | 
			
		||||
	GetStmts() []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type DefaultNoopDB struct{}
 | 
			
		||||
 | 
			
		||||
type NoopResult struct{}
 | 
			
		||||
 | 
			
		||||
func (r NoopResult) LastInsertId() (int64, error) {
 | 
			
		||||
	return 1, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r NoopResult) RowsAffected() (int64, error) {
 | 
			
		||||
	return 1, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewNoopDB() NoopDB {
 | 
			
		||||
	return &DefaultNoopDB{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *DefaultNoopDB) Exec(query string, args ...interface{}) (sql.Result, error) {
 | 
			
		||||
	return NoopResult{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *DefaultNoopDB) Prepare(query string) (*sql.Stmt, error) {
 | 
			
		||||
	return &sql.Stmt{}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *DefaultNoopDB) Query(query string, args ...interface{}) (*sql.Rows, error) {
 | 
			
		||||
	return nil, errors.New("noop")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *DefaultNoopDB) QueryRow(query string, args ...interface{}) *sql.Row {
 | 
			
		||||
	return &sql.Row{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *DefaultNoopDB) GetStmts() []string {
 | 
			
		||||
	return []string{"not", "implemented"}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewDefaultExpecter returns a Expecter powered by go-sqlmock
 | 
			
		||||
@ -27,7 +89,21 @@ func NewDefaultExpecter() (*DB, *Expecter, error) {
 | 
			
		||||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return gormDb, &Expecter{adapter: adapter}, nil
 | 
			
		||||
	recorder := &Recorder{}
 | 
			
		||||
	noop := &DefaultNoopDB{}
 | 
			
		||||
 | 
			
		||||
	gorm := &DB{
 | 
			
		||||
		db:        noop,
 | 
			
		||||
		logger:    recorder,
 | 
			
		||||
		logMode:   2,
 | 
			
		||||
		values:    map[string]interface{}{},
 | 
			
		||||
		callbacks: DefaultCallback,
 | 
			
		||||
		dialect:   newDialect("sqlmock", noop),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gorm.parent = gorm
 | 
			
		||||
 | 
			
		||||
	return gormDb, &Expecter{adapter: adapter, noop: noop, gorm: gorm, recorder: recorder}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewExpecter returns an Expecter for arbitrary adapters
 | 
			
		||||
@ -44,28 +120,13 @@ func NewExpecter(fn AdapterFactory, dialect string, args ...interface{}) (*DB, *
 | 
			
		||||
/* 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")
 | 
			
		||||
func (h *Expecter) First(out interface{}, where ...interface{}) ExpectedQuery {
 | 
			
		||||
	h.gorm.First(out, where)
 | 
			
		||||
	return h.adapter.ExpectQuery(h.recorder.stmt)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Find triggers a Query
 | 
			
		||||
func (h *Expecter) Find(model interface{}) ExpectedQuery {
 | 
			
		||||
func (h *Expecter) Find(out interface{}, where ...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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user