using System; using System.Collections.Generic; using System.Linq; using LCU.API.Collections.RepoApi.Controllers; using LCU.API.Collections.RepoApi.Models.Filters; using LCU.API.Collections.RepoApi.Models.Requests; using LCU.API.Collections.RepoApi.Models.Responses; using LCU.API.Collections.RepoApi.Services; using LCU.Shared.Collections.RepoApiLib.Exceptions; using LCU.Shared.Collections.RepoApiLib.Models; using LCU.Shared.Collections.RepoApiLib.Models.Results; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Moq; using Xunit; namespace LCU.API.Collections.RepoApiTests.Controllers { public class RepoAccountControllerTest { private Mock mockService; private Mock mockStatusService; private Mock mockLetterService; private RepoAccountController controller; private readonly Mock mockHttpContextAccessor; public RepoAccountControllerTest() { mockService = new Mock(); mockStatusService = new Mock(); mockLetterService = new Mock(); mockHttpContextAccessor = new Mock(); controller = new RepoAccountController(mockService.Object, mockLetterService.Object, mockStatusService.Object, mockHttpContextAccessor.Object); } [Fact] public async void Get_OK() { mockService.Setup(service => service.ListAll(It.IsAny(), It.IsAny())) .ReturnsAsync( new PagedResult() { Total = 1, Items = new List { new RepoAccount() { RepoId = 5, AccountNo = "1234567-98" } } }); // arrange var filter = new PageFilter(); // act var result = await controller.Get(filter); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); var okValue = okResult.Value as PagedResponse; Assert.NotNull(okValue); Assert.Equal(1, okValue.TotalItems); } [Fact] public async void Get_Repo_Account_Status_Changes_OK() { // arrange var statusChanges = new List { new RepoStatusChange() { Id = 1, RepoId = 5, StatusFrom = "None", StatusTo = "O4R", ChangedBy = "System", ChangedDate = DateTime.Now } }; mockStatusService.Setup(x => x.ListByAccount(It.IsAny())).ReturnsAsync(statusChanges); // act var result = await controller.GetStatusChangesByRepoId(5); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); var okValue = okResult.Value as IEnumerable; Assert.NotNull(okValue); Assert.True(statusChanges.SequenceEqual(okValue)); } [Fact] public async void Get_Repo_Account_Letters_OK() { // arrange var letters = new List { new RepoLetter { NoticeType = "Type", DateSent = DateTime.Now, DateExpired = DateTime.Now.AddDays(15), DaysToRedeem = 15 } }; mockLetterService.Setup(x => x.ListByAccountIdAsync(It.IsAny())).ReturnsAsync(letters); // act var result = await controller.GetLettersByRepoId(5); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); var okValue = okResult.Value as IEnumerable; Assert.NotNull(okValue); Assert.True(letters.SequenceEqual(okValue)); } [Fact] public async void GetByAccountNo_OK() { // arrange var repos = new List { new RepoAccount() { RepoId = 5, AccountNo = "1234567-98", DateClosed = DateTime.Today }, new RepoAccount() { RepoId = 6, AccountNo = "1234567-98", DateClosed = DateTime.Today } }; mockService.Setup(x => x.GetByAccountNo(It.IsAny())).ReturnsAsync(repos); // act var result = await controller.GetByAccountNo("55555-123"); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); var okValue = okResult.Value as IReadOnlyCollection; Assert.NotNull(okValue); Assert.Equal(5, okValue.First().RepoId); } [Fact] public async void GetById_OK() { // arrange var repos = new List { new RepoAccount() { RepoId = 5, AccountNo = "1234567-98" } }; mockService.Setup(x => x.Get(It.IsAny())).ReturnsAsync(repos.First()); // act var result = await controller.GetById(5); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); var okValue = okResult.Value as RepoAccount; Assert.NotNull(okValue); Assert.Equal(5, okValue.RepoId); } // Post tests [Fact] public async void Post_OK() { // arrange var postAlert = new RepoAccount() { AccountNo = "1234567-98", Borrowers = new List() { new Borrower() { RepoId = 0, IndividualId = "123456", OwnershipType = 6, IndividualName = "John Doe" } }, Collaterals = new List { new Collateral() { CollateralId = 1234567, RepoId = 2345678 } } }; // act var result = await controller.Post(postAlert); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); Assert.Equal(200, okResult.StatusCode); } [Fact] public async void Post_Bad_Request() { // arrange var postAlert = new RepoAccount() { AccountNo = "1234567-98", }; controller.ModelState.AddModelError("Message", "The message field is required."); // act var result = await controller.Post(postAlert); Assert.NotNull(result); var badRequestResult = result as BadRequestObjectResult; // assert Assert.NotNull(badRequestResult); Assert.Equal(StatusCodes.Status400BadRequest, badRequestResult.StatusCode); } [Fact] public async void Search_Ok() { // arrange var searchPhrase = "abcd123"; mockService.Setup(service => service.SearchRepoAccounts(It.IsAny(), It.IsAny())).ReturnsAsync( new List() { new RepoAccount(), new RepoAccount(), new RepoAccount() }); // act var result = await controller.SearchRepoAccounts(searchPhrase); Assert.NotNull(result); var okResult = result as OkObjectResult; // assert Assert.NotNull(okResult); var okResultValue = okResult.Value as IReadOnlyCollection; Assert.NotNull(okResultValue); Assert.Equal(3, okResultValue.Count()); } [Fact] public async void Search_Empty_Bad_Request() { // arrange var searchPhrase = ""; // act var result = await controller.SearchRepoAccounts(searchPhrase); Assert.NotNull(result); var badRequestResult = result as BadRequestObjectResult; // assert Assert.NotNull(badRequestResult); Assert.Equal(StatusCodes.Status400BadRequest, badRequestResult.StatusCode); Assert.Equal("Search Phrase Cannot Be Empty", badRequestResult.Value); } [Fact] public async void Search_Low_Characters_Bad_Request() { // arrange var searchPhrase = "12"; // act var result = await controller.SearchRepoAccounts(searchPhrase); Assert.NotNull(result); var badRequestResult = result as BadRequestObjectResult; // assert Assert.NotNull(badRequestResult); Assert.Equal(StatusCodes.Status400BadRequest, badRequestResult.StatusCode); Assert.Equal("Search Phrase Must Be At Least Three (3) Characters Long", badRequestResult.Value); } [Fact] public async void Search_Max_Results_Bad_Request() { // arrange var searchPhrase = "143"; mockService.Setup(service => service.SearchRepoAccounts(It.IsAny(), It.IsAny())) .ThrowsAsync(new MaxItemException(1492)); // act var result = await controller.SearchRepoAccounts(searchPhrase); Assert.NotNull(result); var payloadTooLargeResult = result as ObjectResult; // assert Assert.NotNull(payloadTooLargeResult); Assert.Equal(StatusCodes.Status413PayloadTooLarge, payloadTooLargeResult.StatusCode); Assert.Equal("Too Many Search Results. (Max: 100) (Found: 1492)", payloadTooLargeResult.Value); } [Fact] public async void DeleteAccountByID_Exception() { //arrange mockService.Setup(service => service.DeleteAsync(It.IsAny())).ThrowsAsync(new Exception("oops")); var result = await controller.DeleteAccountById(5); var badres = result as StatusCodeResult; Assert.NotNull(result); Assert.Equal(500, badres.StatusCode); } [Fact] public async void DeleteAccountByID_Ok() { //arrange mockService.Setup(service => service.DeleteAsync(It.IsAny())).ReturnsAsync(new RepoAccount() { }); var result = await controller.DeleteAccountById(5); var okres = result as OkObjectResult; Assert.NotNull(result); Assert.Equal(200, okres.StatusCode); } } }