From 7c97a0ddd108fcb218d3b3c5615c407e1e42b29a Mon Sep 17 00:00:00 2001 From: Nikita Koryabkin Date: Tue, 3 Dec 2019 07:35:47 +0300 Subject: [PATCH] fix go version less 1.8 --- sqlmock.go | 164 ----------------------------------------- sqlmock_before_go18.go | 109 +++++++++++++++++++++++++++ sqlmock_go18.go | 164 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 273 insertions(+), 164 deletions(-) diff --git a/sqlmock.go b/sqlmock.go index bacc750..90f789b 100644 --- a/sqlmock.go +++ b/sqlmock.go @@ -265,88 +265,6 @@ func (c *sqlmock) ExpectBegin() *ExpectedBegin { return e } -// Exec meets http://golang.org/pkg/database/sql/driver/#Execer -func (c *sqlmock) Exec(query string, args []driver.Value) (driver.Result, error) { - namedArgs := make([]driver.NamedValue, len(args)) - for i, v := range args { - namedArgs[i] = driver.NamedValue{ - Ordinal: i + 1, - Value: v, - } - } - - ex, err := c.exec(query, namedArgs) - if ex != nil { - time.Sleep(ex.delay) - } - if err != nil { - return nil, err - } - - return ex.result, nil -} - -func (c *sqlmock) exec(query string, args []driver.NamedValue) (*ExpectedExec, error) { - var expected *ExpectedExec - var fulfilled int - var ok bool - for _, next := range c.expected { - next.Lock() - if next.fulfilled() { - next.Unlock() - fulfilled++ - continue - } - - if c.ordered { - if expected, ok = next.(*ExpectedExec); ok { - break - } - next.Unlock() - return nil, fmt.Errorf("call to ExecQuery '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) - } - if exec, ok := next.(*ExpectedExec); ok { - if err := c.queryMatcher.Match(exec.expectSQL, query); err != nil { - next.Unlock() - continue - } - - if err := exec.attemptArgMatch(args); err == nil { - expected = exec - break - } - } - next.Unlock() - } - if expected == nil { - msg := "call to ExecQuery '%s' with args %+v was not expected" - if fulfilled == len(c.expected) { - msg = "all expectations were already fulfilled, " + msg - } - return nil, fmt.Errorf(msg, query, args) - } - defer expected.Unlock() - - if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil { - return nil, fmt.Errorf("ExecQuery: %v", err) - } - - if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("ExecQuery '%s', arguments do not match: %s", query, err) - } - - expected.triggered = true - if expected.err != nil { - return expected, expected.err // mocked to return error - } - - if expected.result == nil { - return nil, fmt.Errorf("ExecQuery '%s' with args %+v, must return a database/sql/driver.Result, but it was not set for expectation %T as %+v", query, args, expected, expected) - } - - return expected, nil -} - func (c *sqlmock) ExpectExec(expectedSQL string) *ExpectedExec { e := &ExpectedExec{} e.expectSQL = expectedSQL @@ -421,88 +339,6 @@ func (c *sqlmock) ExpectPrepare(expectedSQL string) *ExpectedPrepare { return e } -// Query meets http://golang.org/pkg/database/sql/driver/#Queryer -func (c *sqlmock) Query(query string, args []driver.Value) (driver.Rows, error) { - namedArgs := make([]driver.NamedValue, len(args)) - for i, v := range args { - namedArgs[i] = driver.NamedValue{ - Ordinal: i + 1, - Value: v, - } - } - - ex, err := c.query(query, namedArgs) - if ex != nil { - time.Sleep(ex.delay) - } - if err != nil { - return nil, err - } - - return ex.rows, nil -} - -func (c *sqlmock) query(query string, args []driver.NamedValue) (*ExpectedQuery, error) { - var expected *ExpectedQuery - var fulfilled int - var ok bool - for _, next := range c.expected { - next.Lock() - if next.fulfilled() { - next.Unlock() - fulfilled++ - continue - } - - if c.ordered { - if expected, ok = next.(*ExpectedQuery); ok { - break - } - next.Unlock() - return nil, fmt.Errorf("call to Query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) - } - if qr, ok := next.(*ExpectedQuery); ok { - if err := c.queryMatcher.Match(qr.expectSQL, query); err != nil { - next.Unlock() - continue - } - if err := qr.attemptArgMatch(args); err == nil { - expected = qr - break - } - } - next.Unlock() - } - - if expected == nil { - msg := "call to Query '%s' with args %+v was not expected" - if fulfilled == len(c.expected) { - msg = "all expectations were already fulfilled, " + msg - } - return nil, fmt.Errorf(msg, query, args) - } - - defer expected.Unlock() - - if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil { - return nil, fmt.Errorf("Query: %v", err) - } - - if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("Query '%s', arguments do not match: %s", query, err) - } - - expected.triggered = true - if expected.err != nil { - return expected, expected.err // mocked to return error - } - - if expected.rows == nil { - return nil, fmt.Errorf("Query '%s' with args %+v, must return a database/sql/driver.Rows, but it was not set for expectation %T as %+v", query, args, expected, expected) - } - return expected, nil -} - func (c *sqlmock) ExpectQuery(expectedSQL string) *ExpectedQuery { e := &ExpectedQuery{} e.expectSQL = expectedSQL diff --git a/sqlmock_before_go18.go b/sqlmock_before_go18.go index 36ec915..35433b5 100644 --- a/sqlmock_before_go18.go +++ b/sqlmock_before_go18.go @@ -4,11 +4,120 @@ package sqlmock import "log" +type namedValue struct { + Name string + Ordinal int + Value driver.Value +} + func (c *sqlmock) ExpectPing() *ExpectedPing { log.Println("ExpectPing has no effect on Go 1.7 or below") return &ExpectedPing{} } +// Query meets http://golang.org/pkg/database/sql/driver/#Queryer +func (c *sqlmock) Query(query string, args []driver.Value) (driver.Rows, error) { + namedArgs := make([]namedValue, len(args)) + for i, v := range args { + namedArgs[i] = namedValue{ + Ordinal: i + 1, + Value: v, + } + } + + ex, err := c.query(query, namedArgs) + if ex != nil { + time.Sleep(ex.delay) + } + if err != nil { + return nil, err + } + + return ex.rows, nil +} + +func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) { + var expected *ExpectedQuery + var fulfilled int + var ok bool + for _, next := range c.expected { + next.Lock() + if next.fulfilled() { + next.Unlock() + fulfilled++ + continue + } + + if c.ordered { + if expected, ok = next.(*ExpectedQuery); ok { + break + } + next.Unlock() + return nil, fmt.Errorf("call to Query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) + } + if qr, ok := next.(*ExpectedQuery); ok { + if err := c.queryMatcher.Match(qr.expectSQL, query); err != nil { + next.Unlock() + continue + } + if err := qr.attemptArgMatch(args); err == nil { + expected = qr + break + } + } + next.Unlock() + } + + if expected == nil { + msg := "call to Query '%s' with args %+v was not expected" + if fulfilled == len(c.expected) { + msg = "all expectations were already fulfilled, " + msg + } + return nil, fmt.Errorf(msg, query, args) + } + + defer expected.Unlock() + + if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil { + return nil, fmt.Errorf("Query: %v", err) + } + + if err := expected.argsMatches(args); err != nil { + return nil, fmt.Errorf("Query '%s', arguments do not match: %s", query, err) + } + + expected.triggered = true + if expected.err != nil { + return expected, expected.err // mocked to return error + } + + if expected.rows == nil { + return nil, fmt.Errorf("Query '%s' with args %+v, must return a database/sql/driver.Rows, but it was not set for expectation %T as %+v", query, args, expected, expected) + } + return expected, nil +} + +// Exec meets http://golang.org/pkg/database/sql/driver/#Execer +func (c *sqlmock) Exec(query string, args []driver.Value) (driver.Result, error) { + namedArgs := make([]namedValue, len(args)) + for i, v := range args { + namedArgs[i] = namedValue{ + Ordinal: i + 1, + Value: v, + } + } + + ex, err := c.exec(query, namedArgs) + if ex != nil { + time.Sleep(ex.delay) + } + if err != nil { + return nil, err + } + + return ex.result, nil +} + func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) { var expected *ExpectedExec var fulfilled int diff --git a/sqlmock_go18.go b/sqlmock_go18.go index 00708d3..0fee0dd 100644 --- a/sqlmock_go18.go +++ b/sqlmock_go18.go @@ -160,4 +160,168 @@ func (c *sqlmock) ExpectPing() *ExpectedPing { return e } +// Query meets http://golang.org/pkg/database/sql/driver/#Queryer +func (c *sqlmock) Query(query string, args []driver.Value) (driver.Rows, error) { + namedArgs := make([]driver.NamedValue, len(args)) + for i, v := range args { + namedArgs[i] = driver.NamedValue{ + Ordinal: i + 1, + Value: v, + } + } + + ex, err := c.query(query, namedArgs) + if ex != nil { + time.Sleep(ex.delay) + } + if err != nil { + return nil, err + } + + return ex.rows, nil +} + +func (c *sqlmock) query(query string, args []driver.NamedValue) (*ExpectedQuery, error) { + var expected *ExpectedQuery + var fulfilled int + var ok bool + for _, next := range c.expected { + next.Lock() + if next.fulfilled() { + next.Unlock() + fulfilled++ + continue + } + + if c.ordered { + if expected, ok = next.(*ExpectedQuery); ok { + break + } + next.Unlock() + return nil, fmt.Errorf("call to Query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) + } + if qr, ok := next.(*ExpectedQuery); ok { + if err := c.queryMatcher.Match(qr.expectSQL, query); err != nil { + next.Unlock() + continue + } + if err := qr.attemptArgMatch(args); err == nil { + expected = qr + break + } + } + next.Unlock() + } + + if expected == nil { + msg := "call to Query '%s' with args %+v was not expected" + if fulfilled == len(c.expected) { + msg = "all expectations were already fulfilled, " + msg + } + return nil, fmt.Errorf(msg, query, args) + } + + defer expected.Unlock() + + if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil { + return nil, fmt.Errorf("Query: %v", err) + } + + if err := expected.argsMatches(args); err != nil { + return nil, fmt.Errorf("Query '%s', arguments do not match: %s", query, err) + } + + expected.triggered = true + if expected.err != nil { + return expected, expected.err // mocked to return error + } + + if expected.rows == nil { + return nil, fmt.Errorf("Query '%s' with args %+v, must return a database/sql/driver.Rows, but it was not set for expectation %T as %+v", query, args, expected, expected) + } + return expected, nil +} + +// Exec meets http://golang.org/pkg/database/sql/driver/#Execer +func (c *sqlmock) Exec(query string, args []driver.Value) (driver.Result, error) { + namedArgs := make([]driver.NamedValue, len(args)) + for i, v := range args { + namedArgs[i] = driver.NamedValue{ + Ordinal: i + 1, + Value: v, + } + } + + ex, err := c.exec(query, namedArgs) + if ex != nil { + time.Sleep(ex.delay) + } + if err != nil { + return nil, err + } + + return ex.result, nil +} + +func (c *sqlmock) exec(query string, args []driver.NamedValue) (*ExpectedExec, error) { + var expected *ExpectedExec + var fulfilled int + var ok bool + for _, next := range c.expected { + next.Lock() + if next.fulfilled() { + next.Unlock() + fulfilled++ + continue + } + + if c.ordered { + if expected, ok = next.(*ExpectedExec); ok { + break + } + next.Unlock() + return nil, fmt.Errorf("call to ExecQuery '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) + } + if exec, ok := next.(*ExpectedExec); ok { + if err := c.queryMatcher.Match(exec.expectSQL, query); err != nil { + next.Unlock() + continue + } + + if err := exec.attemptArgMatch(args); err == nil { + expected = exec + break + } + } + next.Unlock() + } + if expected == nil { + msg := "call to ExecQuery '%s' with args %+v was not expected" + if fulfilled == len(c.expected) { + msg = "all expectations were already fulfilled, " + msg + } + return nil, fmt.Errorf(msg, query, args) + } + defer expected.Unlock() + + if err := c.queryMatcher.Match(expected.expectSQL, query); err != nil { + return nil, fmt.Errorf("ExecQuery: %v", err) + } + + if err := expected.argsMatches(args); err != nil { + return nil, fmt.Errorf("ExecQuery '%s', arguments do not match: %s", query, err) + } + + expected.triggered = true + if expected.err != nil { + return expected, expected.err // mocked to return error + } + + if expected.result == nil { + return nil, fmt.Errorf("ExecQuery '%s' with args %+v, must return a database/sql/driver.Result, but it was not set for expectation %T as %+v", query, args, expected, expected) + } + + return expected, nil +} + // @TODO maybe add ExpectedBegin.WithOptions(driver.TxOptions)