using Amazon.Lambda.TestUtilities; using DeleteProduct; using FluentAssertions; using Moq; using ServerlessTestApi.Core.DataAccess; using ServerlessTestApi.Core.Models; namespace ApiTests.UnitTest; public class MockDeleteProductFunctionTests : FunctionTest { [Fact] public async Task DeleteProduct_With_ProductInDb_Should_ReturnSuccess() { // arrange var request = new ApiRequestBuilder() .WithPathParameter("id", "123456") .WithHttpMethod(HttpMethod.Delete) .Build(); var data = new Mock(); data.Setup(d => d.GetProduct(It.IsAny(), It.IsAny())) .ReturnsAsync(new ProductDTO("123456", "Test Product", 10)); var function = new Function(data.Object, Logger); // act var response = await function.FunctionHandler(request, new TestLambdaContext()); // assert response.StatusCode.Should().Be(200); data.Verify(d => d.DeleteProduct("123456", It.IsAny()), Times.Once); } [Theory] [InlineData("POST")] [InlineData("PUT")] [InlineData("GET")] public async Task TestLambdaHandler_With_NonDeleteRequests_Should_Return405(string httpMethod) { // arrange var request = new ApiRequestBuilder() .WithPathParameter("id", "123456") .WithHttpMethod(httpMethod) .Build(); var data = new Mock(); var function = new Function(data.Object, Logger); // act var response = await function.FunctionHandler(request, new TestLambdaContext()); // assert response.StatusCode.Should().Be(405); } [Fact] public async Task DeleteProduct_With_ErrorInDeleteDataAccess_Should_Return500() { // arrange var request = new ApiRequestBuilder() .WithPathParameter("id", "123456") .WithHttpMethod(HttpMethod.Delete) .Build(); var data = new Mock(); data.Setup(d => d.DeleteProduct(It.IsAny(), It.IsAny())) .ThrowsAsync(new NullReferenceException()); var function = new Function(data.Object, Logger); // act var response = await function.FunctionHandler(request, new TestLambdaContext()); // assert response.StatusCode.Should().Be(500); } [Fact] public async Task DeleteProduct_With_TimeOut_Should_Return503() { // arrange var request = new ApiRequestBuilder() .WithPathParameter("id", "123456") .WithHttpMethod(HttpMethod.Delete) .Build(); var data = new Mock(); data.Setup(d => d.DeleteProduct(It.IsAny(), It.IsAny())) .ThrowsAsync(new TaskCanceledException()); var function = new Function(data.Object, Logger); // act var response = await function.FunctionHandler(request, new TestLambdaContext()); // assert response.StatusCode.Should().Be(503); } }