Skip to content

Commit 5695a1b

Browse files
Merge pull request #116 from StuartFerguson/task/#115_vouchersale
Support for Voucher Transactions
2 parents 1ef53ba + 23e5bc9 commit 5695a1b

File tree

17 files changed

+498
-870
lines changed

17 files changed

+498
-870
lines changed

TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupSuccessful_SaleM
3232

3333
IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient);
3434

35-
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
35+
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
36+
TestData.TransactionId,
37+
TestData.OperatorIdentifier1,
3638
TestData.Merchant,
3739
TestData.TransactionDateTime,
3840
TestData.TransactionReference,
@@ -59,7 +61,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupFailed_SaleMessa
5961

6062
IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient);
6163

62-
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
64+
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
65+
TestData.TransactionId,
66+
TestData.OperatorIdentifier1,
6367
TestData.Merchant,
6468
TestData.TransactionDateTime,
6569
TestData.TransactionReference,
@@ -87,7 +91,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_FailedToSend_ErrorThr
8791

8892
Should.Throw<Exception>(async () =>
8993
{
90-
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
94+
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
95+
TestData.TransactionId,
96+
TestData.OperatorIdentifier1,
9197
TestData.Merchant,
9298
TestData.TransactionDateTime,
9399
TestData.TransactionReference,
@@ -123,7 +129,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_InvalidData_ErrorThro
123129

124130
Should.Throw<Exception>(async () =>
125131
{
126-
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
132+
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
133+
TestData.TransactionId,
134+
TestData.OperatorIdentifier1,
127135
TestData.Merchant,
128136
TestData.TransactionDateTime,
129137
TestData.TransactionReference,
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
namespace TransactionProcessor.BusinessLogic.Tests.OperatorInterfaces
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using BusinessLogic.OperatorInterfaces;
8+
using BusinessLogic.OperatorInterfaces.VoucherManagement;
9+
using Moq;
10+
using Shouldly;
11+
using Testing;
12+
using VoucherManagement.Client;
13+
using VoucherManagement.DataTransferObjects;
14+
using Xunit;
15+
16+
public class VoucherManagementProxyTests
17+
{
18+
[Fact]
19+
public async Task VoucherManagementProxy_ProcessSaleMessage_VoucherIssueSuccessful_SaleMessageIsProcessed()
20+
{
21+
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();
22+
voucherManagementClient.Setup(v => v.IssueVoucher(It.IsAny<String>(), It.IsAny<IssueVoucherRequest>(), It.IsAny<CancellationToken>()))
23+
.ReturnsAsync(TestData.IssueVoucherResponse);
24+
IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);
25+
26+
OperatorResponse operatorResponse = await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
27+
TestData.TransactionId,
28+
TestData.OperatorIdentifier1,
29+
TestData.Merchant,
30+
TestData.TransactionDateTime,
31+
TestData.TransactionReference,
32+
TestData.AdditionalTransactionMetaDataForVoucher,
33+
CancellationToken.None);
34+
35+
operatorResponse.ShouldNotBeNull();
36+
operatorResponse.IsSuccessful.ShouldBeTrue();
37+
operatorResponse.ResponseCode.ShouldBe("0000");
38+
operatorResponse.ResponseMessage.ShouldBe("SUCCESS");
39+
operatorResponse.AdditionalTransactionResponseMetadata.ShouldContainKey("VoucherCode");
40+
operatorResponse.AdditionalTransactionResponseMetadata.ShouldContainKey("VoucherExpiryDate");
41+
}
42+
43+
[Fact]
44+
public async Task VoucherManagementProxy_ProcessSaleMessage_FailedToSend_ErrorThrown()
45+
{
46+
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();
47+
voucherManagementClient.Setup(v => v.IssueVoucher(It.IsAny<String>(), It.IsAny<IssueVoucherRequest>(), It.IsAny<CancellationToken>()))
48+
.ThrowsAsync(new Exception());
49+
IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);
50+
51+
Should.Throw<Exception>(async () =>
52+
{
53+
await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
54+
TestData.TransactionId,
55+
TestData.OperatorIdentifier1,
56+
TestData.Merchant,
57+
TestData.TransactionDateTime,
58+
TestData.TransactionReference,
59+
TestData.AdditionalTransactionMetaDataForVoucher,
60+
CancellationToken.None);
61+
62+
63+
});
64+
}
65+
66+
[Theory]
67+
[InlineData("")]
68+
[InlineData(null)]
69+
[InlineData("A")]
70+
public async Task VoucherManagementProxy_ProcessSaleMessage_InvalidData_TransactionAmount_ErrorThrown(String transactionAmount)
71+
{
72+
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();
73+
74+
Dictionary<String, String> additionalMetatdata = TestData.AdditionalTransactionMetaDataForVoucher;
75+
additionalMetatdata["Amount"] = transactionAmount;
76+
77+
IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);
78+
79+
Should.Throw<Exception>(async () =>
80+
{
81+
await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
82+
TestData.TransactionId,
83+
TestData.OperatorIdentifier1,
84+
TestData.Merchant,
85+
TestData.TransactionDateTime,
86+
TestData.TransactionReference,
87+
additionalMetatdata,
88+
CancellationToken.None);
89+
90+
91+
});
92+
}
93+
94+
[Theory]
95+
[InlineData("", "")]
96+
[InlineData("", null)]
97+
[InlineData(null, "")]
98+
[InlineData(null, null)]
99+
public async Task VoucherManagementProxy_ProcessSaleMessage_InvalidData_RecipientDetails_ErrorThrown(String recipientEmail, String recipientMobile)
100+
{
101+
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();
102+
103+
Dictionary<String, String> additionalMetatdata = new Dictionary<String, String>
104+
{
105+
{"Amount", "10.00"},
106+
{"RecipientEmail", recipientEmail },
107+
{"RecipientMobile", recipientMobile}
108+
109+
};
110+
111+
IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);
112+
113+
Should.Throw<Exception>(async () =>
114+
{
115+
await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
116+
TestData.TransactionId,
117+
TestData.OperatorIdentifier1,
118+
TestData.Merchant,
119+
TestData.TransactionDateTime,
120+
TestData.TransactionReference,
121+
additionalMetatdata,
122+
CancellationToken.None);
123+
124+
125+
});
126+
}
127+
}
128+
}

TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_SuccesfulOpera
491491
.ReturnsAsync(TestData.GetCompletedAuthorisedSaleTransactionAggregate);
492492

493493
Mock<IOperatorProxy> operatorProxy = new Mock<IOperatorProxy>();
494-
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<Guid>(),
494+
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<String>(),
495+
It.IsAny<Guid>(),
496+
It.IsAny<String>(),
495497
It.IsAny<MerchantResponse>(),
496498
It.IsAny<DateTime>(),
497499
It.IsAny<String>(),
@@ -549,7 +551,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_FailedOperator
549551
.ReturnsAsync(TestData.GetDeclinedTransactionAggregate(TransactionResponseCode.TransactionDeclinedByOperator));
550552

551553
Mock<IOperatorProxy> operatorProxy = new Mock<IOperatorProxy>();
552-
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<Guid>(),
554+
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<String>(),
555+
It.IsAny<Guid>(),
556+
It.IsAny<String>(),
553557
It.IsAny<MerchantResponse>(),
554558
It.IsAny<DateTime>(),
555559
It.IsAny<String>(),

TransactionProcessor.BusinessLogic/OperatorInterfaces/IOperatorProxy.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@ public interface IOperatorProxy
1616
/// <summary>
1717
/// Processes the sale message.
1818
/// </summary>
19+
/// <param name="accessToken">The access token.</param>
1920
/// <param name="transactionId">The transaction identifier.</param>
21+
/// <param name="operatorIdentifier">The operator identifier.</param>
2022
/// <param name="merchant">The merchant.</param>
2123
/// <param name="transactionDateTime">The transaction date time.</param>
2224
/// <param name="transactionReference">The transaction reference.</param>
2325
/// <param name="additionalTransactionMetadata">The additional transaction metadata.</param>
2426
/// <param name="cancellationToken">The cancellation token.</param>
2527
/// <returns></returns>
26-
Task<OperatorResponse> ProcessSaleMessage(Guid transactionId,
28+
Task<OperatorResponse> ProcessSaleMessage(String accessToken,
29+
Guid transactionId,
30+
String operatorIdentifier,
2731
MerchantResponse merchant,
2832
DateTime transactionDateTime,
2933
String transactionReference,

TransactionProcessor.BusinessLogic/OperatorInterfaces/SafaricomPinless/SafaricomPinlessProxy.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,23 @@ public SafaricomPinlessProxy(SafaricomConfiguration safaricomConfiguration,
4949
/// <summary>
5050
/// Processes the sale message.
5151
/// </summary>
52+
/// <param name="accessToken">The access token.</param>
5253
/// <param name="transactionId">The transaction identifier.</param>
54+
/// <param name="operatorIdentifier">The operator identifier.</param>
5355
/// <param name="merchant">The merchant.</param>
5456
/// <param name="transactionDateTime">The transaction date time.</param>
5557
/// <param name="transactionReference">The transaction reference.</param>
5658
/// <param name="additionalTransactionMetadata">The additional transaction metadata.</param>
5759
/// <param name="cancellationToken">The cancellation token.</param>
5860
/// <returns></returns>
59-
/// <exception cref="Exception">
60-
/// Amount is a required field for this transaction type
61+
/// <exception cref="Exception">Amount is a required field for this transaction type
6162
/// or
6263
/// CustomerAccountNumber is a required field for this transaction type
6364
/// or
64-
/// Error sending request [{requestUrl}] to Safaricom. Status Code [{responseMessage.StatusCode}]
65-
/// </exception>
66-
public async Task<OperatorResponse> ProcessSaleMessage(Guid transactionId,
65+
/// Error sending request [{requestUrl}] to Safaricom. Status Code [{responseMessage.StatusCode}]</exception>
66+
public async Task<OperatorResponse> ProcessSaleMessage(String accessToken,
67+
Guid transactionId,
68+
String operatorIdentifier,
6769
MerchantResponse merchant,
6870
DateTime transactionDateTime,
6971
String transactionReference,

0 commit comments

Comments
 (0)