crawlkit/backup/backup_test.go
Peter Steinberger 55196d74e0
Some checks failed
CI / test (push) Has been cancelled
CodeQL / analyze (push) Has been cancelled
Security Gate: Secret Scanning / Scan for Verified Secrets (push) Has been cancelled
feat: add shared encrypted backup helpers
2026-05-08 16:41:44 +01:00

55 lines
1.4 KiB
Go

package backup
import (
"context"
"os"
"path/filepath"
"testing"
)
type row struct {
ID string `json:"id"`
Body string `json:"body"`
}
func TestWriteReadEncryptedSnapshot(t *testing.T) {
dir := t.TempDir()
identity := filepath.Join(dir, "age.key")
recipient, err := EnsureIdentity(identity)
if err != nil {
t.Fatal(err)
}
cfg := Config{Repo: filepath.Join(dir, "repo"), Identity: identity, Recipients: []string{recipient}}
if err := os.MkdirAll(cfg.Repo, 0o700); err != nil {
t.Fatal(err)
}
manifest, err := WriteSnapshot(context.Background(), cfg, []Shard{
{Table: "messages", Path: "data/messages/2026/05.jsonl.gz.age", Rows: []row{{ID: "1", Body: "hello"}}},
}, Manifest{})
if err != nil {
t.Fatal(err)
}
if manifest.Counts["messages"] != 1 || len(manifest.Shards) != 1 {
t.Fatalf("unexpected manifest: %+v", manifest)
}
decoded, err := ReadSnapshot(cfg, manifest)
if err != nil {
t.Fatal(err)
}
var rows []row
if err := DecodeJSONL(decoded[0].Plaintext, &rows); err != nil {
t.Fatal(err)
}
if len(rows) != 1 || rows[0].Body != "hello" {
t.Fatalf("unexpected rows: %+v", rows)
}
}
func TestResolveShardPathRejectsEscapes(t *testing.T) {
for _, rel := range []string{"../x.age", "data/../x.age", "data/x.txt", "/data/x.age"} {
if _, err := ResolveShardPath(t.TempDir(), rel); err == nil {
t.Fatalf("expected error for %q", rel)
}
}
}