Skip to content

Commit 1b0955f

Browse files
Merge pull request #599 from TransactionProcessing/copilot/dc3061045dc208c2e8ccc1109986021d-reduce-method-com
Reduce `ProcessReconciliation` method size by extracting reconciliation helpers
2 parents 3a63284 + 28b6b6e commit 1b0955f

2 files changed

Lines changed: 97 additions & 36 deletions

File tree

TransactionProcessorACL.BusinessLogic.Tests/TransactionProcessorACLApplicationServiceTests.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Text;
4+
using Newtonsoft.Json;
45
using SimpleResults;
56

67
namespace TransactionProcessorACL.BusinesssLogic.Tests
@@ -237,6 +238,40 @@ public async Task TransactionProcessorACLApplicationService_ProcessReconciliatio
237238
reconciliationResponse.ResponseCode.ShouldBe(TestData.ResponseCode);
238239
}
239240

241+
[Fact]
242+
public async Task TransactionProcessorACLApplicationService_ProcessReconciliation_RequestIsSerialisedCorrectly()
243+
{
244+
SerialisedMessage capturedMessage = null;
245+
246+
transactionProcessorClient.Setup(t => t.PerformTransaction(It.IsAny<String>(), It.IsAny<SerialisedMessage>(), It.IsAny<CancellationToken>()))
247+
.Callback<String, SerialisedMessage, CancellationToken>((_, message, _) => capturedMessage = message)
248+
.ReturnsAsync(TestData.SerialisedMessageResponseReconciliation);
249+
securityServiceClient.Setup(s => s.GetToken(It.IsAny<String>(), It.IsAny<String>(), It.IsAny<CancellationToken>())).ReturnsAsync(Result.Success(TestData.TokenResponse));
250+
251+
await applicationService.ProcessReconciliation(TestData.EstateId,
252+
TestData.MerchantId,
253+
TestData.TransactionDateTime,
254+
TestData.DeviceIdentifier,
255+
TestData.ReconciliationTransactionCount,
256+
TestData.ReconciliationTransactionValue,
257+
CancellationToken.None);
258+
259+
capturedMessage.ShouldNotBeNull();
260+
capturedMessage.Metadata[MetadataContants.KeyNameEstateId].ShouldBe(TestData.EstateId.ToString());
261+
capturedMessage.Metadata[MetadataContants.KeyNameMerchantId].ShouldBe(TestData.MerchantId.ToString());
262+
263+
ReconciliationRequest reconciliationRequest = JsonConvert.DeserializeObject<ReconciliationRequest>(capturedMessage.SerialisedData,
264+
new JsonSerializerSettings {
265+
TypeNameHandling = TypeNameHandling.All
266+
});
267+
268+
reconciliationRequest.ShouldNotBeNull();
269+
reconciliationRequest.DeviceIdentifier.ShouldBe(TestData.DeviceIdentifier);
270+
reconciliationRequest.TransactionDateTime.ShouldBe(TestData.TransactionDateTime);
271+
reconciliationRequest.TransactionCount.ShouldBe(TestData.ReconciliationTransactionCount);
272+
reconciliationRequest.TransactionValue.ShouldBe(TestData.ReconciliationTransactionValue);
273+
}
274+
240275
[Fact]
241276
public async Task TransactionProcessorACLApplicationService_ProcessReconciliation_GetTokenFailed_ResultFailed()
242277
{

TransactionProcessorACL.BusinessLogic/Services/TransactionProcessorACLApplicationService.cs

Lines changed: 61 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -250,52 +250,25 @@ public async Task<Result<ProcessReconciliationResponse>> ProcessReconciliation(G
250250
}
251251

252252
TokenResponse accessToken = accessTokenResult.Data;
253-
ReconciliationRequest reconciliationRequest = new ReconciliationRequest();
254-
reconciliationRequest.DeviceIdentifier = deviceIdentifier;
255-
reconciliationRequest.TransactionDateTime = transactionDateTime;
256-
reconciliationRequest.TransactionCount = transactionCount;
257-
reconciliationRequest.TransactionValue = transactionValue;
258-
259-
SerialisedMessage requestSerialisedMessage = new SerialisedMessage();
260-
requestSerialisedMessage.Metadata.Add(MetadataContants.KeyNameEstateId, estateId.ToString());
261-
requestSerialisedMessage.Metadata.Add(MetadataContants.KeyNameMerchantId, merchantId.ToString());
262-
requestSerialisedMessage.SerialisedData = JsonConvert.SerializeObject(reconciliationRequest,
263-
new JsonSerializerSettings
264-
{
265-
TypeNameHandling = TypeNameHandling.All
266-
});
267-
268-
ProcessReconciliationResponse response = null;
253+
SerialisedMessage requestSerialisedMessage = CreateReconciliationRequestMessage(estateId,
254+
merchantId,
255+
transactionDateTime,
256+
deviceIdentifier,
257+
transactionCount,
258+
transactionValue);
269259

270260
try
271261
{
272262
Result<SerialisedMessage> transactionResult =
273263
await this.TransactionProcessorClient.PerformTransaction(accessToken.AccessToken, requestSerialisedMessage, cancellationToken);
274264
if (transactionResult.IsFailed)
275265
return ResultHelpers.CreateFailure(transactionResult);
276-
SerialisedMessage responseSerialisedMessage = transactionResult.Data;
277-
ReconciliationResponse reconciliationResponse = JsonConvert.DeserializeObject<ReconciliationResponse>(responseSerialisedMessage.SerialisedData);
278-
279-
response = new ProcessReconciliationResponse
280-
{
281-
ResponseCode = reconciliationResponse.ResponseCode,
282-
ResponseMessage = reconciliationResponse.ResponseMessage,
283-
TransactionId = reconciliationResponse.TransactionId,
284-
};
266+
return Result.Success(CreateProcessReconciliationResponse(transactionResult.Data));
285267
}
286268
catch (Exception ex)
287269
{
288-
response = new ProcessReconciliationResponse
289-
{
290-
ResponseCode = "0001", // Request Message error
291-
ResponseMessage = "Process Reconciliation Failed",
292-
EstateId = estateId,
293-
MerchantId = merchantId,
294-
ErrorMessages = ex.GetExceptionMessages()
295-
};
270+
return Result.Success(CreateReconciliationErrorResponse(estateId, merchantId, ex));
296271
}
297-
298-
return Result.Success(response);
299272
}
300273

