using System.Threading.Tasks; using Amazon.Lambda.Core; using Amazon.Lambda.TestUtilities; using FluentAssertions; using Moq; using SqsEventHandler.Handlers; using SqsEventHandler.Models; using SqsEventHandler.UnitTests.Utilities; using Xunit; namespace SqsEventHandler.UnitTests.Handlers; public class SqsEventHandlerTests { private readonly Mock> _mockSqsEventTrigger; public SqsEventHandlerTests() { _mockSqsEventTrigger = new Mock>(); _mockSqsEventTrigger.Setup(x => x.ProcessSqsMessage(It.IsAny(), It.IsAny())) .Returns(Task.CompletedTask); } [Fact] public async Task SqsEventHandler_Should_CallProcessSqsMessageOnce() { //Arrange var expected = new EmployeeBuilder().Build(); var sqsEvent = new SqsEventBuilder().WithEmployees(new[] { expected }); var lambdaContext = new TestLambdaContext(); //Act var result = await _mockSqsEventTrigger.Object.Handler(sqsEvent, lambdaContext); //Assert result.BatchItemFailures.Should().BeEmpty(); _mockSqsEventTrigger.Verify(x => x.ProcessSqsMessage( It.Is(employee => employee.Equals(expected)), It.IsAny()), Times.Once); } [Fact] public async Task SqsEventHandler_Should_CallProcessSqsMessageTwice() { //Arrange var expected1 = new EmployeeBuilder().WithEmployeeId("101"); var expected2 = new EmployeeBuilder().WithEmployeeId("102"); var sqsEvent = new SqsEventBuilder().WithEmployees(new[] { expected1, expected2 }); var lambdaContext = new TestLambdaContext(); //Act var result = await _mockSqsEventTrigger.Object.Handler(sqsEvent, lambdaContext); //Assert result.BatchItemFailures.Should().BeEmpty(); _mockSqsEventTrigger.Verify(x => x.ProcessSqsMessage( It.Is(employee => employee.Equals(expected1)), It.IsAny()), Times.Once); _mockSqsEventTrigger.Verify(x => x.ProcessSqsMessage( It.Is(employee => employee.Equals(expected2)), It.IsAny()), Times.Once); } [Fact] public async Task SqsEventHandler_Should_ReturnBatchItemFailures() { //Arrange var sqsEvent = new SqsEventBuilder().WithoutEmployees(); var lambdaContext = new TestLambdaContext(); //Act var result = await _mockSqsEventTrigger.Object.Handler(sqsEvent, lambdaContext); //Assert result.BatchItemFailures.Should().NotBeEmpty(); _mockSqsEventTrigger.Verify(x => x.ProcessSqsMessage( It.IsAny(), It.IsAny()), Times.Never); } }