Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EventLoader unable to correctly deserialize posted json body data for APIGateway events #432

Open
bakerhaasis opened this issue Aug 7, 2023 · 2 comments

Comments

@bakerhaasis
Copy link

Using aws-lambda-java-tests v 1.1.1 and attempting to write a unit test for my lambda function handler (integrated with API Gateway).

Here is a snippet from my junit test - attempting to load a test event to pass to the handler function:

APIGatewayV2HTTPEvent event = EventLoader.loadApiGatewayHttpEvent("events/broken.json");

//proceed to pass the event to the function handler

The contents of the file 'broken.json' are as follows :

{
  "version": "2.0",
  "headers": {
    "content-type":"application/json"
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "api-id"
    }
  ,
  "body": {
  	"firstName":"John",
  	"lastName":"Doe",
  	"nickName":"Jonny D"
  },
  "isBase64Encoded": false
}

All the documentation and examples I've found only use a string as the body, but this is a fairly common use case (an HTTP API accepting json data into a POST for updating information). From above, the body has a simple json object structure representing a person. Because the APIGatewayV2HTTPEvent defines the body as a string, the EventLoader fails with the following exception:

java.io.UncheckedIOException: com.amazonaws.lambda.thirdparty.com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
 at [Source: (BufferedInputStream); line: 11, column: 11] (through reference chain: com.amazonaws.services.lambda.runtime.events.APIGatewayV2HTTPEvent["body"])

What am I missing here? Is this a deficiency in the EventLoader class, or am I attempting to test this behavior in the wrong way?

@msailes
Copy link
Collaborator

msailes commented Aug 7, 2023

When you use API Gateway and Lambda now, does the body come as base64 encoded?

@bakerhaasis
Copy link
Author

If you mean whether it is base64 encoded when I call through the API Gateway to the deployed version in AWS, no - I am logging the event from within the lambda and it shows isBase64Encoded: false
As a side note, the lambda works fine deployed to AWS - it is able to parse the input without problem. However, the EventLoader has problems in my unit test code when trying to replicate the event.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants