mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
This commit centralizes tool name sanitization in SanitizeFunctionName, applying character compliance, starting character rules, and length limits. It also fixes a regression in gemini_schema tests and preserves MCP-specific shortening logic while ensuring compliance. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
57 lines
2.5 KiB
Go
57 lines
2.5 KiB
Go
package util
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestSanitizeFunctionName(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input string
|
|
expected string
|
|
}{
|
|
{"Normal", "valid_name", "valid_name"},
|
|
{"With Dots", "name.with.dots", "name.with.dots"},
|
|
{"With Colons", "name:with:colons", "name:with:colons"},
|
|
{"With Dashes", "name-with-dashes", "name-with-dashes"},
|
|
{"Mixed Allowed", "name.with_dots:colons-dashes", "name.with_dots:colons-dashes"},
|
|
{"Invalid Characters", "name!with@invalid#chars", "name_with_invalid_chars"},
|
|
{"Spaces", "name with spaces", "name_with_spaces"},
|
|
{"Non-ASCII", "name_with_你好_chars", "name_with____chars"},
|
|
{"Starts with digit", "123name", "_123name"},
|
|
{"Starts with dot", ".name", "_.name"},
|
|
{"Starts with colon", ":name", "_:name"},
|
|
{"Starts with dash", "-name", "_-name"},
|
|
{"Starts with invalid char", "!name", "_name"},
|
|
{"Exactly 64 chars", "this_is_a_very_long_name_that_exactly_reaches_sixty_four_charact", "this_is_a_very_long_name_that_exactly_reaches_sixty_four_charact"},
|
|
{"Too long (65 chars)", "this_is_a_very_long_name_that_exactly_reaches_sixty_four_charactX", "this_is_a_very_long_name_that_exactly_reaches_sixty_four_charact"},
|
|
{"Very long", "this_is_a_very_long_name_that_exceeds_the_sixty_four_character_limit_for_function_names", "this_is_a_very_long_name_that_exceeds_the_sixty_four_character_l"},
|
|
{"Starts with digit (64 chars total)", "1234567890123456789012345678901234567890123456789012345678901234", "_123456789012345678901234567890123456789012345678901234567890123"},
|
|
{"Starts with invalid char (64 chars total)", "!234567890123456789012345678901234567890123456789012345678901234", "_234567890123456789012345678901234567890123456789012345678901234"},
|
|
{"Empty", "", ""},
|
|
{"Single character invalid", "@", "_"},
|
|
{"Single character valid", "a", "a"},
|
|
{"Single character digit", "1", "_1"},
|
|
{"Single character underscore", "_", "_"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := SanitizeFunctionName(tt.input)
|
|
if got != tt.expected {
|
|
t.Errorf("SanitizeFunctionName(%q) = %v, want %v", tt.input, got, tt.expected)
|
|
}
|
|
// Verify Gemini compliance
|
|
if len(got) > 64 {
|
|
t.Errorf("SanitizeFunctionName(%q) result too long: %d", tt.input, len(got))
|
|
}
|
|
if len(got) > 0 {
|
|
first := got[0]
|
|
if !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || first == '_') {
|
|
t.Errorf("SanitizeFunctionName(%q) result starts with invalid char: %c", tt.input, first)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|