porting all github actions from bluesky-social/indigo to tangled CI
at main 2.6 kB view raw
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}