diff --git a/expectations.go b/expectations.go index 415759e..1b3bc7c 100644 --- a/expectations.go +++ b/expectations.go @@ -153,7 +153,7 @@ func (e *ExpectedQuery) WillDelayFor(duration time.Duration) *ExpectedQuery { // String returns string representation func (e *ExpectedQuery) String() string { - msg := "ExpectedQuery => expecting Query or QueryRow which:" + msg := "ExpectedQuery => expecting Query, QueryContext or QueryRow which:" msg += "\n - matches sql: '" + e.sqlRegex.String() + "'" if len(e.args) == 0 { @@ -208,7 +208,7 @@ func (e *ExpectedExec) WillDelayFor(duration time.Duration) *ExpectedExec { // String returns string representation func (e *ExpectedExec) String() string { - msg := "ExpectedExec => expecting Exec which:" + msg := "ExpectedExec => expecting Exec or ExecContext which:" msg += "\n - matches sql: '" + e.sqlRegex.String() + "'" if len(e.args) == 0 { diff --git a/result_test.go b/result_test.go index 08d47c9..e0214c5 100644 --- a/result_test.go +++ b/result_test.go @@ -23,7 +23,7 @@ func ExampleNewResult() { result := NewResult(lastInsertID, affected) mock.ExpectExec("^INSERT (.+)").WillReturnResult(result) fmt.Println(mock.ExpectationsWereMet()) - // Output: there is a remaining expectation which was not matched: ExpectedExec => expecting Exec which: + // Output: there is a remaining expectation which was not matched: ExpectedExec => expecting Exec or ExecContext which: // - matches sql: '^INSERT (.+)' // - is without arguments // - should return Result having: diff --git a/rows.go b/rows.go index 39f9f83..836f49b 100644 --- a/rows.go +++ b/rows.go @@ -49,6 +49,10 @@ func (rs *rowSets) Next(dest []driver.Value) error { // transforms to debuggable printable string func (rs *rowSets) String() string { + if rs.empty() { + return "with empty rows" + } + msg := "should return rows:\n" if len(rs.sets) == 1 { for n, row := range rs.sets[0].rows { @@ -65,6 +69,15 @@ func (rs *rowSets) String() string { return strings.TrimSpace(msg) } +func (rs *rowSets) empty() bool { + for _, set := range rs.sets { + if len(set.rows) > 0 { + return false + } + } + return true +} + // Rows is a mocked collection of rows to // return for Query result type Rows struct { diff --git a/rows_test.go b/rows_test.go index 56e834e..a508a0b 100644 --- a/rows_test.go +++ b/rows_test.go @@ -263,3 +263,23 @@ func TestWrongNumberOfValues(t *testing.T) { // shouldn't reach here t.Error("expected panic from query") } + +func TestEmptyRowSets(t *testing.T) { + rs1 := NewRows([]string{"a"}).AddRow("a") + rs2 := NewRows([]string{"b"}) + rs3 := NewRows([]string{"c"}) + + set1 := &rowSets{sets: []*Rows{rs1, rs2}} + set2 := &rowSets{sets: []*Rows{rs3, rs2}} + set3 := &rowSets{sets: []*Rows{rs2}} + + if set1.empty() { + t.Fatalf("expected rowset 1, not to be empty, but it was") + } + if !set2.empty() { + t.Fatalf("expected rowset 2, to be empty, but it was not") + } + if !set3.empty() { + t.Fatalf("expected rowset 3, to be empty, but it was not") + } +} diff --git a/sqlmock.go b/sqlmock.go index b906a3f..e82a2a3 100644 --- a/sqlmock.go +++ b/sqlmock.go @@ -247,7 +247,7 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) { break } next.Unlock() - return nil, fmt.Errorf("call to exec query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) + 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 := exec.attemptMatch(query, args); err == nil { @@ -258,7 +258,7 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) { next.Unlock() } if expected == nil { - msg := "call to exec '%s' query with args %+v was not expected" + msg := "call to ExecQuery '%s' with args %+v was not expected" if fulfilled == len(c.expected) { msg = "all expectations were already fulfilled, " + msg } @@ -267,11 +267,11 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) { defer expected.Unlock() if !expected.queryMatches(query) { - return nil, fmt.Errorf("exec query '%s', does not match regex '%s'", query, expected.sqlRegex.String()) + return nil, fmt.Errorf("ExecQuery '%s', does not match regex '%s'", query, expected.sqlRegex.String()) } if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("exec query '%s', arguments do not match: %s", query, err) + return nil, fmt.Errorf("ExecQuery '%s', arguments do not match: %s", query, err) } expected.triggered = true @@ -280,7 +280,7 @@ func (c *sqlmock) exec(query string, args []namedValue) (*ExpectedExec, error) { } if expected.result == nil { - return nil, fmt.Errorf("exec query '%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 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 @@ -337,7 +337,7 @@ func (c *sqlmock) prepare(query string) (*ExpectedPrepare, error) { } defer expected.Unlock() if !expected.sqlRegex.MatchString(query) { - return nil, fmt.Errorf("query '%s', does not match regex [%s]", query, expected.sqlRegex.String()) + return nil, fmt.Errorf("Prepare query string '%s', does not match regex [%s]", query, expected.sqlRegex.String()) } expected.triggered = true @@ -394,7 +394,7 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) break } next.Unlock() - return nil, fmt.Errorf("call to query '%s' with args %+v, was not expected, next expectation is: %s", query, args, next) + 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 := qr.attemptMatch(query, args); err == nil { @@ -406,7 +406,7 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) } if expected == nil { - msg := "call to query '%s' with args %+v was not expected" + msg := "call to Query '%s' with args %+v was not expected" if fulfilled == len(c.expected) { msg = "all expectations were already fulfilled, " + msg } @@ -416,11 +416,11 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, error) defer expected.Unlock() if !expected.queryMatches(query) { - return nil, fmt.Errorf("query '%s', does not match regex [%s]", query, expected.sqlRegex.String()) + return nil, fmt.Errorf("Query '%s', does not match regex [%s]", query, expected.sqlRegex.String()) } if err := expected.argsMatches(args); err != nil { - return nil, fmt.Errorf("exec query '%s', arguments do not match: %s", query, err) + return nil, fmt.Errorf("Query '%s', arguments do not match: %s", query, err) } expected.triggered = true @@ -429,7 +429,7 @@ func (c *sqlmock) query(query string, args []namedValue) (*ExpectedQuery, 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 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 } @@ -473,11 +473,11 @@ func (c *sqlmock) Commit() error { next.Unlock() if c.ordered { - return fmt.Errorf("call to commit transaction, was not expected, next expectation is: %s", next) + return fmt.Errorf("call to Commit transaction, was not expected, next expectation is: %s", next) } } if expected == nil { - msg := "call to commit transaction was not expected" + msg := "call to Commit transaction was not expected" if fulfilled == len(c.expected) { msg = "all expectations were already fulfilled, " + msg } @@ -508,11 +508,11 @@ func (c *sqlmock) Rollback() error { next.Unlock() if c.ordered { - return fmt.Errorf("call to rollback transaction, was not expected, next expectation is: %s", next) + return fmt.Errorf("call to Rollback transaction, was not expected, next expectation is: %s", next) } } if expected == nil { - msg := "call to rollback transaction was not expected" + msg := "call to Rollback transaction was not expected" if fulfilled == len(c.expected) { msg = "all expectations were already fulfilled, " + msg }