Live video on the AT Protocol
1package linking
2
3import (
4 "context"
5 "io"
6 "net/url"
7 "strings"
8 "testing"
9
10 "github.com/bluesky-social/indigo/api/atproto"
11 "github.com/bluesky-social/indigo/api/bsky"
12 lexutil "github.com/bluesky-social/indigo/lex/util"
13 "github.com/stretchr/testify/require"
14 "stream.place/streamplace/js/app"
15 "stream.place/streamplace/pkg/streamplace"
16)
17
18func IndexHTML(t *testing.T) []byte {
19 allFiles, err := app.Files()
20 require.NoError(t, err)
21 require.NotNil(t, allFiles)
22 index, err := allFiles.Open("index.html")
23 require.NoError(t, err)
24 indexBs, err := io.ReadAll(index)
25 require.NoError(t, err)
26 require.NotNil(t, indexBs)
27 return indexBs
28}
29
30func TestNewLinker(t *testing.T) {
31 index := IndexHTML(t)
32 linker, err := NewLinker(context.Background(), index, nil, nil)
33 require.NoError(t, err)
34 require.NotNil(t, linker)
35}
36
37func TestGenerateLinkCard(t *testing.T) {
38 index := IndexHTML(t)
39 linker, err := NewLinker(context.Background(), index, nil, nil)
40 require.NoError(t, err)
41 require.NotNil(t, linker)
42
43 u, err := url.Parse("https://stream.place/iame.li")
44 require.NoError(t, err)
45 sp := "https://stream.place"
46 ls := &streamplace.Livestream{
47 CreatedAt: "2025-03-25T00:39:49.121Z",
48 Post: &atproto.RepoStrongRef{
49 Cid: "bafyreiczmyne5jd4lpax5ttyb5p2fbcageyt6fsthdpyymecokcsmyh4a4",
50 Uri: "at://did:plc:2zmxikig2sj7gqaezl5gntae/app.bsky.feed.post/3ll5zuomua22x",
51 },
52 Title: "Back up! Once again water in the firehose. Link cards if this stays stable",
53 Url: &sp,
54 }
55 lsv := &streamplace.Livestream_LivestreamView{
56 Author: &bsky.ActorDefs_ProfileViewBasic{
57 Handle: "iame.li",
58 Did: "did:plc:2zmxikig2sj7gqaezl5gntae",
59 },
60 Cid: "bafyreib2ohz45jileumnuwa3wdoo3o7caikfyq467eanleqcscouh5wery",
61 IndexedAt: "2025-03-25T01:16:14Z",
62 Record: &lexutil.LexiconTypeDecoder{Val: ls},
63 Uri: "at://did:plc:2zmxikig2sj7gqaezl5gntae/place.stream.livestream/3ll5zuop2k22x",
64 }
65 linkCard, err := linker.GenerateStreamerCard(context.Background(), u, lsv, "")
66 require.NoError(t, err)
67 linkStr := string(linkCard)
68 require.True(t, strings.Contains(linkStr, "iame.li"))
69 require.True(t, strings.Contains(linkStr, ls.Title), "should contain the livestream title")
70 require.True(t, strings.Count(linkStr, "<title>") == 1, "should have exactly one title tag")
71}