The verb surface accumulated overlapping cleanup commands. Consolidate so each cleanup verb has one meaning: - Rename 'database purge' -> 'database delete'. The command removes the SQLite file entirely; "purge" wrongly suggested purging contents. - Fold 'snapshot cleanup' into 'prune'. Prune now runs three passes: reconcile local snapshots against the remote (previously the standalone cleanup command), drop orphaned local rows, then delete unreferenced remote blobs. One command, one mental model. - Delete 'store info'. Its output was a strict subset of 'remote info', which already prints storage type + location. Any user reaching for either should reach for 'remote info'. - Drop 'snapshot remove --all'. It duplicated 'remote nuke --force'. 'remote nuke' is the single supported entry point for wiping the destination store. Also update the storage-binding error message to reference the new 'vaultik database delete' name.
73 lines
2.2 KiB
Go
73 lines
2.2 KiB
Go
package vaultik_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"sneak.berlin/go/vaultik/internal/config"
|
|
"sneak.berlin/go/vaultik/internal/database"
|
|
"sneak.berlin/go/vaultik/internal/log"
|
|
"sneak.berlin/go/vaultik/internal/vaultik"
|
|
)
|
|
|
|
// buildBindTestVaultik returns a minimal Vaultik wired with a real
|
|
// in-memory DB and a config carrying the given StorageURL. Enough to
|
|
// exercise EnsureStorageBinding without spinning up storage or fx.
|
|
func buildBindTestVaultik(t *testing.T, storageURL string) (*vaultik.TestVaultik, *database.Repositories) {
|
|
t.Helper()
|
|
|
|
db, err := database.NewTestDB()
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() { _ = db.Close() })
|
|
|
|
repos := database.NewRepositories(db)
|
|
|
|
tv := vaultik.NewForTesting(nil)
|
|
tv.Repositories = repos
|
|
tv.DB = db
|
|
tv.Config = &config.Config{StorageURL: storageURL}
|
|
tv.SetContext(context.Background())
|
|
|
|
return tv, repos
|
|
}
|
|
|
|
func TestEnsureStorageBinding_FreshDBRecordsURL(t *testing.T) {
|
|
log.Initialize(log.Config{})
|
|
|
|
tv, repos := buildBindTestVaultik(t, "file:///mnt/backups/new")
|
|
|
|
require.NoError(t, tv.EnsureStorageBinding())
|
|
|
|
got, err := repos.LocalMeta.Get(context.Background(), database.LocalMetaKeyStorageURL)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "file:///mnt/backups/new", got, "first call must record the configured URL")
|
|
}
|
|
|
|
func TestEnsureStorageBinding_MatchingURLPasses(t *testing.T) {
|
|
log.Initialize(log.Config{})
|
|
|
|
tv, repos := buildBindTestVaultik(t, "s3://bucket/prefix")
|
|
|
|
require.NoError(t, repos.LocalMeta.Set(context.Background(),
|
|
database.LocalMetaKeyStorageURL, "s3://bucket/prefix"))
|
|
|
|
require.NoError(t, tv.EnsureStorageBinding())
|
|
}
|
|
|
|
func TestEnsureStorageBinding_MismatchRefuses(t *testing.T) {
|
|
log.Initialize(log.Config{})
|
|
|
|
tv, repos := buildBindTestVaultik(t, "file:///mnt/backups/new")
|
|
|
|
require.NoError(t, repos.LocalMeta.Set(context.Background(),
|
|
database.LocalMetaKeyStorageURL, "file:///mnt/backups/old"))
|
|
|
|
err := tv.EnsureStorageBinding()
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "file:///mnt/backups/old")
|
|
assert.Contains(t, err.Error(), "file:///mnt/backups/new")
|
|
assert.Contains(t, err.Error(), "vaultik database delete")
|
|
}
|