using System; using System.Collections.Generic; using System.Threading.Tasks; using Moq; using NUnit.Framework; using LCU.API.Internal.DocumentIngestor.Services.IngestionOperationServices; using LCU.Library.Internal.DocumentIngestorModels.Models; using LCU.API.Internal.DocumentIngestor.Services.MicroApiServices; using LCU.API.Internal.DocumentIngestor.Services.QueueServices; using LCU.API.Internal.DocumentIngestor.Services.DocumentProcessorServices; using LCU.API.Internal.DocumentIngestor.Configurations; using LCU.API.Internal.DocumentIngestor.Services.IndexParserServices; using LCU.Library.Internal.DocumentIngestorModels.Enums; using LCU.Library.Internal.DocumentIngestorModels.Models.IndexFileDocuments; using LCU.Library.Internal.FileOperationsModels.Models; using LCU.Library.Internal.LCUServiceFactory.Services; namespace LCU.API.Internal.DocumentIngestorTests.Services.IngestionOperationServices; public class DocumentProcessorServiceTest { private DocumentProcessorService _documentProcessorService; private ApiConfiguration _apiConfiguration; private Mock _mockQueueDocumentProcessingService; private Mock _mockQueueCompletionService; private Mock _mockFileOperationsApiService; private Mock> _mockLcuServiceFactory; private IDictionary _handlerServicesByType; [SetUp] public void Setup() { _apiConfiguration = new ApiConfiguration { DocumentProcessingReQueueCountLimit = 1 }; _mockQueueDocumentProcessingService = new Mock(); _mockQueueCompletionService = new Mock(); _mockFileOperationsApiService = new Mock(); _mockLcuServiceFactory = new Mock>(); _documentProcessorService = new DocumentProcessorService(_apiConfiguration, _mockQueueDocumentProcessingService.Object, _mockQueueCompletionService.Object, _mockFileOperationsApiService.Object, _mockLcuServiceFactory.Object); } [Test] public void HandleIngestion_Exception_RequestNull() { ProcessingRequest request = null; Assert.ThrowsAsync(async () => await _documentProcessorService.HandleProcessing(request)); _mockFileOperationsApiService.Verify(x => x.ValidateFileExistsAndNotArchived(It.IsAny(), It.IsAny()), Times.Never); _mockQueueCompletionService.Verify(x => x.QueueCompletionRequest(It.IsAny(), It.IsAny()), Times.Never); _mockLcuServiceFactory.Verify(x => x.GetService(It.IsAny()), Times.Never); _mockFileOperationsApiService.Verify(x => x.DirectMoveFile(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public async Task HandleIngestion_DocumentDoesNotNeedProcessing_Update_Return() { var filePath = "\\Test\\Test\\000001Test.pdf"; var archiveFilePath = "\\Test\\Test\\Archived\\000001Test.pdf"; _mockFileOperationsApiService.Setup(service => service.ValidateFileExistsAndNotArchived(filePath, archiveFilePath)) .ReturnsAsync(false); var ingestorRequest = new IngestorRequest { RootPath = "\\Test\\Test" }; var request = new ProcessingRequest() { DocumentFileName = "000001Test.pdf", IngestorRequest = ingestorRequest }; await _documentProcessorService.HandleProcessing(request); _mockFileOperationsApiService.Verify(x => x.ValidateFileExistsAndNotArchived(filePath, archiveFilePath), Times.Once); _mockQueueCompletionService.Verify(x => x.QueueCompletionRequest(request, It.Is(y => y.Success == true && y.AttemptToArchive == false && y.MessageStack.Count == 1 && y.ProcessStatusType == ProcessStatusTypes.Completed) ), Times.Once); _mockLcuServiceFactory.Verify(x => x.GetService(It.IsAny()), Times.Never); _mockFileOperationsApiService.Verify(x => x.DirectMoveFile(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); } [Test] public async Task HandlePostProcessingFailure_ProcessResult_SuccessFalse_QueueDocumentProcessing() { var request = new ProcessingRequest { IngestorRequest = new() { IngestorType = IngestorTypes.FosLoanStatement }, RetryCount = 0 }; var result = new ProcessResult { Success = false, ProcessStatusType = ProcessStatusTypes.CriticalFailure }; await _documentProcessorService.HandlePostProcessingFailure(request, result); _mockQueueDocumentProcessingService.Verify(x => x.QueueDocumentProcessingRequest(It.IsAny()), Times.Once); _mockQueueCompletionService.Verify(x => x.QueueCompletionRequest(It.IsAny(), It.IsAny()), Times.Never); } [Test] public async Task HandlePostProcessingFailure_ProcessResult_SuccessFalse_QueueCompletion() { var request = new ProcessingRequest { RetryCount = 1 }; var result = new ProcessResult { Success = false, ProcessStatusType = ProcessStatusTypes.CriticalFailure }; await _documentProcessorService.HandlePostProcessingFailure(request, result); _mockQueueDocumentProcessingService.Verify(x => x.QueueDocumentProcessingRequest(It.IsAny()), Times.Never); _mockQueueCompletionService.Verify(x => x.QueueCompletionRequest(It.IsAny(), It.IsAny()), Times.Once); } [TestCase(IngestorTypes.FosTaxStatement, typeof(IDocumentProcessingService))] [TestCase(IngestorTypes.FosDnaDocument, typeof(IDocumentProcessingService))] [TestCase(IngestorTypes.FosLoanStatement, typeof(IDocumentProcessingService))] [TestCase(IngestorTypes.XdiDnaNotice, typeof(IDocumentProcessingService))] [TestCase(IngestorTypes.OsgDnaNoticesDocument, typeof(IDocumentProcessingService))] [TestCase(IngestorTypes.XdiActionNotice, typeof(IDocumentProcessingService))] [TestCase(IngestorTypes.OsgHistoricalDocument, typeof(IDocumentProcessingService))] [Test] public async Task HandleProcessing_ByTypedRequest_HandledByMatchingServiceAndArchived(IngestorTypes type, Type handlerType) { var request = new ProcessingRequest { IngestorRequest = new IngestorRequest { IngestorType = type, RootPath = Guid.NewGuid().ToString(), }, DocumentFileName = Guid.NewGuid().ToString() }; var result = new ProcessResult { Success = true }; var documentProcessorService = new Mock(); _mockLcuServiceFactory.Setup(x => x.GetService(request.IngestorRequest.IngestorType)).Returns(documentProcessorService.Object); documentProcessorService.Setup(x => x.ProcessRequest(request)).ReturnsAsync(result); _mockFileOperationsApiService .Setup ( fs => fs.ValidateFileExistsAndNotArchived ( request.IngestorRequest.RootPath + request.DocumentFileName, request.IngestorRequest.ArchivePath + request.DocumentFileName ) ) .ReturnsAsync(true); _mockFileOperationsApiService .Setup(fs => fs.DirectMoveFile(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new RequestResponse { IsSuccessful = true }); await _documentProcessorService.HandleProcessing(request); _mockLcuServiceFactory.Verify(x => x.GetService(request.IngestorRequest.IngestorType), Times.Once); _mockFileOperationsApiService .Verify ( s => s.DirectMoveFile ( request.IngestorRequest.RootPath, request.DocumentFileName, request.IngestorRequest.ArchivePath ), Times.Once ); } }