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.GetExpiredTECNsInPastDay()); } [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.GetExpiredTECNsInPastDay(); 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.GetExpiredTECNsInPastDay(); 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.GetExpiredTECNsInPastDay(); 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", ExpirationDate = DateTime.Now } }; _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)); } [Test] public void EcnIsExpiredNullEcnShouldThrowException() { _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); Assert.Throws(() => _ecnService.EcnIsExpired(null)); } [Test] public void EcnIsExpiredShouldReturnTrueWhenBeforeToday() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(-2), IsTECN = true }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.True(isExpired); } [Test] public void EcnIsExpiredShouldReturnTrueWhenToday() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date, IsTECN = true }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.True(isExpired); } [Test] public void EcnIsExpiredShouldReturnFalseWhenAfterToday() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(2), IsTECN = true }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.False(isExpired); } [Test] public void EcnIsExpiredShouldReturnFalseWhenExtended() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(-2), ExtensionDate = DateTime.Now.Date.AddDays(5), IsTECN = true }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.False(isExpired); } [Test] public void EcnIsExpiredShouldReturnTrueWhenExtensionIsBeforeToday() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(-10), ExtensionDate = DateTime.Now.Date.AddDays(-5), IsTECN = true }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.True(isExpired); } [Test] public void EcnIsExpiredShouldReturnFalseWhenNotTecn() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(-2), IsTECN = false }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.False(isExpired); } [Test] public void EcnIsExpiredShouldReturnFalseWhenClosed() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(-2), IsTECN = false, CloseDate = DateTime.Now.AddDays(-2) }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.False(isExpired); } [Test] public void EcnIsExpiredShouldReturnTrueWhenNotClosed() { ECN ecn = new ECN() { ECNNumber = 1, OriginatorID = 1, Title = "title", ExpirationDate = DateTime.Now.Date.AddDays(-2), IsTECN = true }; _ecnService = new ECNService(_mockLogger.Object, _mockDalService.Object); bool isExpired = _ecnService.EcnIsExpired(ecn); Assert.True(isExpired); } }