Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupSuccessful_SaleM

IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient);

OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
Expand All @@ -59,7 +61,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_TopupFailed_SaleMessa

IOperatorProxy safaricomPinlessproxy = new SafaricomPinlessProxy(safaricomConfiguration, httpClient);

OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
OperatorResponse operatorResponse = await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
Expand Down Expand Up @@ -87,7 +91,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_FailedToSend_ErrorThr

Should.Throw<Exception>(async () =>
{
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
Expand Down Expand Up @@ -123,7 +129,9 @@ public async Task SafaricomPinlessProxy_ProcessSaleMessage_InvalidData_ErrorThro

Should.Throw<Exception>(async () =>
{
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TransactionId,
await safaricomPinlessproxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
namespace TransactionProcessor.BusinessLogic.Tests.OperatorInterfaces
{
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using BusinessLogic.OperatorInterfaces;
using BusinessLogic.OperatorInterfaces.VoucherManagement;
using Moq;
using Shouldly;
using Testing;
using VoucherManagement.Client;
using VoucherManagement.DataTransferObjects;
using Xunit;

public class VoucherManagementProxyTests
{
[Fact]
public async Task VoucherManagementProxy_ProcessSaleMessage_VoucherIssueSuccessful_SaleMessageIsProcessed()
{
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();
voucherManagementClient.Setup(v => v.IssueVoucher(It.IsAny<String>(), It.IsAny<IssueVoucherRequest>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(TestData.IssueVoucherResponse);
IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);

OperatorResponse operatorResponse = await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
TestData.AdditionalTransactionMetaDataForVoucher,
CancellationToken.None);

operatorResponse.ShouldNotBeNull();
operatorResponse.IsSuccessful.ShouldBeTrue();
operatorResponse.ResponseCode.ShouldBe("0000");
operatorResponse.ResponseMessage.ShouldBe("SUCCESS");
operatorResponse.AdditionalTransactionResponseMetadata.ShouldContainKey("VoucherCode");
operatorResponse.AdditionalTransactionResponseMetadata.ShouldContainKey("VoucherExpiryDate");
}

[Fact]
public async Task VoucherManagementProxy_ProcessSaleMessage_FailedToSend_ErrorThrown()
{
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();
voucherManagementClient.Setup(v => v.IssueVoucher(It.IsAny<String>(), It.IsAny<IssueVoucherRequest>(), It.IsAny<CancellationToken>()))
.ThrowsAsync(new Exception());
IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);

Should.Throw<Exception>(async () =>
{
await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
TestData.AdditionalTransactionMetaDataForVoucher,
CancellationToken.None);


});
}

[Theory]
[InlineData("")]
[InlineData(null)]
[InlineData("A")]
public async Task VoucherManagementProxy_ProcessSaleMessage_InvalidData_TransactionAmount_ErrorThrown(String transactionAmount)
{
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();

Dictionary<String, String> additionalMetatdata = TestData.AdditionalTransactionMetaDataForVoucher;
additionalMetatdata["Amount"] = transactionAmount;

IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);

Should.Throw<Exception>(async () =>
{
await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
additionalMetatdata,
CancellationToken.None);


});
}

[Theory]
[InlineData("", "")]
[InlineData("", null)]
[InlineData(null, "")]
[InlineData(null, null)]
public async Task VoucherManagementProxy_ProcessSaleMessage_InvalidData_RecipientDetails_ErrorThrown(String recipientEmail, String recipientMobile)
{
Mock<IVoucherManagementClient> voucherManagementClient = new Mock<IVoucherManagementClient>();

Dictionary<String, String> additionalMetatdata = new Dictionary<String, String>
{
{"Amount", "10.00"},
{"RecipientEmail", recipientEmail },
{"RecipientMobile", recipientMobile}

};

IOperatorProxy voucherManagementProxy = new VoucherManagementProxy(voucherManagementClient.Object);

Should.Throw<Exception>(async () =>
{
await voucherManagementProxy.ProcessSaleMessage(TestData.TokenResponse().AccessToken,
TestData.TransactionId,
TestData.OperatorIdentifier1,
TestData.Merchant,
TestData.TransactionDateTime,
TestData.TransactionReference,
additionalMetatdata,
CancellationToken.None);


});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_SuccesfulOpera
.ReturnsAsync(TestData.GetCompletedAuthorisedSaleTransactionAggregate);

Mock<IOperatorProxy> operatorProxy = new Mock<IOperatorProxy>();
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<Guid>(),
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<String>(),
It.IsAny<Guid>(),
It.IsAny<String>(),
It.IsAny<MerchantResponse>(),
It.IsAny<DateTime>(),
It.IsAny<String>(),
Expand Down Expand Up @@ -549,7 +551,9 @@ public async Task TransactionDomainService_ProcessSaleTransaction_FailedOperator
.ReturnsAsync(TestData.GetDeclinedTransactionAggregate(TransactionResponseCode.TransactionDeclinedByOperator));

Mock<IOperatorProxy> operatorProxy = new Mock<IOperatorProxy>();
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<Guid>(),
operatorProxy.Setup(o => o.ProcessSaleMessage(It.IsAny<String>(),
It.IsAny<Guid>(),
It.IsAny<String>(),
It.IsAny<MerchantResponse>(),
It.IsAny<DateTime>(),
It.IsAny<String>(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@ public interface IOperatorProxy
/// <summary>
/// Processes the sale message.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="transactionId">The transaction identifier.</param>
/// <param name="operatorIdentifier">The operator identifier.</param>
/// <param name="merchant">The merchant.</param>
/// <param name="transactionDateTime">The transaction date time.</param>
/// <param name="transactionReference">The transaction reference.</param>
/// <param name="additionalTransactionMetadata">The additional transaction metadata.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
Task<OperatorResponse> ProcessSaleMessage(Guid transactionId,
Task<OperatorResponse> ProcessSaleMessage(String accessToken,
Guid transactionId,
String operatorIdentifier,
MerchantResponse merchant,
DateTime transactionDateTime,
String transactionReference,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,23 @@ public SafaricomPinlessProxy(SafaricomConfiguration safaricomConfiguration,
/// <summary>
/// Processes the sale message.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="transactionId">The transaction identifier.</param>
/// <param name="operatorIdentifier">The operator identifier.</param>
/// <param name="merchant">The merchant.</param>
/// <param name="transactionDateTime">The transaction date time.</param>
/// <param name="transactionReference">The transaction reference.</param>
/// <param name="additionalTransactionMetadata">The additional transaction metadata.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
/// <exception cref="Exception">
/// Amount is a required field for this transaction type
/// <exception cref="Exception">Amount is a required field for this transaction type
/// or
/// CustomerAccountNumber is a required field for this transaction type
/// or
/// Error sending request [{requestUrl}] to Safaricom. Status Code [{responseMessage.StatusCode}]
/// </exception>
public async Task<OperatorResponse> ProcessSaleMessage(Guid transactionId,
/// Error sending request [{requestUrl}] to Safaricom. Status Code [{responseMessage.StatusCode}]</exception>
public async Task<OperatorResponse> ProcessSaleMessage(String accessToken,
Guid transactionId,
String operatorIdentifier,
MerchantResponse merchant,
DateTime transactionDateTime,
String transactionReference,
Expand Down
Loading