Something went wrong. Try again.
An ATProto Powered Reputation Network
Something went wrong. Try again.
4.2 kB · 111 lines
Go
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112package storage
import ( "context" "database/sql" "path/filepath" "strconv" "strings" "testing" "time"
"provenance/internal/domain")
func TestCompactMigration(t *testing.T) { for _, version := range []int{6, 7} { t.Run(strconv.Itoa(version), func(t *testing.T) { testIdentityMigration(t, version) }) }}
func testIdentityMigration(t *testing.T, version int) { ctx := context.Background() path := filepath.Join(t.TempDir(), "version6.db") conn, err := sql.Open(sqliteDriver, path) if err != nil { t.Fatal(err) } defer conn.Close() legacy := legacy7 if version == 6 { legacy = strings.ReplaceAll(legacy, ") WITHOUT ROWID;", ");") } for _, statement := range []string{"PRAGMA foreign_keys=ON", legacy, schema, "PRAGMA user_version=" + strconv.Itoa(version)} { if _, err := conn.Exec(statement); err != nil { t.Fatal(err) } } exec := func(statement string, args ...any) { t.Helper() if _, err := conn.Exec(statement, args...); err != nil { t.Fatal(err) } } exec("INSERT INTO participants(did) VALUES (?)", "did:plc:a") for _, did := range []string{"did:plc:a", "did:plc:owner"} { exec("INSERT INTO soft_accounts(did, bootstrap_us) VALUES (?, 100)", did) } follow := domain.Vouch{Author: "did:plc:a", Subject: "did:plc:b", Source: domain.FollowCollection, RecordKey: "follow", Score: .5, CreatedAt: listDate} exec("INSERT INTO soft_vouches VALUES (?, ?, ?, ?, ?, ?)", follow.Author, follow.Subject, follow.Source, follow.RecordKey, follow.Score, follow.CreatedAt) exec("INSERT INTO soft_versions VALUES (?, ?, ?, ?)", follow.Author, follow.Source, "deleted", 300) const webAuthor = "did:web:example.com%3A8443:people:alice" exec("INSERT INTO participants(did) VALUES (?)", webAuthor) exec("INSERT INTO soft_accounts(did) VALUES (?)", webAuthor) exec("INSERT INTO soft_vouches VALUES (?, ?, ?, ?, ?, ?)", webAuthor, follow.Subject, follow.Source, "web-follow", follow.Score, follow.CreatedAt) snapshot := listFixture() records := append(snapshot.Blocks, snapshot.Lists[0].Records...) for _, r := range records { exec("INSERT INTO list_records VALUES (?, ?, ?, ?, ?, ?, ?)", r.Author, r.Source, r.RecordKey, r.ListURI, r.Subject, r.Purpose, r.CreatedAt) } exec("INSERT INTO list_snapshots VALUES (?, ?, ?)", snapshot.Lists[0].URI, "did:plc:owner", 100) exec("INSERT INTO list_bootstraps VALUES (?, ?)", follow.Author, 100) now := time.UnixMicro(1000) exec("INSERT INTO trust_cache VALUES (?, ?, ?)", "path", `{"status":"calculated","score":-0.5}`, now.Add(time.Hour).UnixMicro()) exec("INSERT INTO trust_dependencies VALUES (?, ?, ?, ?)", "path", "did:plc:owner", "member", domain.ListItemCollection) if err := conn.Close(); err != nil { t.Fatal(err) } s, err := OpenWithSoft(path, domain.SoftParticipantLists) if err != nil { t.Fatal(err) } defer s.Close() rows, err := s.Incoming(ctx, follow.Subject, "", domain.Default, 100) if err != nil || len(rows) != 3 { t.Fatalf("migration lost sources: %+v %v", rows, err) } webFound := false for _, row := range rows { if row.Author == webAuthor { webFound = true } } if !webFound { t.Fatal("migration changed the did:web identifier") } if _, err := s.CachedTrust(ctx, "path", now); err != nil { t.Fatalf("migration lost cache: %v", err) } follow.RecordKey, follow.Subject = "deleted", "did:plc:stale" if err := s.Apply(ctx, "stream", domain.Change{Kind: domain.RecordChange, DID: follow.Author, Source: follow.Source, RecordKey: follow.RecordKey, Vouch: &follow, TimeUS: 200}); err != nil { t.Fatal(err) } rows, err = s.Incoming(ctx, follow.Subject, "", domain.Default, 100) if err != nil || len(rows) != 0 { t.Fatalf("migration lost tombstone: %+v %v", rows, err) } if err := s.Apply(ctx, "stream", domain.Change{Kind: domain.RecordChange, DID: "did:plc:owner", Source: domain.ListItemCollection, RecordKey: "member", TimeUS: 400}); err != nil { t.Fatal(err) } if _, err := s.CachedTrust(ctx, "path", now); err == nil { t.Fatal("migration lost cache invalidation") } check, err := s.conn.Query("PRAGMA foreign_key_check") if err != nil { t.Fatal(err) } defer check.Close() if check.Next() { t.Fatal("migration broke foreign keys") }}