owpengram-server/internal/rpc/phone_group_call_joinas_test.go

113 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package rpc
import (
"testing"
"github.com/gotd/td/tg"
)
// TestGroupCallJoinAsChannel 覆盖 join_as 身份闭环admin 以频道身份入会 →
// 参与者行 peer=PeerChannel本人与对端视角一致非 admin 以频道身份被拒;
// getGroupCallJoinAs 对 admin 返回 self+频道两个候选、普通成员只返回 self。
func TestGroupCallJoinAsChannel(t *testing.T) {
f := newGroupCallFixture(t)
ownerCtx := f.userCtx(f.owner, 11)
memberCtx := f.userCtx(f.member, 22)
channelPeer := &tg.InputPeerChannel{ChannelID: f.channel.ID, AccessHash: f.channel.AccessHash}
// --- getGroupCallJoinAs 候选 ---
ownerJoinAs, err := f.router.onPhoneGetGroupCallJoinAs(ownerCtx, channelPeer)
if err != nil {
t.Fatalf("owner getGroupCallJoinAs: %v", err)
}
if len(ownerJoinAs.Peers) != 2 {
t.Fatalf("owner join-as peers = %d, want 2 (self + channel): %+v", len(ownerJoinAs.Peers), ownerJoinAs.Peers)
}
if _, ok := ownerJoinAs.Peers[1].(*tg.PeerChannel); !ok {
t.Fatalf("owner join-as second peer = %T, want PeerChannel", ownerJoinAs.Peers[1])
}
memberJoinAs, err := f.router.onPhoneGetGroupCallJoinAs(memberCtx, channelPeer)
if err != nil {
t.Fatalf("member getGroupCallJoinAs: %v", err)
}
if len(memberJoinAs.Peers) != 1 {
t.Fatalf("member join-as peers = %d, want 1 (self only)", len(memberJoinAs.Peers))
}
// --- create + owner 以频道身份 join ---
createRes, err := f.router.onPhoneCreateGroupCall(ownerCtx, &tg.PhoneCreateGroupCallRequest{
Peer: channelPeer, RandomID: 1,
})
if err != nil {
t.Fatalf("createGroupCall: %v", err)
}
call := findUpdate[*tg.UpdateGroupCall](t, createRes).Call.(*tg.GroupCall)
input := &tg.InputGroupCall{ID: call.ID, AccessHash: call.AccessHash}
joinRes, err := f.router.onPhoneJoinGroupCall(ownerCtx, &tg.PhoneJoinGroupCallRequest{
Call: input,
JoinAs: channelPeer,
Params: groupCallJoinParams(t, 8001),
})
if err != nil {
t.Fatalf("owner joinGroupCall(join_as=channel): %v", err)
}
participants := findUpdate[*tg.UpdateGroupCallParticipants](t, joinRes)
if len(participants.Participants) != 1 {
t.Fatalf("participants = %d, want 1", len(participants.Participants))
}
self := participants.Participants[0]
peerCh, ok := self.Peer.(*tg.PeerChannel)
if !ok || peerCh.ChannelID != f.channel.ID {
t.Fatalf("self participant peer = %#v, want PeerChannel(%d)", self.Peer, f.channel.ID)
}
if !self.Self {
t.Fatalf("join_as channel row missing self flag for the joining user")
}
// --- 对端视角member 拉参与者列表也看到频道身份 ---
page, err := f.router.onPhoneGetGroupParticipants(memberCtx, &tg.PhoneGetGroupParticipantsRequest{
Call: input, Limit: 10,
})
if err != nil {
t.Fatalf("member getGroupParticipants: %v", err)
}
if len(page.Participants) != 1 {
t.Fatalf("member sees %d participants, want 1", len(page.Participants))
}
if pc, ok := page.Participants[0].Peer.(*tg.PeerChannel); !ok || pc.ChannelID != f.channel.ID {
t.Fatalf("member view participant peer = %#v, want PeerChannel(%d)", page.Participants[0].Peer, f.channel.ID)
}
if page.Participants[0].Self {
t.Fatalf("member view incorrectly flags channel row as self")
}
// --- 非 admin 以频道身份 join 被拒 ---
if _, err := f.router.onPhoneJoinGroupCall(memberCtx, &tg.PhoneJoinGroupCallRequest{
Call: input,
JoinAs: channelPeer,
Params: groupCallJoinParams(t, 8002),
}); err == nil {
t.Fatalf("non-admin joined as channel")
} else {
assertPhoneRPCErr(t, err, "JOIN_AS_PEER_INVALID")
}
// --- rejoin 换回本人身份:行替换而非新增 ---
rejoinRes, err := f.router.onPhoneJoinGroupCall(ownerCtx, &tg.PhoneJoinGroupCallRequest{
Call: input,
JoinAs: &tg.InputPeerSelf{},
Params: groupCallJoinParams(t, 8003),
})
if err != nil {
t.Fatalf("owner rejoin as self: %v", err)
}
rejoined := findUpdate[*tg.UpdateGroupCallParticipants](t, rejoinRes).Participants[0]
if _, ok := rejoined.Peer.(*tg.PeerUser); !ok {
t.Fatalf("rejoin-as-self participant peer = %#v, want PeerUser", rejoined.Peer)
}
page2, _ := f.router.onPhoneGetGroupParticipants(memberCtx, &tg.PhoneGetGroupParticipantsRequest{Call: input, Limit: 10})
if len(page2.Participants) != 1 {
t.Fatalf("after identity switch participants = %d, want 1 (replace not add)", len(page2.Participants))
}
}