package db_test import ( "os" "testing" "github.com/limeleaf/diffdown/internal/db" ) func openTestDB(t *testing.T) *db.DB { t.Helper() f, err := os.CreateTemp("", "diffdown-test-*.db") if err != nil { t.Fatal(err) } t.Cleanup(func() { os.Remove(f.Name()) }) f.Close() database, err := db.Open(f.Name()) if err != nil { t.Fatal(err) } db.SetMigrationsDir("../../migrations") if err := database.Migrate(); err != nil { t.Fatal(err) } return database } func TestGetDocVersion_Empty(t *testing.T) { d := openTestDB(t) v, err := d.GetDocVersion("rkey1") if err != nil { t.Fatal(err) } if v != 0 { t.Errorf("expected version 0 for new doc, got %d", v) } } func TestAppendSteps_IncreasesVersion(t *testing.T) { d := openTestDB(t) steps := []string{`{"stepType":"replace"}`, `{"stepType":"replace"}`} newVersion, err := d.AppendSteps("rkey1", 0, steps, "client-a") if err != nil { t.Fatal(err) } if newVersion != 2 { t.Errorf("expected version 2, got %d", newVersion) } } func TestAppendSteps_VersionConflict(t *testing.T) { d := openTestDB(t) _, err := d.AppendSteps("rkey1", 0, []string{`{}`}, "client-a") if err != nil { t.Fatal(err) } // Submit again from clientVersion=0 (stale) — must fail. _, err = d.AppendSteps("rkey1", 0, []string{`{}`}, "client-b") if err == nil { t.Fatal("expected conflict error, got nil") } } func TestGetStepsSince(t *testing.T) { d := openTestDB(t) steps := []string{`{"a":1}`, `{"a":2}`, `{"a":3}`} d.AppendSteps("rkey1", 0, steps, "client-a") rows, err := d.GetStepsSince("rkey1", 1) if err != nil { t.Fatal(err) } if len(rows) != 2 { t.Errorf("expected 2 steps since v1, got %d", len(rows)) } if rows[0].JSON != `{"a":2}` { t.Errorf("unexpected step: %s", rows[0].JSON) } } func TestCollaborations(t *testing.T) { d := openTestDB(t) const collabDID = "did:plc:collab" const ownerDID = "did:plc:owner" const rkey = "abc123" if err := d.AddCollaboration(collabDID, ownerDID, rkey); err != nil { t.Fatalf("AddCollaboration: %v", err) } // idempotent — should not error on duplicate if err := d.AddCollaboration(collabDID, ownerDID, rkey); err != nil { t.Fatalf("AddCollaboration (dup): %v", err) } rows, err := d.GetCollaborations(collabDID) if err != nil { t.Fatalf("GetCollaborations: %v", err) } if len(rows) != 1 { t.Fatalf("want 1 row, got %d", len(rows)) } if rows[0].OwnerDID != ownerDID || rows[0].DocumentRKey != rkey { t.Errorf("unexpected row: %+v", rows[0]) } }