fix(messages): sync recognize configured app link entities
This commit is contained in:
parent
35d3908660
commit
c9371c6048
12 changed files with 327 additions and 72 deletions
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue