mirror of
https://github.com/skidoodle/safebin.git
synced 2026-04-28 19:27:41 +02:00
2bcf339408
Signed-off-by: skidoodle <contact@albert.lol>
105 lines
2.2 KiB
Go
105 lines
2.2 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"go.etcd.io/bbolt"
|
|
)
|
|
|
|
func TestInitDB(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
|
|
db, err := InitDB(tmpDir)
|
|
if err != nil {
|
|
t.Fatalf("InitDB failed: %v", err)
|
|
}
|
|
defer func() {
|
|
if err := db.Close(); err != nil {
|
|
t.Errorf("Failed to close DB: %v", err)
|
|
}
|
|
}()
|
|
|
|
dbPath := filepath.Join(tmpDir, DBDirName, DBFileName)
|
|
if _, err := os.Stat(dbPath); os.IsNotExist(err) {
|
|
t.Error("Database file was not created")
|
|
}
|
|
|
|
err = db.View(func(tx *bbolt.Tx) error {
|
|
if b := tx.Bucket([]byte(DBBucketName)); b == nil {
|
|
t.Errorf("Bucket '%s' was not created", DBBucketName)
|
|
}
|
|
if b := tx.Bucket([]byte(DBBucketIndexName)); b == nil {
|
|
t.Errorf("Bucket '%s' was not created", DBBucketIndexName)
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
t.Errorf("View failed: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestDB_MetadataLifecycle(t *testing.T) {
|
|
tmpDir := t.TempDir()
|
|
db, err := InitDB(tmpDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer func() {
|
|
if err := db.Close(); err != nil {
|
|
t.Errorf("Failed to close DB: %v", err)
|
|
}
|
|
}()
|
|
|
|
app := &App{
|
|
Conf: Config{StorageDir: tmpDir, MaxMB: 100},
|
|
DB: db,
|
|
}
|
|
|
|
fileID := "test-file-id"
|
|
fileSize := int64(1024)
|
|
|
|
if err := app.RegisterFile(fileID, fileSize); err != nil {
|
|
t.Fatalf("RegisterFile failed: %v", err)
|
|
}
|
|
|
|
err = db.View(func(tx *bbolt.Tx) error {
|
|
b := tx.Bucket([]byte(DBBucketName))
|
|
data := b.Get([]byte(fileID))
|
|
if data == nil {
|
|
t.Fatal("Metadata not found in DB")
|
|
}
|
|
|
|
var meta FileMeta
|
|
if err := json.Unmarshal(data, &meta); err != nil {
|
|
t.Fatalf("Failed to unmarshal meta: %v", err)
|
|
}
|
|
|
|
if meta.ID != fileID {
|
|
t.Errorf("Want ID %s, got %s", fileID, meta.ID)
|
|
}
|
|
if meta.Size != fileSize {
|
|
t.Errorf("Want Size %d, got %d", fileSize, meta.Size)
|
|
}
|
|
if meta.ExpiresAt.Before(time.Now()) {
|
|
t.Error("Expiration time is in the past")
|
|
}
|
|
|
|
bIndex := tx.Bucket([]byte(DBBucketIndexName))
|
|
indexKey := []byte(meta.ExpiresAt.Format(time.RFC3339) + "_" + fileID)
|
|
if val := bIndex.Get(indexKey); val == nil {
|
|
t.Error("Index entry not found")
|
|
} else if string(val) != fileID {
|
|
t.Errorf("Index value mismatch: want %s, got %s", fileID, string(val))
|
|
}
|
|
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|