diff --git a/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj b/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj
index 9830c488..0d024ffc 100644
--- a/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj
+++ b/TransactionProcessor.Aggregates/TransactionProcessor.Aggregates.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/TransactionProcessor.BusinessLogic.Tests/DomainEventHandlers/VoucherDomainEventHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/DomainEventHandlers/VoucherDomainEventHandlerTests.cs
index e2a97361..8c1953f1 100644
--- a/TransactionProcessor.BusinessLogic.Tests/DomainEventHandlers/VoucherDomainEventHandlerTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/DomainEventHandlers/VoucherDomainEventHandlerTests.cs
@@ -54,10 +54,11 @@ private EstateManagementContext GetContext(String databaseName)
}
public VoucherDomainEventHandlerTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
Logger.Initialise(NullLogger.Instance);
- StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
+
SecurityServiceClient = new Mock();
MessagingServiceClient = new Mock();
diff --git a/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs b/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs
index dc5fdcdf..657ba13a 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Manager/VoucherManagementManagerTests.cs
@@ -1,4 +1,5 @@
using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
using Moq;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
@@ -8,7 +9,6 @@
using System;
using System.Threading;
using System.Threading.Tasks;
-using Microsoft.Extensions.DependencyInjection;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Manager;
using TransactionProcessor.BusinessLogic.Services;
@@ -25,6 +25,8 @@ namespace TransactionProcessor.BusinessLogic.Tests.Manager
using ProjectionEngine.Database.Database;
using ProjectionEngine.Database.Database.Entities;
using Shared.EntityFramework;
+ using Shared.Serialisation;
+ using System.Text.Json;
using Testing;
public class VoucherManagementManagerTests
@@ -36,6 +38,7 @@ private EstateManagementContext GetContext(String databaseName) {
}
public VoucherManagementManagerTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
this.AggregateService = new Mock();
this.DbContextFactory = new Mock>();
this.Context = this.GetContext(Guid.NewGuid().ToString("N"));
diff --git a/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyTransactionDomainService.cs b/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyTransactionDomainService.cs
index 5f36cbaa..1218fe1f 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyTransactionDomainService.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Mediator/DummyTransactionDomainService.cs
@@ -1,6 +1,5 @@
-using EventStore.Client;
-using KurrentDB.Client;
-using Newtonsoft.Json;
+using KurrentDB.Client;
+using Shared.Serialisation;
using SimpleResults;
using TransactionProcessor.BusinessLogic.Requests;
using TransactionProcessor.ProjectionEngine.Models;
@@ -101,8 +100,8 @@ public async Task> GetPartitionResultFromProjection(String projec
public async Task> GetPartitionStateFromProjection(String projectionName,
String partitionId,
CancellationToken cancellationToken) {
- MerchantBalanceProjectionState1 state = new MerchantBalanceProjectionState1(new Merchant("", "", 0, 0, new Deposits(0, 0, DateTime.MinValue), new Withdrawals(0, 0, DateTime.MinValue), new AuthorisedSales(0, 0, DateTime.MinValue), new DeclinedSales(0, 0, DateTime.MinValue), new Fees(0, 0)) { });
- return Result.Success(JsonConvert.SerializeObject(state));
+ MerchantBalanceProjectionState1 state = new MerchantBalanceProjectionState1(new Merchant("", "", 0, 0));
+ return Result.Success(StringSerialiser.Serialise(state));
}
public async Task> GetResultFromProjection(String projectionName,
diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs
index a7577dc0..77cc10fc 100644
--- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPostPayProxyTests.cs
@@ -1,15 +1,17 @@
-using System;
+using SimpleResults;
+using System;
using System.Threading.Tasks;
-using SimpleResults;
namespace TransactionProcessor.BusinessLogic.Tests.OperatorInterfaces
{
- using System.Threading;
using Common;
using Microsoft.Extensions.Caching.Memory;
using Moq;
using PataPawaPostPay;
+ using Shared.Serialisation;
using Shouldly;
+ using System.Text.Json;
+ using System.Threading;
using Testing;
using TransactionProcessor.BusinessLogic.OperatorInterfaces.PataPawaPostPay;
using Xunit;
@@ -26,6 +28,7 @@ public class PataPawaPostPayProxyTests{
private readonly IMemoryCache MemoryCache;
public PataPawaPostPayProxyTests(){
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
PataPawaPostPayService = new Mock();
PataPawaPostPayServiceClient = new Mock();
diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPrePayProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPrePayProxyTests.cs
index 22e00a26..55d1df95 100644
--- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPrePayProxyTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/PataPawaPrePayProxyTests.cs
@@ -1,15 +1,16 @@
-using System;
+using Microsoft.Extensions.Caching.Memory;
+using RichardSzalay.MockHttp;
+using Shared.Logger;
+using Shared.Serialisation;
+using Shouldly;
+using SimpleResults;
+using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
-using Microsoft.Extensions.Caching.Memory;
-using Newtonsoft.Json;
-using RichardSzalay.MockHttp;
-using Shared.Logger;
-using Shouldly;
-using SimpleResults;
using TransactionProcessor.BusinessLogic.OperatorInterfaces;
using TransactionProcessor.BusinessLogic.OperatorInterfaces.PataPawaPrePay;
using TransactionProcessor.Testing;
@@ -23,6 +24,7 @@ public class PataPawaPrePayProxyTests {
private readonly IMemoryCache MemoryCache = new MemoryCache(new MemoryCacheOptions());
public PataPawaPrePayProxyTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
PataPawaPrePaidConfiguration configuration = new PataPawaPrePaidConfiguration();
configuration.Url = "http://localhost";
configuration.Password = "password";
@@ -41,7 +43,7 @@ public async Task PataPawaPrePayProxy_ProcessLogonMessage_MessageProcessed() {
LogonResponse logonResponse = new LogonResponse { Balance = "0", Key = "Key", Msg = "Success", Status = 0 };
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(logonResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(logonResponse));
var result = await this.PataPawaPrePayProxy.ProcessLogonMessage(CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
@@ -66,7 +68,7 @@ public async Task PataPawaPrePayProxy_ProcessLogonMessage_FailedLogon_MessagePro
{
LogonResponse logonResponse = new LogonResponse { Balance = "0", Key = "Key", Msg = "Success", Status = -1 };
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(logonResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(logonResponse));
var result = await this.PataPawaPrePayProxy.ProcessLogonMessage(CancellationToken.None);
result.IsFailed.ShouldBeTrue();
@@ -102,7 +104,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_MeterTransaction_Messag
MeterResponse meterResponse = new MeterResponse { Status = 0, Code = "1", CustomerName = "Customer", Msg = "msg" };
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(meterResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(meterResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
@@ -132,7 +134,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_MeterTransaction_Failed
MeterResponse meterResponse = new MeterResponse { Status = -1, Code = "1", CustomerName = "Customer", Msg = "msg" };
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(meterResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(meterResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
@@ -165,7 +167,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_VendTransaction_Message
CustomerName = "Mr Customer"
}};
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(vendResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(vendResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
@@ -205,7 +207,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_VendTransaction_FailedA
}
};
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(vendResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(vendResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
@@ -245,7 +247,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_VendTransaction_Custome
}
};
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(vendResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(vendResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
@@ -285,7 +287,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_VendTransaction_AmountI
}
};
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(vendResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(vendResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
@@ -323,7 +325,7 @@ public async Task PataPawaPrePayProxy_ProcessSaleMessage_UnknownMessageType_Mess
}
};
- this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", JsonConvert.SerializeObject(vendResponse));
+ this.MockHttpMessageHandler.When("http://localhost").Respond("application/json", StringSerialiser.Serialise(vendResponse));
var result = await this.PataPawaPrePayProxy.ProcessSaleMessage(TestData.TransactionId,
TestData.OperatorId, TestData.Merchant, TestData.TransactionDateTime, TestData.TransactionReference,
diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs
index 507a0bd1..66b023b3 100644
--- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/SafaricomPinlessProxyTests.cs
@@ -1,19 +1,21 @@
-using System;
+using SimpleResults;
+using System;
using System.Collections.Generic;
-using SimpleResults;
namespace TransactionProcessor.BusinessLogic.Tests.OperatorInterfaces
{
- using System.Net;
- using System.Net.Http;
- using System.Threading;
- using System.Threading.Tasks;
using BusinessLogic.OperatorInterfaces;
using BusinessLogic.OperatorInterfaces.SafaricomPinless;
using Moq;
using Moq.Protected;
using Shared.Logger;
+ using Shared.Serialisation;
using Shouldly;
+ using System.Net;
+ using System.Net.Http;
+ using System.Text.Json;
+ using System.Threading;
+ using System.Threading.Tasks;
using Testing;
using Xunit;
@@ -21,6 +23,7 @@ public class SafaricomPinlessProxyTests
{
public SafaricomPinlessProxyTests(){
Logger.Initialise(NullLogger.Instance);
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
}
[Fact]
diff --git a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs
index 729899b7..e88a0d19 100644
--- a/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/OperatorInterfaces/VoucherManagementProxyTests.cs
@@ -3,16 +3,18 @@
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 MediatR;
using Moq;
using Requests;
+ using Shared.Serialisation;
using Shouldly;
+ using System;
+ using System.Collections.Generic;
+ using System.Text.Json;
+ using System.Threading;
+ using System.Threading.Tasks;
using Testing;
using Xunit;
@@ -20,6 +22,7 @@ public class VoucherManagementProxyTests
{
public VoucherManagementProxyTests() {
Logger.Initialise(new NullLogger());
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
}
[Fact]
diff --git a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs
index 8a744b9f..9fa899d8 100644
--- a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/FloatRequestHandlerTests.cs
@@ -1,19 +1,25 @@
-using System.Threading.Tasks;
-using SimpleResults;
+using SimpleResults;
+using System.Threading.Tasks;
namespace TransactionProcessor.BusinessLogic.Tests.RequestHandler;
-using System.Threading;
using BusinessLogic.Services;
using Moq;
using RequestHandlers;
using Requests;
+using Shared.Serialisation;
using Shouldly;
+using System.Text.Json;
+using System.Threading;
using Testing;
using Xunit;
public class FloatRequestHandlerTests
{
+ public FloatRequestHandlerTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
+ }
+
[Fact]
public async Task FloatRequestHandler_CreateFloatForContractProductRequest_IsHandled(){
Mock floatDomainService = new Mock();
diff --git a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs
index 38271acf..da54b86a 100644
--- a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/SettlementRequestHandlerTests.cs
@@ -1,10 +1,12 @@
-using System.Threading;
-using System.Threading.Tasks;
-using Moq;
+using Moq;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Manager;
using TransactionProcessor.BusinessLogic.RequestHandlers;
@@ -17,6 +19,10 @@ namespace TransactionProcessor.BusinessLogic.Tests.RequestHandler;
public class SettlementRequestHandlerTests
{
+ public SettlementRequestHandlerTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
+ }
+
[Fact]
public async Task SettlementRequestHandler_ProcessSettlementRequest_IsHandled()
{
diff --git a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/TransactionRequestHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/TransactionRequestHandlerTests.cs
index ceb0d0d6..24536b87 100644
--- a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/TransactionRequestHandlerTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/TransactionRequestHandlerTests.cs
@@ -1,8 +1,10 @@
-using System.Threading;
-using System.Threading.Tasks;
-using Moq;
+using Moq;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
using TransactionProcessor.BusinessLogic.RequestHandlers;
using TransactionProcessor.BusinessLogic.Requests;
using TransactionProcessor.BusinessLogic.Services;
@@ -13,6 +15,10 @@ namespace TransactionProcessor.BusinessLogic.Tests.RequestHandler
{
public class TransactionRequestHandlerTests
{
+ public TransactionRequestHandlerTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
+ }
+
[Fact]
public async Task TransactionRequestHandler_ProcessLogonTransactionRequest_IsHandled()
{
diff --git a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/VoucherManagementRequestHandlerTests.cs b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/VoucherManagementRequestHandlerTests.cs
index bb50aba7..4a101958 100644
--- a/TransactionProcessor.BusinessLogic.Tests/RequestHandler/VoucherManagementRequestHandlerTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/RequestHandler/VoucherManagementRequestHandlerTests.cs
@@ -1,7 +1,7 @@
-using System;
-using System.Threading.Tasks;
-using Moq;
+using Moq;
using Shouldly;
+using System;
+using System.Threading.Tasks;
using TransactionProcessor.BusinessLogic.Manager;
using TransactionProcessor.BusinessLogic.RequestHandlers;
using TransactionProcessor.BusinessLogic.Requests;
@@ -10,11 +10,17 @@
namespace TransactionProcessor.BusinessLogic.Tests.RequestHandler
{
+ using Shared.Serialisation;
+ using System.Text.Json;
using System.Threading;
using Testing;
public class VoucherManagementRequestHandlerTests
{
+ public VoucherManagementRequestHandlerTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
+ }
+
[Fact]
public async Task VoucherManagementRequestHandler_IssueVoucherRequest_IsHandled()
{
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/ContractDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/ContractDomainServiceTests.cs
index 554978d3..c0523daa 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/ContractDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/ContractDomainServiceTests.cs
@@ -5,6 +5,7 @@
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
using Shared.EventStore.EventStore;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
using TransactionProcessor.Aggregates;
@@ -26,6 +27,7 @@ public ContractDomainServiceTests() {
this.EventStoreContext = new Mock();
IAggregateService AggregateServiceResolver() => this.AggregateService.Object;
this.DomainService = new ContractDomainService(AggregateServiceResolver, this.EventStoreContext.Object);
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(SystemTextJsonSerializer.GetDefaultJsonSerializerOptions()));
}
[Fact]
@@ -38,7 +40,7 @@ public async Task ContractDomainService_CreateContract_ContractIsCreated()
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success);
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
Result result = await this.DomainService.CreateContract(command, CancellationToken.None);
@@ -52,7 +54,7 @@ public async Task ContractDomainService_CreateContract_DuplicateContractNameForO
.ReturnsAsync(TestData.Aggregates.EstateAggregateWithOperator());
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
String queryResult =
- "{\r\n \"total\": 1,\r\n \"contractId\": \"3015e4d0-e9a9-49e5-bd55-a5492f193b62\"\r\n}";
+ "{\r\n \"total\": 1,\r\n \"contract_Id\": \"3015e4d0-e9a9-49e5-bd55-a5492f193b62\"\r\n}";
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
.ReturnsAsync(queryResult);
@@ -70,7 +72,7 @@ public async Task ContractDomainService_CreateContract_ContractAlreadyCreated_Re
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
Result result = await this.DomainService.CreateContract(command, CancellationToken.None);
@@ -83,7 +85,7 @@ public async Task ContractDomainService_CreateContract_EstateNotCreated_ResultFa
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.AggregateService.Setup(e => e.Get(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyEstateAggregate));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
Result result = await this.DomainService.CreateContract(command, CancellationToken.None);
@@ -96,7 +98,7 @@ public async Task ContractDomainService_CreateContract_NoOperatorCreatedForEstat
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.AggregateService.Setup(e => e.Get(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedEstateAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
Result result = await this.DomainService.CreateContract(command, CancellationToken.None);
@@ -110,7 +112,7 @@ public async Task ContractDomainService_CreateContract_OperatorNotFoundForEstate
this.AggregateService.Setup(e => e.Get(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedEstateAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
Result result = await this.DomainService.CreateContract(command, CancellationToken.None);
@@ -125,7 +127,7 @@ public async Task ContractDomainService_AddProductToContract_FixedValue_ProductA
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregate()));
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success);
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddProductToContractCommand command = TestData.Commands.AddProductToContractCommand_FixedValue;
Result result = await this.DomainService.AddProductToContract(command, CancellationToken.None);
@@ -139,7 +141,7 @@ public async Task ContractDomainService_AddProductToContract_FixedValue_Contract
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddProductToContractCommand command = TestData.Commands.AddProductToContractCommand_FixedValue;
Result result = await this.DomainService.AddProductToContract(command, CancellationToken.None);
@@ -155,7 +157,7 @@ public async Task ContractDomainService_AddProductToContract_VariableValue_Produ
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success);
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddProductToContractCommand command = TestData.Commands.AddProductToContractCommand_VariableValue;
Result result = await this.DomainService.AddProductToContract(command, CancellationToken.None);
@@ -169,7 +171,7 @@ public async Task ContractDomainService_AddProductToContract_VariableValue_Contr
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddProductToContractCommand command = TestData.Commands.AddProductToContractCommand_VariableValue;
Result result = await this.DomainService.AddProductToContract(command, CancellationToken.None);
@@ -183,7 +185,7 @@ public async Task ContractDomainService_AddProductToContract_VariableValue_Estat
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddProductToContractCommand command = TestData.Commands.AddProductToContractCommand_VariableValue;
Result result = await this.DomainService.AddProductToContract(command, CancellationToken.None);
@@ -197,7 +199,7 @@ public async Task ContractDomainService_AddProductToContract_FixedValue_EstateNo
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddProductToContractCommand command = TestData.Commands.AddProductToContractCommand_FixedValue;
Result result = await this.DomainService.AddProductToContract(command, CancellationToken.None);
@@ -218,7 +220,7 @@ public async Task ContractDomainService_AddTransactionFeeForProductToContract_Tr
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success);
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddTransactionFeeForProductToContractCommand command =
TestData.Commands.AddTransactionFeeForProductToContractCommand(calculationType, feeType);
@@ -238,7 +240,7 @@ public async Task ContractDomainService_AddTransactionFeeForProductToContract_Co
.ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddTransactionFeeForProductToContractCommand command =
TestData.Commands.AddTransactionFeeForProductToContractCommand(calculationType,feeType);
@@ -259,7 +261,7 @@ public async Task ContractDomainService_AddTransactionFeeForProductToContract_Pr
.ReturnsAsync(Result.Success(TestData.Aggregates.CreatedContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.AddTransactionFeeForProductToContractCommand command =
TestData.Commands.AddTransactionFeeForProductToContractCommand(calculationType, feeType);
@@ -284,7 +286,7 @@ public async Task ContractDomainService_DisableTransactionFeeForProduct_Transact
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success);
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
ContractCommands.DisableTransactionFeeForProductCommand command = TestData.Commands.DisableTransactionFeeForProductCommand;
Result result = await this.DomainService.DisableTransactionFeeForProduct(command, CancellationToken.None);
@@ -385,10 +387,8 @@ public async Task ContractDomainService_CreateContract_StateChangeFailed_ResultI
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
- //this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny()))
- // .ReturnsAsync(Result.Failure());
-
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
+
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
command = command with {
RequestDTO = new CreateContractRequest {
@@ -408,7 +408,7 @@ public async Task ContractDomainService_CreateContract_SaveFailed_ResultIsFailed
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Failure());
@@ -425,7 +425,7 @@ public async Task ContractDomainService_CreateContract_ExceptionThrown_ResultIsF
this.AggregateService.Setup(c => c.GetLatest(It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Success(TestData.Aggregates.EmptyContractAggregate()));
this.EventStoreContext.Setup(c => c.RunTransientQuery(It.IsAny(), It.IsAny()))
- .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contractId\": \"\"\r\n}");
+ .ReturnsAsync("{\r\n \"total\": 0,\r\n \"contract_Id\": \"\"\r\n}");
this.AggregateService.Setup(c => c.Save(It.IsAny(), It.IsAny())).ThrowsAsync(new Exception());
ContractCommands.CreateContractCommand command = TestData.Commands.CreateContractCommand;
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs
index 19f9dbc9..f371d9e6 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs
@@ -1,14 +1,16 @@
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Moq;
+using Moq;
using SecurityService.Client;
using SecurityService.DataTransferObjects;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
+using System;
+using System.Collections.Generic;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Requests;
using TransactionProcessor.BusinessLogic.Services;
@@ -23,6 +25,7 @@ public class EstateDomainServiceTests {
private Mock AggregateService;
private Mock SecurityServiceClient;
public EstateDomainServiceTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
this.AggregateService= new Mock();
this.SecurityServiceClient = new Mock();
IAggregateService AggregateServiceResolver() => this.AggregateService.Object;
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs
index cefd7fb2..f2649cde 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/FloatDomainServiceTests.cs
@@ -1,18 +1,20 @@
-using System;
+using SimpleResults;
+using System;
using System.Threading.Tasks;
-using SimpleResults;
using TransactionProcessor.BusinessLogic.Requests;
namespace TransactionProcessor.BusinessLogic.Tests.Services
{
- using System.Threading;
using Microsoft.Extensions.Configuration;
using Moq;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
using Shared.General;
using Shared.Logger;
+ using Shared.Serialisation;
using Shouldly;
+ using System.Text.Json;
+ using System.Threading;
using Testing;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Services;
@@ -24,7 +26,7 @@ public class FloatDomainServiceTests
private readonly FloatDomainService FloatDomainService;
public FloatDomainServiceTests(){
-
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs
index 59a965d5..65e981ee 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantDomainServiceTests.cs
@@ -1,6 +1,5 @@
using Microsoft.Extensions.Configuration;
using Moq;
-using Newtonsoft.Json;
using SecurityService.Client;
using SecurityService.DataTransferObjects;
using Shared.DomainDrivenDesign.EventSourcing;
@@ -8,11 +7,13 @@
using Shared.EventStore.EventStore;
using Shared.General;
using Shared.Logger;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using TransactionProcessor.Aggregates;
@@ -36,6 +37,7 @@ public class MerchantDomainServiceTests {
private readonly Mock EventStoreContext;
public MerchantDomainServiceTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
IConfigurationRoot configurationRoot =
new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
@@ -838,7 +840,7 @@ public async Task MerchantDomainService_MakeMerchantWithdrawal_WithdrawalIsMade(
.Setup(s => s.GetToken(It.IsAny(), It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Success(TestData.GetTokenResponse()));
- this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState)));
+ this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)));
var result = await this.DomainService.MakeMerchantWithdrawal(TestData.Commands.MakeMerchantWithdrawalCommand, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
@@ -864,7 +866,7 @@ public async Task MerchantDomainService_MakeMerchantWithdrawal_DuplicateWithdraw
.Setup(s => s.GetToken(It.IsAny(), It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Success(TestData.GetTokenResponse()));
- this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState)));
+ this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Success(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)));
var result = await this.DomainService.MakeMerchantWithdrawal(TestData.Commands.MakeMerchantWithdrawalCommand, CancellationToken.None);
result.IsFailed.ShouldBeTrue();
@@ -943,7 +945,7 @@ public async Task MerchantDomainService_MakeMerchantWithdrawal_NotEnoughFundsToW
.ReturnsAsync(Result.Success());
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(Result.Success(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionStateNoCredit)));
+ .ReturnsAsync(Result.Success(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionStateNoCredit)));
var result = await this.DomainService.MakeMerchantWithdrawal(TestData.Commands.MakeMerchantWithdrawalCommand, CancellationToken.None);
result.IsFailed.ShouldBeTrue();
@@ -1583,7 +1585,7 @@ public async Task MerchantDomainService_MakeMerchantWithdrawal_SaveFailed_Result
.Setup(m => m.GetLatest(It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Success(TestData.Aggregates.CreatedMerchantDepositListAggregate()));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(Result.Success(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState)));
+ .ReturnsAsync(Result.Success(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState)));
this.AggregateService.Setup(m => m.Save(It.IsAny(), It.IsAny()))
.ReturnsAsync(Result.Failure());
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantStatementDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantStatementDomainServiceTests.cs
index 6d909c4c..c52ff69f 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/MerchantStatementDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/MerchantStatementDomainServiceTests.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using MessagingService.Client;
+using MessagingService.Client;
using MessagingService.DataTransferObjects;
using Microsoft.Extensions.Configuration;
using Moq;
@@ -9,8 +6,13 @@
using Shared.EventStore.Aggregate;
using Shared.General;
using Shared.Logger;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
+using System;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Services;
using TransactionProcessor.Models.Merchant;
@@ -27,6 +29,7 @@ public class MerchantStatementDomainServiceTests {
private readonly Mock SecurityServiceClient;
private readonly MerchantStatementDomainService DomainService;
public MerchantStatementDomainServiceTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
this.AggregateService = new Mock();
this.StatementBuilder = new Mock();
this.MessagingServiceClient = new Mock();
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/OperatorDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/OperatorDomainServiceTests.cs
index 400c6c14..29a092fe 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/OperatorDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/OperatorDomainServiceTests.cs
@@ -1,11 +1,13 @@
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Moq;
+using Moq;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
+using Shared.Serialisation;
using Shouldly;
using SimpleResults;
+using System;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Requests;
using TransactionProcessor.BusinessLogic.Services;
@@ -24,6 +26,7 @@ public OperatorDomainServiceTests(){
this.AggregateService = new Mock();
IAggregateService AggregateServiceResolver() => this.AggregateService.Object;
this.OperatorDomainService = new OperatorDomainService(AggregateServiceResolver);
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
}
[Fact]
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs
index 2d44b471..48abb388 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/SettlementDomainServiceTests.cs
@@ -6,10 +6,6 @@
namespace TransactionProcessor.BusinessLogic.Tests.Services
{
- using System;
- using System.Collections.Generic;
- using System.Threading;
- using System.Threading.Tasks;
using BusinessLogic.Services;
using Microsoft.Extensions.Configuration;
using Moq;
@@ -17,7 +13,13 @@ namespace TransactionProcessor.BusinessLogic.Tests.Services
using Shared.EventStore.Aggregate;
using Shared.General;
using Shared.Logger;
+ using Shared.Serialisation;
using Shouldly;
+ using System;
+ using System.Collections.Generic;
+ using System.Text.Json;
+ using System.Threading;
+ using System.Threading.Tasks;
using Testing;
using Xunit;
@@ -27,6 +29,7 @@ public class SettlementDomainServiceTests
private SettlementDomainService settlementDomainService;
public SettlementDomainServiceTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
this.AggregateService =
new Mock();
IAggregateService AggregateServiceResolver() => this.AggregateService.Object;
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/StatementBuilderTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/StatementBuilderTests.cs
index 2e297c72..feedd975 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/StatementBuilderTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/StatementBuilderTests.cs
@@ -1,14 +1,16 @@
+using Moq;
+using Shared.Serialisation;
+using Shouldly;
+using SimpleResults;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Abstractions;
using System.Linq;
using System.Reflection;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
-using Moq;
-using Shouldly;
-using SimpleResults;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Services;
using TransactionProcessor.Models.Merchant;
@@ -24,6 +26,7 @@ public class StatementBuilderTests {
private readonly CancellationToken _cancellationToken = CancellationToken.None;
public StatementBuilderTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
_fileSystemMock = new Mock();
_builder = new StatementBuilder(_fileSystemMock.Object);
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs
index c761e6e7..467e34a9 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionDomainServiceTests.cs
@@ -8,10 +8,6 @@
using TransactionProcessor.Models.Merchant;
namespace TransactionProcessor.BusinessLogic.Tests.Services{
- using System;
- using System.Collections.Generic;
- using System.Threading;
- using System.Threading.Tasks;
using BusinessLogic.OperatorInterfaces;
using BusinessLogic.Services;
using MessagingService.Client;
@@ -23,7 +19,13 @@ namespace TransactionProcessor.BusinessLogic.Tests.Services{
using Shared.EventStore.Aggregate;
using Shared.General;
using Shared.Logger;
+ using Shared.Serialisation;
using Shouldly;
+ using System;
+ using System.Collections.Generic;
+ using System.Text.Json;
+ using System.Threading;
+ using System.Threading.Tasks;
using Testing;
using Xunit;
@@ -44,6 +46,7 @@ public class TransactionDomainServiceTests{
#region Constructors
public TransactionDomainServiceTests(){
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionReceiptBuilderTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionReceiptBuilderTests.cs
index 4da4b166..27181a77 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionReceiptBuilderTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionReceiptBuilderTests.cs
@@ -3,19 +3,25 @@
namespace TransactionProcessor.BusinessLogic.Tests.Services
{
+ using BusinessLogic.Services;
+ using Models;
+ using Shared.Serialisation;
+ using Shouldly;
using System.IO;
using System.IO.Abstractions.TestingHelpers;
using System.Reflection;
+ using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
- using BusinessLogic.Services;
- using Models;
- using Shouldly;
using Testing;
using Xunit;
public class TransactionReceiptBuilderTests
{
+ public TransactionReceiptBuilderTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
+ }
+
[Fact]
public async Task TransactionReceiptBuilder_GetEmailReceiptMessage_MessageBuilt()
{
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs
index bf1303f5..fb0aed30 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/TransactionValidationServiceTests.cs
@@ -1,25 +1,23 @@
-using Shared.DomainDrivenDesign.EventSourcing;
-using Shared.EventStore.Aggregate;
+using Shared.EventStore.Aggregate;
using SimpleResults;
using TransactionProcessor.Aggregates;
using TransactionProcessor.Models.Merchant;
namespace TransactionProcessor.BusinessLogic.Tests.Services;
-using System;
-using System.Threading;
-using System.Threading.Tasks;
using BusinessLogic.Services;
using Microsoft.Extensions.Configuration;
using Moq;
-using Newtonsoft.Json;
-using ProjectionEngine.Repository;
-using ProjectionEngine.State;
using SecurityService.Client;
using Shared.EventStore.EventStore;
using Shared.General;
using Shared.Logger;
+using Shared.Serialisation;
using Shouldly;
+using System;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
using Testing;
using Xunit;
@@ -29,6 +27,7 @@ public class TransactionValidationServiceTests {
private readonly Mock EventStoreContext;
private readonly Mock AggregateService;
public TransactionValidationServiceTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
@@ -404,7 +403,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_InvalidCo
.ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -429,7 +428,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_InvalidPr
this.AggregateService.Setup(e => e.Get(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -501,7 +500,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantD
this.AggregateService.Setup(e => e.Get(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -528,7 +527,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantH
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -552,7 +551,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantN
.ReturnsAsync(Result.Success(TestData.Aggregates.EstateAggregateWithOperator()));
this.AggregateService.Setup(m => m.Get(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionStateNoCredit));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionStateNoCredit));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -627,7 +626,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_MerchantN
.ReturnsAsync(Result.NotFound());
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -654,7 +653,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_FailedGet
.ReturnsAsync(Result.NotFound());
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -749,7 +748,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_ProductId
this.AggregateService.Setup(e => e.Get(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
@@ -774,7 +773,7 @@ public async Task TransactionValidationService_ValidateSaleTransaction_Successfu
this.AggregateService.SetupSequence(m => m.Get(It.IsAny(), It.IsAny())).ReturnsAsync(TestData.Aggregates.MerchantAggregateWithEverything(SettlementSchedule.Immediate));
this.EventStoreContext.Setup(e => e.GetPartitionStateFromProjection(It.IsAny(), It.IsAny(), It.IsAny()))
- .ReturnsAsync(JsonConvert.SerializeObject(TestData.MerchantBalanceProjectionState));
+ .ReturnsAsync(StringSerialiser.Serialise(TestData.MerchantBalanceProjectionState));
var result = await this.TransactionValidationService.ValidateSaleTransaction(TestData.EstateId,
TestData.MerchantId,
diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/VoucherDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/VoucherDomainServiceTests.cs
index 4e595170..7c59d143 100644
--- a/TransactionProcessor.BusinessLogic.Tests/Services/VoucherDomainServiceTests.cs
+++ b/TransactionProcessor.BusinessLogic.Tests/Services/VoucherDomainServiceTests.cs
@@ -17,8 +17,10 @@ namespace TransactionProcessor.BusinessLogic.Tests.Services
using Shared.EventStore.Aggregate;
using Shared.General;
using Shared.Logger;
+ using Shared.Serialisation;
using Shouldly;
using System;
+ using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Testing;
@@ -34,6 +36,7 @@ public class VoucherDomainServiceTests
private readonly Mock> DbContextFactory;
public VoucherDomainServiceTests() {
+ StringSerialiser.Initialise(new SystemTextJsonSerializer(new JsonSerializerOptions()));
IConfigurationRoot configurationRoot = new ConfigurationBuilder().AddInMemoryCollection(TestData.DefaultAppSettings).Build();
ConfigurationReader.Initialise(configurationRoot);
diff --git a/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj b/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj
index 2bd204d8..78848b0b 100644
--- a/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj
+++ b/TransactionProcessor.BusinessLogic.Tests/TransactionProcessor.BusinessLogic.Tests.csproj
@@ -8,7 +8,6 @@
-
diff --git a/TransactionProcessor.BusinessLogic/EventHandling/MerchantDomainEventHandler.cs b/TransactionProcessor.BusinessLogic/EventHandling/MerchantDomainEventHandler.cs
index b28b5543..fc37fa98 100644
--- a/TransactionProcessor.BusinessLogic/EventHandling/MerchantDomainEventHandler.cs
+++ b/TransactionProcessor.BusinessLogic/EventHandling/MerchantDomainEventHandler.cs
@@ -1,5 +1,4 @@
using MediatR;
-using Newtonsoft.Json;
using Polly;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
@@ -9,6 +8,7 @@
using System;
using System.Threading;
using System.Threading.Tasks;
+using Shared.Serialisation;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Common;
using TransactionProcessor.BusinessLogic.Events;
@@ -65,7 +65,7 @@ private async Task HandleSpecificDomainEvent(CallbackReceivedEnrichedEve
return ResultHelpers.CreateFailure(result);
// We now need to deserialise the message from the callback
- CallbackHandler.DataTransferObjects.Deposit callbackMessage = JsonConvert.DeserializeObject(domainEvent.CallbackMessage);
+ CallbackHandler.DataTransferObjects.Deposit callbackMessage = StringSerialiser.Deserialise(domainEvent.CallbackMessage);
MerchantCommands.MakeMerchantDepositCommand command = new(domainEvent.EstateId, result.Data.MerchantId, DataTransferObjects.Requests.Merchant.MerchantDepositSource.Automatic, new MakeMerchantDepositRequest { DepositDateTime = callbackMessage.DateTime, Reference = callbackMessage.Reference, Amount = callbackMessage.Amount, });
return await this.Mediator.Send(command, cancellationToken);
diff --git a/TransactionProcessor.BusinessLogic/Events/CallbackReceivedEnrichedEvent.cs b/TransactionProcessor.BusinessLogic/Events/CallbackReceivedEnrichedEvent.cs
index 421950aa..4ae03e5b 100644
--- a/TransactionProcessor.BusinessLogic/Events/CallbackReceivedEnrichedEvent.cs
+++ b/TransactionProcessor.BusinessLogic/Events/CallbackReceivedEnrichedEvent.cs
@@ -1,6 +1,5 @@
using System;
using System.Diagnostics.CodeAnalysis;
-using Newtonsoft.Json;
using Shared.DomainDrivenDesign.EventSourcing;
namespace TransactionProcessor.BusinessLogic.Events
@@ -32,49 +31,14 @@ public CallbackReceivedEnrichedEvent(Guid aggregateId, Guid estateId, Int32 mess
#region Properties
- ///
- /// Gets or sets the callback message.
- ///
- ///
- /// The callback message.
- ///
- [JsonProperty("callbackMessage")]
public String CallbackMessage { get; set; }
- ///
- /// Gets or sets the estate identifier.
- ///
- ///
- /// The estate identifier.
- ///
- [JsonProperty("estateid")]
public Guid EstateId { get; set; }
- ///
- /// Gets or sets the message format.
- ///
- ///
- /// The message format.
- ///
- [JsonProperty("messageFormat")]
public Int32 MessageFormat { get; set; }
- ///
- /// Gets or sets the reference.
- ///
- ///
- /// The reference.
- ///
- [JsonProperty("reference")]
public String Reference { get; set; }
- ///
- /// Gets or sets the type string.
- ///
- ///
- /// The type string.
- ///
- [JsonProperty("typeString")]
public String TypeString { get; set; }
#endregion
diff --git a/TransactionProcessor.BusinessLogic/OperatorInterfaces/PataPawaPrePay/PataPawaPrePayProxy.cs b/TransactionProcessor.BusinessLogic/OperatorInterfaces/PataPawaPrePay/PataPawaPrePayProxy.cs
index 48e4f498..695bf5a3 100644
--- a/TransactionProcessor.BusinessLogic/OperatorInterfaces/PataPawaPrePay/PataPawaPrePayProxy.cs
+++ b/TransactionProcessor.BusinessLogic/OperatorInterfaces/PataPawaPrePay/PataPawaPrePayProxy.cs
@@ -1,17 +1,20 @@
-using System.Diagnostics.CodeAnalysis;
+using Shared.Serialisation;
using SimpleResults;
+using System.Diagnostics.CodeAnalysis;
+using System.Text.Json.Serialization;
namespace TransactionProcessor.BusinessLogic.OperatorInterfaces.PataPawaPrePay;
+using Common;
+using Microsoft.Extensions.Caching.Memory;
+using Shared.Logger;
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Net.Http;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
-using Common;
-using Microsoft.Extensions.Caching.Memory;
-using Newtonsoft.Json;
-using Shared.Logger;
public class PataPawaPrePayProxy : IOperatorProxy{
private readonly PataPawaPrePaidConfiguration Configuration;
@@ -157,7 +160,7 @@ private async Task> PerformVendTransaction(String meter
}
private Result CreateFromLogon(String responseContent){
- LogonResponse logonResponse = JsonConvert.DeserializeObject(responseContent);
+ LogonResponse logonResponse = StringSerialiser.Deserialise(responseContent);
if (logonResponse.Status != 0) {
return Result.Failure($"Error logging on with PataPawa Pre Paid API, Response is {logonResponse.Status}");
@@ -180,7 +183,7 @@ private Result CreateFromLogon(String responseContent){
private Result CreateFromMeter(String responseContent)
{
- MeterResponse meterResponse = JsonConvert.DeserializeObject(responseContent);
+ MeterResponse meterResponse = StringSerialiser.Deserialise(responseContent);
if (meterResponse.Status != 0)
{
@@ -202,7 +205,7 @@ private Result CreateFromMeter(String responseContent)
private Result CreateFromVend(String responseContent)
{
- VendResponse vendResponse = JsonConvert.DeserializeObject(responseContent);
+ VendResponse vendResponse = StringSerialiser.Deserialise(responseContent);
if (vendResponse.Status != 0)
{
@@ -245,4 +248,49 @@ private void PostEvictionCallback(Object key,
this.ProcessLogonMessage(CancellationToken.None).Wait();
}
}
+
+ public class DateTimeSpaceConverter : JsonConverter
+ {
+ private static readonly string[] AcceptedFormats = new[] {
+ "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd H:mm:ss", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm:ss.FFFFFFFK", "o" // ISO 8601 round-trip
+ };
+ public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ if (reader.TokenType == JsonTokenType.Null)
+ {
+ return default;
+ }
+
+ if (reader.TokenType == JsonTokenType.String)
+ {
+ var s = reader.GetString();
+ if (string.IsNullOrWhiteSpace(s))
+ return default;
+
+ // Try exact known formats first (handles "2026-05-07 06:03:18")
+ if (DateTime.TryParseExact(s, AcceptedFormats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AllowWhiteSpaces, out var dtExact))
+ return dtExact;
+
+ // Fall back to general parse
+ if (DateTime.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var dt))
+ return dt;
+
+ throw new JsonException($"Unable to parse DateTime: '{s}'.");
+ }
+
+ // If JSON contains a number, attempt to treat it as Unix seconds (optional)
+ if (reader.TokenType == JsonTokenType.Number && reader.TryGetInt64(out long seconds))
+ {
+ return DateTimeOffset.FromUnixTimeSeconds(seconds).LocalDateTime;
+ }
+
+ throw new JsonException($"Unexpected token parsing DateTime. Token: {reader.TokenType}");
+ }
+
+ public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
+ {
+ // Write in the same "space" format so round-trip matches your input
+ writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture));
+ }
+ }
}
\ No newline at end of file
diff --git a/TransactionProcessor.BusinessLogic/RequestHandlers/MerchantRequestHandler.cs b/TransactionProcessor.BusinessLogic/RequestHandlers/MerchantRequestHandler.cs
index a7337110..0f350853 100644
--- a/TransactionProcessor.BusinessLogic/RequestHandlers/MerchantRequestHandler.cs
+++ b/TransactionProcessor.BusinessLogic/RequestHandlers/MerchantRequestHandler.cs
@@ -3,8 +3,8 @@
using System.Threading;
using System.Threading.Tasks;
using MediatR;
-using Newtonsoft.Json;
using Shared.EventStore.EventStore;
+using Shared.Serialisation;
using SimpleResults;
using TransactionProcessor.BusinessLogic.Manager;
using TransactionProcessor.BusinessLogic.Requests;
@@ -76,8 +76,8 @@ public async Task> Handle(MerchantQuerie
if (result.IsFailed)
return Result.NotFound(
$"Merchant Balance not found for Merchant {query.MerchantId} on MerchantBalanceProjection");
-
- MerchantBalanceProjectionState1 projectionState = JsonConvert.DeserializeObject(result.Data);
+ var json = result.Data.ToLower();
+ MerchantBalanceProjectionState1 projectionState = StringSerialiser.Deserialise(json, new SerialiserOptions(SerialiserPropertyFormat.CamelCase));
return Result.Success(projectionState);
}
diff --git a/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs b/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs
index 7814e00a..eb7a1c1a 100644
--- a/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs
+++ b/TransactionProcessor.BusinessLogic/Services/ContractDomainService.cs
@@ -1,15 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
-using Newtonsoft.Json.Linq;
-using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
using Shared.EventStore.EventStore;
using Shared.Exceptions;
using Shared.Results;
+using Shared.Serialisation;
using SimpleResults;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Common;
@@ -199,19 +197,21 @@ private async Task ValidateContractCreationPreConditions(ContractCommand
return Result.NotFound($"Unable to create a contract for an operator that is not setup on estate [{estate.Name}]");
String projection =
- $"fromCategory(\"ContractAggregate\")\n.when({{\n $init: function (s, e) {{\n return {{\n total: 0,\n contractId: 0\n }};\n }},\n 'ContractCreatedEvent': function(s,e){{\n // Check if it matches\n if (e.data.description === '{command.RequestDTO.Description}' \n && e.data.operatorId === '{command.RequestDTO.OperatorId}'){{\n s.total += 1;\n s.contractId = e.data.contractId\n }}\n }}\n}})";
+ $"fromCategory(\"ContractAggregate\")\n.when({{\n $init: function (s, e) {{\n return {{\n total: 0,\n contractId: 0\n }};\n }},\n 'ContractCreatedEvent': function(s,e){{\n // Check if it matches\n if (e.data.description === '{command.RequestDTO.Description}' \n && e.data.operatorId === '{command.RequestDTO.OperatorId}'){{\n s.total += 1;\n s.contract_Id = e.data.contractId\n }}\n }}\n}})";
Result result = await this.Context.RunTransientQuery(projection, cancellationToken);
if (result.IsFailed)
return ResultHelpers.CreateFailure(result);
String resultString = result.Data;
- if (String.IsNullOrEmpty(resultString) == false)
- {
- JObject jsonResult = JObject.Parse(resultString);
- String contractIdString = jsonResult["contractId"]?.Value();
- if (Guid.TryParse(contractIdString, out Guid contractIdResult) && contractIdResult != Guid.Empty)
+ if (String.IsNullOrEmpty(resultString) == false) {
+ var resultObject = new { total = 0, contract_Id = String.Empty };
+
+ var queryResult = StringSerialiser.DeserialiseAnonymousType(resultString, resultObject);
+
+ if (Guid.TryParse(queryResult.contract_Id, out Guid contractIdResult) && contractIdResult != Guid.Empty){
return Result.Conflict($"Contract Description {command.RequestDTO.Description} already in use for operator {command.RequestDTO.OperatorId}");
+ }
}
return Result.Success();
diff --git a/TransactionProcessor.BusinessLogic/Services/IdGenerationService.cs b/TransactionProcessor.BusinessLogic/Services/IdGenerationService.cs
index 5c95319d..abb0b993 100644
--- a/TransactionProcessor.BusinessLogic/Services/IdGenerationService.cs
+++ b/TransactionProcessor.BusinessLogic/Services/IdGenerationService.cs
@@ -6,7 +6,6 @@ namespace TransactionProcessor.BusinessLogic.Services
{
using System.Diagnostics.CodeAnalysis;
using System.Security.Cryptography;
- using Newtonsoft.Json;
using Shared.Serialisation;
[ExcludeFromCodeCoverage]
diff --git a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs
index 89c6268b..744b7bfd 100644
--- a/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs
+++ b/TransactionProcessor.BusinessLogic/Services/MerchantDomainService.cs
@@ -1,5 +1,4 @@
-using Newtonsoft.Json;
-using SecurityService.Client;
+using SecurityService.Client;
using SecurityService.DataTransferObjects;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
@@ -14,6 +13,7 @@
using System.Threading;
using System.Threading.Tasks;
using KurrentDB.Client;
+using Shared.Serialisation;
using TransactionProcessor.Aggregates;
using TransactionProcessor.BusinessLogic.Common;
using TransactionProcessor.BusinessLogic.Requests;
@@ -802,7 +802,7 @@ private async Task ValidateWithdrawalBalance(MerchantCommands.MakeMercha
return Result.Invalid($"Failed to get Merchant Balance.");
}
- MerchantBalanceProjectionState1 projectionState = JsonConvert.DeserializeObject(getBalanceResult.Data);
+ MerchantBalanceProjectionState1 projectionState = StringSerialiser.Deserialise(getBalanceResult.Data);
if (projectionState?.merchant == null)
{
return Result.Invalid("Merchant Balance data is missing or invalid.");
diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs
index 88155658..0a3c1073 100644
--- a/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs
+++ b/TransactionProcessor.BusinessLogic/Services/TransactionDomainService.cs
@@ -475,6 +475,7 @@ private async Task> ProcessMessageWithOperator(Models.M
catch (Exception e) {
// Log out the error
Logger.LogError(e);
+ Logger.LogWarning(e.StackTrace);
return ResultHelpers.CreateFailedResult(new OperatorResponse { IsSuccessful = false, ResponseCode = "9999", ResponseMessage = e.GetCombinedExceptionMessages() });
}
}
diff --git a/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs b/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs
index aa8686d0..51f4368b 100644
--- a/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs
+++ b/TransactionProcessor.BusinessLogic/Services/TransactionValidationService.cs
@@ -6,15 +6,15 @@
namespace TransactionProcessor.BusinessLogic.Services;
+using ProjectionEngine.State;
+using Shared.EventStore.EventStore;
+using Shared.Serialisation;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using Newtonsoft.Json;
-using ProjectionEngine.State;
-using Shared.EventStore.EventStore;
public interface ITransactionValidationService
{
@@ -305,7 +305,7 @@ private async Task> ValidateTransactionAmoun
return CreateFailedResult(new TransactionValidationResult(TransactionResponseCode.UnknownFailure, $"Error getting balance for Merchant [{merchantName}]"));
}
- MerchantBalanceProjectionState1 projectionState = JsonConvert.DeserializeObject(getBalanceResult.Data);
+ MerchantBalanceProjectionState1 projectionState = StringSerialiser.Deserialise(getBalanceResult.Data);
if (projectionState.merchant.balance < transactionAmount)
{
return CreateFailedResult(new TransactionValidationResult(TransactionResponseCode.MerchantDoesNotHaveEnoughCredit, $"Merchant [{merchantName}] does not have enough credit available [{projectionState.merchant.balance:0.00}] to perform transaction amount [{transactionAmount}]"));
diff --git a/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj b/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj
index 013a38b5..1a228469 100644
--- a/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj
+++ b/TransactionProcessor.BusinessLogic/TransactionProcessor.BusinessLogic.csproj
@@ -6,15 +6,15 @@
-
+
-
-
+
+
diff --git a/TransactionProcessor.Client/ITransactionProcessorClient.cs b/TransactionProcessor.Client/ITransactionProcessorClient.cs
index 1494ab84..f745a247 100644
--- a/TransactionProcessor.Client/ITransactionProcessorClient.cs
+++ b/TransactionProcessor.Client/ITransactionProcessorClient.cs
@@ -21,9 +21,18 @@ namespace TransactionProcessor.Client
public interface ITransactionProcessorClient
{
#region Methods
- Task> PerformTransaction(String accessToken,
- SerialisedMessage transactionRequest,
- CancellationToken cancellationToken);
+
+ Task> PerformTransaction(String accessToken,
+ ReconciliationRequest transactionRequest,
+ CancellationToken cancellationToken);
+
+ Task> PerformTransaction(String accessToken,
+ SaleTransactionRequest transactionRequest,
+ CancellationToken cancellationToken);
+
+ Task> PerformTransaction(String accessToken,
+ LogonTransactionRequest transactionRequest,
+ CancellationToken cancellationToken);
Task> GetSettlementByDate(String accessToken,
DateTime settlementDate,
diff --git a/TransactionProcessor.Client/TransactionProcessor.Client.csproj b/TransactionProcessor.Client/TransactionProcessor.Client.csproj
index d4236ab8..32e6da9a 100644
--- a/TransactionProcessor.Client/TransactionProcessor.Client.csproj
+++ b/TransactionProcessor.Client/TransactionProcessor.Client.csproj
@@ -6,8 +6,8 @@
-
-
+
+
diff --git a/TransactionProcessor.Client/TransactionProcessorClient.cs b/TransactionProcessor.Client/TransactionProcessorClient.cs
index ca8839b0..1387ce71 100644
--- a/TransactionProcessor.Client/TransactionProcessorClient.cs
+++ b/TransactionProcessor.Client/TransactionProcessorClient.cs
@@ -1,4 +1,3 @@
-using SecurityService.Client;
using SimpleResults;
using TransactionProcessor.DataTransferObjects.Requests.Contract;
using TransactionProcessor.DataTransferObjects.Requests.Estate;
@@ -16,13 +15,10 @@ namespace TransactionProcessor.Client;
using System;
using System.Collections.Generic;
using System.Net.Http;
-using System.Net.Http.Headers;
-using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ClientProxyBase;
using DataTransferObjects;
-using Newtonsoft.Json;
using Shared.Results;
public class TransactionProcessorClient : ClientProxyBase, ITransactionProcessorClient {
@@ -269,12 +265,12 @@ public async Task> GetVoucherByTransactionId(String a
}
}
- public async Task> PerformTransaction(String accessToken,
- SerialisedMessage transactionRequest,
+ public async Task> PerformTransaction(String accessToken,
+ LogonTransactionRequest transactionRequest,
CancellationToken cancellationToken) {
- String requestUri = this.BuildRequestUrl($"/api/transactions");
+ String requestUri = this.BuildRequestUrl($"/api/transactions/logon");
try {
- var result = await this.Post(requestUri, transactionRequest, accessToken, cancellationToken);
+ var result = await this.Post(requestUri, transactionRequest, accessToken, cancellationToken);
if (result.IsFailed)
return ResultHelpers.CreateFailure(result);
@@ -283,7 +279,53 @@ public async Task> PerformTransaction(String accessTok
}
catch (Exception ex) {
// An exception has occurred, add some additional information to the message
- Exception exception = new("Error posting transaction.", ex);
+ Exception exception = new("Error posting logon transaction.", ex);
+
+ throw exception;
+ }
+ }
+
+ public async Task> PerformTransaction(String accessToken,
+ SaleTransactionRequest transactionRequest,
+ CancellationToken cancellationToken)
+ {
+ String requestUri = this.BuildRequestUrl($"/api/transactions/sale");
+ try
+ {
+ var result = await this.Post(requestUri, transactionRequest, accessToken, cancellationToken);
+
+ if (result.IsFailed)
+ return ResultHelpers.CreateFailure(result);
+
+ return Result.Success(result.Data);
+ }
+ catch (Exception ex)
+ {
+ // An exception has occurred, add some additional information to the message
+ Exception exception = new("Error posting logon transaction.", ex);
+
+ throw exception;
+ }
+ }
+
+ public async Task> PerformTransaction(String accessToken,
+ ReconciliationRequest transactionRequest,
+ CancellationToken cancellationToken)
+ {
+ String requestUri = this.BuildRequestUrl($"/api/transactions/reconciliation");
+ try
+ {
+ var result = await this.Post