Skip to content

Commit 95b9fff

Browse files
Merge pull request #146 from TransactionProcessing/bug/#144_caseinsentitivemetadata
Need same case insentive checks on operator
2 parents c313a43 + c7860a5 commit 95b9fff

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,71 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupSuccessful_SaleM
4747
operatorResponse.ResponseMessage.ShouldBe("Topup Successful");
4848
}
4949

50+
[Theory]
51+
[InlineData("amount")]
52+
[InlineData("Amount")]
53+
[InlineData("AMOUNT")]
54+
public async Task SafaricomPinlessProxy_ProcessSaleMessage_MetadataCasingTests_Amount_TopupSuccessful_SaleMessageIsProcessed(String amountFieldName)
55+
{
56+
HttpResponseMessage responseMessage = new HttpResponseMessage
57+
{
58+
StatusCode = HttpStatusCode.OK,
59+
Content = new StringContent(TestData.SuccessfulSafaricomTopup)
60+
};
61+
62+
SafaricomConfiguration safaricomConfiguration = TestData.SafaricomConfiguration;
63+
HttpClient httpClient = SetupMockHttpClient(responseMessage);
64+
65+
IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient);
66+
67+
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
68+
TestData.TransactionId,
69+
TestData.OperatorIdentifier1,
70+
TestData.Merchant,
71+
TestData.TransactionDateTime,
72+
TestData.TransactionReference,
73+
TestData.AdditionalTransactionMetaData(amountName: amountFieldName),
74+
CancellationToken.None);
75+
76+
operatorResponse.ShouldNotBeNull();
77+
operatorResponse.IsSuccessful.ShouldBeTrue();
78+
operatorResponse.ResponseCode.ShouldBe("200");
79+
operatorResponse.ResponseMessage.ShouldBe("Topup Successful");
80+
}
81+
82+
[Theory]
83+
[InlineData("customeraccountnumber")]
84+
[InlineData("customerAccountNumber")]
85+
[InlineData("CustomerAccountNumber")]
86+
[InlineData("CUSTOMERACCOUNTNUMBER")]
87+
public async Task SafaricomPinlessProxy_ProcessSaleMessage_MetadataCasingTests_CustomerAccountNumber_TopupSuccessful_SaleMessageIsProcessed(String customerAccountNumberFieldName)
88+
{
89+
HttpResponseMessage responseMessage = new HttpResponseMessage
90+
{
91+
StatusCode = HttpStatusCode.OK,
92+
Content = new StringContent(TestData.SuccessfulSafaricomTopup)
93+
};
94+
95+
SafaricomConfiguration safaricomConfiguration = TestData.SafaricomConfiguration;
96+
HttpClient httpClient = SetupMockHttpClient(responseMessage);
97+
98+
IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient);
99+
100+
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
101+
TestData.TransactionId,
102+
TestData.OperatorIdentifier1,
103+
TestData.Merchant,
104+
TestData.TransactionDateTime,
105+
TestData.TransactionReference,
106+
TestData.AdditionalTransactionMetaData(customerAccountNumberName: customerAccountNumberFieldName),
107+
CancellationToken.None);
108+
109+
operatorResponse.ShouldNotBeNull();
110+
operatorResponse.IsSuccessful.ShouldBeTrue();
111+
operatorResponse.ResponseCode.ShouldBe("200");
112+
operatorResponse.ResponseMessage.ShouldBe("Topup Successful");
113+
}
114+
50115
[Fact]
51116
public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupFailed_SaleMessageIsProcessed()
52117
{

TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>net5.0</TargetFramework>
5-
<DebugType>None</DebugType>
5+
<DebugType>Full</DebugType>
66
<IsPackable>false</IsPackable>
77
</PropertyGroup>
88

TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
using System;
44
using System.Collections.Generic;
5+
using System.Diagnostics.CodeAnalysis;
56
using System.IO;
67
using System.Net.Http;
78
using System.Text;
@@ -73,8 +74,8 @@ public async Task<OperatorResponse> ProcessSaleMessage(String accessToken,
7374
CancellationToken cancellationToken)
7475
{
7576
// Extract the required fields
76-
String transactionAmount = additionalTransactionMetadata.GetValueOrDefault("Amount");
77-
String customerMsisdn = additionalTransactionMetadata.GetValueOrDefault("CustomerAccountNumber");
77+
String transactionAmount = this.ExtractFieldFromMetadata("Amount", additionalTransactionMetadata);
78+
String customerMsisdn = this.ExtractFieldFromMetadata("CustomerAccountNumber", additionalTransactionMetadata);
7879

7980
if (String.IsNullOrEmpty(transactionAmount))
8081
{
@@ -115,6 +116,28 @@ public async Task<OperatorResponse> ProcessSaleMessage(String accessToken,
115116
return this.CreateFrom(responseContent);
116117
}
117118

119+
[ExcludeFromCodeCoverage]
120+
private String ExtractFieldFromMetadata(String fieldName,
121+
Dictionary<String, String> additionalTransactionMetadata)
122+
{
123+
// Create a case insensitive version of the dictionary
124+
Dictionary<String, String> caseInsensitiveDictionary = new Dictionary<String, String>(StringComparer.InvariantCultureIgnoreCase);
125+
foreach (KeyValuePair<String, String> keyValuePair in additionalTransactionMetadata)
126+
{
127+
caseInsensitiveDictionary.Add(keyValuePair.Key, keyValuePair.Value);
128+
}
129+
130+
if (caseInsensitiveDictionary.ContainsKey(fieldName))
131+
{
132+
return caseInsensitiveDictionary[fieldName];
133+
}
134+
else
135+
{
136+
return String.Empty;
137+
}
138+
139+
}
140+
118141
/// <summary>
119142
/// Builds the request.
120143
/// </summary>

0 commit comments

Comments
 (0)