adapters/apigateway/v2/gateway_test.go

package v2_test

import (
	"context"
	"errors"
	"testing"

	"github.com/aws/aws-lambda-go/events"

	v2 "mercemay.top/src/lambdalog/adapters/apigateway/v2"
)

type capture struct{ msgs []string }

func (c *capture) Info(msg string, _ ...v2.Field)  { c.msgs = append(c.msgs, "info:"+msg) }
func (c *capture) Error(msg string, _ ...v2.Field) { c.msgs = append(c.msgs, "error:"+msg) }
func (c *capture) With(_ ...v2.Field) v2.Logger    { return c }

func request() events.APIGatewayV2HTTPRequest {
	return events.APIGatewayV2HTTPRequest{
		RouteKey: "GET /x",
		RequestContext: events.APIGatewayV2HTTPRequestContext{
			RequestID: "req-2",
			HTTP: events.APIGatewayV2HTTPRequestContextHTTPDescription{
				Method: "GET", Path: "/x", SourceIP: "1.2.3.4",
			},
		},
	}
}

func TestWrap_HappyPath(t *testing.T) {
	c := &capture{}
	h := v2.Wrap(c, func(ctx context.Context, req events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) {
		return events.APIGatewayV2HTTPResponse{StatusCode: 204}, nil
	})
	if _, err := h(context.Background(), request()); err != nil {
		t.Fatalf("err: %v", err)
	}
	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{}
	h := v2.Wrap(c, func(ctx context.Context, req events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) {
		return events.APIGatewayV2HTTPResponse{}, errors.New("boom")
	})
	if _, err := h(context.Background(), request()); err == nil {
		t.Fatal("expected error")
	}
	if c.msgs[len(c.msgs)-1] != "error:http.request.end" {
		t.Fatalf("msgs: %v", c.msgs)
	}
}

func TestExtractFields(t *testing.T) {
	fs := v2.ExtractFields(request())
	if len(fs) != 5 {
		t.Fatalf("fields: %#v", fs)
	}
}

func TestJSONResponse(t *testing.T) {
	r := v2.JSONResponse(200, `{"a":1}`)
	if r.Headers["Content-Type"] != "application/json" {
		t.Fatalf("headers: %+v", r.Headers)
	}
}

func TestErrorResponse(t *testing.T) {
	r := v2.ErrorResponse(503, "x")
	if r.StatusCode != 503 || r.Body != "x" {
		t.Fatalf("%+v", r)
	}
}