using Microsoft.AspNetCore.Mvc; using LCU.Library.Internal.LoanRateModels.Entities; using LCU.API.Internal.LoanRate.Controllers; using LCU.API.Internal.LoanRate.Services; namespace LCU.API.Internal.LoanRateTests.ControllerTests; public class RateControllerTest { private readonly Mock _mockRateService; private readonly RateController _controller; public RateControllerTest() { _mockRateService = new Mock(); _controller = new RateController(_mockRateService.Object); } [Fact] public async void Rate_Get_OK() { var rateId = 1; var rates = new List { new() { RateId = rateId } }; _mockRateService.Setup(x => x.GetAsync()).ReturnsAsync(rates).Verifiable(); var result = await _controller.Get(); Assert.NotNull(result); Assert.IsType(result); var status = result as OkObjectResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); var RateResult = status.Value as List; Assert.NotNull(RateResult); Assert.Single(RateResult); Assert.Equal(rateId, RateResult.First().RateId); _mockRateService.Verify(); } [Fact] public async void Rate_Get_NoContent() { var rates = new List(); _mockRateService.Setup(x => x.GetAsync()).ReturnsAsync(rates).Verifiable(); var result = await _controller.Get(); Assert.NotNull(result); Assert.IsType(result); var status = result as NoContentResult; Assert.NotNull(status); Assert.Equal(204, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_Get_InternalServerError() { _mockRateService.Setup(x => x.GetAsync()) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.Get(); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_GetById_OK() { var rateId = 1; var rate = new Rate { RateId = rateId }; _mockRateService.Setup(x => x.GetByIdAsync(rateId)) .ReturnsAsync(rate).Verifiable(); var result = await _controller.GetById(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as OkObjectResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); var RateResult = status.Value as Rate; Assert.NotNull(RateResult); Assert.Equal(rateId, RateResult.RateId); _mockRateService.Verify(); } [Fact] public async void Rate_GetById_NoContent() { var rateId = 1; Rate? rate = null; _mockRateService.Setup(x => x.GetByIdAsync(rateId)) .ReturnsAsync(rate).Verifiable(); var result = await _controller.GetById(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as NoContentResult; Assert.NotNull(status); Assert.Equal(204, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_GetById_BadRequest() { var rateId = 0; var result = await _controller.GetById(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_GetById_InternalServerError() { var rateId = 1; _mockRateService.Setup(x => x.GetByIdAsync(rateId)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.GetById(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_GetListById_OK() { var rateIds = new List { 1, 2, 3 }; var rates = new List { new() { RateId = rateIds[0] }, new() { RateId = rateIds[1] }, new() { RateId = rateIds[2] } }; _mockRateService.Setup(x => x.GetRangeByIdAsync(rateIds)) .ReturnsAsync(rates).Verifiable(); var result = await _controller.GetListById(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as OkObjectResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); var rateResult = status.Value as List; Assert.NotNull(rateResult); Assert.Equal(rateIds[0], rateResult[0].RateId); Assert.Equal(rateIds[1], rateResult[1].RateId); Assert.Equal(rateIds[2], rateResult[2].RateId); _mockRateService.Verify(); } [Fact] public async void Rate_GetListById_NoContent() { var rateIds = new List { 1, 2, 3 }; List? rates = null; _mockRateService.Setup(x => x.GetRangeByIdAsync(rateIds)) .ReturnsAsync(rates).Verifiable(); var result = await _controller.GetListById(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as NoContentResult; Assert.NotNull(status); Assert.Equal(204, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_GetListById_BadRequest() { List? rateIds = null; var result = await _controller.GetListById(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_GetListById_InternalServerError() { var rateIds = new List { 1, 2, 3 }; _mockRateService.Setup(x => x.GetRangeByIdAsync(rateIds)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.GetListById(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_Post_CreatedAtAction() { var rateId = 1; var Value = Guid.NewGuid().ToString(); var rate = new Rate { Value = 5.59M }; var rateReturned = new Rate { RateId = rateId, Value = 5.59M }; _mockRateService.Setup(x => x.SaveAsync(rate)) .ReturnsAsync(rateReturned).Verifiable(); var result = await _controller.Post(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as CreatedAtActionResult; Assert.NotNull(status); Assert.Equal(201, status.StatusCode); var resultValue = status.Value as Rate; Assert.NotNull(result); Assert.NotNull(resultValue); Assert.Equal(rateReturned.RateId, resultValue.RateId); Assert.Equal(rateReturned.Value, resultValue.Value); _mockRateService.Verify(); } [Fact] public async void Rate_Post_BadRequest() { Rate? rate = null; var result = await _controller.Post(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_Post_InternalServerError() { var rate = new Rate { RateId = 1 }; _mockRateService.Setup(x => x.SaveAsync(rate)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.Post(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_SaveRange_Ok() { var rates = new List { new() { Value = 5.60M }, new() { Value = 5.59M }, new() { Value = 5.61M } }; _mockRateService.Setup(x => x.SaveRangeAsync(rates)); var result = await _controller.SaveRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as OkResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_SaveRange_BadRequest() { List? rates = null; var result = await _controller.SaveRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_SaveRange_InternalServerError() { var rates = new List { new() { Value = 5.60M }, new() { Value = 5.59M }, new() { Value = 5.61M } }; _mockRateService.Setup(x => x.SaveRangeAsync(rates)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.SaveRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_Put_OK() { var rateId = 1; var value = 5.60M; var rate = new Rate { RateId = rateId, Value = value }; var rateReturned = new Rate { RateId = rateId, Value = value }; _mockRateService.Setup(x => x.UpdateAsync(rate)) .ReturnsAsync(rateReturned).Verifiable(); var result = await _controller.Put(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as OkObjectResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); var rateResult = status.Value as Rate; Assert.NotNull(rateResult); Assert.Equal(rate.Value, rateResult.Value); _mockRateService.Verify(); } [Fact] public async void Rate_Put_Status406NotAcceptable() { var rate = new Rate { RateId = 1 }; var result = await _controller.Put(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(406, status.StatusCode); } [Fact] public async void Rate_Put_BadRequest_NoIds() { var rate = new Rate { Value = 5.59M }; var result = await _controller.Put(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); _mockRateService.Verify(x => x.GetAsync(), Times.Never); } [Fact] public async void Rate_Put_BadRequest() { Rate? rate = null; var result = await _controller.Put(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_Put_InternalServerError() { var rate = new Rate { RateId = 1 }; _mockRateService.Setup(x => x.UpdateAsync(rate)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.Put(rate); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_UpdateRange_OK() { var values = new List { 5.60M, 5.61M, 5.62M }; var rates = new List { new() { RateId = 1, Value = values[0] }, new() { RateId = 2, Value = values[1] }, new() { RateId = 3, Value = values[2] } }; var ratesReturned = new List { new() { RateId = 1, Value = values[0] }, new() { RateId = 2, Value = values[1] }, new() { RateId = 3, Value = values[2] } }; _mockRateService.Setup(x => x.UpdateRangeAsync(rates)) .ReturnsAsync(ratesReturned).Verifiable(); var result = await _controller.UpdateRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as OkObjectResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); var rateResult = status.Value as List; Assert.NotNull(rateResult); Assert.Equal(rates[0].Value, rateResult[0].Value); Assert.Equal(rates[1].Value, rateResult[1].Value); Assert.Equal(rates[2].Value, rateResult[2].Value); _mockRateService.Verify(); } [Fact] public async void Rate_UpdateRange_BadRequest_NoIds() { var rates = new List { new () { Value = 5.60M }, new () { Value = 5.61M } }; var result = await _controller.UpdateRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); _mockRateService.Verify(x => x.GetAsync(), Times.Never); } [Fact] public async void Rate_UpdateRange_BadRequest() { List? rates = null; var result = await _controller.UpdateRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_UpdateRange_InternalServcerError() { var rates = new List { new () { RateId = 1, Value = 5.60M }, new () { RateId = 2, Value = 5.61M } }; _mockRateService.Setup(x => x.UpdateRangeAsync(rates)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.UpdateRange(rates); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_Delete_OK() { var rateId = 1; _mockRateService.Setup(x => x.DeleteAsync(rateId)).Verifiable(); var result = await _controller.Delete(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as OkResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_Delete_BadRequest() { var rateId = 0; var result = await _controller.Delete(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_Delete_InternalServerError() { var rateId = 1; _mockRateService.Setup(x => x.DeleteAsync(rateId)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.Delete(rateId); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_DeleteRange_OK() { var rateIds = new List { 1, 1, 1 }; _mockRateService.Setup(x => x.DeleteRangeAsync(rateIds)).Verifiable(); var result = await _controller.DeleteRange(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as OkResult; Assert.NotNull(status); Assert.Equal(200, status.StatusCode); _mockRateService.Verify(); } [Fact] public async void Rate_DeleteRange_BadRequest() { var rateIds = new List(); var result = await _controller.DeleteRange(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as BadRequestObjectResult; Assert.NotNull(status); Assert.Equal(400, status.StatusCode); } [Fact] public async void Rate_DeleteRange_InternalServerError() { var rateIds = new List { 1 }; _mockRateService.Setup(x => x.DeleteRangeAsync(rateIds)) .Throws(new Exception("Test")).Verifiable(); var result = await _controller.DeleteRange(rateIds); Assert.NotNull(result); Assert.IsType(result); var status = result as StatusCodeResult; Assert.NotNull(status); Assert.Equal(500, status.StatusCode); _mockRateService.Verify(); } }