using System.Net; using Amazon.DynamoDBv2.DataModel; using Amazon.DynamoDBv2.DocumentModel; using Amazon.EventBridge; using Amazon.EventBridge.Model; using Amazon.Lambda.APIGatewayEvents; using Moq; using Unicorn.Web.Common; using Xunit; namespace Unicorn.Web.ApprovalService.Tests; public class RequestApprovalFunctionTest { public RequestApprovalFunctionTest() { TestHelpers.SetEnvironmentVariables(); // Set env variable for Powertools Metrics Environment.SetEnvironmentVariable("POWERTOOLS_METRICS_NAMESPACE","ContractService"); } [Fact] public async Task RequestApprovalFunction_WhenPropertyFound_SendsApprovalRequest() { // Arrange var request = TestHelpers.LoadApiGatewayProxyRequest("./events/request_approval_event.json"); var context = TestHelpers.NewLambdaContext(); var dynamoDbContext = new Mock(); var eventBindingClient = new Mock(); var eventBusName = Guid.NewGuid().ToString(); var serviceNamespace = Guid.NewGuid().ToString(); var searchResult = new List { new() { Country = "USA", City = "Anytown", Street = "Main Street", PropertyNumber = "123", Status = "NEW" } }; dynamoDbContext.Setup(c => c.FromQueryAsync(It.IsAny(), It.IsAny())) .Returns(TestHelpers.NewDynamoDBSearchResult(searchResult)); eventBindingClient.Setup(c => c.PutEventsAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new PutEventsResponse { FailedEntryCount = 0 }); var expectedResponse = new APIGatewayProxyResponse { StatusCode = (int)HttpStatusCode.OK, Headers = new Dictionary { { "Content-Type", "application/json" }, { "X-Custom-Header", "application/json" } } }; // Act var function = new RequestApprovalFunction(dynamoDbContext.Object, eventBindingClient.Object, eventBusName, serviceNamespace); var response = await function.FunctionHandler(request, context); // Assert Assert.Equal(expectedResponse.Headers, response.Headers); Assert.Equal(expectedResponse.StatusCode, response.StatusCode); dynamoDbContext.Verify(v => v.FromQueryAsync(It.IsAny(), It.IsAny()), Times.Once); dynamoDbContext.Verify(v => v.SaveAsync(It.Is(p => p.Status == PropertyStatus.Pending), It.IsAny()), Times.Once); eventBindingClient.Verify(v => v.PutEventsAsync(It.Is(r=> r.Entries.First().DetailType == "PublicationApprovalRequested"), It.IsAny()), Times.Once); } }