mirror of
https://github.com/gofiber/storage.git
synced 2025-10-05 16:48:25 +08:00
chore: use testcontainers-go in postgres store
This commit is contained in:
@@ -8,14 +8,52 @@ import (
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/testcontainers/testcontainers-go"
|
||||
"github.com/testcontainers/testcontainers-go/modules/postgres"
|
||||
"github.com/testcontainers/testcontainers-go/wait"
|
||||
)
|
||||
|
||||
var testStore = New(Config{
|
||||
Database: os.Getenv("POSTGRES_DATABASE"),
|
||||
Username: os.Getenv("POSTGRES_USERNAME"),
|
||||
Password: os.Getenv("POSTGRES_PASSWORD"),
|
||||
Reset: true,
|
||||
})
|
||||
const (
|
||||
// postgresImage is the default image used for running Postgres in tests.
|
||||
postgresImage = "docker.io/postgres:16-alpine"
|
||||
postgresImageEnvVar string = "TEST_POSTGRES_IMAGE"
|
||||
postgresUser string = "username"
|
||||
postgresPass string = "p4ssw0rd"
|
||||
postgresDatabase string = "fiber"
|
||||
)
|
||||
|
||||
func newTestStore(t testing.TB) (*Storage, error) {
|
||||
t.Helper()
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
img := postgresImage
|
||||
if imgFromEnv := os.Getenv(postgresImageEnvVar); imgFromEnv != "" {
|
||||
img = imgFromEnv
|
||||
}
|
||||
|
||||
c, err := postgres.Run(ctx, img,
|
||||
postgres.WithUsername(postgresUser),
|
||||
postgres.WithPassword(postgresPass),
|
||||
postgres.WithDatabase(postgresDatabase),
|
||||
testcontainers.WithWaitStrategy(
|
||||
// First, we wait for the container to log readiness twice.
|
||||
// This is because it will restart itself after the first startup.
|
||||
wait.ForLog("database system is ready to accept connections").WithOccurrence(2),
|
||||
),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
conn, err := c.ConnectionString(ctx, "sslmode=disable")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return New(Config{
|
||||
ConnectionURI: conn,
|
||||
Reset: true,
|
||||
}), nil
|
||||
}
|
||||
|
||||
func Test_Postgres_Set(t *testing.T) {
|
||||
var (
|
||||
@@ -23,7 +61,10 @@ func Test_Postgres_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)
|
||||
}
|
||||
|
||||
@@ -33,7 +74,10 @@ func Test_Postgres_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)
|
||||
@@ -46,7 +90,10 @@ func Test_Postgres_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)
|
||||
@@ -61,7 +108,10 @@ func Test_Postgres_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)
|
||||
@@ -70,12 +120,18 @@ func Test_Postgres_Set_Expiration(t *testing.T) {
|
||||
func Test_Postgres_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_Postgres_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))
|
||||
@@ -87,7 +143,10 @@ func Test_Postgres_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)
|
||||
@@ -101,7 +160,10 @@ func Test_Postgres_Delete(t *testing.T) {
|
||||
func Test_Postgres_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)
|
||||
@@ -122,8 +184,11 @@ func Test_Postgres_Reset(t *testing.T) {
|
||||
func Test_Postgres_GC(t *testing.T) {
|
||||
testVal := []byte("doe")
|
||||
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
// This key should expire
|
||||
err := testStore.Set("john", testVal, time.Nanosecond)
|
||||
err = testStore.Set("john", testVal, time.Nanosecond)
|
||||
require.NoError(t, err)
|
||||
|
||||
testStore.gc(time.Now())
|
||||
@@ -144,7 +209,10 @@ func Test_Postgres_GC(t *testing.T) {
|
||||
func Test_Postgres_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")
|
||||
@@ -164,18 +232,26 @@ func Test_SslRequiredMode(t *testing.T) {
|
||||
}
|
||||
|
||||
func Test_Postgres_Conn(t *testing.T) {
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.True(t, testStore.Conn() != nil)
|
||||
}
|
||||
|
||||
func Test_Postgres_Close(t *testing.T) {
|
||||
testStore, err := newTestStore(t)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Nil(t, testStore.Close())
|
||||
}
|
||||
|
||||
func Benchmark_Postgres_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)
|
||||
}
|
||||
@@ -184,7 +260,10 @@ func Benchmark_Postgres_Set(b *testing.B) {
|
||||
}
|
||||
|
||||
func Benchmark_Postgres_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()
|
||||
@@ -198,10 +277,12 @@ func Benchmark_Postgres_Get(b *testing.B) {
|
||||
}
|
||||
|
||||
func Benchmark_Postgres_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