diff --git a/pom.xml b/pom.xml
index f65bd1e6b..512b978ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,9 @@
1.7.21
1.1.7
1.1.0
+ 1.11.289
1.0.0
+ 2.0.1
2.8.5
diff --git a/serverless/pom.xml b/serverless/pom.xml
index 491946e71..85adbc859 100644
--- a/serverless/pom.xml
+++ b/serverless/pom.xml
@@ -35,6 +35,26 @@
aws-lambda-java-core
${aws-lambda-core.version}
+
+ com.amazonaws
+ aws-java-sdk-dynamodb
+ ${aws-java-sdk-dynamodb.version}
+
+
+ com.amazonaws
+ aws-java-sdk-s3
+
+
+ com.amazonaws
+ aws-java-sdk-kms
+
+
+
+
+ com.amazonaws
+ aws-lambda-java-events
+ ${aws-lambda-java-events.version}
+
com.amazonaws
aws-lambda-java-log4j
diff --git a/serverless/serverless.yml b/serverless/serverless.yml
index 8f2199d26..4affb57a8 100644
--- a/serverless/serverless.yml
+++ b/serverless/serverless.yml
@@ -21,7 +21,7 @@
# THE SOFTWARE.
#
-service: lambda-info-http-endpoint
+service: serverless-services
frameworkVersion: ">=1.2.0 <2.0.0"
@@ -41,9 +41,62 @@ package:
artifact: target/serverless.jar
functions:
- currentTime:
- handler: com.iluwatar.serverless.api.LambdaInfoApiHandler
+ lambdaInfoApi:
+ handler: com.iluwatar.serverless.faas.api.LambdaInfoApiHandler
events:
- http:
path: info
method: get
+
+ savePerson:
+ handler: com.iluwatar.serverless.baas.api.SavePersonApiHandler
+ events:
+ - http:
+ path: api/person
+ method: post
+ cors: true
+ integration: lambda-proxy
+
+ getPerson:
+ handler: com.iluwatar.serverless.baas.api.FindPersonApiHandlerr
+ events:
+ - http:
+ path: api/person/{id}
+ method: get
+ cors: true
+ integration: lambda-proxy
+
+resources:
+ Resources:
+ DynamoDbTable:
+ Type: AWS::DynamoDB::Table
+ Properties:
+ TableName: persons
+ AttributeDefinitions:
+ - AttributeName: id
+ AttributeType: S
+ KeySchema:
+ - AttributeName: id
+ KeyType: HASH
+ ProvisionedThroughput:
+ ReadCapacityUnits: 1
+ WriteCapacityUnits: 1
+ DynamoDBIamPolicy:
+ Type: AWS::IAM::Policy
+ DependsOn: DynamoDbTable
+ Properties:
+ PolicyName: lambda-dynamodb
+ PolicyDocument:
+ Version: '2012-10-17'
+ Statement:
+ - Effect: Allow
+ Action:
+ - dynamodb:GetItem
+ - dynamodb:PutItem
+ - dynamodb:UpdateItem
+ - dynamodb:DeleteItem
+ - dynamodb:Query
+ - dynamodb:Scan
+ Resource: arn:aws:dynamodb:*:*:table/persons
+ Roles:
+ - Ref: IamRoleLambdaExecution
\ No newline at end of file
diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java
new file mode 100644
index 000000000..2ff4ad961
--- /dev/null
+++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java
@@ -0,0 +1,79 @@
+package com.iluwatar.serverless.baas.api;
+
+import com.amazonaws.regions.Regions;
+import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
+import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * abstract dynamodb handler
+ * @param - serializable collection
+ */
+public abstract class AbstractDynamoDbHandler {
+ private DynamoDBMapper dynamoDbMapper;
+
+ private ObjectMapper objectMapper;
+
+ public AbstractDynamoDbHandler() {
+ this.initAmazonDynamoDb();
+ this.objectMapper = new ObjectMapper();
+ }
+
+ private void initAmazonDynamoDb() {
+ AmazonDynamoDB amazonDynamoDb = AmazonDynamoDBClientBuilder
+ .standard()
+ .withRegion(Regions.US_EAST_1)
+ .build();
+
+ this.dynamoDbMapper = new DynamoDBMapper(amazonDynamoDb);
+ }
+
+ protected DynamoDBMapper getDynamoDbMapper() {
+ return this.dynamoDbMapper;
+ }
+
+ protected ObjectMapper getObjectMapper() {
+ return objectMapper;
+ }
+
+ public void setDynamoDbMapper(DynamoDBMapper dynamoDbMapper) {
+ this.dynamoDbMapper = dynamoDbMapper;
+ }
+
+ protected Map headers() {
+ Map headers = new HashMap<>();
+ headers.put("Content-Type", "application/json");
+
+ return headers;
+ }
+
+ /**
+ * API Gateway response
+ *
+ * @param statusCode - status code
+ * @param body - Object body
+ * @return - api gateway proxy response
+ */
+ protected APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent(Integer statusCode, T body) {
+ APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent =
+ new APIGatewayProxyResponseEvent().withHeaders(headers());
+ try {
+ apiGatewayProxyResponseEvent
+ .withStatusCode(statusCode)
+ .withBody(getObjectMapper()
+ .writeValueAsString(body));
+
+ } catch (JsonProcessingException jsonProcessingException) {
+ throw new RuntimeException(jsonProcessingException);
+ }
+
+ return apiGatewayProxyResponseEvent;
+ }
+}
diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java
new file mode 100644
index 000000000..ef7dd3fec
--- /dev/null
+++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java
@@ -0,0 +1,29 @@
+package com.iluwatar.serverless.baas.api;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
+import com.iluwatar.serverless.baas.model.Person;
+import org.apache.log4j.Logger;
+
+/**
+ * find person from persons collection
+ * Created by dheeraj.mummar on 3/5/18.
+ */
+public class FindPersonApiHandler extends AbstractDynamoDbHandler
+ implements RequestHandler {
+
+ private static final Logger LOG = Logger.getLogger(FindPersonApiHandler.class);
+ private static final Integer SUCCESS_STATUS_CODE = 200;
+
+ @Override
+ public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent,
+ Context context) {
+ LOG.info(apiGatewayProxyRequestEvent.getPathParameters());
+ Person person = this.getDynamoDbMapper().load(Person.class, apiGatewayProxyRequestEvent
+ .getPathParameters().get("id"));
+
+ return apiGatewayProxyResponseEvent(SUCCESS_STATUS_CODE, person);
+ }
+}
diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java
new file mode 100644
index 000000000..8817f1e48
--- /dev/null
+++ b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java
@@ -0,0 +1,39 @@
+package com.iluwatar.serverless.baas.api;
+
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.RequestHandler;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
+import com.iluwatar.serverless.baas.model.Person;
+import org.apache.log4j.Logger;
+
+import java.io.IOException;
+
+/**
+ * save person into persons collection
+ * Created by dheeraj.mummar on 3/4/18.
+ */
+public class SavePersonApiHandler extends AbstractDynamoDbHandler
+ implements RequestHandler {
+
+ private static final Logger LOG = Logger.getLogger(SavePersonApiHandler.class);
+ private static final Integer CREATED_STATUS_CODE = 201;
+ private static final Integer BAD_REQUEST_STATUS_CODE = 400;
+
+ @Override
+ public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent
+ apiGatewayProxyRequestEvent, Context context) {
+ APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent;
+ Person person;
+ try {
+ person = getObjectMapper().readValue(apiGatewayProxyRequestEvent.getBody(), Person.class);
+ getDynamoDbMapper().save(person);
+ apiGatewayProxyResponseEvent = apiGatewayProxyResponseEvent(CREATED_STATUS_CODE, person);
+ } catch (IOException ioException) {
+ LOG.error("unable to parse body", ioException);
+ apiGatewayProxyResponseEvent = apiGatewayProxyResponseEvent(BAD_REQUEST_STATUS_CODE, null);
+ }
+
+ return apiGatewayProxyResponseEvent;
+ }
+}
diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java
new file mode 100644
index 000000000..382309823
--- /dev/null
+++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java
@@ -0,0 +1,119 @@
+package com.iluwatar.serverless.baas.model;
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument;
+
+import java.io.Serializable;
+
+/**
+ * Address Object
+ * Created by dheeraj.mummarareddy on 3/4/18.
+ */
+@DynamoDBDocument
+public class Address implements Serializable {
+
+ private static final long serialVersionUID = 6760844284799736970L;
+
+ private String addressLineOne;
+ private String addressLineTwo;
+ private String city;
+ private String state;
+ private String zipCode;
+
+ @DynamoDBAttribute(attributeName = "addressLineOne")
+ public String getAddressLineOne() {
+ return addressLineOne;
+ }
+
+ public void setAddressLineOne(String addressLineOne) {
+ this.addressLineOne = addressLineOne;
+ }
+
+ @DynamoDBAttribute(attributeName = "addressLineTwo")
+ public String getAddressLineTwo() {
+ return addressLineTwo;
+ }
+
+ public void setAddressLineTwo(String addressLineTwo) {
+ this.addressLineTwo = addressLineTwo;
+ }
+
+ @DynamoDBAttribute(attributeName = "city")
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ @DynamoDBAttribute(attributeName = "state")
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ @DynamoDBAttribute(attributeName = "zipCode")
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Address address = (Address) o;
+
+ if (addressLineOne != null ? !addressLineOne.equals(address.addressLineOne) :
+ address.addressLineOne != null) {
+ return false;
+ }
+
+ if (addressLineTwo != null ? !addressLineTwo.equals(address.addressLineTwo) :
+ address.addressLineTwo != null) {
+ return false;
+ }
+
+ if (city != null ? !city.equals(address.city) : address.city != null) {
+ return false;
+ }
+ if (state != null ? !state.equals(address.state) : address.state != null) {
+ return false;
+ }
+ return zipCode != null ? zipCode.equals(address.zipCode) : address.zipCode == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = addressLineOne != null ? addressLineOne.hashCode() : 0;
+ result = 31 * result + (addressLineTwo != null ? addressLineTwo.hashCode() : 0);
+ result = 31 * result + (city != null ? city.hashCode() : 0);
+ result = 31 * result + (state != null ? state.hashCode() : 0);
+ result = 31 * result + (zipCode != null ? zipCode.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Address{"
+ + "addressLineOne='" + addressLineOne + '\''
+ + ", addressLineTwo='" + addressLineTwo + '\''
+ + ", city='" + city + '\''
+ + ", state='" + state + '\''
+ + ", zipCode='" + zipCode + '\''
+ + '}';
+ }
+}
diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java
new file mode 100644
index 000000000..0c68f3cbe
--- /dev/null
+++ b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java
@@ -0,0 +1,102 @@
+package com.iluwatar.serverless.baas.model;
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.io.Serializable;
+
+/**
+ * Person Request
+ * Created by dheeraj.mummarareddy on 3/4/18.
+ */
+@DynamoDBTable(tableName = "persons")
+public class Person implements Serializable {
+
+ private static final long serialVersionUID = -3413087924608627075L;
+
+ private String id;
+ private String firstName;
+ private String lastName;
+ private Address address;
+
+ @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+ @DynamoDBHashKey(attributeName = "id")
+ @DynamoDBAutoGeneratedKey
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ @DynamoDBAttribute(attributeName = "firstName")
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ @DynamoDBAttribute(attributeName = "lastName")
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ @DynamoDBAttribute(attributeName = "address")
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Person person = (Person) o;
+
+ if (firstName != null ? !firstName.equals(person.firstName) : person.firstName != null) {
+ return false;
+ }
+
+ if (lastName != null ? !lastName.equals(person.lastName) : person.lastName != null) {
+ return false;
+ }
+
+ return address != null ? address.equals(person.address) : person.address == null;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = firstName != null ? firstName.hashCode() : 0;
+ result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
+ result = 31 * result + (address != null ? address.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Person{"
+ + "id='" + id + '\''
+ + ", firstName='" + firstName + '\''
+ + ", lastName='" + lastName + '\''
+ + ", address=" + address
+ + '}';
+ }
+}
diff --git a/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java
similarity index 99%
rename from serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java
rename to serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java
index f20cc13c8..98e2de64f 100644
--- a/serverless/src/main/java/com/iluwatar/serverless/ApiGatewayResponse.java
+++ b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java
@@ -20,7 +20,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-package com.iluwatar.serverless;
+package com.iluwatar.serverless.faas;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
diff --git a/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java
similarity index 99%
rename from serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java
rename to serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java
index aedb6f72f..03932a9f0 100644
--- a/serverless/src/main/java/com/iluwatar/serverless/LambdaInfo.java
+++ b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java
@@ -20,7 +20,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-package com.iluwatar.serverless;
+package com.iluwatar.serverless.faas;
import java.io.Serializable;
diff --git a/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java
similarity index 95%
rename from serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java
rename to serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java
index 669601a23..67e1835f9 100644
--- a/serverless/src/main/java/com/iluwatar/serverless/api/LambdaInfoApiHandler.java
+++ b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java
@@ -20,13 +20,13 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-package com.iluwatar.serverless.api;
+package com.iluwatar.serverless.faas.api;
-import com.iluwatar.serverless.ApiGatewayResponse;
+import com.iluwatar.serverless.faas.ApiGatewayResponse;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
-import com.iluwatar.serverless.LambdaInfo;
+import com.iluwatar.serverless.faas.LambdaInfo;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java
new file mode 100644
index 000000000..6d8343db1
--- /dev/null
+++ b/serverless/src/test/java/com/illuwatar/serverless/baas/api/FindPersonApiHandlerTest.java
@@ -0,0 +1,49 @@
+package com.illuwatar.serverless.baas.api;
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
+import com.iluwatar.serverless.baas.api.FindPersonApiHandler;
+import com.iluwatar.serverless.baas.api.SavePersonApiHandler;
+import com.iluwatar.serverless.baas.model.Person;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.Collections;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+/**
+ * Created by dheeraj.mummar on 3/5/18.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class FindPersonApiHandlerTest {
+
+ private FindPersonApiHandler findPersonApiHandler;
+
+ @Mock
+ private DynamoDBMapper dynamoDbMapper;
+
+ @Before
+ public void setUp() {
+ this.findPersonApiHandler = new FindPersonApiHandler();
+ this.findPersonApiHandler.setDynamoDbMapper(dynamoDbMapper);
+ }
+
+ @Test
+ public void handleRequest() {
+ findPersonApiHandler.handleRequest(apiGatewayProxyRequestEvent(), mock(Context.class));
+ verify(dynamoDbMapper, times(1)).load(Person.class, "37e7a1fe-3544-473d-b764-18128f02d72d");
+ }
+
+ private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent() {
+ return new APIGatewayProxyRequestEvent()
+ .withPathParamters(Collections
+ .singletonMap("id", "37e7a1fe-3544-473d-b764-18128f02d72d"));
+ }
+}
diff --git a/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java
new file mode 100644
index 000000000..43bda53dc
--- /dev/null
+++ b/serverless/src/test/java/com/illuwatar/serverless/baas/api/SavePersonApiHandlerTest.java
@@ -0,0 +1,78 @@
+package com.illuwatar.serverless.baas.api;
+
+import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
+import com.amazonaws.services.lambda.runtime.Context;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
+import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.iluwatar.serverless.baas.api.SavePersonApiHandler;
+import com.iluwatar.serverless.baas.model.Address;
+import com.iluwatar.serverless.baas.model.Person;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import static org.mockito.Mockito.*;
+
+/**
+ * Created by dheeraj.mummar on 3/4/18.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class SavePersonApiHandlerTest {
+
+ private SavePersonApiHandler savePersonApiHandler;
+
+ @Mock
+ private DynamoDBMapper dynamoDbMapper;
+
+ private ObjectMapper objectMapper = new ObjectMapper();
+
+ @Before
+ public void setUp() {
+ this.savePersonApiHandler = new SavePersonApiHandler();
+ this.savePersonApiHandler.setDynamoDbMapper(dynamoDbMapper);
+ }
+
+ @Test
+ public void handleRequestSavePersonSuccessful() throws JsonProcessingException {
+ Person person = newPerson();
+ APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent =
+ this.savePersonApiHandler
+ .handleRequest(apiGatewayProxyRequestEvent(objectMapper.writeValueAsString(person)), mock(Context.class));
+ verify(dynamoDbMapper, times(1)).save(person);
+ Assert.assertNotNull(apiGatewayProxyResponseEvent);
+ Assert.assertEquals(new Integer(201), apiGatewayProxyResponseEvent.getStatusCode());
+ }
+
+ @Test
+ public void handleRequestSavePersonException() {
+ APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent =
+ this.savePersonApiHandler
+ .handleRequest(apiGatewayProxyRequestEvent("invalid sample request"), mock(Context.class));
+ Assert.assertNotNull(apiGatewayProxyResponseEvent);
+ Assert.assertEquals(new Integer(400), apiGatewayProxyResponseEvent.getStatusCode());
+ }
+
+ private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent(String body) {
+ APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent();
+ return apiGatewayProxyRequestEvent.withBody(body);
+ }
+
+ private Person newPerson() {
+ Person person = new Person();
+ person.setFirstName("Thor");
+ person.setLastName("Odinson");
+ Address address = new Address();
+ address.setAddressLineOne("1 Odin ln");
+ address.setCity("Asgard");
+ address.setState("country of the Gods");
+ address.setZipCode("00001");
+ person.setAddress(address);
+
+ return person;
+ }
+}
diff --git a/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java
similarity index 97%
rename from serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java
rename to serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java
index 6c7a03386..ddf186a25 100644
--- a/serverless/src/test/java/com/iluwatar/serverless/api/LambdaInfoApiHandlerTest.java
+++ b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java
@@ -20,7 +20,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
-package com.iluwatar.serverless.api;
+package com.iluwatar.serverless.faas.api;
import com.amazonaws.services.lambda.runtime.Context;
import org.junit.jupiter.api.Test;