owpengram-server/internal/domain/message_entity_autodetect_test.go
2026-09-01 12:06:31 +03:00

82 lines
2.5 KiB
Go

package domain
import (
"reflect"
"strings"
"testing"
)
func TestDetectAutomaticMessageEntitiesUsesUTF16AndWhitespaceBoundaries(t *testing.T) {
message := "اعلان 🚀\n\n@matrixG"
want := []MessageEntity{{Type: MessageEntityMention, Offset: 10, Length: 8}}
if got := DetectAutomaticMessageEntities(message, nil); !reflect.DeepEqual(got, want) {
t.Fatalf("entities = %+v, want %+v", got, want)
}
}
func TestDetectAutomaticMessageEntitiesCoversLexicalTypes(t *testing.T) {
message := "@alice #golang $USD /help@matrix_bot"
want := []MessageEntity{
{Type: MessageEntityMention, Offset: 0, Length: 6},
{Type: MessageEntityHashtag, Offset: 7, Length: 7},
{Type: MessageEntityCashtag, Offset: 15, Length: 4},
{Type: MessageEntityBotCommand, Offset: 20, Length: 16},
}
if got := DetectAutomaticMessageEntities(message, nil); !reflect.DeepEqual(got, want) {
t.Fatalf("entities = %+v, want %+v", got, want)
}
}
func TestDetectAutomaticMessageEntitiesSkipsEmailURLsAndOccupiedRanges(t *testing.T) {
message := "mail bob@example.com https://t.me/@scam github.com/@other @real"
got := DetectAutomaticMessageEntities(message, []MessageEntitySpan{{Offset: 58, Length: 5}})
if len(got) != 0 {
t.Fatalf("entities = %+v, want no email, URL-path or occupied mention", got)
}
}
func TestDetectAutomaticMessageEntitiesMentionBoundaries(t *testing.T) {
tests := []struct {
name string
message string
want []MessageEntity
}{
{
name: "maximum username length",
message: "\n@" + strings.Repeat("a", 32),
want: []MessageEntity{{Type: MessageEntityMention, Offset: 1, Length: 33}},
},
{
name: "username too long",
message: "@" + strings.Repeat("a", 33),
},
{
name: "unicode word prefix",
message: "نام@matrixG",
},
{
name: "duplicate at prefix",
message: "@@matrixG",
},
{
name: "punctuation boundary",
message: "(@matrixG)",
want: []MessageEntity{{Type: MessageEntityMention, Offset: 1, Length: 8}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := DetectAutomaticMessageEntities(tt.message, nil); !reflect.DeepEqual(got, tt.want) {
t.Fatalf("entities = %+v, want %+v", got, tt.want)
}
})
}
}
func TestDetectAutomaticMessageEntitiesCapsDerivedEntities(t *testing.T) {
message := strings.Repeat("@a ", MaxMessageEntityCount+1)
got := DetectAutomaticMessageEntities(message, nil)
if len(got) != MaxMessageEntityCount {
t.Fatalf("entity count = %d, want %d", len(got), MaxMessageEntityCount)
}
}