internal/encoder/json/truncate/truncate_test.go

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