package apptracking import ( "encoding/json" "strings" "testing" ) func TestNormalizeTextUsesBytesAndNeverTruncates(t *testing.T) { if got, ok := NormalizeText(" "+strings.Repeat("e", MaxErrorCodeBytes)+" ", MaxErrorCodeBytes); !ok || got != strings.Repeat("e", MaxErrorCodeBytes) { t.Fatalf("text at byte limit must be trimmed but otherwise preserved: ok=%v got=%q", ok, got) } if got, ok := NormalizeText(strings.Repeat("e", 185), MaxErrorCodeBytes); ok || got != "" { t.Fatalf("oversized error_code must be rejected, never truncated: ok=%v got=%q", ok, got) } // 一个汉字编码为三个 UTF-8 bytes;这里防止调用方误把字段限制实现成 rune 数。 if got, ok := NormalizeText(strings.Repeat("界", 22), MaxErrorCodeBytes); ok || got != "" { t.Fatalf("text limits must count UTF-8 bytes: ok=%v got=%q", ok, got) } } func TestNormalizePropertiesAndBatchContract(t *testing.T) { if !ValidBatchSize(1) || !ValidBatchSize(MaxBatchSize) || ValidBatchSize(0) || ValidBatchSize(MaxBatchSize+1) { t.Fatalf("batch bounds do not match the shared contract") } got, ok := NormalizeProperties(json.RawMessage(` {"screen":"home"} `)) if !ok || string(got) != `{"screen":"home"}` { t.Fatalf("valid properties mismatch: ok=%v got=%s", ok, got) } if got, ok := NormalizeProperties(json.RawMessage(`"` + strings.Repeat("x", MaxPropertiesBytes) + `"`)); ok || got != nil { t.Fatalf("properties over the encoded byte limit must be rejected: ok=%v bytes=%d", ok, len(got)) } if got, ok := NormalizeProperties(json.RawMessage(`{"broken"`)); ok || got != nil { t.Fatalf("invalid properties JSON must be rejected: ok=%v got=%s", ok, got) } }