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.
///