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
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
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
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
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