upd store
This commit is contained in:
103
tests/snapshot_test.go
Normal file
103
tests/snapshot_test.go
Normal 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user