84 lines
2.9 KiB
Go
84 lines
2.9 KiB
Go
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)
|
||
}
|
||
}
|