mattermost/server/public/pluginapi/store_test.go
Agniva De Sarker 89f5a0deec
MM-56402: Initialize replica conn pool on-demand (#26410)
Previously, we would setup both pools only when
GetMasterDB was called. This was inefficient and
would waste open connections if the replica wasn't used
at all.

We fix it to initialize the pools as they are called.

https://mattermost.atlassian.net/browse/MM-56402
```release-note
NONE
```

Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com>
2024-03-08 13:11:48 +05:30

102 lines
2.8 KiB
Go

package pluginapi_test
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/mattermost/mattermost/server/public/model"
"github.com/mattermost/mattermost/server/public/plugin/plugintest"
"github.com/mattermost/mattermost/server/public/pluginapi"
)
func TestStore(t *testing.T) {
t.Run("master db singleton", func(t *testing.T) {
api := &plugintest.API{}
driver := &plugintest.Driver{}
defer driver.AssertExpectations(t)
driver.On("Conn", true).Return("test", nil)
driver.On("ConnPing", "test").Return(nil)
driver.On("ConnClose", "test").Return(nil)
store := pluginapi.NewClient(api, driver).Store
db1, err := store.GetMasterDB()
require.NoError(t, err)
require.NotNil(t, db1)
db2, err := store.GetMasterDB()
require.NoError(t, err)
require.NotNil(t, db2)
require.Same(t, db1, db2)
require.NoError(t, store.Close())
})
t.Run("master db fallback", func(t *testing.T) {
config := &model.Config{
SqlSettings: model.SqlSettings{
DriverName: model.NewString("ramsql"),
DataSource: model.NewString("TestStore-master-db"),
ConnMaxLifetimeMilliseconds: model.NewInt(2),
},
}
driver := &plugintest.Driver{}
defer driver.AssertExpectations(t)
driver.On("Conn", true).Return("test", nil)
driver.On("ConnPing", "test").Return(nil)
driver.On("ConnClose", "test").Return(nil)
api := &plugintest.API{}
defer api.AssertExpectations(t)
store := pluginapi.NewClient(api, driver).Store
api.On("GetUnsanitizedConfig").Return(config)
masterDB, err := store.GetMasterDB()
require.NoError(t, err)
require.NotNil(t, masterDB)
// No replica is set up, should fallback to master
replicaDB, err := store.GetReplicaDB()
require.NoError(t, err)
require.Same(t, replicaDB, masterDB)
require.NoError(t, store.Close())
})
t.Run("replica db singleton", func(t *testing.T) {
config := &model.Config{
SqlSettings: model.SqlSettings{
DriverName: model.NewString("ramsql"),
DataSource: model.NewString("TestStore-master-db"),
DataSourceReplicas: []string{"TestStore-master-db"},
ConnMaxLifetimeMilliseconds: model.NewInt(2),
},
}
api := &plugintest.API{}
defer api.AssertExpectations(t)
api.On("GetUnsanitizedConfig").Return(config)
driver := &plugintest.Driver{}
defer driver.AssertExpectations(t)
driver.On("Conn", false).Return("test", nil)
driver.On("ConnPing", "test").Return(nil)
driver.On("ConnClose", "test").Return(nil)
store := pluginapi.NewClient(api, driver).Store
db1, err := store.GetReplicaDB()
require.NoError(t, err)
require.NotNil(t, db1)
db2, err := store.GetReplicaDB()
require.NoError(t, err)
require.NotNil(t, db2)
require.Same(t, db1, db2)
require.NoError(t, store.Close())
})
}