mirror of
https://github.com/skidoodle/pastebin
synced 2025-10-14 09:44:48 +02:00
v2
This commit is contained in:
97
store/boltdb_test.go
Normal file
97
store/boltdb_test.go
Normal file
@@ -0,0 +1,97 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log/slog"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"go.etcd.io/bbolt"
|
||||
)
|
||||
|
||||
// setupTestDB creates a temporary BoltDB instance for testing and returns a cleanup function.
|
||||
func setupTestDB(t *testing.T) (*BoltStore, func()) {
|
||||
dir := t.TempDir()
|
||||
dbPath := filepath.Join(dir, "test.db")
|
||||
store, err := NewBoltStore(dbPath)
|
||||
assert.NoError(t, err)
|
||||
|
||||
cleanup := func() {
|
||||
if err := store.Close(); err != nil {
|
||||
slog.Error("failed to close store", "error", err)
|
||||
}
|
||||
if err := os.RemoveAll(dir); err != nil {
|
||||
slog.Error("failed to remove temp directory", "dir", dir, "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
return store, cleanup
|
||||
}
|
||||
|
||||
// TestBoltStore_SetGetDel tests the Set, Get, and Del methods of the BoltStore.
|
||||
func TestBoltStore_SetGetDel(t *testing.T) {
|
||||
store, cleanup := setupTestDB(t)
|
||||
defer cleanup()
|
||||
|
||||
// Test Set and Get
|
||||
err := store.Set("key1", "value1")
|
||||
assert.NoError(t, err)
|
||||
|
||||
val, ok, err := store.Get("key1")
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, "value1", val)
|
||||
|
||||
// Test Get non-existent key
|
||||
_, ok, err = store.Get("non-existent")
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, ok)
|
||||
|
||||
// Test Delete
|
||||
err = store.Del("key1")
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, ok, err = store.Get("key1")
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, ok)
|
||||
}
|
||||
|
||||
// TestBoltStore_Cleanup tests the Cleanup method of the BoltStore.
|
||||
func TestBoltStore_Cleanup(t *testing.T) {
|
||||
store, cleanup := setupTestDB(t)
|
||||
defer cleanup()
|
||||
|
||||
// Set one fresh and one stale paste
|
||||
err := store.Set("fresh", "content")
|
||||
assert.NoError(t, err)
|
||||
|
||||
err = store.db.Update(func(tx *bbolt.Tx) error {
|
||||
b := tx.Bucket(pastesBucket)
|
||||
stalePaste := Paste{
|
||||
Content: "stale",
|
||||
CreatedAt: time.Now().Add(-2 * time.Hour),
|
||||
}
|
||||
encoded, err := json.Marshal(stalePaste)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return b.Put([]byte("stale"), encoded)
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
||||
// Cleanup pastes older than 1 hour
|
||||
store.Cleanup(1 * time.Hour)
|
||||
|
||||
// Check that fresh paste still exists
|
||||
_, ok, err := store.Get("fresh")
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, ok)
|
||||
|
||||
// Check that stale paste was deleted
|
||||
_, ok, err = store.Get("stale")
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, ok)
|
||||
}
|
||||
Reference in New Issue
Block a user