Live video on the AT Protocol
1package badges
2
3import (
4 "context"
5 "testing"
6 "time"
7
8 "github.com/bluesky-social/indigo/atproto/syntax"
9 "github.com/bluesky-social/indigo/util"
10 "github.com/stretchr/testify/require"
11 "stream.place/streamplace/pkg/constants"
12 "stream.place/streamplace/pkg/model"
13 "stream.place/streamplace/pkg/streamplace"
14)
15
16func TestGetValidBadges(t *testing.T) {
17 ctx := context.Background()
18
19 mod, err := model.MakeDB(":memory:")
20 require.NoError(t, err)
21
22 issuerDID := "did:web:node.example.com"
23 streamerDID := "did:plc:streamer"
24 moderatorDID := "did:plc:moderator"
25 regularUserDID := "did:plc:regular"
26
27 t.Run("returns empty when no streamer context", func(t *testing.T) {
28 badges, err := GetValidBadges(ctx, regularUserDID, "", issuerDID, mod)
29 require.NoError(t, err)
30 require.Empty(t, badges)
31 })
32
33 t.Run("returns streamer badge for streamer", func(t *testing.T) {
34 badges, err := GetValidBadges(ctx, streamerDID, streamerDID, issuerDID, mod)
35 require.NoError(t, err)
36 require.Len(t, badges, 1)
37 require.Equal(t, constants.BadgeTypeStreamer, badges[0].BadgeType)
38 require.Equal(t, issuerDID, badges[0].Issuer)
39 require.Equal(t, streamerDID, badges[0].Recipient)
40 })
41
42 t.Run("returns no badges for regular user", func(t *testing.T) {
43 badges, err := GetValidBadges(ctx, regularUserDID, streamerDID, issuerDID, mod)
44 require.NoError(t, err)
45 require.Empty(t, badges)
46 })
47
48 t.Run("returns mod badge for moderator", func(t *testing.T) {
49 // Grant moderation permissions
50 perm := &streamplace.ModerationPermission{
51 LexiconTypeID: "place.stream.moderation.permission",
52 Moderator: moderatorDID,
53 Permissions: []string{"ban", "hide"},
54 CreatedAt: time.Now().Format(util.ISO8601),
55 }
56 aturi, err := syntax.ParseATURI("at://" + streamerDID + "/place.stream.moderation.permission/test123")
57 require.NoError(t, err)
58
59 err = mod.CreateModerationDelegation(ctx, perm, aturi)
60 require.NoError(t, err)
61
62 badges, err := GetValidBadges(ctx, moderatorDID, streamerDID, issuerDID, mod)
63 require.NoError(t, err)
64 require.Len(t, badges, 1)
65 require.Equal(t, constants.BadgeTypeMod, badges[0].BadgeType)
66 require.Equal(t, issuerDID, badges[0].Issuer)
67 require.Equal(t, moderatorDID, badges[0].Recipient)
68 })
69
70 t.Run("streamer badge takes priority over mod", func(t *testing.T) {
71 // Even if streamer has mod permissions for themselves, they get streamer badge
72 badges, err := GetValidBadges(ctx, streamerDID, streamerDID, issuerDID, mod)
73 require.NoError(t, err)
74 require.Len(t, badges, 1)
75 require.Equal(t, constants.BadgeTypeStreamer, badges[0].BadgeType)
76 })
77}