using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using LCU.API.Internal.RepoApi.Old_Repo_Services; using LCU.API.Internal.RepoApi.Repos.Exceptions; using LCU.API.Internal.RepoApi.Repos.Models; using LCU.API.Internal.RepoApi.Repos.Models.Results; using LCU.API.Internal.RepoApi.Repos.Repositories; using LCU.API.Internal.RepoApi.Models.Old_Repo_Models.Filters; using LCU.API.Internal.RepoApi.Models.Old_Repo_Models.Requests; using Moq; using Xunit; using LCU.API.Internal.RepoApi.Old_Repo_Exceptions; namespace LCU.API.Internal.RepoApiTests.ServiceTests { public class RepoAccountServiceTests { private readonly Mock _repoAccountRepositoryMock; private readonly Mock _repoStatusChangeRepositoryMock; private readonly Mock _repoManualStatusRepositoryMock; private readonly Mock _collateralRepositoryMock; private readonly Mock _unitOfWorkMock; private readonly RepoAccountService _service; public RepoAccountServiceTests() { _repoAccountRepositoryMock = new Mock(); _repoStatusChangeRepositoryMock = new Mock(); _repoManualStatusRepositoryMock = new Mock(); _collateralRepositoryMock = new Mock(); _unitOfWorkMock = new Mock(); _service = new RepoAccountService( _repoAccountRepositoryMock.Object, _repoStatusChangeRepositoryMock.Object, _repoManualStatusRepositoryMock.Object, _collateralRepositoryMock.Object, _unitOfWorkMock.Object); } [Fact] public async Task ListAll_ShouldReturnPagedResult_WhenCalled() { // Arrange var pageFilter = new PageFilter { Page = 1, Limit = 10 }; var repoAccountFilter = new RepoAccountPostFilter { RepoIdList = new List { 1, 2 }, Status = "Open" }; var expectedResult = new PagedResult(); _repoAccountRepositoryMock .Setup(repo => repo.ListAsync(It.IsAny>(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(expectedResult); // Act var result = await _service.ListAll(pageFilter, repoAccountFilter); // Assert Assert.Equal(expectedResult, result); } [Fact] public async Task ListAll_ShouldThrowServerErrorException_WhenExceptionOccurs() { // Arrange var pageFilter = new PageFilter { Page = 1, Limit = 10 }; var repoAccountFilter = new RepoAccountPostFilter(); _repoAccountRepositoryMock .Setup(repo => repo.ListAsync(It.IsAny>(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ThrowsAsync(new Exception()); // Act & Assert await Assert.ThrowsAsync(() => _service.ListAll(pageFilter, repoAccountFilter)); } [Fact] public async Task FindByAuctionAssignmentId_ShouldReturnRepoAccount_WhenFound() { // Arrange var auctionAssignmentId = 1; var expectedRepoAccount = new RepoAccount(); _repoAccountRepositoryMock .Setup(repo => repo.FindByAuctionAssignmentIdAsync(auctionAssignmentId)) .ReturnsAsync(expectedRepoAccount); // Act var result = await _service.FindByAuctionAssignmentId(auctionAssignmentId); // Assert Assert.Equal(expectedRepoAccount, result); } [Fact] public async Task FindByAuctionAssignmentId_ShouldThrowServerErrorException_WhenExceptionOccurs() { // Arrange var auctionAssignmentId = 1; _repoAccountRepositoryMock .Setup(repo => repo.FindByAuctionAssignmentIdAsync(auctionAssignmentId)) .ThrowsAsync(new Exception()); // Act & Assert await Assert.ThrowsAsync(() => _service.FindByAuctionAssignmentId(auctionAssignmentId)); } [Fact] public async Task SaveAsync_ShouldSaveRepoAccountAndAddStatusChange() { // Arrange var repoAccount = new RepoAccount { RepoId = 1, Status = "Open" }; var savedRepoAccount = new RepoAccount { RepoId = 1, Status = "Open" }; _repoAccountRepositoryMock .Setup(repo => repo.AddAsync(repoAccount)) .ReturnsAsync(savedRepoAccount); // Act var result = await _service.SaveAsync(repoAccount); // Assert Assert.Equal(repoAccount, result); _unitOfWorkMock.Verify(uow => uow.CompleteAsync(), Times.Once); } [Fact] public async Task SaveAsync_ShouldThrowServerErrorException_WhenExceptionOccurs() { // Arrange var repoAccount = new RepoAccount { RepoId = 1, Status = "Open" }; _repoAccountRepositoryMock .Setup(repo => repo.AddAsync(repoAccount)) .ThrowsAsync(new Exception()); // Act & Assert await Assert.ThrowsAsync(() => _service.SaveAsync(repoAccount)); } [Fact] public async Task Get_ShouldReturnRepoAccount_WhenFound() { // Arrange var id = 1; var expectedRepoAccount = new RepoAccount(); _repoAccountRepositoryMock .Setup(repo => repo.FindByIdAsync(id)) .ReturnsAsync(expectedRepoAccount); // Act var result = await _service.Get(id); // Assert Assert.Equal(expectedRepoAccount, result); } [Fact] public async Task Get_ShouldThrowNotFoundException_WhenRepoAccountNotFound() { // Arrange var id = 1; _repoAccountRepositoryMock .Setup(repo => repo.FindByIdAsync(id)) .ReturnsAsync((RepoAccount)null); // Act & Assert await Assert.ThrowsAsync(() => _service.Get(id)); } [Fact] public async Task Get_ShouldThrowServerErrorException_WhenExceptionOccurs() { // Arrange var id = 1; _repoAccountRepositoryMock .Setup(repo => repo.FindByIdAsync(id)) .ThrowsAsync(new Exception()); // Act & Assert await Assert.ThrowsAsync(() => _service.Get(id)); } } }