From 9eb204231df724fba92d55689c616287b803c4b1 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Wed, 8 Jan 2025 15:36:38 +0000 Subject: [PATCH] Add file processing tests and enhance file handling logic - Introduced a new test method to verify processing of uploaded files in the processed folder. - Updated `FileProcessorDomainService` to check both processed and failed directories for file status. - Enhanced file moving logic to allow overwriting existing files during moves. - Added a new static path for processed Safaricom files in the `TestData` class. --- .../FileProcessorDomainServiceTests.cs | 25 +++++++++++++++++++ .../Services/FileProcessorDomainService.cs | 21 ++++++++++++---- FileProcessor.Testing/TestData.cs | 1 + 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/FileProcessor.BusinessLogic.Tests/FileProcessorDomainServiceTests.cs b/FileProcessor.BusinessLogic.Tests/FileProcessorDomainServiceTests.cs index 84e583e..6f9ef4c 100644 --- a/FileProcessor.BusinessLogic.Tests/FileProcessorDomainServiceTests.cs +++ b/FileProcessor.BusinessLogic.Tests/FileProcessorDomainServiceTests.cs @@ -468,6 +468,31 @@ public async Task FileRequestHandler_ProcessUploadedFileRequest_FileIsInFailedFo this.VerifyFileProcessing("home/txnproc/bulkfiles/safaricom/processed"); } + [Fact] + public async Task FileRequestHandler_ProcessUploadedFileRequest_FileIsInProcessedFolder_RequestIsHandled() + { + this.FileProcessorManager.Setup(f => f.GetFileProfile(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.FileProfileSafaricom); + + this.FileAggregateRepository.Setup(f => f.GetLatestVersion(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.GetCreatedFileAggregate())); + this.FileAggregateRepository.Setup(f => f.SaveChanges(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success); + + this.FileSystem.AddFile(TestData.ProcessedSafaricomFilePathWithName, new MockFileData(String.Empty)); + + this.FileSystem.AddDirectory("home/txnproc/bulkfiles/safaricom/inprogress"); + this.FileSystem.AddDirectory("home/txnproc/bulkfiles/safaricom/processed"); + this.FileSystem.AddDirectory("home/txnproc/bulkfiles/safaricom/failed"); + + this.SecurityServiceClient.Setup(s => s.GetToken(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.TokenResponse())); + + this.EstateClient.Setup(e => e.GetOperators(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(TestData.OperatorList); + + Result result = await this.FileProcessorDomainService.ProcessUploadedFile(TestData.ProcessUploadedFileCommand, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + + this.FileAggregateRepository.Verify(f => f.SaveChanges(It.IsAny(), It.IsAny()), Times.Exactly(2)); + this.VerifyFileProcessing("home/txnproc/bulkfiles/safaricom/processed"); + } [Theory] [InlineData("Safaricom")] diff --git a/FileProcessor.BusinessLogic/Services/FileProcessorDomainService.cs b/FileProcessor.BusinessLogic/Services/FileProcessorDomainService.cs index bf2f97e..c93fba0 100644 --- a/FileProcessor.BusinessLogic/Services/FileProcessorDomainService.cs +++ b/FileProcessor.BusinessLogic/Services/FileProcessorDomainService.cs @@ -460,16 +460,27 @@ private async Task ProcessFile(Guid fileId, inProgressFile = this.FileSystem.FileInfo.New(fileName); if (inProgressFile.Exists == false) { - // We also want to check the failed folder incase this is an event replay + // We also want to check the processed and failed folders incase this is an event replay IFileInfo failedFileInfo = this.FileSystem.FileInfo.New($"{fileProfile.FailedDirectory}/{inProgressFile.Name}"); + IFileInfo processedFileInfo = + this.FileSystem.FileInfo.New($"{fileProfile.ProcessedDirectory}/{inProgressFile.Name}"); - if (failedFileInfo.Exists == false) { + (Boolean, Boolean) fileStatus = (failedFileInfo.Exists, processedFileInfo.Exists); + + IFileInfo fileInfo = fileStatus switch + { + (true, false) => failedFileInfo, + (false, true) => processedFileInfo, + _ => null + }; + + if (fileInfo == null) { return Result.NotFound($"File {inProgressFile.FullName} not found"); } // Overwrite the inprogress file info object with the file found in the failed folder - inProgressFile = failedFileInfo; + inProgressFile = fileInfo; } Result result = await ApplyFileUpdates(async (FileAggregate fileAggregate) => { @@ -499,10 +510,10 @@ private async Task ProcessFile(Guid fileId, Logger.LogInformation($"About to move file {inProgressFile.Name} to [{fileProfile.ProcessedDirectory}]"); // Move file now - inProgressFile.MoveTo($"{fileProfile.ProcessedDirectory}/{inProgressFile.Name}"); + inProgressFile.MoveTo($"{fileProfile.ProcessedDirectory}/{inProgressFile.Name}", true); } else { - inProgressFile.MoveTo($"{fileProfile.FailedDirectory}/{inProgressFile.Name}"); + inProgressFile.MoveTo($"{fileProfile.FailedDirectory}/{inProgressFile.Name}", true); } return result; diff --git a/FileProcessor.Testing/TestData.cs b/FileProcessor.Testing/TestData.cs index f263d7f..ddf6c0c 100644 --- a/FileProcessor.Testing/TestData.cs +++ b/FileProcessor.Testing/TestData.cs @@ -39,6 +39,7 @@ public class TestData public static String FilePathWithName = "home/txnproc/bulkfiles/Example.csv"; public static String InProgressSafaricomFilePathWithName = "home/txnproc/bulkfiles/safaricom/inprogress/Example.csv"; public static String FailedSafaricomFilePathWithName = "home/txnproc/bulkfiles/safaricom/failed/Example.csv"; + public static String ProcessedSafaricomFilePathWithName = "home/txnproc/bulkfiles/safaricom/processed/Example.csv"; public static Guid FileProfileId = Guid.Parse("D0D3A4E5-870E-42F6-AD0E-5E24252BC95E");