package truncate_test
import (
"strings"
"testing"
"mercemay.top/src/lambdalog/internal/encoder"
"mercemay.top/src/lambdalog/internal/encoder/json/truncate"
)
func TestApply_NoOpWhenSmall(t *testing.T) {
r := encoder.Record{Level: "info", Message: "x", Fields: []encoder.Field{{Key: "k", Value: "v"}}}
changed := truncate.Apply(&r)
if changed {
t.Fatalf("unexpected truncation")
}
if len(r.Fields) != 1 {
t.Fatalf("fields length changed: %d", len(r.Fields))
}
}
func TestApply_TruncatesHugeField(t *testing.T) {
big := strings.Repeat("x", truncate.FieldMaxBytes+1000)
r := encoder.Record{Fields: []encoder.Field{{Key: "payload", Value: big}}}
changed := truncate.Apply(&r)
if !changed {
t.Fatal("expected truncation")
}
got, ok := r.Fields[0].Value.(string)
if !ok {
t.Fatalf("field no longer string: %T", r.Fields[0].Value)
}
if !strings.HasSuffix(got, truncate.Ellipsis) {
t.Fatalf("missing ellipsis: ...%s", got[len(got)-20:])
}
if len(got) != truncate.FieldMaxBytes {
t.Fatalf("got %d bytes, want %d", len(got), truncate.FieldMaxBytes)
}
}
func TestApply_DropsTailFields(t *testing.T) {
defer func(prev int) { truncate.MaxBytes = prev }(truncate.MaxBytes)
truncate.MaxBytes = 256
r := encoder.Record{
Level: "info",
Message: "hello",
Fields: []encoder.Field{
{Key: "a", Value: strings.Repeat("a", 100)},
{Key: "b", Value: strings.Repeat("b", 100)},
{Key: "c", Value: strings.Repeat("c", 100)},
},
}
before := r
if !truncate.Apply(&r) {
t.Fatal("expected truncation")
}
if len(r.Fields) >= len(before.Fields) {
t.Fatalf("no fields dropped: before=%d after=%d", len(before.Fields), len(r.Fields))
}
sum := truncate.Describe(before, r)
if sum.DroppedFields == 0 {
t.Fatalf("describe reports no drop: %+v", sum)
}
}
func TestApply_TruncatesOversizeMessage(t *testing.T) {
defer func(prev int) { truncate.MaxBytes = prev }(truncate.MaxBytes)
truncate.MaxBytes = 128
r := encoder.Record{Level: "info", Message: strings.Repeat("m", 500)}
before := r
if !truncate.Apply(&r) {
t.Fatal("expected truncation")
}
if !strings.HasSuffix(r.Message, truncate.Ellipsis) {
t.Fatalf("no ellipsis: %s", r.Message)
}
sum := truncate.Describe(before, r)
if !sum.TruncatedMsg {
t.Fatalf("describe should flag message truncation: %+v", sum)
}
}
func TestDescribe_Noop(t *testing.T) {
r := encoder.Record{Message: "hi"}
got := truncate.Describe(r, r)
if got.DroppedFields != 0 || got.TruncatedMsg {
t.Fatalf("unexpected summary: %+v", got)
}
}