77 lines
2.4 KiB
Go
77 lines
2.4 KiB
Go
package rpc
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"testing"
|
||
|
||
"github.com/gotd/td/tg"
|
||
|
||
"telesrv/internal/domain"
|
||
)
|
||
|
||
// TestWebPagePreviewMedia 验证 getWebPagePreview 的 media 决策:done 卡片→messageMediaWebPage,
|
||
// 无链接/解析失败/非 done 一律 messageMediaEmpty(绝不返回 pending、绝不报错)。
|
||
func TestWebPagePreviewMedia(t *testing.T) {
|
||
ctx := context.Background()
|
||
urlEntities := []tg.MessageEntityClass{&tg.MessageEntityURL{Offset: 0, Length: 9}} // "https://x"
|
||
|
||
doneCard := domain.MessageWebPage{
|
||
State: domain.MessageWebPageStateDone,
|
||
ID: 42,
|
||
URL: "https://x",
|
||
DisplayURL: "x",
|
||
Title: "Hello",
|
||
Photo: &domain.Photo{
|
||
ID: 7, AccessHash: 8, DCID: 2,
|
||
Sizes: []domain.PhotoSize{{Kind: domain.PhotoSizeKindDefault, Type: "x", W: 320, H: 200, Size: 1024}},
|
||
},
|
||
}
|
||
|
||
files := &fakeFiles{resolveWebPageFn: func(string) (domain.MessageWebPage, error) { return doneCard, nil }}
|
||
r := &Router{deps: Deps{Files: files}}
|
||
|
||
t.Run("done-card", func(t *testing.T) {
|
||
media := r.webPagePreviewMedia(ctx, "https://x", urlEntities)
|
||
wrap, ok := media.(*tg.MessageMediaWebPage)
|
||
if !ok {
|
||
t.Fatalf("media = %T, want *tg.MessageMediaWebPage", media)
|
||
}
|
||
page, ok := wrap.Webpage.(*tg.WebPage)
|
||
if !ok {
|
||
t.Fatalf("webpage = %T, want *tg.WebPage", wrap.Webpage)
|
||
}
|
||
if v, _ := page.GetTitle(); v != "Hello" {
|
||
t.Fatalf("title = %q, want Hello", v)
|
||
}
|
||
})
|
||
|
||
t.Run("no-url", func(t *testing.T) {
|
||
if media := r.webPagePreviewMedia(ctx, "plain text", nil); !isEmptyMedia(media) {
|
||
t.Fatalf("media = %T, want empty", media)
|
||
}
|
||
})
|
||
|
||
t.Run("resolve-error-degrades", func(t *testing.T) {
|
||
files.resolveWebPageFn = func(string) (domain.MessageWebPage, error) {
|
||
return domain.MessageWebPage{}, errors.New("boom")
|
||
}
|
||
if media := r.webPagePreviewMedia(ctx, "https://x", urlEntities); !isEmptyMedia(media) {
|
||
t.Fatalf("media = %T, want empty on error", media)
|
||
}
|
||
})
|
||
|
||
t.Run("non-done-state-degrades", func(t *testing.T) {
|
||
files.resolveWebPageFn = func(string) (domain.MessageWebPage, error) {
|
||
return domain.MessageWebPage{State: domain.MessageWebPageStateEmpty, ID: 1, URL: "https://x"}, nil
|
||
}
|
||
if media := r.webPagePreviewMedia(ctx, "https://x", urlEntities); !isEmptyMedia(media) {
|
||
t.Fatalf("media = %T, want empty for empty-state webpage", media)
|
||
}
|
||
})
|
||
}
|
||
|
||
func isEmptyMedia(m tg.MessageMediaClass) bool {
|
||
_, ok := m.(*tg.MessageMediaEmpty)
|
||
return ok
|
||
}
|