- handler/devices_test.go: validateIdentifier (charset/лимиты, запрет _ + # /). - iotpg/dsn_test.go: replaceDSNDatabase (вкл. sslrootcert со слэшем, ошибка для key=value) + safeNamespaceRe. - gofmt для затронутых файлов. go test ./... зелёный.
43 lines
1.5 KiB
Go
43 lines
1.5 KiB
Go
// devices_test.go — тесты валидации идентификаторов (validateIdentifier).
|
|
//
|
|
// Покрывают charset/лимиты, критичные для MQTT (username/topic) и PG (имя БД):
|
|
// запрет _, +, #, /, ведущего дефиса, пробелов и превышения длины.
|
|
package handler
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestValidateIdentifier(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
value string
|
|
maxLen int
|
|
wantOK bool
|
|
}{
|
|
{"простое имя", "boiler", 64, true},
|
|
{"дефис внутри", "boiler-1", 64, true},
|
|
{"одна буква", "a", 64, true},
|
|
{"цифры", "dev001", 64, true},
|
|
{"подчёркивание запрещено", "a_b", 64, false},
|
|
{"плюс запрещён (wildcard MQTT)", "a+b", 64, false},
|
|
{"решётка запрещена (wildcard MQTT)", "a#b", 64, false},
|
|
{"слэш запрещён (уровень топика)", "a/b", 64, false},
|
|
{"ведущий дефис", "-abc", 64, false},
|
|
{"пробел", "abc def", 64, false},
|
|
{"пусто", "", 64, false},
|
|
{"юникод", "имя", 64, false},
|
|
{"ровно максимум", strings.Repeat("a", 56), 56, true},
|
|
{"больше максимума", strings.Repeat("a", 57), 56, false},
|
|
}
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
gotOK := validateIdentifier(c.value, "x", c.maxLen) == ""
|
|
if gotOK != c.wantOK {
|
|
t.Errorf("validateIdentifier(%q, max=%d) ok=%v, want %v", c.value, c.maxLen, gotOK, c.wantOK)
|
|
}
|
|
})
|
|
}
|
|
}
|