package account import ( "strings" "testing" "unicode/utf8" ) // TestTelegramSeed covers the pure mapping from Telegram launch fields to the // create-time account seed: supported-language detection (bare and region-tagged), // the first-name / username display-name precedence, and trimming. func TestTelegramSeed(t *testing.T) { cases := map[string]struct { languageCode, username, firstName string wantLang, wantName string }{ "ru bare": {"ru", "user", "Иван", "ru", "Иван"}, "en region-tagged": {"en-US", "user", "John", "en", "John"}, "ru region-tagged": {"ru-RU", "", "Пётр", "ru", "Пётр"}, "unknown language": {"fr", "frodo", "Frodo", "", "Frodo"}, "empty language": {"", "neo", "Neo", "", "Neo"}, "first name wins": {"en", "handle", "Real Name", "en", "Real Name"}, "username fallback": {"en", "handle", "", "en", "handle"}, "both empty": {"en", "", "", "en", ""}, "trimmed": {" RU ", " ", " Anna ", "ru", "Anna"}, } for name, tc := range cases { t.Run(name, func(t *testing.T) { got := telegramSeed(tc.languageCode, tc.username, tc.firstName) if got.preferredLanguage != tc.wantLang { t.Errorf("preferredLanguage = %q, want %q", got.preferredLanguage, tc.wantLang) } if got.displayName != tc.wantName { t.Errorf("displayName = %q, want %q", got.displayName, tc.wantName) } }) } } // TestTelegramSeedTruncatesLongName checks an over-long Telegram name is capped to // maxDisplayName runes (counted in runes, not bytes). func TestTelegramSeedTruncatesLongName(t *testing.T) { long := strings.Repeat("я", maxDisplayName+5) got := telegramSeed("ru", "", long) if n := utf8.RuneCountInString(got.displayName); n != maxDisplayName { t.Errorf("display name rune count = %d, want %d", n, maxDisplayName) } }