package v1_test
import (
"context"
"errors"
"testing"
"github.com/aws/aws-lambda-go/events"
v1 "mercemay.top/src/lambdalog/adapters/apigateway/v1"
)
type capture struct{ msgs []string }
func (c *capture) Info(msg string, _ ...v1.Field) { c.msgs = append(c.msgs, "info:"+msg) }
func (c *capture) Error(msg string, _ ...v1.Field) { c.msgs = append(c.msgs, "error:"+msg) }
func (c *capture) With(_ ...v1.Field) v1.Logger { return c }
func TestWrap_HappyPath(t *testing.T) {
c := &capture{}
h := v1.Wrap(c, func(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
return events.APIGatewayProxyResponse{StatusCode: 200, Body: "ok"}, nil
})
resp, err := h(context.Background(), events.APIGatewayProxyRequest{HTTPMethod: "GET", Path: "/x"})
if err != nil {
t.Fatalf("err: %v", err)
}
if resp.StatusCode != 200 {
t.Fatalf("status: %d", resp.StatusCode)
}
if len(c.msgs) != 2 || c.msgs[1] != "info:http.request.end" {
t.Fatalf("msgs: %v", c.msgs)
}
}
func TestWrap_Error(t *testing.T) {
c := &capture{}
boom := errors.New("boom")
h := v1.Wrap(c, func(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
return events.APIGatewayProxyResponse{}, boom
})
if _, err := h(context.Background(), events.APIGatewayProxyRequest{}); !errors.Is(err, boom) {
t.Fatalf("err = %v, want boom", err)
}
if c.msgs[len(c.msgs)-1] != "error:http.request.end" {
t.Fatalf("msgs: %v", c.msgs)
}
}
func TestExtractFields(t *testing.T) {
req := events.APIGatewayProxyRequest{
HTTPMethod: "POST", Path: "/a",
RequestContext: events.APIGatewayProxyRequestContext{
Stage: "prod", RequestID: "abc",
Identity: events.APIGatewayRequestIdentity{SourceIP: "1.2.3.4"},
},
}
fs := v1.ExtractFields(req)
if len(fs) != 5 {
t.Fatalf("fields: %#v", fs)
}
}
func TestResponseSize(t *testing.T) {
plain := events.APIGatewayProxyResponse{Body: "hello"}
if got := v1.ResponseSize(plain); got != 5 {
t.Fatalf("plain size: %d", got)
}
b64 := events.APIGatewayProxyResponse{IsBase64Encoded: true, Body: "aGVsbG8="}
if got := v1.ResponseSize(b64); got < 4 || got > 6 {
t.Fatalf("b64 size: %d", got)
}
}
func TestErrorResponse(t *testing.T) {
r := v1.ErrorResponse(500, "x")
if r.StatusCode != 500 || r.Body != "x" || r.Headers["Content-Type"] == "" {
t.Fatalf("got %+v", r)
}
}