using FabApprovalWorkerService.Models; using FabApprovalWorkerService.Services; using Microsoft.Extensions.Logging; using Moq; namespace FabApprovalWorkerServiceTests; internal class ECNServiceTests { Mock> _mockLogger; Mock _mockDalService; ECNService _ecnService; [SetUp] public void Setup() { _mockLogger = new Mock>(); _mockDalService = new Mock(); } [Test] public void EcnServiceWithNullLoggerShouldThrowException() { Assert.Throws(() => new ECNService(null, _mockDalService.Object)); } [Test] public void EcnServiceWithNullDalServiceShouldThrowException() { Assert.Throws(() => new ECNService(_mockLogger.Object, null)); } [Test] public void GetExpiringTECNsWithDbErrorShouldThrowException() { _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).ThrowsAsync(new Exception()); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.ThrowsAsync(async Task () => await _ecnService.GetExpiringTECNs()); } [Test] public void GetExpiredTECNsWithDbErrorShouldThrowException() { _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).ThrowsAsync(new Exception()); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.ThrowsAsync(async Task () => await _ecnService.GetExpiredTECNs()); } [Test] public async Task GetExpiringTECNsWithNoResultsFromDbShouldReturnEmpty() { IEnumerable emptyEcns = new List(); _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(emptyEcns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actual = await _ecnService.GetExpiringTECNs(); Assert.That(actual, Is.Empty); } [Test] public async Task GetExpiredTECNsWithNoResultsFromDbShouldReturnEmpty() { IEnumerable emptyEcns = new List(); _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(emptyEcns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actual = await _ecnService.GetExpiredTECNs(); Assert.That(actual, Is.Empty); } [Test] public async Task GetExpiringTECNsWithNoExtensionFromDbShouldReturnSameResults() { IEnumerable ecns = new List() { new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title1", IsTECN = true, ExpirationDate = DateTime.Now.AddDays(1) }, new ECN() { ECNNumber = 2, OriginatorID = 1, Title = "title2", IsTECN = true, ExpirationDate = DateTime.Now.AddDays(2) }, new ECN() { ECNNumber = 3, OriginatorID = 1, Title = "title3", IsTECN = true, ExpirationDate = DateTime.Now.AddDays(3) }, }; _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(ecns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actual = await _ecnService.GetExpiringTECNs(); Assert.That(actual.Count(), Is.EqualTo(3)); } [Test] public async Task GetExpiredTECNsWithNoExtensionFromDbShouldReturnSameResults() { IEnumerable ecns = new List() { new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title1", IsTECN = true, ExpirationDate = DateTime.Now.Date.AddHours(2) }, new ECN() { ECNNumber = 2, OriginatorID = 1, Title = "title2", IsTECN = true, ExpirationDate = DateTime.Now.Date.AddHours(20) }, new ECN() { ECNNumber = 3, OriginatorID = 1, Title = "title3", IsTECN = true, ExpirationDate = DateTime.Now.Date.AddHours(12) }, }; _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(ecns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actual = await _ecnService.GetExpiredTECNs(); Assert.That(actual.Count(), Is.EqualTo(3)); } [Test] public async Task GetExpiringTECNsWithExtensionsFromDbShouldReturnSameResults() { IEnumerable ecns = new List() { new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title1", IsTECN = true, ExpirationDate = DateTime.Now.AddDays(1) }, new ECN() { ECNNumber = 2, OriginatorID = 1, Title = "title2", IsTECN = true, ExpirationDate = DateTime.Now.AddDays(2) }, new ECN() { ECNNumber = 3, OriginatorID = 1, Title = "title3", IsTECN = true, ExpirationDate = DateTime.Now.AddDays(3), ExtensionDate = DateTime.Now.AddDays(10) }, }; _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(ecns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actual = await _ecnService.GetExpiringTECNs(); Assert.That(actual.Count(), Is.EqualTo(2)); } [Test] public async Task GetExpiredTECNsWithExtensionsFromDbShouldReturnSameResults() { IEnumerable ecns = new List() { new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title1", IsTECN = true, ExpirationDate = DateTime.Now.Date.AddHours(2) }, new ECN() { ECNNumber = 2, OriginatorID = 1, Title = "title2", IsTECN = true, ExpirationDate = DateTime.Now.Date.AddHours(20) }, new ECN() { ECNNumber = 3, OriginatorID = 1, Title = "title3", IsTECN = true, ExpirationDate = DateTime.Now.Date.AddHours(12), ExtensionDate = DateTime.Now.Date.AddDays(10) }, }; _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(ecns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actual = await _ecnService.GetExpiredTECNs(); Assert.That(actual.Count(), Is.EqualTo(2)); } [Test] public void GetTECNNotificationUserEmailsDbErrorShouldThrowException() { _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Throws(new Exception()); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.ThrowsAsync(async Task () => await _ecnService.GetTECNNotificationUserEmails()); } [Test] public async Task GetTECNNotificationUserEmailsShouldReturnExpectedUserEmails() { IEnumerable userEmails = new List() { "fake1@email.com", "fake2@email.com" }; _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(userEmails)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); IEnumerable actualEmails = await _ecnService.GetTECNNotificationUserEmails(); Assert.That(actualEmails.Count(), Is.EqualTo(2)); } [Test] public void GetEcnByNumberWithInvalidNumberShouldThrowException() { _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.ThrowsAsync(async Task () => await _ecnService.GetEcnByNumber(0)); Assert.ThrowsAsync(async Task () => await _ecnService.GetEcnByNumber(-4)); } [Test] public void GetEcnByNumberDbErrorShouldThrowException() { _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Throws(new Exception()); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.ThrowsAsync(async Task () => await _ecnService.GetEcnByNumber(2)); } [Test] public void GetEcnByNumberEcnNotFoundShouldThrowException() { IEnumerable expectedEcns = new List(); _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(expectedEcns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.ThrowsAsync(async Task () => await _ecnService.GetEcnByNumber(8)); } [Test] public async Task GetEcnByNumberShouldReturnExpectedEcn() { IEnumerable expectedEcns = new List() { new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title" } }; _mockDalService.Setup(d => d.QueryAsync(It.IsAny())).Returns(Task.FromResult(expectedEcns)); _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); ECN actualEcn = await _ecnService.GetEcnByNumber(9); Assert.That(expectedEcns.First(), Is.EqualTo(actualEcn)); } }