301274
public async Task<GetVoucherResponse> GetVoucher(Guid estateId,
@@ -526,6 +499,59 @@ public async Task<Result<MerchantResponse>> GetMerchant(Guid estateId,
526499
return merchantResponse;
527500
}
528501

502+
private static ProcessReconciliationResponse CreateProcessReconciliationResponse(SerialisedMessage responseSerialisedMessage)
503+
{
504+
ReconciliationResponse reconciliationResponse = JsonConvert.DeserializeObject<ReconciliationResponse>(responseSerialisedMessage.SerialisedData);
505+
506+
return new ProcessReconciliationResponse
507+
{
508+
ResponseCode = reconciliationResponse.ResponseCode,
509+
ResponseMessage = reconciliationResponse.ResponseMessage,
510+
TransactionId = reconciliationResponse.TransactionId,
511+
};
512+
}
513+
514+
private static ProcessReconciliationResponse CreateReconciliationErrorResponse(Guid estateId,
515+
Guid merchantId,
516+
Exception ex)
517+
{
518+
return new ProcessReconciliationResponse
519+
{
520+
ResponseCode = "0001", // Request Message error
521+
ResponseMessage = "Process Reconciliation Failed",
522+
EstateId = estateId,
523+
MerchantId = merchantId,
524+
ErrorMessages = ex.GetExceptionMessages()
525+
};
526+
}
527+
528+
private static SerialisedMessage CreateReconciliationRequestMessage(Guid estateId,
529+
Guid merchantId,
530+
DateTime transactionDateTime,
531+
String deviceIdentifier,
532+
Int32 transactionCount,
533+
Decimal transactionValue)
534+
{
535+
ReconciliationRequest reconciliationRequest = new ReconciliationRequest
536+
{
537+
DeviceIdentifier = deviceIdentifier,
538+
TransactionDateTime = transactionDateTime,
539+
TransactionCount = transactionCount,
540+
TransactionValue = transactionValue
541+
};
542+
543+
SerialisedMessage requestSerialisedMessage = new SerialisedMessage();
544+
requestSerialisedMessage.Metadata.Add(MetadataContants.KeyNameEstateId, estateId.ToString());
545+
requestSerialisedMessage.Metadata.Add(MetadataContants.KeyNameMerchantId, merchantId.ToString());
546+
requestSerialisedMessage.SerialisedData = JsonConvert.SerializeObject(reconciliationRequest,
547+
new JsonSerializerSettings
548+
{
549+
TypeNameHandling = TypeNameHandling.All
550+
});
551+
552+
return requestSerialisedMessage;
553+
}
554+
529555
#endregion
530556
}
531557
}

0 commit comments

Comments
 (0)