Files
mattermost/store/sqlstore/sqlx_wrapper_test.go
Agniva De Sarker 1f3e2d0c4f Added a sqlXPassThrough layer (#18238)
* Added a sqlXPassThrough layer

This layer embeds the original sqlx object and wraps some
key methods to avoid some boilerplate.

- Add timeout to all methods from the timeout in settings.
- Added trace functionality.
- Added auto-rebind capabilities so that each store method
doesn't need to call rebind every time.
- Added auto-lowering of query string to support NamedExec
for both MySQL and Postgres

All methods are not wrapped as all are likely not to be called
from our code. As and when they are called, support will be added.

```release-note
NONE
```

* fix lint issues

```release-note
NONE
```

* address review comments

```release-note
NONE
```

* incorporate suggestions

```release-note
NONE
```
2021-08-30 10:20:28 +05:30

84 lines
1.8 KiB
Go

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package sqlstore
import (
"context"
"strings"
"testing"
"github.com/mattermost/mattermost-server/v6/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSqlX(t *testing.T) {
t.Run("NamedQuery", func(t *testing.T) {
testDrivers := []string{
model.DatabaseDriverPostgres,
model.DatabaseDriverMysql,
}
for _, driver := range testDrivers {
settings := makeSqlSettings(driver)
*settings.QueryTimeout = 1
store := &SqlStore{
rrCounter: 0,
srCounter: 0,
settings: settings,
}
store.initConnection()
defer store.Close()
tx, err := store.GetMasterX().Beginx()
require.NoError(t, err)
var query string
if store.DriverName() == model.DatabaseDriverMysql {
query = `SELECT SLEEP(:Timeout);`
} else if store.DriverName() == model.DatabaseDriverPostgres {
query = `SELECT pg_sleep(:timeout);`
}
arg := struct{ Timeout int }{Timeout: 2}
_, err = tx.NamedQuery(query, arg)
require.Equal(t, context.DeadlineExceeded, err)
require.NoError(t, tx.Commit())
}
})
t.Run("NamedParse", func(t *testing.T) {
queries := []struct {
in string
out string
}{
{
in: `SELECT pg_sleep(:Timeout)`,
out: `SELECT pg_sleep(:timeout)`,
},
{
in: `SELECT u.Username FROM Bots
LIMIT
:Limit
OFFSET
:Offset`,
out: `SELECT u.Username FROM Bots
LIMIT
:limit
OFFSET
:offset`,
},
{
in: `UPDATE OAuthAccessData SET Token =:Token`,
out: `UPDATE OAuthAccessData SET Token =:token`,
},
}
for _, q := range queries {
out := namedParamRegex.ReplaceAllStringFunc(q.in, strings.ToLower)
assert.Equal(t, q.out, out)
}
})
}