55 lines
1.4 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|