using FluentAssertions; using LCU.Api.Internal.DocumentIngestorLib.Extensions.Queryables; using LCU.Library.Internal.DocumentIngestorModels.Entities; using LCU.Library.Internal.DocumentIngestorModels.Enums; using LCU.Library.Internal.DocumentIngestorModels.Models.Pagination; namespace LCU.API.Internal.DocumentIngestorLibTests.Extensions.Queryables; public class DocumentProcessingInfoNotificationStatusQueryableTest { [Test] public void FilterByNotificationStatusType_NotificationStatusFiltersIsNull_ReturnsUnmodifiedQueryable() { var processingInfo = InfoFactory(); var filter = new Filter { NotificationStatusFilters = null }; var originalProcessingInfo = processingInfo.ToArray(); var filtered = processingInfo.FilterByNotificationStatusType(filter); filtered.Should().BeEquivalentTo(originalProcessingInfo); } [Test] public void FilterByNotificationStatusType_NotificationStatusFiltersIsEmpty_ReturnsUnmodifiedQueryable() { var processingInfo = InfoFactory(); var filter = new Filter { NotificationStatusFilters = new List() }; var originalProcessingInfo = processingInfo.ToArray(); var filtered = processingInfo.FilterByNotificationStatusType(filter); filtered.Should().BeEquivalentTo(originalProcessingInfo); } [Test] public void FilterByNotificationStatusType_ProcessingInfoMemberNotificationInfoIsNull_IsFilteredOut() { var processingInfo = InfoFactory(); var filter = new Filter { NotificationStatusFilters = processingInfo .Where(i => i.MemberNotificationInfos != null) .SelectMany(i => i.MemberNotificationInfos.ToList()) .Select(i => i.NotificationStatusType) .Distinct() .ToList() }; var filtered = processingInfo.FilterByNotificationStatusType(filter); filtered.Should().NotContain(i => i.MemberNotificationInfos == null); } [Test] public void FilterByNotificationStatusType_ProcessingInfoMemberNotificationInfoStatusNotInFilter_IsFilteredOut() { var processingInfo = InfoFactory(); var notIncludedStatuses = Enum.GetValues()[..(Enum.GetValues().Length / 2)]; var filter = new Filter { NotificationStatusFilters = processingInfo .Where(i => i.MemberNotificationInfos != null) .SelectMany(i => i.MemberNotificationInfos.ToList()) .Select(i => i.NotificationStatusType) .Distinct() .Except(notIncludedStatuses) .ToList() }; var filtered = processingInfo.FilterByNotificationStatusType(filter); filtered.Should().NotContain(i => notIncludedStatuses.Contains(i.MemberNotificationInfos.FirstOrDefault().NotificationStatusType)); } [Test] public void FilterByNotificationStatusType_ProcessingInfoMemberNotificationInfoStatusInFilter_IsRetained() { var processingInfo = InfoFactory(); var includedStatuses = Enum.GetValues()[..(Enum.GetValues().Length / 2)]; var filter = new Filter { NotificationStatusFilters = includedStatuses.Distinct().ToList() }; var filtered = processingInfo.FilterByNotificationStatusType(filter); filtered.Should().OnlyContain(i => includedStatuses.Contains(i.MemberNotificationInfos.FirstOrDefault().NotificationStatusType)); } private static IQueryable InfoFactory() => Enum.GetValues() .Distinct() .SelectMany(status => new[] { new DocumentProcessingInfo { MemberNotificationInfos = new List { new() { NotificationStatusType = status } } }, new DocumentProcessingInfo//double each status { MemberNotificationInfos = new List { new() { NotificationStatusType = status } } } }) .Concat(new[] { new DocumentProcessingInfo { MemberNotificationInfos = null } }) .AsQueryable(); }