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) } manager := dbManager{db} storage := store.NewGormStorage( &manager, ) // --- 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) } }