pkg-proxy/internal/handler/read_metadata_test.go
Andrew Nesbitt 8b762ffb39
Fix silent truncation of large npm metadata responses
ReadMetadata used io.LimitReader which silently truncated responses at
the size limit. For packages like drizzle-orm (~92MB metadata), this
produced invalid JSON that was served to clients.

Now returns ErrMetadataTooLarge when the limit is exceeded, and bumps
the limit from 50MB to 100MB.

Fixes #78
2026-04-08 16:02:30 +01:00

45 lines
1 KiB
Go

package handler
import (
"bytes"
"errors"
"testing"
)
func TestReadMetadata(t *testing.T) {
t.Run("small body", func(t *testing.T) {
data := []byte("hello world")
got, err := ReadMetadata(bytes.NewReader(data))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if !bytes.Equal(got, data) {
t.Errorf("got %q, want %q", got, data)
}
})
t.Run("exactly at limit", func(t *testing.T) {
data := make([]byte, maxMetadataSize)
for i := range data {
data[i] = 'x'
}
got, err := ReadMetadata(bytes.NewReader(data))
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(got) != int(maxMetadataSize) {
t.Errorf("got length %d, want %d", len(got), maxMetadataSize)
}
})
t.Run("over limit returns error", func(t *testing.T) {
data := make([]byte, maxMetadataSize+100)
for i := range data {
data[i] = 'x'
}
_, err := ReadMetadata(bytes.NewReader(data))
if !errors.Is(err, ErrMetadataTooLarge) {
t.Errorf("got error %v, want ErrMetadataTooLarge", err)
}
})
}