Files
2026-03-31 14:32:23 -05:00

229 lines
10 KiB
C#

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<IOrganizationDao> _mockOrganizationDao;
public OrganizationServiceTest()
{
_mockOrganizationDao = new Mock<IOrganizationDao>();
_organizationService = new OrganizationService(_mockOrganizationDao.Object);
}
[Test]
public async Task GetOrganizationByOrganizationNumber_Returns_Organization()
{
var testOrganizationResult = OrganizationFactory();
var testOrganizationsResult = new List<Organization> { testOrganizationResult };
_mockOrganizationDao.Setup(x => x.FindByOrganizationsSearch(It.IsAny<CoreRequestParameters>(),
It.Is<OrganizationSearchRequest>(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<CoreRequestParameters>(),
It.Is<OrganizationSearchRequest>(request => request.OrgNbr == 1234))).ThrowsAsync(new Exception("Exception thrown from unit test.")).Verifiable();
Assert.ThrowsAsync<ServiceException>(() => _organizationService.GetOrganizationByOrganizationNumber(1234));
_mockOrganizationDao.Verify();
}
[Test]
public async Task GetOrganizationByMemberAgreementNbr_Returns_Organization()
{
var testOrganizationResult = OrganizationFactory();
_mockOrganizationDao.Setup(x => x.FindOrganizationByMemberAgreeNbr(It.IsAny<CoreRequestParameters>(),
It.Is<MemberNbrRequest>(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<CoreRequestParameters>(),
It.Is<MemberNbrRequest>(request => request.MemberNbr == 12345))).ThrowsAsync(new Exception("Exception thrown from unit test")).Verifiable();
Assert.ThrowsAsync<ServiceException>(() => _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<CoreRequestParameters>(),
It.Is<OrganizationSearchRequest>(r => r.OrgName == organizationName)
))
.ThrowsAsync(searchException);
var thrownException = Assert.ThrowsAsync<ServiceException>(() => _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<CoreRequestParameters>(),
It.Is<OrganizationSearchRequest>(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<string>(), It.IsAny<int>()))
.Returns<string, int>((name, count) => Task.FromResult(organizations.Where(o => o.Name.Contains(name)).Take(count).Select(o => o.OrganizationNumber)));
_mockOrganizationDao
.Setup(dao => dao.FindByOrganizationsSearch(It.IsAny<CoreRequestParameters>(), It.IsAny<OrganizationSearchRequest>()))
.Returns<CoreRequestParameters, OrganizationSearchRequest>((_, 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<ServiceException>(() => _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<string>(), It.IsAny<int>()))
.Returns<string, int>((name, count) => Task.FromResult(organizations.Where(o => o.Name.Contains(name)).Take(count).Select(o => o.OrganizationNumber)));
_mockOrganizationDao
.Setup(dao => dao.FindByOrganizationsSearch(It.IsAny<CoreRequestParameters>(), It.IsAny<OrganizationSearchRequest>()))
.ThrowsAsync(new Exception());
Assert.ThrowsAsync<ServiceException>(() => _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<string>()))
.Returns<string>(name => Task.FromResult<long>(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<ServiceException>(() => _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()
};
}
}
}