P0 fixes: - ModelError.Is(): use exact matching instead of substring contains() - shouldClearStickySession: add context param for cancellation/tracing P1 fixes: - TODO stubs: return 501 Not Implemented errors - validateInstanceSignature: deduplicate to shared validateCodeSignature() - Error messages: standardize to English only - http.go: remove pseudo if-else with duplicate branches
98 lines
2.1 KiB
Go
98 lines
2.1 KiB
Go
//go:build unit
|
||
|
||
package admin
|
||
|
||
import (
|
||
"testing"
|
||
|
||
"github.com/stretchr/testify/require"
|
||
)
|
||
|
||
// truncateSearchByRune 模拟 user_handler.go 中的 search 截断逻辑
|
||
func truncateSearchByRune(search string, maxRunes int) string {
|
||
if runes := []rune(search); len(runes) > maxRunes {
|
||
return string(runes[:maxRunes])
|
||
}
|
||
return search
|
||
}
|
||
|
||
func TestTruncateSearchByRune(t *testing.T) {
|
||
tests := []struct {
|
||
name string
|
||
input string
|
||
maxRunes int
|
||
wantLen int // 期望的 rune 长度
|
||
}{
|
||
{
|
||
name: "纯中文超长",
|
||
input: string(make([]rune, 150)),
|
||
maxRunes: 100,
|
||
wantLen: 100,
|
||
},
|
||
{
|
||
name: "纯 ASCII 超长",
|
||
input: string(make([]byte, 150)),
|
||
maxRunes: 100,
|
||
wantLen: 100,
|
||
},
|
||
{
|
||
name: "空字符串",
|
||
input: "",
|
||
maxRunes: 100,
|
||
wantLen: 0,
|
||
},
|
||
{
|
||
name: "恰好 100 个字符",
|
||
input: string(make([]rune, 100)),
|
||
maxRunes: 100,
|
||
wantLen: 100,
|
||
},
|
||
{
|
||
name: "不足 100 字符不截断",
|
||
input: "hello世界",
|
||
maxRunes: 100,
|
||
wantLen: 7,
|
||
},
|
||
}
|
||
|
||
for _, tc := range tests {
|
||
t.Run(tc.name, func(t *testing.T) {
|
||
result := truncateSearchByRune(tc.input, tc.maxRunes)
|
||
require.Equal(t, tc.wantLen, len([]rune(result)))
|
||
})
|
||
}
|
||
}
|
||
|
||
func TestTruncateSearchByRune_PreservesMultibyte(t *testing.T) {
|
||
// 101 个中文字符,截断到 100 个后应该仍然是有效 UTF-8
|
||
input := ""
|
||
for i := 0; i < 101; i++ {
|
||
input += "中"
|
||
}
|
||
result := truncateSearchByRune(input, 100)
|
||
|
||
require.Equal(t, 100, len([]rune(result)))
|
||
// 验证截断结果是有效的 UTF-8(每个中文字符 3 字节)
|
||
require.Equal(t, 300, len(result))
|
||
}
|
||
|
||
func TestTruncateSearchByRune_MixedASCIIAndMultibyte(t *testing.T) {
|
||
// 50 个 ASCII + 51 个中文 = 101 个 rune
|
||
input := ""
|
||
for i := 0; i < 50; i++ {
|
||
input += "a"
|
||
}
|
||
for i := 0; i < 51; i++ {
|
||
input += "中"
|
||
}
|
||
result := truncateSearchByRune(input, 100)
|
||
|
||
runes := []rune(result)
|
||
require.Equal(t, 100, len(runes))
|
||
// 前 50 个应该是 'a',后 50 个应该是 '中'
|
||
require.Equal(t, 'a', runes[0])
|
||
require.Equal(t, 'a', runes[49])
|
||
require.Equal(t, '中', runes[50])
|
||
require.Equal(t, '中', runes[99])
|
||
}
|