fix(messages): sync recognize configured app link entities

This commit is contained in:
iamxvbaba 2026-08-01 00:12:02 +08:00
parent 35d3908660
commit c9371c6048
12 changed files with 327 additions and 72 deletions

View file

@ -227,6 +227,110 @@ func TestSendMessageHighlightsBareURL(t *testing.T) {
}
}
// TestSendMessageHighlightsConfiguredAppLink locks the server-only compatibility
// contract: clients may omit the custom-scheme entity, while the persisted/echoed
// message still carries MessageEntityURL and never starts webpage resolution.
func TestSendMessageHighlightsConfiguredAppLink(t *testing.T) {
ctx := context.Background()
r, owner, friend := newMediaTestRouter(t)
r.deps.Files.(*fakeFiles).webPagePreviewOn = true
message := "👍 telesrv://resolve?domain=Alice"
updates, err := r.onMessagesSendMessage(WithUserID(ctx, owner.ID), &tg.MessagesSendMessageRequest{
Peer: &tg.InputPeerUser{UserID: friend.ID, AccessHash: friend.AccessHash},
Message: message,
RandomID: 5302,
})
if err != nil {
t.Fatalf("sendMessage: %v", err)
}
msg := newMessageFromUpdates(t, updates)
if msg.Media != nil {
t.Fatalf("custom app-link media = %T, want nil", msg.Media)
}
for _, entity := range msg.Entities {
if url, ok := entity.(*tg.MessageEntityURL); ok && url.Offset == 3 && url.Length == utf16CodeUnitLen("telesrv://resolve?domain=Alice") {
return
}
}
t.Fatalf("sent message missing configured app-link entity: %+v", msg.Entities)
}
// TestSendMessageFillsCustomLinkBesideClientHTTPEntity covers the partial-client
// case exposed by Android: an existing HTTP entity must not suppress app-link detection.
func TestSendMessageFillsCustomLinkBesideClientHTTPEntity(t *testing.T) {
ctx := context.Background()
r, owner, friend := newMediaTestRouter(t)
message := "https://x telesrv://resolve?domain=Alice"
updates, err := r.onMessagesSendMessage(WithUserID(ctx, owner.ID), &tg.MessagesSendMessageRequest{
Peer: &tg.InputPeerUser{UserID: friend.ID, AccessHash: friend.AccessHash},
Message: message,
Entities: []tg.MessageEntityClass{&tg.MessageEntityURL{Offset: 0, Length: utf16CodeUnitLen("https://x")}},
RandomID: 5303,
})
if err != nil {
t.Fatalf("sendMessage: %v", err)
}
msg := newMessageFromUpdates(t, updates)
if len(msg.Entities) != 2 {
t.Fatalf("message entities = %+v, want client HTTP plus server app-link", msg.Entities)
}
custom, ok := msg.Entities[1].(*tg.MessageEntityURL)
if !ok || custom.Offset != utf16CodeUnitLen("https://x ") || custom.Length != utf16CodeUnitLen("telesrv://resolve?domain=Alice") {
t.Fatalf("custom entity = %#v", msg.Entities[1])
}
}
func TestAutoEntityDerivationDoesNotMutateSendRequests(t *testing.T) {
t.Run("send-message-replay", func(t *testing.T) {
ctx := context.Background()
r, owner, friend := newMediaTestRouter(t)
req := &tg.MessagesSendMessageRequest{
Peer: &tg.InputPeerUser{UserID: friend.ID, AccessHash: friend.AccessHash},
Message: "telesrv://resolve?domain=Alice",
RandomID: 5304,
}
first, err := r.onMessagesSendMessage(WithUserID(ctx, owner.ID), req)
if err != nil {
t.Fatalf("first sendMessage: %v", err)
}
if len(req.Entities) != 0 {
t.Fatalf("sendMessage request was mutated: %+v", req.Entities)
}
if _, err := r.onMessagesSendMessage(WithUserID(ctx, owner.ID), req); err != nil {
t.Fatalf("sendMessage replay: %v", err)
}
if got := newMessageFromUpdates(t, first); len(got.Entities) != 1 {
t.Fatalf("first send entities = %+v, want derived app-link", got.Entities)
}
})
t.Run("send-media-replay", func(t *testing.T) {
ctx := context.Background()
r, owner, friend := newMediaTestRouter(t)
req := &tg.MessagesSendMediaRequest{
Peer: &tg.InputPeerUser{UserID: friend.ID, AccessHash: friend.AccessHash},
Media: &tg.InputMediaContact{PhoneNumber: "+15550005305", FirstName: "Alice"},
Message: "telesrv://resolve?domain=Alice",
RandomID: 5305,
}
first, err := r.onMessagesSendMedia(WithUserID(ctx, owner.ID), req)
if err != nil {
t.Fatalf("first sendMedia: %v", err)
}
if len(req.Entities) != 0 {
t.Fatalf("sendMedia request was mutated: %+v", req.Entities)
}
if _, err := r.onMessagesSendMedia(WithUserID(ctx, owner.ID), req); err != nil {
t.Fatalf("sendMedia replay: %v", err)
}
if got := newMessageFromUpdates(t, first); len(got.Entities) != 1 {
t.Fatalf("first media caption entities = %+v, want derived app-link", got.Entities)
}
})
}
// TestSendMessageNoURLNoPlaceholder 验证无 URL 实体时不挂占位。
func TestSendMessageNoURLNoPlaceholder(t *testing.T) {
ctx := context.Background()