diff --git a/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/ConfigurationServiceTests.cs b/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/ConfigurationServiceTests.cs index c064a9093..77bdf9227 100644 --- a/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/ConfigurationServiceTests.cs +++ b/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/ConfigurationServiceTests.cs @@ -4,25 +4,6 @@ using System.Text; using System.Threading.Tasks; -/* - *var mockHttp = new MockHttpMessageHandler(); - - // Setup a respond for the user api (including a wildcard in the URL) - mockHttp.When("http://localhost/api/user/*") - .Respond("application/json", "{'name' : 'Test McGee'}"); // Respond with JSON - - // Inject the handler or client into your application code - var client = mockHttp.ToHttpClient(); - - var response = await client.GetAsync("http://localhost/api/user/1234"); - // or without async: var response = client.GetAsync("http://localhost/api/user/1234").Result; - - var json = await response.Content.ReadAsStringAsync(); - - // No network connection required - Console.Write(json); // {'name' : 'Test McGee'} -*/ - namespace TransactionMobile.Maui.BusinessLogic.Tests.ServicesTests { using System.Net; diff --git a/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs b/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs new file mode 100644 index 000000000..596400c00 --- /dev/null +++ b/TransactionMobile.Maui.BusinessLogic.Tests/ServicesTests/TransactionServiceTests.cs @@ -0,0 +1,524 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TransactionMobile.Maui.BusinessLogic.Tests.ServicesTests +{ + using System.Net; + using System.Net.Http; + using System.Threading; + using Logging; + using Models; + using Moq; + using Newtonsoft.Json; + using RichardSzalay.MockHttp; + using Services; + using Shouldly; + using SimpleResults; + using TransactionProcessorACL.DataTransferObjects.Responses; + using Xunit; + + public class TransactionServiceTests{ + + private MockHttpMessageHandler MockHttpMessageHandler; + + private Func BaseAddressResolver; + + private ITransactionService TransactionService; + + private Mock ApplicationCache; + + public TransactionServiceTests(){ + this.MockHttpMessageHandler = new MockHttpMessageHandler(); + this.BaseAddressResolver = (s) => $"http://localhost"; + this.ApplicationCache = new Mock(); + this.TransactionService = new TransactionService(this.BaseAddressResolver, this.MockHttpMessageHandler.ToHttpClient(), this.ApplicationCache.Object); + this.ApplicationCache.Setup(s => s.GetAccessToken()).Returns(new TokenResponseModel(){ + AccessToken = "token" + }); + Logger.Initialise(new NullLogger()); + } + + /* + PerformBillPaymentGetAccount + PerformBillPaymentMakePayment + PerformBillPaymentGetMeter + PerformReconciliation + PerformVoucherIssue + */ + + [Fact] + public async Task TransactionService_PerformLogon_LogonPerformed(){ + + PerformLogonRequestModel requestModel = new PerformLogonRequestModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber + }; + + LogonTransactionResponseMessage expectedResponse = new LogonTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = new Dictionary() + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performLogonResult = await this.TransactionService.PerformLogon(requestModel, CancellationToken.None); + + performLogonResult.IsSuccess.ShouldBeTrue(); + performLogonResult.Data.ShouldNotBeNull(); + performLogonResult.Data.EstateId.ShouldBe(expectedResponse.EstateId); + performLogonResult.Data.MerchantId.ShouldBe(expectedResponse.MerchantId); + performLogonResult.Data.ResponseCode.ShouldBe(expectedResponse.ResponseCode); + performLogonResult.Data.ResponseMessage.ShouldBe(expectedResponse.ResponseMessage); + performLogonResult.Data.IsSuccessful.ShouldBeTrue(); + } + + [Theory] + [InlineData(HttpStatusCode.BadRequest)] + [InlineData(HttpStatusCode.HttpVersionNotSupported)] + public async Task TransactionService_PerformLogon_LogonFailed(HttpStatusCode statusCode){ + + PerformLogonRequestModel requestModel = new PerformLogonRequestModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(statusCode)); + + Result performLogonResult = await this.TransactionService.PerformLogon(requestModel, CancellationToken.None); + + performLogonResult.IsFailed.ShouldBeTrue(); + } + + [Fact] + public async Task TransactionService_PerformMobileTopup_MobileTopupPerformed(){ + + PerformMobileTopupRequestModel requestModel = new PerformMobileTopupRequestModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + CustomerAccountNumber = TestData.CustomerAccountNumber, + CustomerEmailAddress = TestData.CustomerEmailAddress, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + TopupAmount = TestData.PaymentAmount + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = new Dictionary() + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performMobileTopupResult = await this.TransactionService.PerformMobileTopup(requestModel, CancellationToken.None); + + performMobileTopupResult.IsSuccess.ShouldBeTrue(); + performMobileTopupResult.Data.ShouldNotBeNull(); + performMobileTopupResult.Data.EstateId.ShouldBe(expectedResponse.EstateId); + performMobileTopupResult.Data.MerchantId.ShouldBe(expectedResponse.MerchantId); + performMobileTopupResult.Data.ResponseCode.ShouldBe(expectedResponse.ResponseCode); + performMobileTopupResult.Data.ResponseMessage.ShouldBe(expectedResponse.ResponseMessage); + performMobileTopupResult.Data.IsSuccessful.ShouldBeTrue(); + } + + [Fact] + public async Task TransactionService_PerformVoucherIssue_MobileTopupFailed(){ + + PerformMobileTopupRequestModel requestModel = new PerformMobileTopupRequestModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + CustomerAccountNumber = TestData.CustomerAccountNumber, + CustomerEmailAddress = TestData.CustomerEmailAddress, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + TopupAmount = TestData.PaymentAmount + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(HttpStatusCode.BadRequest)); + + Result performMobileTopupResult = await this.TransactionService.PerformMobileTopup(requestModel, CancellationToken.None); + + performMobileTopupResult.IsFailed.ShouldBeTrue(); + } + + [Fact] + public async Task TransactionService_PerformVoucherIssue_VoucherIssuePerformed(){ + PerformVoucherIssueRequestModel requestModel = new PerformVoucherIssueRequestModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + CustomerEmailAddress = TestData.CustomerEmailAddress, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + RecipientEmailAddress = TestData.RecipientEmailAddress, + RecipientMobileNumber = TestData.RecipientMobileNumber, + VoucherAmount = TestData.PaymentAmount + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = new Dictionary() + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performVoucherIssueResult = await this.TransactionService.PerformVoucherIssue(requestModel, CancellationToken.None); + + performVoucherIssueResult.IsSuccess.ShouldBeTrue(); + performVoucherIssueResult.Data.ShouldNotBeNull(); + performVoucherIssueResult.Data.EstateId.ShouldBe(expectedResponse.EstateId); + performVoucherIssueResult.Data.MerchantId.ShouldBe(expectedResponse.MerchantId); + performVoucherIssueResult.Data.ResponseCode.ShouldBe(expectedResponse.ResponseCode); + performVoucherIssueResult.Data.ResponseMessage.ShouldBe(expectedResponse.ResponseMessage); + performVoucherIssueResult.Data.IsSuccessful.ShouldBeTrue(); + } + + [Fact] + public async Task TransactionService_PerformVoucherIssue_VoucherIssueFailed(){ + + PerformVoucherIssueRequestModel requestModel = new PerformVoucherIssueRequestModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + CustomerEmailAddress = TestData.CustomerEmailAddress, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + RecipientEmailAddress = TestData.RecipientEmailAddress, + RecipientMobileNumber = TestData.RecipientMobileNumber, + VoucherAmount = TestData.PaymentAmount + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(HttpStatusCode.BadRequest)); + + Result performVoucherIssueResult = await this.TransactionService.PerformVoucherIssue(requestModel, CancellationToken.None); + + performVoucherIssueResult.IsFailed.ShouldBeTrue(); + } + + [Fact] + public async Task TransactionService_PerformBillPaymentGetAccount_GetAccountPerformed(){ + PerformBillPaymentGetAccountModel requestModel = new PerformBillPaymentGetAccountModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + CustomerAccountNumber = TestData.CustomerAccountNumber, + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = new Dictionary(){ + { "customerAccountName", TestData.BillDetails.AccountName }, + { "customerAccountNumber", TestData.BillDetails.AccountNumber }, + { "customerBillBalance", TestData.BillDetails.Balance }, + { "customerBillDueDate", TestData.BillDetails.DueDate } + } + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performBillPaymentGetAccountResult = await this.TransactionService.PerformBillPaymentGetAccount(requestModel, CancellationToken.None); + + performBillPaymentGetAccountResult.IsSuccess.ShouldBeTrue(); + performBillPaymentGetAccountResult.Data.ShouldNotBeNull(); + performBillPaymentGetAccountResult.Data.IsSuccessful.ShouldBeTrue(); + performBillPaymentGetAccountResult.Data.BillDetails.ShouldNotBeNull(); + performBillPaymentGetAccountResult.Data.BillDetails.AccountName.ShouldBe(TestData.BillDetails.AccountName); + performBillPaymentGetAccountResult.Data.BillDetails.AccountNumber.ShouldBe(TestData.BillDetails.AccountNumber); + performBillPaymentGetAccountResult.Data.BillDetails.Balance.ShouldBe(TestData.BillDetails.Balance); + performBillPaymentGetAccountResult.Data.BillDetails.DueDate.ShouldBe(TestData.BillDetails.DueDate); + } + + [Fact] + public async Task TransactionService_PerformBillPaymentGetAccount_GetAccountFailed(){ + + PerformBillPaymentGetAccountModel requestModel = new PerformBillPaymentGetAccountModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + CustomerAccountNumber = TestData.CustomerAccountNumber, + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(HttpStatusCode.BadRequest)); + + Result performBillPaymentGetAccountResult = await this.TransactionService.PerformBillPaymentGetAccount(requestModel, CancellationToken.None); + + performBillPaymentGetAccountResult.IsFailed.ShouldBeTrue(); + } + + + [Fact] + public async Task TransactionService_PerformBillPaymentGetMeter_GetMeterPerformed(){ + PerformBillPaymentGetMeterModel requestModel = new PerformBillPaymentGetMeterModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + MeterNumber = TestData.MeterNumber + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = new Dictionary(){ + { "pataPawaPrePaidCustomerName", TestData.BillDetails.AccountName } + } + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentGetMeter(requestModel, CancellationToken.None); + + performBillPaymentGetMeterResult.IsSuccess.ShouldBeTrue(); + performBillPaymentGetMeterResult.Data.ShouldNotBeNull(); + performBillPaymentGetMeterResult.Data.IsSuccessful.ShouldBeTrue(); + performBillPaymentGetMeterResult.Data.MeterDetails.ShouldNotBeNull(); + performBillPaymentGetMeterResult.Data.MeterDetails.CustomerName.ShouldBe(TestData.MeterDetails.CustomerName); + performBillPaymentGetMeterResult.Data.MeterDetails.MeterNumber.ShouldBe(TestData.MeterDetails.MeterNumber); + } + + [Fact] + public async Task TransactionService_PerformBillPaymentGetMeter_NoAdditionalResponseMetaData_GetMeterPerformed(){ + PerformBillPaymentGetMeterModel requestModel = new PerformBillPaymentGetMeterModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + MeterNumber = TestData.MeterNumber + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = null + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentGetMeter(requestModel, CancellationToken.None); + + performBillPaymentGetMeterResult.IsSuccess.ShouldBeTrue(); + performBillPaymentGetMeterResult.Data.ShouldNotBeNull(); + performBillPaymentGetMeterResult.Data.IsSuccessful.ShouldBeFalse(); + performBillPaymentGetMeterResult.Data.MeterDetails.ShouldBeNull(); + } + + [Fact] + public async Task TransactionService_PerformBillPaymentGetMeter_GetMeterFailed(){ + PerformBillPaymentGetMeterModel requestModel = new PerformBillPaymentGetMeterModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + MeterNumber = TestData.MeterNumber + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(HttpStatusCode.BadRequest)); + + Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentGetMeter(requestModel, CancellationToken.None); + + performBillPaymentGetMeterResult.IsFailed.ShouldBeTrue(); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task TransactionService_PerformBillPaymentMakePayment_MakePaymentPerformed(Boolean isPostPayment){ + PerformBillPaymentMakePaymentModel requestModel = new PerformBillPaymentMakePaymentModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + CustomerAccountName = TestData.CustomerAccountName, + PaymentAmount = TestData.PaymentAmount, + CustomerAccountNumber = TestData.CustomerAccountNumber, + CustomerMobileNumber = TestData.CustomerMobileNumber, + PostPayment = isPostPayment + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage{ + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentMakePayment(requestModel, CancellationToken.None); + + performBillPaymentGetMeterResult.IsSuccess.ShouldBeTrue(); + performBillPaymentGetMeterResult.Data.ShouldNotBeNull(); + performBillPaymentGetMeterResult.Data.IsSuccessful.ShouldBeTrue(); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task TransactionService_PerformBillPaymentMakePayment_MakePaymentFailed(Boolean isPostPayment){ + PerformBillPaymentMakePaymentModel requestModel = new PerformBillPaymentMakePaymentModel{ + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + TransactionNumber = TestData.TransactionNumber, + ContractId = TestData.Operator1ProductDetails.ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1, + ProductId = TestData.Operator1ProductDetails.ProductId, + CustomerAccountName = TestData.CustomerAccountName, + PaymentAmount = TestData.PaymentAmount, + CustomerAccountNumber = TestData.CustomerAccountNumber, + CustomerMobileNumber = TestData.CustomerMobileNumber, + PostPayment = isPostPayment + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(HttpStatusCode.BadRequest)); + + Result performBillPaymentGetMeterResult = await this.TransactionService.PerformBillPaymentMakePayment(requestModel, CancellationToken.None); + + performBillPaymentGetMeterResult.IsSuccess.ShouldBeFalse(); + } + + [Fact] + public async Task TransactionService_PerformReconciliation_ReconciliationPerformed() + { + PerformReconciliationRequestModel requestModel = new PerformReconciliationRequestModel + { + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + OperatorTotals = new List(){ + new OperatorTotalModel{ + TransactionCount = TestData.TransactionCount, + TransactionValue = TestData.TransactionValue, + ContractId = TestData.OperatorId1ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1 + } + }, + TransactionCount = TestData.TransactionCount, + TransactionValue = TestData.TransactionValue + }; + + SaleTransactionResponseMessage expectedResponse = new SaleTransactionResponseMessage + { + ResponseMessage = TestData.ResponseMessage_Success, + EstateId = TestData.EstateId, + MerchantId = TestData.MerchantId, + ResponseCode = TestData.ResponseCode_Success, + TransactionId = TestData.TransactionId, + AdditionalResponseMetaData = null + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond("application/json", JsonConvert.SerializeObject(expectedResponse)); // Respond with JSON + + Result performReconciliationResult = await this.TransactionService.PerformReconciliation(requestModel, CancellationToken.None); + + performReconciliationResult.IsSuccess.ShouldBeTrue(); + performReconciliationResult.Data.ShouldNotBeNull(); + performReconciliationResult.Data.EstateId.ShouldBe(expectedResponse.EstateId); + performReconciliationResult.Data.MerchantId.ShouldBe(expectedResponse.MerchantId); + performReconciliationResult.Data.ResponseCode.ShouldBe(expectedResponse.ResponseCode); + performReconciliationResult.Data.ResponseMessage.ShouldBe(expectedResponse.ResponseMessage); + performReconciliationResult.Data.IsSuccessful.ShouldBeTrue(); + } + + [Fact] + public async Task TransactionService_PerformReconciliation_ReconciliationFailed() + { + PerformReconciliationRequestModel requestModel = new PerformReconciliationRequestModel + { + ApplicationVersion = TestData.ApplicationVersion, + DeviceIdentifier = TestData.DeviceIdentifier, + TransactionDateTime = TestData.TransactionDateTime, + OperatorTotals = new List(){ + new OperatorTotalModel{ + TransactionCount = TestData.TransactionCount, + TransactionValue = TestData.TransactionValue, + ContractId = TestData.OperatorId1ContractId, + OperatorIdentifier = TestData.OperatorIdentifier1 + } + }, + TransactionCount = TestData.TransactionCount, + TransactionValue = TestData.TransactionValue + }; + + this.MockHttpMessageHandler.When($"http://localhost/api/transactions") + .Respond(req => new HttpResponseMessage(HttpStatusCode.BadRequest)); + + Result performReconciliationResult = await this.TransactionService.PerformReconciliation(requestModel, CancellationToken.None); + + performReconciliationResult.IsFailed.ShouldBeTrue(); + } + } +} diff --git a/TransactionMobile.Maui.BusinessLogic.Tests/TestData.cs b/TransactionMobile.Maui.BusinessLogic.Tests/TestData.cs index 63419c2bf..c2d71dff9 100644 --- a/TransactionMobile.Maui.BusinessLogic.Tests/TestData.cs +++ b/TransactionMobile.Maui.BusinessLogic.Tests/TestData.cs @@ -211,13 +211,20 @@ public static class TestData } }; + public static String ResponseCode_Success = "0000"; + public static String ResponseMessage_Success = "SUCCESS"; + public static String ResponseCode_Failed = "1000"; + public static String ResponseMessage_Failed = "Failed"; + + + public static PerformLogonResponseModel PerformLogonResponseModel => new PerformLogonResponseModel { EstateId = TestData.EstateId, MerchantId = TestData.MerchantId, - ResponseCode = "0000", - ResponseMessage = "SUCCESS" + ResponseCode = ResponseCode_Success, + ResponseMessage = ResponseMessage_Success }; public static PerformLogonResponseModel PerformLogonResponseFailedModel => @@ -225,18 +232,10 @@ public static class TestData { EstateId = TestData.EstateId, MerchantId = TestData.MerchantId, - ResponseCode = "1000", - ResponseMessage = "SUCCESS" + ResponseCode = ResponseCode_Failed, + ResponseMessage = ResponseMessage_Failed }; - public static PerformLogonResponseModel PerformLogonResponseModelFailed => - new PerformLogonResponseModel - { - EstateId = TestData.EstateId, - MerchantId = TestData.MerchantId, - ResponseCode = "1001", - ResponseMessage = "FAILED" - }; public static PerformBillPaymentGetAccountResponseModel PerformBillPaymentGetAccountResponseModel => new PerformBillPaymentGetAccountResponseModel { @@ -323,6 +322,8 @@ public static class TestData public static Decimal PaymentAmount = 50.00m; + public static Guid TransactionId = Guid.Parse("66F9743A-A682-4A73-9A80-441A3C9BCFDC"); + public static BillDetails BillDetails => new BillDetails { AccountNumber = TestData.CustomerAccountNumber, @@ -337,6 +338,11 @@ public static class TestData MeterNumber = TestData.MeterNumber, CustomerName = TestData.CustomerAccountName }; + + public static Int32 TransactionCount = 1; + + public static Decimal TransactionValue = 100.00m; + } } \ No newline at end of file diff --git a/TransactionMobile.Maui.BusinessLogic/Services/TransactionService.cs b/TransactionMobile.Maui.BusinessLogic/Services/TransactionService.cs index 38cc8bac9..4503a97b6 100644 --- a/TransactionMobile.Maui.BusinessLogic/Services/TransactionService.cs +++ b/TransactionMobile.Maui.BusinessLogic/Services/TransactionService.cs @@ -16,7 +16,7 @@ using ViewModels; using ViewModels.Transactions; - [ExcludeFromCodeCoverage(Justification = "Need to refactor to allow injection of client for mocking")] + //[ExcludeFromCodeCoverage(Justification = "Need to refactor to allow injection of client for mocking")] public class TransactionService : ClientProxyBase, ITransactionService { #region Fields @@ -272,9 +272,7 @@ private async Task> SendTransactionRequest(content));