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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 29 additions & 15 deletions TransactionProcessor.DatabaseTests/ContractEventTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,47 +55,41 @@ public async Task AddContract_ContractIsAdded_EventReplayHandled() {
}

[Fact]
public async Task AddContractProduct_ContractProductIsAdded()
{
public async Task AddContractProduct_ContractProductIsAdded() {
Result result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
EstateManagementContext context = this.GetContext();
ContractProduct? fixedContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ContractId &&
c.ContractProductId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ProductId);
ContractProduct? fixedContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ContractId && c.ContractProductId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ProductId);
fixedContractProduct.ShouldNotBeNull();

result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
context = this.GetContext();
ContractProduct? variableContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ContractId &&
c.ContractProductId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ProductId);
ContractProduct? variableContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ContractId && c.ContractProductId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ProductId);
variableContractProduct.ShouldNotBeNull();
}

[Fact]
public async Task AddContractProduct_ContractProductIsAdded_EventReplayHandled()
{
public async Task AddContractProduct_ContractProductIsAdded_EventReplayHandled() {
Result result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
EstateManagementContext context = this.GetContext();
ContractProduct? fixedContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ContractId &&
c.ContractProductId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ProductId);
ContractProduct? fixedContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ContractId && c.ContractProductId == TestData.DomainEvents.FixedValueProductAddedToContractEvent.ProductId);
fixedContractProduct.ShouldNotBeNull();

result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
context = this.GetContext();
ContractProduct? variableContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ContractId &&
c.ContractProductId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ProductId);
ContractProduct? variableContractProduct = await context.ContractProducts.SingleOrDefaultAsync(c => c.ContractId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ContractId && c.ContractProductId == TestData.DomainEvents.VariableValueProductAddedToContractEvent.ProductId);
variableContractProduct.ShouldNotBeNull();

