From 34f13df930aa167604da74dc24a206a751288c0e Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Sat, 3 Oct 2020 16:44:44 +0100 Subject: [PATCH] Added messging service client --- .../IMessagingServiceClient.cs | 28 +++++ .../MessagingService.Client.csproj | 20 +++ .../MessagingServiceClient.cs | 114 ++++++++++++++++++ .../Common/DockerHelper.cs | 11 +- .../Email/SendEmailSteps.cs | 12 +- .../MessagingService.IntegrationTests.csproj | 3 +- MessagingService.sln | 9 +- 7 files changed, 181 insertions(+), 16 deletions(-) create mode 100644 MessagingService.Client/IMessagingServiceClient.cs create mode 100644 MessagingService.Client/MessagingService.Client.csproj create mode 100644 MessagingService.Client/MessagingServiceClient.cs diff --git a/MessagingService.Client/IMessagingServiceClient.cs b/MessagingService.Client/IMessagingServiceClient.cs new file mode 100644 index 0000000..afdf211 --- /dev/null +++ b/MessagingService.Client/IMessagingServiceClient.cs @@ -0,0 +1,28 @@ +namespace MessagingService.Client +{ + using System; + using System.Threading; + using System.Threading.Tasks; + using DataTransferObjects; + + /// + /// + /// + public interface IMessagingServiceClient + { + #region Methods + + /// + /// Sends the email. + /// + /// The access token. + /// The request. + /// The cancellation token. + /// + Task SendEmail(String accessToken, + SendEmailRequest request, + CancellationToken cancellationToken); + + #endregion + } +} \ No newline at end of file diff --git a/MessagingService.Client/MessagingService.Client.csproj b/MessagingService.Client/MessagingService.Client.csproj new file mode 100644 index 0000000..aeb7a33 --- /dev/null +++ b/MessagingService.Client/MessagingService.Client.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.0 + + + + + + + + + + + + + + + + diff --git a/MessagingService.Client/MessagingServiceClient.cs b/MessagingService.Client/MessagingServiceClient.cs new file mode 100644 index 0000000..c65db28 --- /dev/null +++ b/MessagingService.Client/MessagingServiceClient.cs @@ -0,0 +1,114 @@ +namespace MessagingService.Client +{ + using System; + using System.Net.Http; + using System.Net.Http.Headers; + using System.Text; + using System.Threading; + using System.Threading.Tasks; + using ClientProxyBase; + using DataTransferObjects; + using Newtonsoft.Json; + + /// + /// + /// + /// + /// + public class MessagingServiceClient : ClientProxyBase, IMessagingServiceClient + { + #region Fields + + /// + /// The base address + /// + private readonly String BaseAddress; + + /// + /// The base address resolver + /// + private readonly Func BaseAddressResolver; + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The base address resolver. + /// The HTTP client. + public MessagingServiceClient(Func baseAddressResolver, + HttpClient httpClient) : base(httpClient) + { + this.BaseAddressResolver = baseAddressResolver; + + // Add the API version header + this.HttpClient.DefaultRequestHeaders.Add("api-version", "1.0"); + } + + #endregion + + #region Methods + + /// + /// Sends the email. + /// + /// The access token. + /// The send email request. + /// The cancellation token. + /// + public async Task SendEmail(String accessToken, + SendEmailRequest sendEmailRequest, + CancellationToken cancellationToken) + { + SendEmailResponse response = null; + + String requestUri = this.BuildRequestUrl("/api/email/"); + + try + { + String requestSerialised = JsonConvert.SerializeObject(sendEmailRequest); + + StringContent httpContent = new StringContent(requestSerialised, Encoding.UTF8, "application/json"); + + // Add the access token to the client headers + this.HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); + + // Make the Http Call here + HttpResponseMessage httpResponse = await this.HttpClient.PostAsync(requestUri, httpContent, cancellationToken); + + // Process the response + String content = await this.HandleResponse(httpResponse, cancellationToken); + + // call was successful so now deserialise the body to the response object + response = JsonConvert.DeserializeObject(content); + } + catch(Exception ex) + { + // An exception has occurred, add some additional information to the message + Exception exception = new Exception("Error sending email message.", ex); + + throw exception; + } + + return response; + } + + /// + /// Builds the request URL. + /// + /// The route. + /// + private String BuildRequestUrl(String route) + { + String baseAddress = this.BaseAddressResolver("MessagingServiceApi"); + + String requestUri = $"{baseAddress}{route}"; + + return requestUri; + } + + #endregion + } +} \ No newline at end of file diff --git a/MessagingService.IntegrationTests/Common/DockerHelper.cs b/MessagingService.IntegrationTests/Common/DockerHelper.cs index e6d169f..764cf84 100644 --- a/MessagingService.IntegrationTests/Common/DockerHelper.cs +++ b/MessagingService.IntegrationTests/Common/DockerHelper.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Net.Http; using System.Threading.Tasks; + using Client; using Ductus.FluentDocker.Builders; using Ductus.FluentDocker.Common; using Ductus.FluentDocker.Model.Builders; @@ -26,7 +27,10 @@ public class DockerHelper : global::Shared.IntegrationTesting.DockerHelper /// public ISecurityServiceClient SecurityServiceClient; - public HttpClient MessagingServiceClient; + /// + /// The messaging service client + /// + public IMessagingServiceClient MessagingServiceClient; /// /// The test identifier @@ -166,12 +170,11 @@ public override async Task StartContainersForScenarioRun(String scenarioName) // Setup the base address resolvers String SecurityServiceBaseAddressResolver(String api) => $"http://127.0.0.1:{this.SecurityServicePort}"; + String MessagingServiceBaseAddressResolver(String api) => $"http://127.0.0.1:{this.MessagingServicePort}"; HttpClient httpClient = new HttpClient(); this.SecurityServiceClient = new SecurityServiceClient(SecurityServiceBaseAddressResolver, httpClient); - - this.MessagingServiceClient = new HttpClient(); - this.MessagingServiceClient.BaseAddress = new Uri($"http://127.0.0.1:{this.MessagingServicePort}"); + this.MessagingServiceClient = new MessagingServiceClient(MessagingServiceBaseAddressResolver, httpClient); } /// diff --git a/MessagingService.IntegrationTests/Email/SendEmailSteps.cs b/MessagingService.IntegrationTests/Email/SendEmailSteps.cs index b1677a7..554d951 100644 --- a/MessagingService.IntegrationTests/Email/SendEmailSteps.cs +++ b/MessagingService.IntegrationTests/Email/SendEmailSteps.cs @@ -56,18 +56,10 @@ private async Task SendEmail(TableRow tableRow) Subject = subject, ToAddresses = toAddresses.Split(",").ToList() }; - - StringContent requestContent = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); - this.TestingContext.DockerHelper.MessagingServiceClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", this.TestingContext.AccessToken); - HttpResponseMessage httpResponse = await this.TestingContext.DockerHelper.MessagingServiceClient.PostAsync("api/Email", requestContent, CancellationToken.None).ConfigureAwait(false); - - httpResponse.StatusCode.ShouldBe(HttpStatusCode.Created); - String responseContent = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false); + SendEmailResponse sendEmailResponse = await this.TestingContext.DockerHelper.MessagingServiceClient.SendEmail(this.TestingContext.AccessToken, request, CancellationToken.None).ConfigureAwait(false); - responseContent.ShouldNotBeNullOrEmpty(); - SendEmailResponse response = JsonConvert.DeserializeObject(responseContent); - response.MessageId.ShouldNotBe(Guid.Empty); + sendEmailResponse.MessageId.ShouldNotBe(Guid.Empty); } } } diff --git a/MessagingService.IntegrationTests/MessagingService.IntegrationTests.csproj b/MessagingService.IntegrationTests/MessagingService.IntegrationTests.csproj index 89de71e..c181ff1 100644 --- a/MessagingService.IntegrationTests/MessagingService.IntegrationTests.csproj +++ b/MessagingService.IntegrationTests/MessagingService.IntegrationTests.csproj @@ -7,7 +7,7 @@ - + @@ -27,6 +27,7 @@ + diff --git a/MessagingService.sln b/MessagingService.sln index caa08cd..a1d699b 100644 --- a/MessagingService.sln +++ b/MessagingService.sln @@ -25,7 +25,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagingService.BusinessLo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagingService.EmailAggregate.Tests", "MessagingService.EmailAggregate.Tests\MessagingService.EmailAggregate.Tests.csproj", "{2FBED4B6-3096-4AD1-8436-247A59E0CDC2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagingService.IntegrationTests", "MessagingService.IntegrationTests\MessagingService.IntegrationTests.csproj", "{FEBD44D2-5B93-40D8-B59C-E5221570055D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MessagingService.IntegrationTests", "MessagingService.IntegrationTests\MessagingService.IntegrationTests.csproj", "{FEBD44D2-5B93-40D8-B59C-E5221570055D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MessagingService.Client", "MessagingService.Client\MessagingService.Client.csproj", "{E1F3FEA4-3358-429F-B3CF-FD7E15EDB993}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -73,6 +75,10 @@ Global {FEBD44D2-5B93-40D8-B59C-E5221570055D}.Debug|Any CPU.Build.0 = Debug|Any CPU {FEBD44D2-5B93-40D8-B59C-E5221570055D}.Release|Any CPU.ActiveCfg = Release|Any CPU {FEBD44D2-5B93-40D8-B59C-E5221570055D}.Release|Any CPU.Build.0 = Release|Any CPU + {E1F3FEA4-3358-429F-B3CF-FD7E15EDB993}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E1F3FEA4-3358-429F-B3CF-FD7E15EDB993}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1F3FEA4-3358-429F-B3CF-FD7E15EDB993}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E1F3FEA4-3358-429F-B3CF-FD7E15EDB993}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -88,6 +94,7 @@ Global {17A755D6-96EE-46EB-8850-9641B8F1A5E1} = {9AEE6ADE-DD45-4605-A933-E06CF0BA4203} {2FBED4B6-3096-4AD1-8436-247A59E0CDC2} = {9AEE6ADE-DD45-4605-A933-E06CF0BA4203} {FEBD44D2-5B93-40D8-B59C-E5221570055D} = {9AEE6ADE-DD45-4605-A933-E06CF0BA4203} + {E1F3FEA4-3358-429F-B3CF-FD7E15EDB993} = {BF2482A1-13C0-4305-B732-AB62EBD9429B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1929C0FE-8CEB-4D0E-BD22-9E5E16E2B49F}