upd store

This commit is contained in:
Vladimir V Maksimov
2025-11-06 16:50:12 +03:00
parent 488f11bd56
commit 00b12cdf7d
8 changed files with 269 additions and 117 deletions

View File

@@ -23,15 +23,15 @@ func newTestService(t *testing.T) (*gorm.DB, *service.VersionService, *store.Gor
}
storage := store.NewGormStorage(db)
service := service.NewVersionService(storage)
service := service.NewVersionService(storage, 5)
return db, service, storage
}
func TestVersioningLifecycle(t *testing.T) {
db, service, store := newTestService(t)
db, service, _ := newTestService(t)
// 1⃣ Создаём документ
docID, err := store.CreateDocument("test.json")
doc, err := service.CreateDocument("test.json")
if err != nil {
t.Fatalf("create document: %v", err)
}
@@ -42,7 +42,7 @@ func TestVersioningLifecycle(t *testing.T) {
v3 := []byte(`{"name": "Alice", "age": 32, "city": "Paris", "lang": "fr"}`)
// 3⃣ Сохраняем версии
ver1, err := service.SaveNewVersion(docID, v1)
ver1, err := service.SaveNewVersion(doc.ID, v1)
if err != nil {
t.Fatalf("save v1: %v", err)
}
@@ -50,7 +50,7 @@ func TestVersioningLifecycle(t *testing.T) {
t.Errorf("v1 должен быть snapshot, но IsSnapshot=%v", ver1.IsSnapshot)
}
ver2, err := service.SaveNewVersion(docID, v2)
ver2, err := service.SaveNewVersion(doc.ID, v2)
if err != nil {
t.Fatalf("save v2: %v", err)
}
@@ -58,7 +58,7 @@ func TestVersioningLifecycle(t *testing.T) {
t.Errorf("v2 не должен быть snapshot")
}
ver3, err := service.SaveNewVersion(docID, v3)
ver3, err := service.SaveNewVersion(doc.ID, v3)
if err != nil {
t.Fatalf("save v3: %v", err)
}
@@ -102,15 +102,21 @@ func jsonEqual(a, b []byte) bool {
}
func TestDiffVersions(t *testing.T) {
_, service, store := newTestService(t)
_, service, _ := newTestService(t)
docID, _ := store.CreateDocument("diff.json")
doc, _ := service.CreateDocument("diff.json")
v1 := []byte(`{"name":"Alice","age":30}`)
v2 := []byte(`{"name":"Alice","age":31,"city":"Paris"}`)
ver1, _ := service.SaveNewVersion(docID, v1)
ver2, _ := service.SaveNewVersion(docID, v2)
ver1, err := service.SaveNewVersion(doc.ID, v1)
if err != nil {
t.Fatal(err)
}
ver2, err := service.SaveNewVersion(doc.ID, v2)
if err != nil {
t.Fatal(err)
}
diff, err := service.DiffVersions(ver1.ID, ver2.ID)
if err != nil {

103
tests/snapshot_test.go Normal file
View File

@@ -0,0 +1,103 @@
package tests
import (
"testing"
"git.gm6.ru/icewind/seadoc/models"
"git.gm6.ru/icewind/seadoc/service"
"git.gm6.ru/icewind/seadoc/store"
"github.com/google/uuid"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func TestSnapshotInterval(t *testing.T) {
// --- Setup in-memory DB ---
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatalf("failed to open sqlite: %v", err)
}
if err := db.AutoMigrate(&models.Document{}, &models.Version{}); err != nil {
t.Fatalf("failed to migrate: %v", err)
}
storage := store.NewGormStorage(db)
// --- Service with snapshot interval = 3 ---
svc := service.NewVersionService(storage, 3)
//doc := models.Document{ID: uuid.New()}
var doc *models.Document
if doc, err = svc.CreateDocument("test"); err != nil {
t.Fatalf("failed to create document: %v", err)
}
// v1 — snapshot
_, err = svc.SaveNewVersion(doc.ID, []byte(`{"count": 1}`))
if err != nil {
t.Fatalf("v1 failed: %v", err)
}
// v2, v3, v4 — patch-версии
_, _ = svc.SaveNewVersion(doc.ID, []byte(`{"count": 2}`))
_, _ = svc.SaveNewVersion(doc.ID, []byte(`{"count": 3}`))
_, _ = svc.SaveNewVersion(doc.ID, []byte(`{"count": 4}`))
// теперь должен создаться **автоматический snapshot**
latest, err := storage.GetLatestVersion(doc.ID)
if err != nil {
t.Fatalf("failed to get latest version: %v", err)
}
if !latest.IsSnapshot {
t.Fatalf("expected latest version to be snapshot, got patch")
}
// восстановим документ — должен быть {"count":4}
full, err := svc.ReconstructVersion(latest.ID)
if err != nil {
t.Fatalf("failed to reconstruct version: %v", err)
}
if string(full) != `{"count": 4}` {
t.Fatalf("snapshot contains wrong data: %s", full)
}
}
func TestDiffVersions_Multiple(t *testing.T) {
_, service, _ := newTestService(t)
doc, err := service.CreateDocument("multi-diff.json")
if err != nil {
t.Fatal(err)
}
versions := [][]byte{
[]byte(`{"name":"Alice","age":30}`),
[]byte(`{"name":"Alice","age":31}`),
[]byte(`{"name":"Alice","age":31,"city":"Paris"}`),
[]byte(`{"name":"Alice","age":31,"city":"Paris","active":true}`),
}
stored := make([]uuid.UUID, 0, len(versions))
for _, v := range versions {
ver, err := service.SaveNewVersion(doc.ID, v)
if err != nil {
t.Fatal(err)
}
stored = append(stored, ver.ID)
}
// сравним самую первую и последнюю версии
diff, err := service.DiffVersions(stored[0], stored[len(stored)-1])
if err != nil {
t.Fatalf("diff error: %v", err)
}
expected := `{"age":31,"city":"Paris","active":true}`
if !jsonEqual(diff, []byte(expected)) {
t.Errorf("unexpected diff:\n got: %s\nwant: %s", diff, expected)
}
}