@@ -5,7 +5,9 @@ package plugin
55
66import (
77 "encoding/json"
8+ "strings"
89 "testing"
10+ "unicode/utf8"
911
1012 "github.com/golang/mock/gomock"
1113 "github.com/pkg/errors"
@@ -374,3 +376,33 @@ func TestForceDisconnectUser_DeleteErrors(t *testing.T) {
374376
375377 api .AssertExpectations (t )
376378}
379+
380+ func TestTruncatePostMessage (t * testing.T ) {
381+ t .Run ("short message is returned unchanged" , func (t * testing.T ) {
382+ msg := "hello world"
383+ require .Equal (t , msg , truncatePostMessage (msg ))
384+ })
385+
386+ t .Run ("message at the rune limit is returned unchanged" , func (t * testing.T ) {
387+ msg := strings .Repeat ("a" , model .PostMessageMaxRunesV2 )
388+ require .Equal (t , msg , truncatePostMessage (msg ))
389+ })
390+
391+ t .Run ("oversized ASCII message is truncated and marker appended" , func (t * testing.T ) {
392+ msg := strings .Repeat ("a" , model .PostMessageMaxRunesV2 + 5_000 )
393+ out := truncatePostMessage (msg )
394+
395+ require .LessOrEqual (t , utf8 .RuneCountInString (out ), model .PostMessageMaxRunesV2 )
396+ require .True (t , strings .HasSuffix (out , "_… message truncated_" ))
397+ })
398+
399+ t .Run ("oversized multibyte message keeps rune boundaries" , func (t * testing.T ) {
400+ // Each rune is 3 bytes, so byte-based truncation would corrupt the output.
401+ msg := strings .Repeat ("✓" , model .PostMessageMaxRunesV2 + 1_000 )
402+ out := truncatePostMessage (msg )
403+
404+ require .LessOrEqual (t , utf8 .RuneCountInString (out ), model .PostMessageMaxRunesV2 )
405+ require .True (t , utf8 .ValidString (out ), "truncated output should remain valid UTF-8" )
406+ require .True (t , strings .HasSuffix (out , "_… message truncated_" ))
407+ })
408+ }
0 commit comments