using Microsoft.Extensions.Caching.Memory; using LCU.API.Internal.RepoApi.Old_Repo_Services; using LCU.API.Internal.RepoApi.Repos.Repositories; using LCU.API.Internal.RepoApi.Repos.Models.Settings; using LCU.API.Internal.RepoApi.Configurations; using LCU.API.Internal.RepoApi.Old_Repo_DataAccess; using LCU.API.Internal.RepoApi.Repos.Repositories.Settings; namespace LCU.API.Internal.RepoApiTests.ServiceTests { public class SettingsServiceTests { private readonly Mock _mockAccountTypeRepository; private readonly Mock _mockAllowedStatusChangeRepository; private readonly Mock _mockBodyStyleRepository; private readonly Mock _mockCleaningLevelRepository; private readonly Mock _mockCollateralTypeRepository; private readonly Mock _mockCollateralTypeToVehicleTypeRepository; private readonly Mock _mockHoldStatusRepository; private readonly Mock _mockLoanCategoryRepository; private readonly Mock _mockLocationTypeRepository; private readonly Mock _mockVehicleTypeRepository; private readonly Mock _mockExternalUserRepository; private readonly Mock _mockRepoCompanyRepository; private readonly Mock _mockUnitOfWork; private readonly Mock _mockMemoryCache; private readonly Mock _mockCollectionsDao; private readonly ApiConfiguration _apiConfiguration; private readonly SettingsService _settingsService; public SettingsServiceTests() { _mockAccountTypeRepository = new Mock(); _mockAllowedStatusChangeRepository = new Mock(); _mockBodyStyleRepository = new Mock(); _mockCleaningLevelRepository = new Mock(); _mockCollateralTypeRepository = new Mock(); _mockCollateralTypeToVehicleTypeRepository = new Mock(); _mockHoldStatusRepository = new Mock(); _mockLoanCategoryRepository = new Mock(); _mockLocationTypeRepository = new Mock(); _mockVehicleTypeRepository = new Mock(); _mockExternalUserRepository = new Mock(); _mockRepoCompanyRepository = new Mock(); _mockUnitOfWork = new Mock(); _mockMemoryCache = new Mock(); _mockCollectionsDao = new Mock(); _apiConfiguration = new ApiConfiguration { SettingsCacheExpirationSeconds = 60, TransactionTypeCodes = new List { "Code1", "Code2" }, TransactionTypeCodeQueryPrefix = "Prefix", TransactionHistoryParameterDateFormat = "yyyy-MM-dd", TransactionHistoryStartDateOffset = 30 }; _settingsService = new SettingsService( _mockAccountTypeRepository.Object, _mockAllowedStatusChangeRepository.Object, _mockBodyStyleRepository.Object, _mockCleaningLevelRepository.Object, _mockCollateralTypeRepository.Object, _mockCollateralTypeToVehicleTypeRepository.Object, _mockHoldStatusRepository.Object, _mockLoanCategoryRepository.Object, _mockLocationTypeRepository.Object, _mockVehicleTypeRepository.Object, _mockExternalUserRepository.Object, _mockRepoCompanyRepository.Object, _mockUnitOfWork.Object, _mockMemoryCache.Object, _mockCollectionsDao.Object, _apiConfiguration ); } [Fact] public async Task GetCachedRepoSettingsAsync_ShouldReturnSettings_WhenCacheIsEmpty() { // Arrange var cacheEntryMock = new Mock(); _mockMemoryCache .Setup(mc => mc.CreateEntry(It.IsAny())) .Returns(cacheEntryMock.Object); _mockAccountTypeRepository.Setup(repo => repo.ListAllAsync()) .ReturnsAsync(new List { new AccountType { ID = 1, AccountTypeCode = "AT1" } }); // Act var result = await _settingsService.GetCachedRepoSettingsAsync(); // Assert Assert.NotNull(result); Assert.NotEmpty(result.AccountTypes); } [Fact] public async Task SaveAsync_ShouldSaveAccountType() { // Arrange var accountType = new AccountType { ID = 1, AccountTypeCode = "AT1" }; // Act var result = await _settingsService.SaveAsync(accountType); // Assert _mockAccountTypeRepository.Verify(repo => repo.AddAsync(accountType), Times.Once); _mockUnitOfWork.Verify(uow => uow.CompleteAsync(), Times.Once); Assert.Equal(accountType, result); } [Fact] public async Task SaveAsync_ShouldThrowException_WhenRepositoryFails() { // Arrange var accountType = new AccountType { ID = 1, AccountTypeCode = "AT1" }; _mockAccountTypeRepository.Setup(repo => repo.AddAsync(accountType)) .ThrowsAsync(new Exception("Repository failure")); // Act & Assert await Assert.ThrowsAsync(() => _settingsService.SaveAsync(accountType)); } [Fact] public async Task UpdateAsync_ShouldUpdateAccountType() { // Arrange var accountType = new AccountType { ID = 1, AccountTypeCode = "AT1", Description = "Updated" }; _mockAccountTypeRepository.Setup(repo => repo.FindByIdAsync(accountType.ID)) .ReturnsAsync(new AccountType { ID = 1, AccountTypeCode = "AT1" }); // Act var result = await _settingsService.UpdateAsync(accountType); // Assert _mockAccountTypeRepository.Verify(repo => repo.Update(It.IsAny()), Times.Once); _mockUnitOfWork.Verify(uow => uow.CompleteAsync(), Times.Once); Assert.Equal(accountType.Description, result.Description); } [Fact] public async Task UpdateAsync_ShouldThrowNotFoundException_WhenAccountTypeDoesNotExist() { // Arrange var accountType = new AccountType { ID = 1, AccountTypeCode = "AT1" }; _mockAccountTypeRepository.Setup(repo => repo.FindByIdAsync(accountType.ID)) .ReturnsAsync((AccountType)null); // Act & Assert await Assert.ThrowsAsync (() => _settingsService.UpdateAsync(accountType)); } } }