...

Source file src/github.com/DATA-DOG/go-sqlmock/driver_test.go

Documentation: github.com/DATA-DOG/go-sqlmock

     1  package sqlmock
     2  
     3  import (
     4  	"database/sql/driver"
     5  	"errors"
     6  	"fmt"
     7  	"testing"
     8  )
     9  
    10  type void struct{}
    11  
    12  func (void) Print(...interface{}) {}
    13  
    14  type converter struct{}
    15  
    16  func (c *converter) ConvertValue(v interface{}) (driver.Value, error) {
    17  	return nil, errors.New("converter disabled")
    18  }
    19  
    20  func ExampleNew() {
    21  	db, mock, err := New()
    22  	if err != nil {
    23  		fmt.Println("expected no error, but got:", err)
    24  		return
    25  	}
    26  	defer db.Close()
    27  	// now we can expect operations performed on db
    28  	mock.ExpectBegin().WillReturnError(fmt.Errorf("an error will occur on db.Begin() call"))
    29  }
    30  
    31  func TestShouldOpenConnectionIssue15(t *testing.T) {
    32  	db, mock, err := New()
    33  	if err != nil {
    34  		t.Errorf("expected no error, but got: %s", err)
    35  	}
    36  	if len(pool.conns) != 1 {
    37  		t.Errorf("expected 1 connection in pool, but there is: %d", len(pool.conns))
    38  	}
    39  
    40  	smock, _ := mock.(*sqlmock)
    41  	if smock.opened != 1 {
    42  		t.Errorf("expected 1 connection on mock to be opened, but there is: %d", smock.opened)
    43  	}
    44  
    45  	// defer so the rows gets closed first
    46  	defer func() {
    47  		if smock.opened != 0 {
    48  			t.Errorf("expected no connections on mock to be opened, but there is: %d", smock.opened)
    49  		}
    50  	}()
    51  
    52  	mock.ExpectQuery("SELECT").WillReturnRows(NewRows([]string{"one", "two"}).AddRow("val1", "val2"))
    53  	rows, err := db.Query("SELECT")
    54  	if err != nil {
    55  		t.Errorf("unexpected error: %s", err)
    56  	}
    57  	defer rows.Close()
    58  
    59  	mock.ExpectExec("UPDATE").WillReturnResult(NewResult(1, 1))
    60  	if _, err = db.Exec("UPDATE"); err != nil {
    61  		t.Errorf("unexpected error: %s", err)
    62  	}
    63  
    64  	// now there should be two connections open
    65  	if smock.opened != 2 {
    66  		t.Errorf("expected 2 connection on mock to be opened, but there is: %d", smock.opened)
    67  	}
    68  
    69  	mock.ExpectClose()
    70  	if err = db.Close(); err != nil {
    71  		t.Errorf("expected no error on close, but got: %s", err)
    72  	}
    73  
    74  	// one is still reserved for rows
    75  	if smock.opened != 1 {
    76  		t.Errorf("expected 1 connection on mock to be still reserved for rows, but there is: %d", smock.opened)
    77  	}
    78  }
    79  
    80  func TestTwoOpenConnectionsOnTheSameDSN(t *testing.T) {
    81  	db, mock, err := New()
    82  	if err != nil {
    83  		t.Errorf("expected no error, but got: %s", err)
    84  	}
    85  	db2, mock2, err := New()
    86  	if err != nil {
    87  		t.Errorf("expected no error, but got: %s", err)
    88  	}
    89  	if len(pool.conns) != 2 {
    90  		t.Errorf("expected 2 connection in pool, but there is: %d", len(pool.conns))
    91  	}
    92  
    93  	if db == db2 {
    94  		t.Errorf("expected not the same database instance, but it is the same")
    95  	}
    96  	if mock == mock2 {
    97  		t.Errorf("expected not the same mock instance, but it is the same")
    98  	}
    99  }
   100  
   101  func TestWithOptions(t *testing.T) {
   102  	c := &converter{}
   103  	_, mock, err := New(ValueConverterOption(c))
   104  	if err != nil {
   105  		t.Errorf("expected no error, but got: %s", err)
   106  	}
   107  	smock, _ := mock.(*sqlmock)
   108  	if smock.converter.(*converter) != c {
   109  		t.Errorf("expected a custom converter to be set")
   110  	}
   111  }
   112  
   113  func TestWrongDSN(t *testing.T) {
   114  	t.Parallel()
   115  	db, _, _ := New()
   116  	defer db.Close()
   117  	if _, err := db.Driver().Open("wrong_dsn"); err == nil {
   118  		t.Error("expected error on Open")
   119  	}
   120  }
   121  
   122  func TestNewDSN(t *testing.T) {
   123  	if _, _, err := NewWithDSN("sqlmock_db_99"); err != nil {
   124  		t.Errorf("expected no error on NewWithDSN, but got: %s", err)
   125  	}
   126  }
   127  
   128  func TestDuplicateNewDSN(t *testing.T) {
   129  	if _, _, err := NewWithDSN("sqlmock_db_1"); err == nil {
   130  		t.Error("expected error on NewWithDSN")
   131  	}
   132  }
   133  

View as plain text