owpengram-server/internal/rpc/self_flag_emission_test.go

84 lines
2.9 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"
"telesrv/internal/domain"
)
// DrKLO 的 UserObject.isUserSelf 只看 user.self flag服务端任何把"请求者自己的 user"
// 用 self=false 形态下发的路径,都会让 Android putUsers 覆盖账号缓存Saved Messages
// 退化为普通自聊。本测试锁定几个曾漏 self 分支的 channel/global 历史转换出口viewer
// 自己出现在 users 集合时必须带 self 标志。
// selfFlag 在 users 里定位 viewer返回其 self 标志(找不到时 fail
func selfFlag(t *testing.T, users []tg.UserClass, viewerID int64) bool {
t.Helper()
for _, uc := range users {
u, ok := uc.(*tg.User)
if !ok || u.ID != viewerID {
continue
}
return u.Self
}
t.Fatalf("viewer %d missing from users slice", viewerID)
return false
}
func TestChannelHistoryMessagesMarksViewerSelf(t *testing.T) {
const viewer = int64(1001)
history := domain.ChannelHistory{
Channel: domain.Channel{ID: 40, AccessHash: 7, Megagroup: true},
Users: []domain.User{
{ID: viewer, AccessHash: 5, FirstName: "Me"},
{ID: 2002, AccessHash: 6, FirstName: "Other"},
},
}
out, ok := tgChannelHistoryMessages(viewer, history).(*tg.MessagesChannelMessages)
if !ok {
t.Fatalf("expected MessagesChannelMessages, got %T", tgChannelHistoryMessages(viewer, history))
}
if !selfFlag(t, out.Users, viewer) {
t.Fatal("viewer's own user must carry self flag in channel history (Saved Messages cache integrity)")
}
if selfFlag(t, out.Users, 2002) {
t.Fatal("other user must not carry self flag")
}
}
func TestChannelSearchPostsMessagesMarksViewerSelf(t *testing.T) {
const viewer = int64(1001)
history := domain.ChannelHistory{
Channel: domain.Channel{ID: 40, AccessHash: 7, Megagroup: true},
Count: 5, // 触发 MessagesMessagesSlice 分支
Channels: []domain.Channel{{ID: 40, AccessHash: 7, Megagroup: true}},
Users: []domain.User{{ID: viewer, AccessHash: 5, FirstName: "Me"}},
}
slice, ok := tgChannelSearchPostsMessages(viewer, history).(*tg.MessagesMessagesSlice)
if !ok {
t.Fatalf("expected MessagesMessagesSlice, got %T", tgChannelSearchPostsMessages(viewer, history))
}
if !selfFlag(t, slice.Users, viewer) {
t.Fatal("viewer self flag lost in channel post search")
}
}
func TestGlobalSearchMessagesMarksViewerSelf(t *testing.T) {
const viewer = int64(1001)
private := domain.MessageList{Users: []domain.User{{ID: viewer, AccessHash: 5, FirstName: "Me"}}}
channel := domain.ChannelHistory{Users: []domain.User{{ID: viewer, AccessHash: 5, FirstName: "Me"}}}
switch out := tgGlobalSearchMessages(viewer, 50, private, channel).(type) {
case *tg.MessagesMessages:
if !selfFlag(t, out.Users, viewer) {
t.Fatal("viewer self flag lost in global search (messages)")
}
case *tg.MessagesMessagesSlice:
if !selfFlag(t, out.Users, viewer) {
t.Fatal("viewer self flag lost in global search (slice)")
}
default:
t.Fatalf("unexpected global search result type %T", out)
}
}