result = await this.Repository.AddContractProduct(TestData.DomainEvents.FixedValueProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();

result = await this.Repository.AddContractProduct(TestData.DomainEvents.VariableValueProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
}

[Fact]
public async Task AddContractProductTransactionFee_ContractIsAdded()
{
Expand All @@ -116,5 +110,25 @@ public async Task AddContractProductTransactionFee_ContractIsAdded_EventReplayHa
result = await this.Repository.AddContractProductTransactionFee(TestData.DomainEvents.TransactionFeeForProductAddedToContractEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
}
}

[Fact]
public async Task AddFileImportLog_FileImportLogIsAdded()
{
Result result = await this.Repository.AddFileImportLog(TestData.DomainEvents.ImportLogCreatedEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
EstateManagementContext context = this.GetContext();
var fileImportLog = await context.FileImportLogs.SingleOrDefaultAsync(f => f.FileImportLogId == TestData.DomainEvents.ImportLogCreatedEvent.FileImportLogId);
fileImportLog.ShouldNotBeNull();
}

[Fact]
public async Task AddFileImportLog_FileImportLogIsAdded_EventReplayHandled()
{
Result result = await this.Repository.AddFileImportLog(TestData.DomainEvents.ImportLogCreatedEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();

result = await this.Repository.AddFileImportLog(TestData.DomainEvents.ImportLogCreatedEvent, CancellationToken.None);
result.IsSuccess.ShouldBeTrue();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1837,7 +1837,7 @@ public async Task<Result> AddFileImportLog(ImportLogCreatedEvent domainEvent,

await context.FileImportLogs.AddAsync(fileImportLog, cancellationToken);

return await context.SaveChangesAsync(cancellationToken);
return await context.SaveChangesWithDuplicateHandling(cancellationToken);
}

public async Task<Result> AddFileLineToFile(FileLineAddedEvent domainEvent,
Expand Down
14 changes: 14 additions & 0 deletions TransactionProcessor.Testing/TestData.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Text;
using FileProcessor.FileImportLog.DomainEvents;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Shared.EventStore.ProjectionEngine;
Expand Down Expand Up @@ -451,6 +452,14 @@ public class TestData

public static Decimal TransactionAmount = 1000.00m;

public static Guid FileImportLogId = Guid.Parse("2250C12E-B617-4012-8145-33ADD6E8E848");
public static Guid FileId = Guid.Parse("3F2A50DE-FD72-4D50-87B0-8F97D1688EFD");
public static Guid FileProfileId = Guid.Parse("E1FF239B-908B-497D-AB5B-6BA3148CE80D");
public static String FileName = "TestFile1.csv";
public static String FilePath = "/uploads/TestFile1.csv";
public static DateTime FileUploadedDateTime = new DateTime(2023, 1, 1, 10, 0, 0);
public static DateTime ImportLogDateTime = new DateTime(2023, 1, 1, 10, 5, 0);

public static OperatorResponse OperatorResponse =>
new OperatorResponse
{
Expand Down Expand Up @@ -2764,6 +2773,11 @@ public static class DomainEvents {
public static OperatorDomainEvents.OperatorNameUpdatedEvent OperatorNameUpdatedEvent => new(TestData.OperatorId, TestData.EstateId, TestData.OperatorName2);
public static OperatorDomainEvents.OperatorRequireCustomMerchantNumberChangedEvent OperatorRequireCustomMerchantNumberChangedEvent => new(TestData.OperatorId, TestData.EstateId, TestData.RequireCustomMerchantNumberFalse);
public static OperatorDomainEvents.OperatorRequireCustomTerminalNumberChangedEvent OperatorRequireCustomTerminalNumberChangedEvent => new(TestData.OperatorId, TestData.EstateId, TestData.RequireCustomTerminalNumberFalse);

public static ImportLogCreatedEvent ImportLogCreatedEvent => new ImportLogCreatedEvent(FileImportLogId, EstateId, ImportLogDateTime);
public static FileAddedToImportLogEvent FileAddedToImportLogEvent => new FileAddedToImportLogEvent(FileImportLogId, FileId, EstateId, MerchantId, EstateSecurityUserId,
FileProfileId, FileName, FilePath, FileUploadedDateTime );

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

<ItemGroup>
<PackageReference Include="ClientProxyBase" Version="2025.7.13" />
<PackageReference Include="FileProcessor.FileImportLog.DomainEvents" Version="2025.8.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.7" />
<PackageReference Include="SecurityService.Client" Version="2025.7.2" />
<PackageReference Include="System.ServiceModel.Federation" Version="8.1.2" />
Expand Down
8 changes: 4 additions & 4 deletions TransactionProcessor/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,29 +186,29 @@
}
},
"ConnectionStrings": {
"TransactionProcessorReadModel": "server=192.168.1.167;user id=sa;password=Sc0tland;database=TransactionProcessorReadModel;Encrypt=false"
"TransactionProcessorReadModel": "server=192.168.1.163;user id=sa;password=Sc0tland;database=TransactionProcessorReadModel;Encrypt=false"
},
"SecurityConfiguration": {
"ApiName": "transactionProcessor"
//"Authority": "https://127.0.0.1:5001"
},
"OperatorConfiguration": {
"Safaricom": {
"Url": "http://192.168.1.167:9000/api/safaricom",
"Url": "http://192.168.1.163:9000/api/safaricom",
"LoginId": "D-S136",
"MSISDN": "700945625",
"Pin": "0322",
"Password": "@SafePay33",
"ExtCode": "SA"
},
"PataPawaPostPay": {
"Url": "http://192.168.1.167:9000/PataPawaPostPayService/basichttp",
"Url": "http://192.168.1.163:9000/PataPawaPostPayService/basichttp",
"Username": "testuser1",
"Password": "password1",
"ApiLogonRequired": true
},
"PataPawaPrePay": {
"Url": "http://192.168.1.167:9000/api/patapawaprepay",
"Url": "http://192.168.1.163:9000/api/patapawaprepay",
"Username": "operatora",
"Password": "1234567898",
"ApiLogonRequired": true
Expand Down
Loading