mirror of
https://github.com/gofiber/storage.git
synced 2025-10-05 16:48:25 +08:00
chore: use testcontainers-go in mysql store
This commit is contained in:
@@ -1,44 +1,75 @@
|
||||
package mysql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"os"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/testcontainers/testcontainers-go/modules/mysql"
|
||||
)
|
||||
|
||||
var testStore = New(Config{
|
||||
Database: os.Getenv("MYSQL_DATABASE"),
|
||||
Username: os.Getenv("MYSQL_USERNAME"),
|
||||
Password: os.Getenv("MYSQL_PASSWORD"),
|
||||
Reset: true,
|
||||
})
|
||||
const (
|
||||
// mysqlImage is the default image used for running MySQL in tests.
|
||||
mysqlImage = "docker.io/mysql:9"
|
||||
mysqlImageEnvVar string = "TEST_MYSQL_IMAGE"
|
||||
mysqlUser string = "password"
|
||||
mysqlPass string = "username"
|
||||
mysqlDatabase string = "fiber"
|
||||
)
|
||||
|
||||
func newTestStore(t testing.TB) (*Storage, error) {
|
||||
t.Helper()
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
c := mustStartMySQL(t)
|
||||
|
||||
conn, err := c.ConnectionString(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return New(Config{
|
||||
ConnectionURI: conn,
|
||||
Reset: true,
|
||||
}), nil
|
||||
}
|
||||
|
||||
func mustStartMySQL(t testing.TB) *mysql.MySQLContainer {
|
||||
img := mysqlImage
|
||||
if imgFromEnv := os.Getenv(mysqlImageEnvVar); imgFromEnv != "" {
|
||||
img = imgFromEnv
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
c, err := mysql.Run(ctx, img,
|
||||
mysql.WithPassword(mysqlPass),
|
||||
mysql.WithUsername(mysqlUser),
|
||||
mysql.WithDatabase(mysqlDatabase),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
func Test_MYSQL_New(t *testing.T) {
|
||||
newConfigStore := New(Config{
|
||||
Database: os.Getenv("MYSQL_DATABASE"),
|
||||
Username: os.Getenv("MYSQL_USERNAME"),
|
||||
Password: os.Getenv("MYSQL_PASSWORD"),
|
||||
Reset: true,
|
||||
})
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.True(t, newConfigStore.db != nil)
|
||||
require.NoError(t, newConfigStore.Close())
|
||||
require.True(t, testStore.db != nil)
|
||||
require.NoError(t, testStore.Close())
|
||||
|
||||
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", os.Getenv("MYSQL_USERNAME"), os.Getenv("MYSQL_PASSWORD"), "127.0.0.1", 3306, os.Getenv("MYSQL_DATABASE"))
|
||||
newConfigStore = New(Config{
|
||||
ConnectionURI: dsn,
|
||||
Reset: true,
|
||||
})
|
||||
c := mustStartMySQL(t)
|
||||
|
||||
require.True(t, newConfigStore.db != nil)
|
||||
newConfigStore.Close()
|
||||
dsn, err := c.ConnectionString(context.Background())
|
||||
require.NoError(t, err)
|
||||
|
||||
db, _ := sql.Open("mysql", dsn)
|
||||
newConfigStore = New(Config{
|
||||
newConfigStore := New(Config{
|
||||
Db: db,
|
||||
Reset: true,
|
||||
})
|
||||
@@ -53,7 +84,10 @@ func Test_MYSQL_Set(t *testing.T) {
|
||||
val = []byte("doe")
|
||||
)
|
||||
|
||||
err := testStore.Set(key, val, 0)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set(key, val, 0)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -63,7 +97,10 @@ func Test_MYSQL_Set_Override(t *testing.T) {
|
||||
val = []byte("doe")
|
||||
)
|
||||
|
||||
err := testStore.Set(key, val, 0)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set(key, val, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set(key, val, 0)
|
||||
@@ -76,7 +113,10 @@ func Test_MYSQL_Get(t *testing.T) {
|
||||
val = []byte("doe")
|
||||
)
|
||||
|
||||
err := testStore.Set(key, val, 0)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set(key, val, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
result, err := testStore.Get(key)
|
||||
@@ -91,7 +131,10 @@ func Test_MYSQL_Set_Expiration(t *testing.T) {
|
||||
exp = 1 * time.Second
|
||||
)
|
||||
|
||||
err := testStore.Set(key, val, exp)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set(key, val, exp)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(1100 * time.Millisecond)
|
||||
@@ -100,12 +143,18 @@ func Test_MYSQL_Set_Expiration(t *testing.T) {
|
||||
func Test_MYSQL_Get_Expired(t *testing.T) {
|
||||
key := "john"
|
||||
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
result, err := testStore.Get(key)
|
||||
require.NoError(t, err)
|
||||
require.Zero(t, len(result))
|
||||
}
|
||||
|
||||
func Test_MYSQL_Get_NotExist(t *testing.T) {
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
result, err := testStore.Get("notexist")
|
||||
require.NoError(t, err)
|
||||
require.Zero(t, len(result))
|
||||
@@ -117,7 +166,10 @@ func Test_MYSQL_Delete(t *testing.T) {
|
||||
val = []byte("doe")
|
||||
)
|
||||
|
||||
err := testStore.Set(key, val, 0)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set(key, val, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Delete(key)
|
||||
@@ -131,7 +183,10 @@ func Test_MYSQL_Delete(t *testing.T) {
|
||||
func Test_MYSQL_Reset(t *testing.T) {
|
||||
val := []byte("doe")
|
||||
|
||||
err := testStore.Set("john1", val, 0)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set("john1", val, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set("john2", val, 0)
|
||||
@@ -153,7 +208,10 @@ func Test_MYSQL_GC(t *testing.T) {
|
||||
testVal := []byte("doe")
|
||||
|
||||
// This key should expire
|
||||
err := testStore.Set("john", testVal, time.Nanosecond)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set("john", testVal, time.Nanosecond)
|
||||
require.NoError(t, err)
|
||||
|
||||
testStore.gc(time.Now())
|
||||
@@ -174,7 +232,10 @@ func Test_MYSQL_GC(t *testing.T) {
|
||||
func Test_MYSQL_Non_UTF8(t *testing.T) {
|
||||
val := []byte("0xF5")
|
||||
|
||||
err := testStore.Set("0xF6", val, 0)
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = testStore.Set("0xF6", val, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
result, err := testStore.Get("0xF6")
|
||||
@@ -183,18 +244,26 @@ func Test_MYSQL_Non_UTF8(t *testing.T) {
|
||||
}
|
||||
|
||||
func Test_MYSQL_Close(t *testing.T) {
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Nil(t, testStore.Close())
|
||||
}
|
||||
|
||||
func Test_MYSQL_Conn(t *testing.T) {
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.True(t, testStore.Conn() != nil)
|
||||
}
|
||||
|
||||
func Benchmark_MYSQL_Set(b *testing.B) {
|
||||
testStore, err := newTestStore(b)
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
|
||||
var err error
|
||||
for i := 0; i < b.N; i++ {
|
||||
err = testStore.Set("john", []byte("doe"), 0)
|
||||
}
|
||||
@@ -203,7 +272,10 @@ func Benchmark_MYSQL_Set(b *testing.B) {
|
||||
}
|
||||
|
||||
func Benchmark_MYSQL_Get(b *testing.B) {
|
||||
err := testStore.Set("john", []byte("doe"), 0)
|
||||
testStore, err := newTestStore(b)
|
||||
require.NoError(b, err)
|
||||
|
||||
err = testStore.Set("john", []byte("doe"), 0)
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ReportAllocs()
|
||||
@@ -217,10 +289,12 @@ func Benchmark_MYSQL_Get(b *testing.B) {
|
||||
}
|
||||
|
||||
func Benchmark_MYSQL_SetAndDelete(b *testing.B) {
|
||||
testStore, err := newTestStore(b)
|
||||
require.NoError(b, err)
|
||||
|
||||
b.ReportAllocs()
|
||||
b.ResetTimer()
|
||||
|
||||
var err error
|
||||
for i := 0; i < b.N; i++ {
|
||||
_ = testStore.Set("john", []byte("doe"), 0)
|
||||
err = testStore.Delete("john")
|
||||
|
Reference in New Issue
Block a user