adapters/apigateway/v1/gateway_test.go

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