Files
DoGaMa-serv/internal/persistence/sqlite/catalog_test.go
T

63 lines
2.1 KiB
Go

package sqlite_test
import (
"context"
"errors"
"path/filepath"
"testing"
catalogdata "git.zaynet.fr/DoGaMa/DoGaMa-serv/catalog"
"git.zaynet.fr/DoGaMa/DoGaMa-serv/internal/catalog"
"git.zaynet.fr/DoGaMa/DoGaMa-serv/internal/instance"
"git.zaynet.fr/DoGaMa/DoGaMa-serv/internal/persistence/sqlite"
)
func TestCatalogSyncIsImmutableAndDraftPinsSnapshot(t *testing.T) {
ctx := context.Background()
db, err := sqlite.Open(ctx, filepath.Join(t.TempDir(), "dogama.db"))
if err != nil {
t.Fatal(err)
}
defer db.Close()
repository := sqlite.NewRepository(db)
snapshots, err := catalog.LoadFS(catalogdata.Files, ".")
if err != nil {
t.Fatal(err)
}
if err := repository.Sync(ctx, snapshots); err != nil {
t.Fatal(err)
}
summaries, err := repository.List(ctx)
if err != nil || len(summaries) != 1 || summaries[0].Digest != snapshots[0].Digest {
t.Fatalf("summaries = %#v, error = %v", summaries, err)
}
loaded, err := repository.Get(ctx, snapshots[0].Template.ID, snapshots[0].Template.Version)
if err != nil || loaded.Digest != snapshots[0].Digest {
t.Fatalf("loaded snapshot = %#v, error = %v", loaded, err)
}
tampered := snapshots[0]
tampered.Digest = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
if err := repository.Sync(ctx, []catalog.Snapshot{tampered}); !errors.Is(err, catalog.ErrImmutableSnapshot) {
t.Fatalf("immutable snapshot error = %v", err)
}
preview, err := instance.BuildPreview(snapshots[0], instance.PreviewRequest{
DisplayName: "Family Palworld", Slug: "family-palworld",
HostPorts: map[string]int{"game": 8211},
MountPaths: map[string]string{"saved": "/srv/game-servers/family-palworld/saved"},
DataOrigin: "new", BackupRetention: 7,
})
if err != nil {
t.Fatal(err)
}
if err := repository.CreateDraft(ctx, instance.Draft{ID: "opaque-instance-id", Preview: preview}); err != nil {
t.Fatal(err)
}
var state, digest string
if err := db.QueryRow("SELECT lifecycle_state, template_digest FROM instances WHERE id=?", "opaque-instance-id").Scan(&state, &digest); err != nil {
t.Fatal(err)
}
if state != "draft" || digest != snapshots[0].Digest {
t.Fatalf("draft state=%q digest=%q", state, digest)
}
}