From 307907f2751d2bdf483b508254d868565a1b3e6d Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 12 Jul 2021 21:15:20 +0100 Subject: [PATCH 1/4] :| --- FileProcessor.Client/FileProcessor.Client.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FileProcessor.Client/FileProcessor.Client.csproj b/FileProcessor.Client/FileProcessor.Client.csproj index bc546f3..660a1a9 100644 --- a/FileProcessor.Client/FileProcessor.Client.csproj +++ b/FileProcessor.Client/FileProcessor.Client.csproj @@ -15,7 +15,7 @@ - + From c030cb08fa88d254a201aa8969f876743d78e524 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 12 Jul 2021 21:37:26 +0100 Subject: [PATCH 2/4] Use client in integration tests --- .../Common/DockerHelper.cs | 10 ++- .../Features/GetFileImportDetailsSteps.cs | 76 +++++++------------ .../FileProcessor.IntegrationTests.csproj | 5 +- 3 files changed, 34 insertions(+), 57 deletions(-) diff --git a/FileProcessor.IntegrationTests/Common/DockerHelper.cs b/FileProcessor.IntegrationTests/Common/DockerHelper.cs index 65de935..c56d375 100644 --- a/FileProcessor.IntegrationTests/Common/DockerHelper.cs +++ b/FileProcessor.IntegrationTests/Common/DockerHelper.cs @@ -11,6 +11,7 @@ namespace FileProcessor.IntegrationTests.Common using System.Net; using System.Net.Http; using System.Threading; + using Client; using Ductus.FluentDocker.Builders; using Ductus.FluentDocker.Common; using Ductus.FluentDocker.Model.Builders; @@ -43,7 +44,10 @@ public class DockerHelper : global::Shared.IntegrationTesting.DockerHelper /// public ISecurityServiceClient SecurityServiceClient; - public HttpClient FileProcessorClient; + /// + /// The file processor client + /// + public IFileProcessorClient FileProcessorClient; /// /// The test identifier @@ -360,9 +364,7 @@ await Retry.For(async () => this.EstateClient = new EstateClient(EstateManagementBaseAddressResolver, httpClient); this.SecurityServiceClient = new SecurityServiceClient(SecurityServiceBaseAddressResolver, httpClient); this.EstateReportingClient = new EstateReportingClient(EstateReportingBaseAddressResolver, httpClient); - //this.TransactionProcessorClient = new TransactionProcessorClient(TransactionProcessorBaseAddressResolver, httpClient); - this.FileProcessorClient = new HttpClient(); - this.FileProcessorClient.BaseAddress = new Uri(FileProcessorBaseAddressResolver(null)); + this.FileProcessorClient = new FileProcessorClient(FileProcessorBaseAddressResolver, httpClient); await this.LoadEventStoreProjections().ConfigureAwait(false); } diff --git a/FileProcessor.IntegrationTests/Features/GetFileImportDetailsSteps.cs b/FileProcessor.IntegrationTests/Features/GetFileImportDetailsSteps.cs index 22c40fd..a916163 100644 --- a/FileProcessor.IntegrationTests/Features/GetFileImportDetailsSteps.cs +++ b/FileProcessor.IntegrationTests/Features/GetFileImportDetailsSteps.cs @@ -10,6 +10,7 @@ namespace FileProcessor.IntegrationTests.Features using System.Net; using System.Net.Http; using System.Net.Http.Headers; + using System.Threading; using Common; using DataTransferObjects.Responses; using Newtonsoft.Json; @@ -36,7 +37,7 @@ public GetFileImportDetailsSteps(ScenarioContext scenarioContext, [When(@"I get the '(.*)' import logs between '(.*)' and '(.*)' the following data is returned")] public async Task WhenIGetTheImportLogsBetweenAndTheFollowingDataIsReturned(string estateName, string startDate, string endDate, Table table) { - FileImportLogList importLogList = await this.GetFileImportLogList(estateName, startDate, endDate); + FileImportLogList importLogList = await this.GetFileImportLogList(estateName, startDate, endDate, CancellationToken.None); foreach (TableRow tableRow in table.Rows) { @@ -50,76 +51,53 @@ public async Task WhenIGetTheImportLogsBetweenAndTheFollowingDataIsReturned(stri } } - private async Task GetFile(String estateName, Guid fileId) + private async Task GetFile(String estateName, Guid fileId, CancellationToken cancellationToken) { var estateDetails = this.TestingContext.GetEstateDetails(estateName); - - String requestUri = - $"{this.TestingContext.DockerHelper.FileProcessorClient.BaseAddress}api/files/{fileId}?estateId={estateDetails.EstateId}"; - HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUri); - requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this.TestingContext.AccessToken); - - var responseMessage = await this.TestingContext.DockerHelper.FileProcessorClient.SendAsync(requestMessage); - - responseMessage.StatusCode.ShouldBe(HttpStatusCode.OK); - var content = await responseMessage.Content.ReadAsStringAsync(); - content.ShouldNotBeNull(); - content.ShouldNotBeEmpty(); - - var fileDetails = JsonConvert.DeserializeObject(content); + + var fileDetails = await this.TestingContext.DockerHelper.FileProcessorClient.GetFile(this.TestingContext.AccessToken, estateDetails.EstateId, fileId, cancellationToken); fileDetails.ShouldNotBeNull(); - + return fileDetails; } private async Task GetFileImportLogList(String estateName, String startDate, - String endDate) + String endDate, + CancellationToken cancellationToken) { var queryStartDate = SpecflowTableHelper.GetDateForDateString(startDate, DateTime.Now); var queryEndDate = SpecflowTableHelper.GetDateForDateString(endDate, DateTime.Now); var estateDetails = this.TestingContext.GetEstateDetails(estateName); - String requestUri = - $"{this.TestingContext.DockerHelper.FileProcessorClient.BaseAddress}api/fileImportLogs?estateId={estateDetails.EstateId}&startDate={queryStartDate.Date:yyyy-MM-dd}&endDate={queryEndDate.Date:yyyy-MM-dd}"; - HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUri); - requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this.TestingContext.AccessToken); - - var responseMessage = await this.TestingContext.DockerHelper.FileProcessorClient.SendAsync(requestMessage); - - responseMessage.StatusCode.ShouldBe(HttpStatusCode.OK); - var content = await responseMessage.Content.ReadAsStringAsync(); - content.ShouldNotBeNull(); - content.ShouldNotBeEmpty(); - - var importLogList = JsonConvert.DeserializeObject(content); + var importLogList = await this.TestingContext.DockerHelper.FileProcessorClient.GetFileImportLogs(this.TestingContext.AccessToken, + estateDetails.EstateId, + queryStartDate, + queryEndDate, + null, + cancellationToken); importLogList.ShouldNotBeNull(); importLogList.FileImportLogs.ShouldNotBeNull(); importLogList.FileImportLogs.ShouldNotBeEmpty(); + return importLogList; } private async Task GetFileImportLog(String estateName, - Guid fileImportLogId) + Guid fileImportLogId, + CancellationToken cancellationToken) { var estateDetails = this.TestingContext.GetEstateDetails(estateName); - String requestUri = - $"{this.TestingContext.DockerHelper.FileProcessorClient.BaseAddress}api/fileImportLogs/{fileImportLogId}?estateId={estateDetails.EstateId}"; - HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestUri); - requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this.TestingContext.AccessToken); - - var responseMessage = await this.TestingContext.DockerHelper.FileProcessorClient.SendAsync(requestMessage); - - responseMessage.StatusCode.ShouldBe(HttpStatusCode.OK); - var content = await responseMessage.Content.ReadAsStringAsync(); - content.ShouldNotBeNull(); - content.ShouldNotBeEmpty(); - - var fileImportLog = JsonConvert.DeserializeObject(content); + var fileImportLog = await this.TestingContext.DockerHelper.FileProcessorClient.GetFileImportLog(this.TestingContext.AccessToken, + fileImportLogId, + estateDetails.EstateId, + null, + cancellationToken); fileImportLog.ShouldNotBeNull(); fileImportLog.Files.ShouldNotBeNull(); fileImportLog.Files.ShouldNotBeEmpty(); + return fileImportLog; } @@ -127,11 +105,11 @@ private async Task GetFileImportLog(String estateName, public async Task WhenIGetTheImportLogForTheFollowingFileInformationIsReturned(string estateName, string startDate, Table table) { EstateDetails estateDetails = this.TestingContext.GetEstateDetails(estateName); - FileImportLogList importLogList = await this.GetFileImportLogList(estateName, startDate, startDate); + FileImportLogList importLogList = await this.GetFileImportLogList(estateName, startDate, startDate, CancellationToken.None); importLogList.FileImportLogs.ShouldHaveSingleItem(); - var fileImportLog = await this.GetFileImportLog(estateName, importLogList.FileImportLogs.Single().FileImportLogId); + var fileImportLog = await this.GetFileImportLog(estateName, importLogList.FileImportLogs.Single().FileImportLogId, CancellationToken.None); foreach (TableRow tableRow in table.Rows) { @@ -167,7 +145,7 @@ public async Task WhenIGetTheFileForEstateTheFollowingFileInformationIsReturned( await Retry.For(async () => { - var fileDetails = await this.GetFile(estateName, fileId); + var fileDetails = await this.GetFile(estateName, fileId, CancellationToken.None); fileDetails.ProcessingCompleted.ShouldBe(processingCompleted); fileDetails.FileLines.Count.ShouldBe(numberOfLines); fileDetails.ProcessingSummary.TotalLines.ShouldBe(totaLines); @@ -185,7 +163,7 @@ public async Task WhenIGetTheFileForEstateTheFollowingFileLinesAreReturned(strin Guid fileId = estateDetails.GetFileId(fileName); - var fileDetails = await this.GetFile(estateName, fileId); + var fileDetails = await this.GetFile(estateName, fileId, CancellationToken.None); foreach (TableRow tableRow in table.Rows) { diff --git a/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj b/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj index 4f72e2b..3335364 100644 --- a/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj +++ b/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj @@ -8,6 +8,7 @@ + @@ -31,10 +32,6 @@ - - - - True From ef08bb525ab670cc1753abd2722030d9fff7a105 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 12 Jul 2021 21:52:21 +0100 Subject: [PATCH 3/4] ... --- .../Features/SharedSteps.cs | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/FileProcessor.IntegrationTests/Features/SharedSteps.cs b/FileProcessor.IntegrationTests/Features/SharedSteps.cs index 10820c5..fa1d9d4 100644 --- a/FileProcessor.IntegrationTests/Features/SharedSteps.cs +++ b/FileProcessor.IntegrationTests/Features/SharedSteps.cs @@ -12,6 +12,7 @@ namespace FileProcessor.IntegrationTests.Features using System.Net.Http.Headers; using System.Threading; using Common; + using DataTransferObjects; using Shared.IntegrationTesting; using Shouldly; using TechTalk.SpecFlow; @@ -41,21 +42,21 @@ public void GivenIHaveAFileNamedWithTheFollowingContents(String fileName, Table [Given(@"I upload this file for processing")] public async Task GivenIUploadThisFileForProcessing(Table table) { - var response = await this.UploadFile(table); + var fileId = await this.UploadFile(table); - response.StatusCode.ShouldBe(HttpStatusCode.Accepted); + fileId.ShouldNotBe(Guid.Empty); } [Given(@"I upload this file for processing an error should be returned indicating the file is a duplicate")] public async Task GivenIUploadThisFileForProcessingAnErrorShouldBeReturnedIndicatingTheFileIsADuplicate(Table table) { - var response = await this.UploadFile(table); - response.StatusCode.ShouldBe(HttpStatusCode.BadRequest); - var responseContent = await response.Content.ReadAsStringAsync(CancellationToken.None); - responseContent.ShouldContain("Duplicate file", Case.Insensitive); + Should.Throw(async () => + { + await this.UploadFile(table); + }); } - private async Task UploadFile(Table table) + private async Task UploadFile(Table table) { var row = table.Rows.First(); String merchantName = SpecflowTableHelper.GetStringRowValue(row, "MerchantName"); @@ -66,30 +67,26 @@ private async Task UploadFile(Table table) Guid estateId = estate.EstateId; var merchantId = estate.GetMerchantId(merchantName); String filePath = this.TestingContext.UploadFile; - - var client = new HttpClient(); - var formData = new MultipartFormDataContent(); - - var fileContent = new ByteArrayContent(await File.ReadAllBytesAsync(filePath)); - fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); - formData.Add(fileContent, "file", Path.GetFileName(filePath)); - formData.Add(new StringContent(estateId.ToString()), "request.EstateId"); - formData.Add(new StringContent(merchantId.ToString()), "request.MerchantId"); - formData.Add(new StringContent(fileProfileId), "request.FileProfileId"); - formData.Add(new StringContent(userId), "request.UserId"); - - var request = new HttpRequestMessage(HttpMethod.Post, $"http://127.0.0.1:{this.TestingContext.DockerHelper.FileProcessorPort}/api/files") - { - Content = formData - }; - request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", this.TestingContext.AccessToken); - - var response = await client.SendAsync(request); + var fileData = await File.ReadAllBytesAsync(filePath); + + UploadFileRequest uploadFileRequest = new UploadFileRequest + { + EstateId = estateId, + FileProfileId = Guid.Parse(fileProfileId), + MerchantId = merchantId, + UserId = Guid.Parse(userId) + }; + + var fileId = await this.TestingContext.DockerHelper.FileProcessorClient.UploadFile(this.TestingContext.AccessToken, + Path.GetFileName(filePath), + fileData, + uploadFileRequest, + CancellationToken.None); // Now we need to wait some time to let the file be processed await Task.Delay(TimeSpan.FromMinutes(1)); - return response; + return fileId; } From 2b535116a9cd0cba7c3d4683788e9dbc5da74582 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 12 Jul 2021 22:45:24 +0100 Subject: [PATCH 4/4] ... --- FileProcessor.Client/FileProcessorClient.cs | 2 +- .../FileProcessor.IntegrationTests.csproj | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/FileProcessor.Client/FileProcessorClient.cs b/FileProcessor.Client/FileProcessorClient.cs index 774f550..9c809ca 100644 --- a/FileProcessor.Client/FileProcessorClient.cs +++ b/FileProcessor.Client/FileProcessorClient.cs @@ -198,7 +198,7 @@ public async Task UploadFile(String accessToken, Guid response = Guid.Empty; try { - String requestUri = this.BuildRequestUrl("api/files"); + String requestUri = this.BuildRequestUrl("/api/files"); HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Post, requestUri); MultipartFormDataContent formData = new MultipartFormDataContent(); diff --git a/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj b/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj index 3335364..1ebfa5e 100644 --- a/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj +++ b/FileProcessor.IntegrationTests/FileProcessor.IntegrationTests.csproj @@ -8,7 +8,6 @@ - @@ -56,4 +55,9 @@ + + + + +