using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using NUnit.Framework; using Moq; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels; using LCU.Api.Internal.CoreApiWrapper.Services; using LCU.Library.Internal.CoreApiWrapperLib.DataAccess; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.CoreRequests; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Organizations; using LCU.Library.Internal.Exceptions; namespace LCU.Api.Internal.CoreApiWrapperTest.Service { public class OrganizationServiceTest { private readonly IOrganizationService _organizationService; private readonly Mock _mockOrganizationDao; public OrganizationServiceTest() { _mockOrganizationDao = new Mock(); _organizationService = new OrganizationService(_mockOrganizationDao.Object); } [Test] public async Task GetOrganizationByOrganizationNumber_Returns_Organization() { var testOrganizationResult = OrganizationFactory(); var testOrganizationsResult = new List { testOrganizationResult }; _mockOrganizationDao.Setup(x => x.FindByOrganizationsSearch(It.IsAny(), It.Is(request => request.OrgNbr == 1234))).ReturnsAsync(testOrganizationsResult).Verifiable(); var results = await _organizationService.GetOrganizationByOrganizationNumber(1234); Assert.NotNull(results); var organizations = results.ToList(); Assert.AreEqual(1, organizations.Count); var result = organizations.FirstOrDefault(); Assert.AreEqual(testOrganizationResult.Name, result?.Name); _mockOrganizationDao.Verify(); } [Test] public void GetOrganizationByOrganizationNumber_Exception_ThrowsServiceException() { _mockOrganizationDao.Setup(x => x.FindByOrganizationsSearch(It.IsAny(), It.Is(request => request.OrgNbr == 1234))).ThrowsAsync(new Exception("Exception thrown from unit test.")).Verifiable(); Assert.ThrowsAsync(() => _organizationService.GetOrganizationByOrganizationNumber(1234)); _mockOrganizationDao.Verify(); } [Test] public async Task GetOrganizationByMemberAgreementNbr_Returns_Organization() { var testOrganizationResult = OrganizationFactory(); _mockOrganizationDao.Setup(x => x.FindOrganizationByMemberAgreeNbr(It.IsAny(), It.Is(request => request.MemberNbr == 12345))).ReturnsAsync(testOrganizationResult).Verifiable(); var result = await _organizationService.GetMemberByMemberAgreeNbr(12345); Assert.NotNull(result); Assert.AreEqual(testOrganizationResult.Name, result.Name); _mockOrganizationDao.Verify(); } [Test] public void GetOrganizationByMemberAgreementNbr_Exception_ThrowsServiceException() { _mockOrganizationDao.Setup(x => x.FindOrganizationByMemberAgreeNbr(It.IsAny(), It.Is(request => request.MemberNbr == 12345))).ThrowsAsync(new Exception("Exception thrown from unit test")).Verifiable(); Assert.ThrowsAsync(() => _organizationService.GetMemberByMemberAgreeNbr(12345)); _mockOrganizationDao.Verify(); } [Test] public void GetOrganizationByName_SearchThrowsException_ThrowsServiceException() { var organizationName = Guid.NewGuid().ToString(); var searchException = new Exception(Guid.NewGuid().ToString()); _mockOrganizationDao .Setup(o => o.FindByOrganizationsSearch ( It.IsAny(), It.Is(r => r.OrgName == organizationName) )) .ThrowsAsync(searchException); var thrownException = Assert.ThrowsAsync(() => _organizationService.GetOrganizationByName(organizationName)); StringAssert.Contains(organizationName, thrownException.Message); } [Test] public async Task GetOrganizationByName_SearchSucceeds_ReturnsResults() { var organizationName = Guid.NewGuid().ToString(); var actualOrganizations = new[] { OrganizationFactory() }; _mockOrganizationDao .Setup(o => o.FindByOrganizationsSearch ( It.IsAny(), It.Is(r => r.OrgName == organizationName) )) .ReturnsAsync(actualOrganizations); var organizations = await _organizationService.GetOrganizationByName(organizationName); Assert.AreSame(actualOrganizations, organizations); } [Test] public async Task GetOrganizationByNameLike_DaoReturnsOrgNumbersAndOrgsForNumbers_ReturnsOrganizations() { var organizationName = Guid.NewGuid().ToString(); var partialName = organizationName[5..^5]; var organizations = new [] { OrganizationFactory(organizationName), OrganizationFactory(), OrganizationFactory(organizationName) }; var nameMatchedOrganizations = organizations .Where(o => o.Name == organizationName) .ToArray(); var limit = nameMatchedOrganizations.Length / 2; _mockOrganizationDao .Setup(dao => dao.FindOrganizationNumbersByNameSearch(It.IsAny(), It.IsAny())) .Returns((name, count) => Task.FromResult(organizations.Where(o => o.Name.Contains(name)).Take(count).Select(o => o.OrganizationNumber))); _mockOrganizationDao .Setup(dao => dao.FindByOrganizationsSearch(It.IsAny(), It.IsAny())) .Returns((_, search) => Task.FromResult(nameMatchedOrganizations.Where(o => search.OrgNbr == o.OrganizationNumber))); var foundOrganizations = await _organizationService.GetOrganizationByNameLike(partialName, limit); CollectionAssert.AreEquivalent(nameMatchedOrganizations.Take(limit), foundOrganizations); } [Test] public void GetOrganizationByNameLike_DaoThrowsFromFindOrganizationNumbersByNameSearch_ThrowsServiceException() { var organizationName = Guid.NewGuid().ToString(); var limit = DateTime.Now.Millisecond; _mockOrganizationDao .Setup(dao => dao.FindOrganizationNumbersByNameSearch(organizationName, limit)) .ThrowsAsync(new Exception()); Assert.ThrowsAsync(() => _organizationService.GetOrganizationByNameLike(organizationName, limit)); } [Test] public void GetOrganizationByNameLike_DaoThrowsFromFindByOrganizationsSearch_ThrowsServiceException() { var organizationName = Guid.NewGuid().ToString(); var limit = DateTime.Now.Millisecond; var organizations = new [] { OrganizationFactory(organizationName), OrganizationFactory(), OrganizationFactory(organizationName) }; _mockOrganizationDao .Setup(dao => dao.FindOrganizationNumbersByNameSearch(It.IsAny(), It.IsAny())) .Returns((name, count) => Task.FromResult(organizations.Where(o => o.Name.Contains(name)).Take(count).Select(o => o.OrganizationNumber))); _mockOrganizationDao .Setup(dao => dao.FindByOrganizationsSearch(It.IsAny(), It.IsAny())) .ThrowsAsync(new Exception()); Assert.ThrowsAsync(() => _organizationService.GetOrganizationByNameLike(organizationName, limit)); } [Test] public async Task CountOrganizationNumbersByName_DaoReturnsCount_ReturnsCount() { var organizationName = Guid.NewGuid().ToString(); var partialName = organizationName[5..^5]; var organizations = new [] { OrganizationFactory(organizationName), OrganizationFactory(), OrganizationFactory(organizationName) }; var nameMatchedOrganizations = organizations .Where(o => o.Name == organizationName) .ToArray(); _mockOrganizationDao .Setup(dao => dao.CountOrganizationNumbersByName(It.IsAny())) .Returns(name => Task.FromResult(organizations.Count(o => o.Name.Contains(name)))); var count = await _organizationService.CountOrganizationNumbersByName(partialName); Assert.AreEqual(count, nameMatchedOrganizations.Length); } [Test] public void CountOrganizationNumbersByName_DaoThrowsFromCountOrganizationNumbersByName_ThrowsServiceException() { var organizationName = Guid.NewGuid().ToString(); _mockOrganizationDao .Setup(dao => dao.CountOrganizationNumbersByName(organizationName)) .ThrowsAsync(new Exception()); Assert.ThrowsAsync(() => _organizationService.CountOrganizationNumbersByName(organizationName)); } private static Random _organizationNumberSeries = new Random(DateTime.Now.Millisecond); private static Organization OrganizationFactory(string name = null, long? number = null) { return new Organization { Name = name ?? "Test Organization", OrganizationNumber = number ?? _organizationNumberSeries.Next() }; } } }