From afd0657a40439efa4d2dac1a6e345ff22655dbb7 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Thu, 13 May 2021 15:01:53 +0100 Subject: [PATCH] Need same case insentive checks on operator --- .../SafaricomPinlessProxyTests.cs | 65 +++++++++++++++++++ ...actionProcessor.BusinessLogic.Tests.csproj | 2 +- .../SafaricomPinless/SafaricomPinlessProxy.cs | 27 +++++++- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs index 05a5fcd1..ebf03433 100644 --- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs @@ -47,6 +47,71 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupSuccessful_SaleM operatorResponse.ResponseMessage.ShouldBe("Topup Successful"); } + [Theory] + [InlineData("amount")] + [InlineData("Amount")] + [InlineData("AMOUNT")] + public async Task SafaricomPinlessProxy_ProcessSaleMessage_MetadataCasingTests_Amount_TopupSuccessful_SaleMessageIsProcessed(String amountFieldName) + { + HttpResponseMessage responseMessage = new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(TestData.SuccessfulSafaricomTopup) + }; + + SafaricomConfiguration safaricomConfiguration = TestData.SafaricomConfiguration; + HttpClient httpClient = SetupMockHttpClient(responseMessage); + + IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient); + + OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken, + TestData.TransactionId, + TestData.OperatorIdentifier1, + TestData.Merchant, + TestData.TransactionDateTime, + TestData.TransactionReference, + TestData.AdditionalTransactionMetaData(amountName: amountFieldName), + CancellationToken.None); + + operatorResponse.ShouldNotBeNull(); + operatorResponse.IsSuccessful.ShouldBeTrue(); + operatorResponse.ResponseCode.ShouldBe("200"); + operatorResponse.ResponseMessage.ShouldBe("Topup Successful"); + } + + [Theory] + [InlineData("customeraccountnumber")] + [InlineData("customerAccountNumber")] + [InlineData("CustomerAccountNumber")] + [InlineData("CUSTOMERACCOUNTNUMBER")] + public async Task SafaricomPinlessProxy_ProcessSaleMessage_MetadataCasingTests_CustomerAccountNumber_TopupSuccessful_SaleMessageIsProcessed(String customerAccountNumberFieldName) + { + HttpResponseMessage responseMessage = new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(TestData.SuccessfulSafaricomTopup) + }; + + SafaricomConfiguration safaricomConfiguration = TestData.SafaricomConfiguration; + HttpClient httpClient = SetupMockHttpClient(responseMessage); + + IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient); + + OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken, + TestData.TransactionId, + TestData.OperatorIdentifier1, + TestData.Merchant, + TestData.TransactionDateTime, + TestData.TransactionReference, + TestData.AdditionalTransactionMetaData(customerAccountNumberName: customerAccountNumberFieldName), + CancellationToken.None); + + operatorResponse.ShouldNotBeNull(); + operatorResponse.IsSuccessful.ShouldBeTrue(); + operatorResponse.ResponseCode.ShouldBe("200"); + operatorResponse.ResponseMessage.ShouldBe("Topup Successful"); + } + [Fact] public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupFailed_SaleMessageIsProcessed() { diff --git a/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj b/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj index 3d8393ba..1a781fe3 100644 --- a/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj +++ b/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj @@ -2,7 +2,7 @@ net5.0 - None + Full false diff --git a/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs b/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs index bc9a2337..920ae77a 100644 --- a/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs +++ b/TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs @@ -2,6 +2,7 @@ { using System; using System.Collections.Generic; + using System.Diagnostics.CodeAnalysis; using System.IO; using System.Net.Http; using System.Text; @@ -73,8 +74,8 @@ public async Task ProcessSaleMessage(String accessToken, CancellationToken cancellationToken) { // Extract the required fields - String transactionAmount = additionalTransactionMetadata.GetValueOrDefault("Amount"); - String customerMsisdn = additionalTransactionMetadata.GetValueOrDefault("CustomerAccountNumber"); + String transactionAmount = this.ExtractFieldFromMetadata("Amount", additionalTransactionMetadata); + String customerMsisdn = this.ExtractFieldFromMetadata("CustomerAccountNumber", additionalTransactionMetadata); if (String.IsNullOrEmpty(transactionAmount)) { @@ -115,6 +116,28 @@ public async Task ProcessSaleMessage(String accessToken, return this.CreateFrom(responseContent); } + [ExcludeFromCodeCoverage] + private String ExtractFieldFromMetadata(String fieldName, + Dictionary additionalTransactionMetadata) + { + // Create a case insensitive version of the dictionary + Dictionary caseInsensitiveDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + foreach (KeyValuePair keyValuePair in additionalTransactionMetadata) + { + caseInsensitiveDictionary.Add(keyValuePair.Key, keyValuePair.Value); + } + + if (caseInsensitiveDictionary.ContainsKey(fieldName)) + { + return caseInsensitiveDictionary[fieldName]; + } + else + { + return String.Empty; + } + + } + /// /// Builds the request. ///