mirror of
https://github.com/gofiber/storage.git
synced 2025-10-05 08:37:10 +08:00

This is not relevant for this PR, as Ryuk is responsible for terminating containers after the test session finishes
207 lines
4.4 KiB
Go
207 lines
4.4 KiB
Go
package couchbase
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/testcontainers/testcontainers-go/modules/couchbase"
|
|
)
|
|
|
|
const (
|
|
// couchbaseImage is the default image used for running couchbase in tests.
|
|
couchbaseImage = "couchbase:enterprise-7.1.1"
|
|
couchbaseImageEnvVar string = "TEST_COUCHBASE_IMAGE"
|
|
couchbaseUser string = "default"
|
|
couchbasePass string = "password"
|
|
couchbaseBucket string = "fiber_storage"
|
|
)
|
|
|
|
func newTestStore(t testing.TB) (*Storage, error) {
|
|
t.Helper()
|
|
|
|
img := couchbaseImage
|
|
if imgFromEnv := os.Getenv(couchbaseImageEnvVar); imgFromEnv != "" {
|
|
img = imgFromEnv
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
bucket := couchbase.NewBucket(couchbaseBucket).WithReplicas(1).WithFlushEnabled(true)
|
|
|
|
c, err := couchbase.Run(ctx,
|
|
img,
|
|
couchbase.WithAdminCredentials(couchbaseUser, couchbasePass),
|
|
couchbase.WithBuckets(bucket),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
t.Cleanup(func() {
|
|
if c != nil {
|
|
require.NoError(t, c.Terminate(ctx))
|
|
}
|
|
})
|
|
|
|
conn, err := c.ConnectionString(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return New(Config{
|
|
Username: couchbaseUser,
|
|
Password: couchbasePass,
|
|
Host: conn,
|
|
Bucket: couchbaseBucket,
|
|
}), nil
|
|
}
|
|
|
|
func TestSetCouchbase_ShouldReturnNoError(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Set("test", []byte("test"), 0)
|
|
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestGetCouchbase_ShouldReturnNil_WhenDocumentNotFound(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
val, err := testStore.Get("not_found_key")
|
|
|
|
require.NoError(t, err)
|
|
require.Zero(t, len(val))
|
|
}
|
|
|
|
func TestSetAndGet_GetShouldReturn_SetValueWithoutError(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Set("test", []byte("fiber_test_value"), 0)
|
|
require.NoError(t, err)
|
|
|
|
val, err := testStore.Get("test")
|
|
|
|
require.NoError(t, err)
|
|
require.Equal(t, val, []byte("fiber_test_value"))
|
|
}
|
|
|
|
func TestSetAndGet_GetShouldReturnNil_WhenTTLExpired(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Set("test", []byte("fiber_test_value"), 3*time.Second)
|
|
require.NoError(t, err)
|
|
|
|
time.Sleep(6 * time.Second)
|
|
|
|
val, err := testStore.Get("test")
|
|
|
|
require.NoError(t, err)
|
|
require.Zero(t, len(val))
|
|
}
|
|
|
|
func TestSetAndDelete_DeleteShouldReturn_NoError(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Set("test", []byte("fiber_test_value"), 0)
|
|
require.NoError(t, err)
|
|
|
|
err = testStore.Delete("test")
|
|
require.NoError(t, err)
|
|
|
|
_, err = testStore.Get("test")
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestSetAndReset_ResetShouldReturn_NoError(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Set("test", []byte("fiber_test_value"), 0)
|
|
require.NoError(t, err)
|
|
|
|
err = testStore.Reset()
|
|
require.NoError(t, err)
|
|
|
|
_, err = testStore.Get("test")
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestClose_CloseShouldReturn_NoError(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Close()
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestGetConn_ReturnsNotNil(t *testing.T) {
|
|
testStore, err := newTestStore(t)
|
|
require.NoError(t, err)
|
|
defer testStore.Close()
|
|
|
|
require.True(t, testStore.Conn() != nil)
|
|
}
|
|
|
|
func Benchmark_Couchbase_Set(b *testing.B) {
|
|
testStore, err := newTestStore(b)
|
|
require.NoError(b, err)
|
|
defer testStore.Close()
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
err = testStore.Set("john", []byte("doe"), 0)
|
|
}
|
|
|
|
require.NoError(b, err)
|
|
}
|
|
|
|
func Benchmark_Couchbase_Get(b *testing.B) {
|
|
testStore, err := newTestStore(b)
|
|
require.NoError(b, err)
|
|
defer testStore.Close()
|
|
|
|
err = testStore.Set("john", []byte("doe"), 0)
|
|
require.NoError(b, err)
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
_, err = testStore.Get("john")
|
|
}
|
|
|
|
require.NoError(b, err)
|
|
}
|
|
|
|
func Benchmark_Couchbase_SetAndDelete(b *testing.B) {
|
|
testStore, err := newTestStore(b)
|
|
require.NoError(b, err)
|
|
defer testStore.Close()
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
_ = testStore.Set("john", []byte("doe"), 0)
|
|
err = testStore.Delete("john")
|
|
}
|
|
|
|
require.NoError(b, err)
|
|
}
|