Skip to content

Commit

Permalink
add unit tests for Scan with Scanner interface
Browse files Browse the repository at this point in the history
  • Loading branch information
peano88 committed Jun 23, 2021
1 parent 2d0c603 commit b57e5ac
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 2 deletions.
2 changes: 1 addition & 1 deletion rows.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ func (rs *rowSets) Scan(dest ...interface{}) error {
destVal.Elem().Kind(), val.Kind(), string(r.defs[i].Name))
}
if err := scanner.Scan(val.Interface()); err != nil {
return fmt.Errorf("Scanning value error for column '%s': %w", r.defs[i].Name, err)
return fmt.Errorf("Scanning value error for column '%s': %w", string(r.defs[i].Name), err)
}

}
Expand Down
80 changes: 79 additions & 1 deletion rows_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package pgxmock

import (
"context"
"errors"
"fmt"
"testing"
)
Expand Down Expand Up @@ -93,7 +94,7 @@ func ExampleRows_expectToBeClosed() {
}

// func ExampleRows_customDriverValue() {
// mock, err := New()
// mock, err := NewConn()
// if err != nil {
// fmt.Println("failed to open pgxmock database:", err)
// }
Expand Down Expand Up @@ -355,6 +356,83 @@ func TestRowsScanError(t *testing.T) {
}
}

type testScanner struct {
Value int64
}

func (s *testScanner) Scan(src interface{}) error {
switch src := src.(type) {
case int64:
s.Value = src
return nil
default:
return errors.New("a dummy scan error")
}
}

func TestRowsScanWithScannerIface(t *testing.T) {
mock, err := NewConn()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer mock.Close(context.Background())

r := NewRows([]string{"col1"}).AddRow(int64(23))
mock.ExpectQuery("SELECT").WillReturnRows(r)

rs, err := mock.Query(context.Background(), "SELECT")
if err != nil {
t.Fatalf("unexpected error: %s", err)
}

var result testScanner
if !rs.Next() || rs.Err() != nil {
t.Fatal("unexpected error on first row read")
}
if rs.Scan(&result) != nil {
t.Fatal("unexpected error for scan")
}

if result.Value != int64(23) {
t.Fatalf("expected Value to be 23 but got: %d", result.Value)
}

}

func TestRowsScanErrorOnScannerIface(t *testing.T) {
mock, err := NewConn()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer mock.Close(context.Background())

r := NewRows([]string{"col1"}).AddRow("one").AddRow("two")
mock.ExpectQuery("SELECT").WillReturnRows(r)

rs, err := mock.Query(context.Background(), "SELECT")
if err != nil {
t.Fatalf("unexpected error: %s", err)
}

var one int64 // No scanner interface
var two testScanner // scanner error
if !rs.Next() || rs.Err() != nil {
t.Fatal("unexpected error on first row read")
}
if rs.Scan(&one) == nil {
t.Fatal("expected an error for first scan (no scanner interface), but got none")
}

if !rs.Next() || rs.Err() != nil {
t.Fatal("unexpected error on second row read")
}

err = rs.Scan(&two)
if err == nil {
t.Fatal("expected an error for second scan (scanner error), but got none")
}
}

func TestCSVRowParser(t *testing.T) {
t.Parallel()
rs := NewRows([]string{"col1", "col2"}).FromCSVString("a,NULL")
Expand Down

0 comments on commit b57e5ac

Please sign in to comment.