Live video on the AT Protocol
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}