69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
package sqlmock
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var re = regexp.MustCompile("\\s+")
|
|
|
|
// strip out new lines and trim spaces
|
|
func stripQuery(q string) (s string) {
|
|
return strings.TrimSpace(re.ReplaceAllString(q, " "))
|
|
}
|
|
|
|
// QueryMatcher is an SQL query string matcher interface,
|
|
// which can be used to customize validation of SQL query strings.
|
|
// As an example, external library could be used to build
|
|
// and validate SQL ast, columns selected.
|
|
//
|
|
// sqlmock can be customized to implement a different QueryMatcher
|
|
// configured through an option when sqlmock.New or sqlmock.NewWithDSN
|
|
// is called, default QueryMatcher is QueryMatcherRegexp.
|
|
type QueryMatcher interface {
|
|
|
|
// Match expected SQL query string without whitespace to
|
|
// actual SQL.
|
|
Match(expectedSQL, actualSQL string) error
|
|
}
|
|
|
|
// QueryMatcherFunc type is an adapter to allow the use of
|
|
// ordinary functions as QueryMatcher. If f is a function
|
|
// with the appropriate signature, QueryMatcherFunc(f) is a
|
|
// QueryMatcher that calls f.
|
|
type QueryMatcherFunc func(expectedSQL, actualSQL string) error
|
|
|
|
// Match implements the QueryMatcher
|
|
func (f QueryMatcherFunc) Match(expectedSQL, actualSQL string) error {
|
|
return f(expectedSQL, actualSQL)
|
|
}
|
|
|
|
// QueryMatcherRegexp is the default SQL query matcher
|
|
// used by sqlmock. It parses expectedSQL to a regular
|
|
// expression and attempts to match actualSQL.
|
|
var QueryMatcherRegexp QueryMatcher = QueryMatcherFunc(func(expectedSQL, actualSQL string) error {
|
|
expect := stripQuery(expectedSQL)
|
|
actual := stripQuery(actualSQL)
|
|
re, err := regexp.Compile(expect)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !re.MatchString(actual) {
|
|
return fmt.Errorf(`could not match actual sql: "%s" with expected regexp "%s"`, actual, re.String())
|
|
}
|
|
return nil
|
|
})
|
|
|
|
// QueryMatcherEqual is the SQL query matcher
|
|
// which simply tries a case sensitive match of
|
|
// expected and actual SQL strings without whitespace.
|
|
var QueryMatcherEqual QueryMatcher = QueryMatcherFunc(func(expectedSQL, actualSQL string) error {
|
|
expect := stripQuery(expectedSQL)
|
|
actual := stripQuery(actualSQL)
|
|
if actual != expect {
|
|
return fmt.Errorf(`actual sql: "%s" does not equal to expected "%s"`, actual, expect)
|
|
}
|
|
return nil
|
|
})
|