fix(rpc): preserve verification icons in message envelopes

This commit is contained in:
epilepticseizureee 2026-07-29 23:37:43 +03:00
parent cec4361d8b
commit f0bd6c9699
8 changed files with 138 additions and 19 deletions

View file

@ -679,3 +679,106 @@ func TestUsersGetUsersResolvesBotVerificationInOneBatch(t *testing.T) {
verify.batchCalls, verify.peerCalls)
}
}
// TestOpeningChatMessageLookupsKeepBotVerificationIcons covers the supplemental
// message lookups official clients issue while opening a chat. These responses
// update the same peer cache as messages.getDialogs, so returning an unstamped
// user/channel here makes a visible badge disappear until the dialogs response is
// loaded again.
func TestOpeningChatMessageLookupsKeepBotVerificationIcons(t *testing.T) {
t.Run("private messages.getMessages", func(t *testing.T) {
const (
viewerID = int64(1000000001)
targetID = int64(1000000002)
iconID = int64(8800010)
)
verify := newFakeBotVerifications()
peer := domain.Peer{Type: domain.PeerTypeUser, ID: targetID}
verify.marks[peer] = domain.CustomVerification{
VerifierBotID: 777000123,
Peer: peer,
IconDocumentID: iconID,
Description: "Verified by Acme Trust",
}
r := New(Config{}, Deps{
Messages: &captureMessages{list: domain.MessageList{
Messages: []domain.Message{{
ID: 7,
OwnerUserID: viewerID,
Peer: peer,
From: peer,
Date: 1700000000,
Body: "reply source",
}},
Count: 1,
}},
Users: mapUsersService{users: map[int64]domain.User{
viewerID: {ID: viewerID, FirstName: "Viewer"},
targetID: {ID: targetID, FirstName: "Target"},
}},
BotVerifications: verify,
}, zaptest.NewLogger(t), clock.System)
result, err := r.onMessagesGetMessages(
WithUserID(context.Background(), viewerID),
[]tg.InputMessageClass{&tg.InputMessageID{ID: 7}},
)
if err != nil {
t.Fatalf("messages.getMessages: %v", err)
}
box := result.(*tg.MessagesMessages)
if len(box.Users) != 1 {
t.Fatalf("users = %d, want target user", len(box.Users))
}
user := &tg.User{}
tlRoundTrip(t, box.Users[0].(*tg.User), user)
if icon, ok := user.GetBotVerificationIcon(); !ok || icon != iconID {
t.Fatalf("opening-chat user bot_verification_icon = %d, ok=%v, want %d", icon, ok, iconID)
}
})
t.Run("channel channels.getMessages", func(t *testing.T) {
const iconID = int64(8800011)
f := newBotVerificationFixture(t, newFakeBotVerifications())
group := f.botVerificationGroup(t, "Verified Group")
sent, err := f.router.onMessagesSendMessage(
WithUserID(context.Background(), f.owner.ID),
&tg.MessagesSendMessageRequest{
Peer: &tg.InputPeerChannel{ChannelID: group.ID, AccessHash: group.AccessHash},
Message: "pinned source",
RandomID: 8800011,
},
)
if err != nil {
t.Fatalf("send channel message: %v", err)
}
messageID := sent.(*tg.Updates).Updates[1].(*tg.UpdateNewChannelMessage).Message.(*tg.Message).ID
peer := domain.Peer{Type: domain.PeerTypeChannel, ID: group.ID}
f.verify.marks[peer] = domain.CustomVerification{
VerifierBotID: f.bot.ID,
Peer: peer,
IconDocumentID: iconID,
Description: "Verified by Acme Trust",
}
result, err := f.router.onChannelsGetMessages(
WithUserID(context.Background(), f.owner.ID),
&tg.ChannelsGetMessagesRequest{
Channel: &tg.InputChannel{ChannelID: group.ID, AccessHash: group.AccessHash},
ID: []tg.InputMessageClass{&tg.InputMessageID{ID: messageID}},
},
)
if err != nil {
t.Fatalf("channels.getMessages: %v", err)
}
box := result.(*tg.MessagesMessages)
if len(box.Chats) != 1 {
t.Fatalf("chats = %d, want target channel", len(box.Chats))
}
channel := &tg.Channel{}
tlRoundTrip(t, box.Chats[0].(*tg.Channel), channel)
if icon, ok := channel.GetBotVerificationIcon(); !ok || icon != iconID {
t.Fatalf("opening-chat channel bot_verification_icon = %d, ok=%v, want %d", icon, ok, iconID)
}
})
}