Live video on the AT Protocol
at eli/multitesting 112 lines 3.0 kB view raw
1package atproto 2 3import ( 4 "context" 5 "fmt" 6 "strings" 7 "testing" 8 "time" 9 10 comatproto "github.com/bluesky-social/indigo/api/atproto" 11 lexutil "github.com/bluesky-social/indigo/lex/util" 12 "github.com/bluesky-social/indigo/util" 13 "github.com/stretchr/testify/require" 14 "stream.place/streamplace/pkg/bus" 15 "stream.place/streamplace/pkg/config" 16 "stream.place/streamplace/pkg/devenv" 17 "stream.place/streamplace/pkg/log" 18 "stream.place/streamplace/pkg/model" 19 "stream.place/streamplace/pkg/statedb" 20 "stream.place/streamplace/pkg/streamplace" 21) 22 23func TestHandleChange(t *testing.T) { 24 ctx, cancel := context.WithCancel(context.Background()) 25 defer cancel() 26 27 dev := devenv.WithDevEnv(t) 28 t.Logf("dev: %+v", dev) 29 cli := config.CLI{ 30 BroadcasterHost: "example.com", 31 DBURL: ":memory:", 32 RelayHost: strings.ReplaceAll(dev.PDSURL, "http://", "ws://"), 33 PLCURL: dev.PLCURL, 34 } 35 36 t.Logf("cli: %+v", cli) 37 b := bus.NewBus() 38 cli.DataDir = t.TempDir() 39 mod, err := model.MakeDB(":memory:") 40 require.NoError(t, err) 41 state, err := statedb.MakeDB(context.Background(), &cli, nil, mod) 42 require.NoError(t, err) 43 atsync := &ATProtoSynchronizer{ 44 CLI: &cli, 45 StatefulDB: state, 46 Model: mod, 47 Bus: b, 48 PLCDirectory: dev.TestDirectory(), 49 } 50 51 done := make(chan struct{}) 52 53 go func() { 54 err := atsync.StartFirehose(ctx) 55 require.NoError(t, err) 56 close(done) 57 }() 58 59 user := dev.CreateAccount(t) 60 61 msg := &streamplace.ChatMessage{ 62 LexiconTypeID: "place.stream.chat.message", 63 Text: "Hello, world!", 64 CreatedAt: time.Now().Add(-time.Second).Format(util.ISO8601), 65 Streamer: user.DID, 66 } 67 68 _, err = comatproto.RepoCreateRecord(ctx, user.XRPC, &comatproto.RepoCreateRecord_Input{ 69 Collection: "place.stream.chat.message", 70 Repo: user.DID, 71 Record: &lexutil.LexiconTypeDecoder{Val: msg}, 72 }) 73 require.NoError(t, err) 74 75 var message *streamplace.ChatDefs_MessageView 76 err = untilNoErrors(t, func() error { 77 messages, err := mod.MostRecentChatMessages(user.DID) 78 if err != nil { 79 return err 80 } 81 if len(messages) != 1 { 82 return fmt.Errorf("expected 2 messages, got %d", len(messages)) 83 } 84 message = messages[0] 85 return nil 86 }) 87 require.NoError(t, err) 88 require.Equal(t, user.Handle, message.Author.Handle) 89 90 log.Log(ctx, "updating handle", "handle", "new-handle.test") 91 err = comatproto.IdentityUpdateHandle(context.Background(), user.XRPC, &comatproto.IdentityUpdateHandle_Input{ 92 Handle: "new-handle.test", 93 }) 94 require.NoError(t, err) 95 96 err = untilNoErrors(t, func() error { 97 messages, err := mod.MostRecentChatMessages(user.DID) 98 if err != nil { 99 return err 100 } 101 if len(messages) != 1 { 102 return fmt.Errorf("expected 2 messages, got %d", len(messages)) 103 } 104 message = messages[0] 105 if message.Author.Handle != "new-handle.test" { 106 return fmt.Errorf("expected new handle, got %s", message.Author.Handle) 107 } 108 return nil 109 }) 110 require.NoError(t, err) 111 require.Equal(t, message.Author.Handle, "new-handle.test") 112}