...

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

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

     1  package sqlmock
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  )
     7  
     8  func ExampleQueryMatcher() {
     9  	// configure to use case sensitive SQL query matcher
    10  	// instead of default regular expression matcher
    11  	db, mock, err := New(QueryMatcherOption(QueryMatcherEqual))
    12  	if err != nil {
    13  		fmt.Println("failed to open sqlmock database:", err)
    14  	}
    15  	defer db.Close()
    16  
    17  	rows := NewRows([]string{"id", "title"}).
    18  		AddRow(1, "one").
    19  		AddRow(2, "two")
    20  
    21  	mock.ExpectQuery("SELECT * FROM users").WillReturnRows(rows)
    22  
    23  	rs, err := db.Query("SELECT * FROM users")
    24  	if err != nil {
    25  		fmt.Println("failed to match expected query")
    26  		return
    27  	}
    28  	defer rs.Close()
    29  
    30  	for rs.Next() {
    31  		var id int
    32  		var title string
    33  		rs.Scan(&id, &title)
    34  		fmt.Println("scanned id:", id, "and title:", title)
    35  	}
    36  
    37  	if rs.Err() != nil {
    38  		fmt.Println("got rows error:", rs.Err())
    39  	}
    40  	// Output: scanned id: 1 and title: one
    41  	// scanned id: 2 and title: two
    42  }
    43  
    44  func TestQueryStringStripping(t *testing.T) {
    45  	assert := func(actual, expected string) {
    46  		if res := stripQuery(actual); res != expected {
    47  			t.Errorf("Expected '%s' to be '%s', but got '%s'", actual, expected, res)
    48  		}
    49  	}
    50  
    51  	assert(" SELECT 1", "SELECT 1")
    52  	assert("SELECT   1 FROM   d", "SELECT 1 FROM d")
    53  	assert(`
    54      SELECT c
    55      FROM D
    56  `, "SELECT c FROM D")
    57  	assert("UPDATE  (.+) SET  ", "UPDATE (.+) SET")
    58  }
    59  
    60  func TestQueryMatcherRegexp(t *testing.T) {
    61  	type testCase struct {
    62  		expected string
    63  		actual   string
    64  		err      error
    65  	}
    66  
    67  	cases := []testCase{
    68  		{"?\\l", "SEL", fmt.Errorf("error parsing regexp: missing argument to repetition operator: `?`")},
    69  		{"SELECT (.+) FROM users", "SELECT name, email FROM users WHERE id = ?", nil},
    70  		{"Select (.+) FROM users", "SELECT name, email FROM users WHERE id = ?", fmt.Errorf(`could not match actual sql: "SELECT name, email FROM users WHERE id = ?" with expected regexp "Select (.+) FROM users"`)},
    71  		{"SELECT (.+) FROM\nusers", "SELECT name, email\n FROM users\n WHERE id = ?", nil},
    72  	}
    73  
    74  	for i, c := range cases {
    75  		err := QueryMatcherRegexp.Match(c.expected, c.actual)
    76  		if err == nil && c.err != nil {
    77  			t.Errorf(`got no error, but expected "%v" at %d case`, c.err, i)
    78  			continue
    79  		}
    80  		if err != nil && c.err == nil {
    81  			t.Errorf(`got unexpected error "%v" at %d case`, err, i)
    82  			continue
    83  		}
    84  		if err == nil {
    85  			continue
    86  		}
    87  		if err.Error() != c.err.Error() {
    88  			t.Errorf(`expected error "%v", but got "%v" at %d case`, c.err, err, i)
    89  		}
    90  	}
    91  }
    92  
    93  func TestQueryMatcherEqual(t *testing.T) {
    94  	type testCase struct {
    95  		expected string
    96  		actual   string
    97  		err      error
    98  	}
    99  
   100  	cases := []testCase{
   101  		{"SELECT name, email FROM users WHERE id = ?", "SELECT name, email\n FROM users\n WHERE id = ?", nil},
   102  		{"SELECT", "Select", fmt.Errorf(`actual sql: "Select" does not equal to expected "SELECT"`)},
   103  		{"SELECT from users", "SELECT from table", fmt.Errorf(`actual sql: "SELECT from table" does not equal to expected "SELECT from users"`)},
   104  	}
   105  
   106  	for i, c := range cases {
   107  		err := QueryMatcherEqual.Match(c.expected, c.actual)
   108  		if err == nil && c.err != nil {
   109  			t.Errorf(`got no error, but expected "%v" at %d case`, c.err, i)
   110  			continue
   111  		}
   112  		if err != nil && c.err == nil {
   113  			t.Errorf(`got unexpected error "%v" at %d case`, err, i)
   114  			continue
   115  		}
   116  		if err == nil {
   117  			continue
   118  		}
   119  		if err.Error() != c.err.Error() {
   120  			t.Errorf(`expected error "%v", but got "%v" at %d case`, c.err, err, i)
   121  		}
   122  	}
   123  }
   124  

View as plain text