// 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) } }) } }