using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Moq; using NUnit.Framework; using LCU.Api.Internal.CoreApiWrapper.Controllers; using LCU.Api.Internal.CoreApiWrapper.Services; using LCU.Library.Internal.CoreApiWrapperModel.CoreModels.Organizations; using LCU.Library.Internal.Exceptions; using Microsoft.AspNetCore.Http; namespace LCU.Api.Internal.CoreApiWrapperTest.Controllers { public class OrganizationControllerTest { private OrganizationController _organizationController; private Mock _mockOrganizationService; [SetUp] public void SetUp() { _mockOrganizationService = new Mock(); _organizationController = new OrganizationController(_mockOrganizationService.Object); } [Test] public async Task GetOrganizationByOrganizationNumber_OK() { const long organizationNumber = 123334234324; var testOrganizationResult = new Organization { Name = "Test Organization" }; var testOrganizationsResult = new List { testOrganizationResult }; _mockOrganizationService.Setup(x => x.GetOrganizationByOrganizationNumber(organizationNumber)).ReturnsAsync(testOrganizationsResult).Verifiable(); var results = await _organizationController.GetOrganizationByOrganizationNumber(organizationNumber); Assert.NotNull(results); var okResult = results as OkObjectResult; Assert.NotNull(okResult); Assert.AreEqual(200, okResult.StatusCode); var result = okResult.Value as List; Assert.NotNull(result); Assert.AreEqual(1, result.Count); Assert.AreEqual(testOrganizationResult.Name, result.FirstOrDefault()?.Name); _mockOrganizationService.Verify(); } [Test] public async Task GetOrganizationByOrganizationNumber_ExceptionThrown_ServerError() { const long organizationNumber = 123334234324; _mockOrganizationService.Setup(x => x.GetOrganizationByOrganizationNumber(organizationNumber)).ThrowsAsync(new Exception("Thrown from unit test")).Verifiable(); var results = await _organizationController.GetOrganizationByOrganizationNumber(organizationNumber); Assert.NotNull(results); var badRes = results as StatusCodeResult; Assert.NotNull(badRes); Assert.AreEqual(500, badRes.StatusCode); } [Test] public async Task GetOrganizationByOrganizationNumber_ServiceExceptionThrown_ServerError() { const long organizationNumber = 123334234324; _mockOrganizationService.Setup(x => x.GetOrganizationByOrganizationNumber(organizationNumber)).ThrowsAsync(new ServiceException("Thrown from unit test")).Verifiable(); var results = await _organizationController.GetOrganizationByOrganizationNumber(organizationNumber); Assert.NotNull(results); var badRes = results as StatusCodeResult; Assert.NotNull(badRes); Assert.AreEqual(500, badRes.StatusCode); } [Test] public async Task GetMemberByAccountNumber_ServiceException_ServerErrorReturned() { const long organizationNumber = 123334234324; _mockOrganizationService.Setup(x => x.GetOrganizationByOrganizationNumber(organizationNumber)).ThrowsAsync(new ServiceException("Thrown from unit test")).Verifiable(); var results = await _organizationController.GetOrganizationByOrganizationNumber(organizationNumber); Assert.NotNull(results); var badRes = results as StatusCodeResult; Assert.NotNull(badRes); Assert.AreEqual(500, badRes.StatusCode); } [Test] public async Task GetMemberByAccountNumber_Exception_ServerErrorReturned() { const long organizationNumber = 123334234324; _mockOrganizationService.Setup(x => x.GetOrganizationByOrganizationNumber(organizationNumber)).ThrowsAsync(new Exception("Thrown from unit test")).Verifiable(); var results = await _organizationController.GetOrganizationByOrganizationNumber(organizationNumber); Assert.NotNull(results); var badRes = results as StatusCodeResult; Assert.NotNull(badRes); Assert.AreEqual(500, badRes.StatusCode); } [Test] public async Task GetOrganizationByMemberAgreementNumber_OK() { const long memberNumber = 123334234324; var testOrganizationResult = new Organization { Name = "Test Organization" }; _mockOrganizationService.Setup(x => x.GetMemberByMemberAgreeNbr(memberNumber)).ReturnsAsync(testOrganizationResult).Verifiable(); var results = await _organizationController.GetOrganizationByMemberAgreementNumber(memberNumber); Assert.NotNull(results); var okResult = results as OkObjectResult; Assert.NotNull(okResult); Assert.AreEqual(200, okResult.StatusCode); var result = okResult.Value as Organization; Assert.NotNull(result); Assert.AreEqual(testOrganizationResult.Name, result?.Name); _mockOrganizationService.Verify(); } [Test] public async Task GetOrganizationByMemberAgreementNumber_ServiceException_ServerErrorReturned() { const long memberNumber = 123334234324; _mockOrganizationService.Setup(x => x.GetMemberByMemberAgreeNbr(memberNumber)).ThrowsAsync(new ServiceException("Thrown from unit test")).Verifiable(); var results = await _organizationController.GetOrganizationByMemberAgreementNumber(memberNumber); Assert.NotNull(results); var badRes = results as StatusCodeResult; Assert.NotNull(badRes); Assert.AreEqual(500, badRes.StatusCode); } [Test] public async Task GetOrganizationByMemberAgreementNumber_Exception_ServerErrorReturned() { const long memberNumber = 123334234324; _mockOrganizationService.Setup(x => x.GetMemberByMemberAgreeNbr(memberNumber)).ThrowsAsync(new Exception("Thrown from unit test")).Verifiable(); var results = await _organizationController.GetOrganizationByMemberAgreementNumber(memberNumber); Assert.NotNull(results); var badRes = results as StatusCodeResult; Assert.NotNull(badRes); Assert.AreEqual(500, badRes.StatusCode); } [Test] public async Task GetOrganizationByOrganizationName_GetOrganizationByNameThrowsServiceException_Returns500() { var organizationName = Guid.NewGuid().ToString(); _mockOrganizationService .Setup(os => os.GetOrganizationByName(organizationName)) .ThrowsAsync(new ServiceException(string.Empty)); var response = await _organizationController.GetOrganizationByOrganizationName(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status500InternalServerError, ((StatusCodeResult)response).StatusCode); } [Test] public async Task GetOrganizationByOrganizationName_GetOrganizationByNameThrowsNonServiceException_500() { var exception = new Exception(); var organizationName = Guid.NewGuid().ToString(); _mockOrganizationService .Setup(os => os.GetOrganizationByName(organizationName)) .ThrowsAsync(exception); var response = await _organizationController.GetOrganizationByOrganizationName(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status500InternalServerError, ((StatusCodeResult)response).StatusCode); } [Test] public async Task GetOrganizationByOrganizationName_GetOrganizationByNameSucceeds_ReturnsOkAndResult() { var organizationName = Guid.NewGuid().ToString(); var organizations = new[] { new Organization() }; _mockOrganizationService .Setup(os => os.GetOrganizationByName(organizationName)) .ReturnsAsync(organizations); var response = await _organizationController.GetOrganizationByOrganizationName(organizationName); Assert.IsInstanceOf(response); Assert.AreSame(organizations, ((OkObjectResult)response).Value); } [Test] public async Task GetOrganizationByOrganizationNameLike_ServiceCallReturns_ReturnsOkAndResults() { var organizationName = Guid.NewGuid().ToString(); var limit = DateTime.Now.Millisecond; var organizations = new []{ new Organization{ Name = organizationName } }; _mockOrganizationService .Setup(s => s.GetOrganizationByNameLike(organizationName, limit)) .ReturnsAsync(organizations); var response = await _organizationController.GetOrganizationByOrganizationNameLike(organizationName, limit); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status200OK, ((OkObjectResult)response).StatusCode); Assert.AreSame(organizations, ((OkObjectResult)response).Value); } [Test] public async Task GetOrganizationByOrganizationNameLike_ServiceThrowsServiceException_Returns500() { var organizationName = Guid.NewGuid().ToString(); _mockOrganizationService .Setup(s => s.GetOrganizationByNameLike(organizationName, It.IsAny())) .ThrowsAsync(new ServiceException(string.Empty)); var response = await _organizationController.GetOrganizationByOrganizationNameLike(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status500InternalServerError, ((StatusCodeResult)response).StatusCode); } [Test] public async Task GetOrganizationByOrganizationNameLike_ServiceThrowsException_Returns500() { var organizationName = Guid.NewGuid().ToString(); _mockOrganizationService .Setup(s => s.GetOrganizationByNameLike(organizationName, It.IsAny())) .ThrowsAsync(new Exception()); var response = await _organizationController.GetOrganizationByOrganizationNameLike(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status500InternalServerError, ((StatusCodeResult)response).StatusCode); } [Test] public async Task CountOrganizationNumbersByName_ServiceCallReturns_ReturnsOkAndResults() { var organizationName = Guid.NewGuid().ToString(); var count = DateTime.Now.Millisecond; _mockOrganizationService .Setup(s => s.CountOrganizationNumbersByName(organizationName)) .ReturnsAsync(count); var response = await _organizationController.CountOrganizationNumbersByName(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status200OK, ((OkObjectResult)response).StatusCode); Assert.AreEqual(count, ((OkObjectResult)response).Value); } [Test] public async Task CountOrganizationNumbersByName_ServiceThrowsServiceException_Returns500() { var organizationName = Guid.NewGuid().ToString(); _mockOrganizationService .Setup(s => s.CountOrganizationNumbersByName(organizationName)) .ThrowsAsync(new ServiceException(string.Empty)); var response = await _organizationController.CountOrganizationNumbersByName(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status500InternalServerError, ((StatusCodeResult)response).StatusCode); } [Test] public async Task CountOrganizationNumbersByName_ServiceThrowsException_Returns500() { var organizationName = Guid.NewGuid().ToString(); _mockOrganizationService .Setup(s => s.CountOrganizationNumbersByName(organizationName)) .ThrowsAsync(new Exception()); var response = await _organizationController.CountOrganizationNumbersByName(organizationName); Assert.IsInstanceOf(response); Assert.AreEqual(StatusCodes.Status500InternalServerError, ((StatusCodeResult)response).StatusCode); } } }