1package indexer
2
3import (
4 "context"
5 "os"
6 "path/filepath"
7 "testing"
8 "time"
9
10 bsky "github.com/bluesky-social/indigo/api/bsky"
11 "github.com/bluesky-social/indigo/carstore"
12 "github.com/bluesky-social/indigo/events"
13 "github.com/bluesky-social/indigo/plc"
14 "github.com/bluesky-social/indigo/repomgr"
15 "github.com/bluesky-social/indigo/util"
16 "gorm.io/driver/sqlite"
17 "gorm.io/gorm"
18)
19
20type testIx struct {
21 dir string
22
23 ix *Indexer
24 rm *repomgr.RepoManager
25
26 didr plc.PLCClient
27}
28
29func testIndexer(t *testing.T) *testIx {
30 t.Helper()
31
32 dir, err := os.MkdirTemp("", "ixtest")
33 if err != nil {
34 t.Fatal(err)
35 }
36
37 maindb, err := gorm.Open(sqlite.Open(filepath.Join(dir, "test.sqlite")))
38 if err != nil {
39 t.Fatal(err)
40 }
41
42 cardb, err := gorm.Open(sqlite.Open(filepath.Join(dir, "car.sqlite")))
43 if err != nil {
44 t.Fatal(err)
45 }
46
47 cspath := filepath.Join(dir, "carstore")
48 if err := os.Mkdir(cspath, 0775); err != nil {
49 t.Fatal(err)
50 }
51
52 cs, err := carstore.NewCarStore(cardb, []string{cspath})
53 if err != nil {
54 t.Fatal(err)
55 }
56
57 repoman := repomgr.NewRepoManager(cs, &util.FakeKeyManager{})
58 evtman := events.NewEventManager(events.NewMemPersister())
59
60 didr := testPLC(t)
61
62 rf := NewRepoFetcher(maindb, repoman, 10)
63
64 ix, err := NewIndexer(maindb, evtman, didr, rf, false)
65 if err != nil {
66 t.Fatal(err)
67 }
68
69 return &testIx{
70 dir: dir,
71 ix: ix,
72 rm: repoman,
73
74 didr: didr,
75 }
76}
77
78func (ix *testIx) Cleanup() {
79 if ix.dir != "" {
80 _ = os.RemoveAll(ix.dir)
81 }
82 ix.ix.Shutdown()
83}
84
85// TODO: dedupe this out into some testing utility package
86func testPLC(t *testing.T) *plc.FakeDid {
87 // TODO: just do in memory...
88 tdir, err := os.MkdirTemp("", "plcserv")
89 if err != nil {
90 t.Fatal(err)
91 }
92
93 db, err := gorm.Open(sqlite.Open(filepath.Join(tdir, "plc.sqlite")))
94 if err != nil {
95 t.Fatal(err)
96 }
97 return plc.NewFakeDid(db)
98}
99
100func TestBasicIndexing(t *testing.T) {
101 tt := testIndexer(t)
102 defer tt.Cleanup()
103
104 post := &bsky.FeedPost{
105 CreatedAt: time.Now().Format(util.ISO8601),
106 Text: "im the OP, the best",
107 }
108
109 ctx := context.Background()
110
111 if err := tt.rm.InitNewActor(ctx, 1, "bob", "did:plc:asdasda", "bob", "FAKE", "userboy"); err != nil {
112 t.Fatal(err)
113 }
114
115 uri, cc, err := tt.rm.CreateRecord(ctx, 1, "app.bsky.feed.post", post)
116 if err != nil {
117 t.Fatal(err)
118 }
119
120 _ = uri
121 _ = cc
122
123 // TODO: test some things at this level specifically.
124 // we have higher level integration tests, but at some point I want to stress this mechanism directly.
125 // we will want a decent set of utilities to make it easy on ourselves
126 // things to test:
127 // - crawling missing data
128 // - references to missing posts work
129 // - mentions?
130}