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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EstateManagement.BusinessLogic.Tests.EventHandling
{
using System.Threading;
using BusinessLogic.EventHandling;
using BusinessLogic.Services;
using MediatR;
using Moq;
using Requests;
using Shouldly;
using Testing;
using TransactionProcessor.Transaction.DomainEvents;
using Xunit;

public class TransactionDomainEventHandlerTests
{
[Fact]
public async Task TransactionDomainEventHandler_Handle_TransactionHasBeenCompletedEvent_EventIsHandled()
{
Mock<IMediator> mediator = new Mock<IMediator>(MockBehavior.Strict);
mediator.Setup(m => m.Send(It.IsAny<IRequest<Unit>>(), It.IsAny<CancellationToken>())).ReturnsAsync(new Unit());
TransactionDomainEventHandler handler = new TransactionDomainEventHandler(mediator.Object);

Should.NotThrow(async () =>
{
await handler.Handle(TestData.TransactionHasBeenCompletedEvent, CancellationToken.None);
});
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EstateManagement.BusinessLogic.Tests.RequestHandler
{
using System.Threading;
using BusinessLogic.Services;
using Moq;
using RequestHandlers;
using Requests;
using Shouldly;
using Testing;
using Xunit;

public class MerchantStatementRequestHandlerTests
{
[Fact]
public void MerchantStatementRequestHandler_CreateMerchantRequest_IsHandled()
{
Mock<IMerchantStatementDomainService> merchantDomainService = new Mock<IMerchantStatementDomainService>(MockBehavior.Strict);
merchantDomainService.Setup(m => m.AddTransactionToStatement(It.IsAny<Guid>(),
It.IsAny<Guid>(),
It.IsAny<DateTime>(),
It.IsAny<Decimal?>(),
It.IsAny<Boolean>(),
It.IsAny<Guid>(),
It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
MerchantStatementRequestHandler handler = new MerchantStatementRequestHandler(merchantDomainService.Object);

AddTransactionToMerchantStatementRequest request = TestData.AddTransactionToMerchantStatementRequest;

Should.NotThrow(async () =>
{
await handler.Handle(request, CancellationToken.None);
});

}
}
}
17 changes: 17 additions & 0 deletions EstateManagement.BusinessLogic.Tests/Requests/RequestsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -256,5 +256,22 @@ public void SetMerchantSettlementScheduleRequest_CanBeCreated_IsCreated()
setMerchantSettlementScheduleRequest.MerchantId.ShouldBe(TestData.MerchantId);
setMerchantSettlementScheduleRequest.SettlementSchedule.ShouldBe(TestData.SettlementSchedule);
}

[Fact]
public void AddTransactionToMerchantStatementRequest_CanBeCreated_IsCreated()
{
AddTransactionToMerchantStatementRequest addTransactionToMerchantStatementRequest =
AddTransactionToMerchantStatementRequest.Create(TestData.EstateId, TestData.MerchantId, TestData.TransactionDateTime1,
TestData.TransactionAmount1, TestData.IsAuthorisedTrue, TestData.TransactionId1);

addTransactionToMerchantStatementRequest.ShouldNotBeNull();
addTransactionToMerchantStatementRequest.IsAuthorised.ShouldBe(TestData.IsAuthorisedTrue);
addTransactionToMerchantStatementRequest.TransactionAmount.ShouldBe(TestData.TransactionAmount1);
addTransactionToMerchantStatementRequest.TransactionDateTime.ShouldBe(TestData.TransactionDateTime1);
addTransactionToMerchantStatementRequest.TransactionId.ShouldBe(TestData.TransactionId1);
addTransactionToMerchantStatementRequest.EstateId.ShouldBe(TestData.EstateId);
addTransactionToMerchantStatementRequest.MerchantId.ShouldBe(TestData.MerchantId);

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EstateManagement.BusinessLogic.Tests.Services
{
using System.Threading;
using BusinessLogic.Services;
using MerchantAggregate;
using MerchantStatementAggregate;
using Moq;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
using Shouldly;
using Testing;
using Xunit;

public class MerchantStatementDomainServiceTests
{
[Fact]
public async Task MerchantStatementDomainService_AddTransactionToStatement_TransactionAdded()
{
Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>>();
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedMerchantAggregate);

MerchantStatementAggregate merchantStatementAggregate = TestData.CreatedMerchantStatementAggregate();

Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>> merchantStatementAggregateRepository = new Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>>();
merchantStatementAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(merchantStatementAggregate);
MerchantStatementDomainService merchantStatementDomainService =
new MerchantStatementDomainService(merchantAggregateRepository.Object, merchantStatementAggregateRepository.Object);

Should.NotThrow(async () =>
{
await merchantStatementDomainService.AddTransactionToStatement(TestData.EstateId,
TestData.MerchantId,
TestData.TransactionDateTime1,
TestData.TransactionAmount1,
TestData.IsAuthorisedTrue,
TestData.TransactionId1,
CancellationToken.None);
});

var merchantStatement = merchantStatementAggregate.GetStatement(true);
var statementLines = merchantStatement.GetStatementLines();
statementLines.ShouldNotBeEmpty();
statementLines.Count.ShouldBe(1);
}

[Fact]
public async Task MerchantStatementDomainService_AddTransactionToStatement_TransactionNotAuthorised_TransactionNotAddedToStatement()
{
Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>>();
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedMerchantAggregate);

MerchantStatementAggregate merchantStatementAggregate = TestData.CreatedMerchantStatementAggregate();

Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>> merchantStatementAggregateRepository = new Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>>();
merchantStatementAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(merchantStatementAggregate);
MerchantStatementDomainService merchantStatementDomainService =
new MerchantStatementDomainService(merchantAggregateRepository.Object, merchantStatementAggregateRepository.Object);

Should.NotThrow(async () =>
{
await merchantStatementDomainService.AddTransactionToStatement(TestData.EstateId,
TestData.MerchantId,
TestData.TransactionDateTime1,
TestData.TransactionAmount1,
TestData.IsAuthorisedFalse,
TestData.TransactionId1,
CancellationToken.None);
});

var merchantStatement = merchantStatementAggregate.GetStatement(true);
var statementLines = merchantStatement.GetStatementLines();
statementLines.ShouldBeEmpty();
}

[Fact]
public async Task MerchantStatementDomainService_AddTransactionToStatement_LogonTransaction_TransactionNotAddedToStatement()
{
Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>>();
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedMerchantAggregate);

MerchantStatementAggregate merchantStatementAggregate = TestData.CreatedMerchantStatementAggregate();

Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>> merchantStatementAggregateRepository = new Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>>();
merchantStatementAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(merchantStatementAggregate);
MerchantStatementDomainService merchantStatementDomainService =
new MerchantStatementDomainService(merchantAggregateRepository.Object, merchantStatementAggregateRepository.Object);

Should.NotThrow(async () =>
{
await merchantStatementDomainService.AddTransactionToStatement(TestData.EstateId,
TestData.MerchantId,
TestData.TransactionDateTime1,
null,
TestData.IsAuthorisedTrue,
TestData.TransactionId1,
CancellationToken.None);
});

var merchantStatement = merchantStatementAggregate.GetStatement(true);
var statementLines = merchantStatement.GetStatementLines();
statementLines.ShouldBeEmpty();
}

[Fact]
public async Task MerchantStatementDomainService_AddTransactionToStatement_MerchantNotCreated_TransactionNotAddedToStatement()
{
Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>> merchantAggregateRepository =
new Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>>();
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(new MerchantAggregate());

MerchantStatementAggregate merchantStatementAggregate = TestData.CreatedMerchantStatementAggregate();

Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>> merchantStatementAggregateRepository =
new Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>>();
merchantStatementAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(merchantStatementAggregate);
MerchantStatementDomainService merchantStatementDomainService =
new MerchantStatementDomainService(merchantAggregateRepository.Object, merchantStatementAggregateRepository.Object);

Should.NotThrow(async () =>
{
await merchantStatementDomainService.AddTransactionToStatement(TestData.EstateId,
TestData.MerchantId,
TestData.TransactionDateTime1,
TestData.TransactionAmount1,
TestData.IsAuthorisedTrue,
TestData.TransactionId1,
CancellationToken.None);
});

var merchantStatement = merchantStatementAggregate.GetStatement(true);
var statementLines = merchantStatement.GetStatementLines();
statementLines.ShouldBeEmpty();
}

[Fact]
public async Task MerchantStatementDomainService_AddTransactionToStatement_StatementNotAlreadyCreated_TransactionAdded()
{
Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>> merchantAggregateRepository = new Mock<IAggregateRepository<MerchantAggregate, DomainEventRecord.DomainEvent>>();
merchantAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>())).ReturnsAsync(TestData.CreatedMerchantAggregate);

MerchantStatementAggregate merchantStatementAggregate = new MerchantStatementAggregate();

Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>> merchantStatementAggregateRepository = new Mock<IAggregateRepository<MerchantStatementAggregate, DomainEventRecord.DomainEvent>>();
merchantStatementAggregateRepository.Setup(m => m.GetLatestVersion(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
.ReturnsAsync(merchantStatementAggregate);
MerchantStatementDomainService merchantStatementDomainService =
new MerchantStatementDomainService(merchantAggregateRepository.Object, merchantStatementAggregateRepository.Object);

Should.NotThrow(async () =>
{
await merchantStatementDomainService.AddTransactionToStatement(TestData.EstateId,
TestData.MerchantId,
TestData.TransactionDateTime1,
TestData.TransactionAmount1,
TestData.IsAuthorisedTrue,
TestData.TransactionId1,
CancellationToken.None);
});

var merchantStatement = merchantStatementAggregate.GetStatement(true);
var statementLines = merchantStatement.GetStatementLines();
statementLines.ShouldNotBeEmpty();
statementLines.Count.ShouldBe(1);
}
}
}
44 changes: 44 additions & 0 deletions EstateManagement.BusinessLogic/Common/Extensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
namespace EstateManagement.BusinessLogic.Common
{
using System;
using System.Diagnostics.CodeAnalysis;

/// <summary>
///
/// </summary>
[ExcludeFromCodeCoverage]
public static class Extensions
{
#region Methods

/// <summary>
/// Converts to datetime.
/// </summary>
/// <param name="guid">The unique identifier.</param>
/// <returns></returns>
public static DateTime ToDateTime(this Guid guid)
{
var bytes = guid.ToByteArray();

Array.Resize(ref bytes, 8);

return new DateTime(BitConverter.ToInt64(bytes));
}

/// <summary>
/// Converts to guid.
/// </summary>
/// <param name="dt">The dt.</param>
/// <returns></returns>
public static Guid ToGuid(this DateTime dt)
{
var bytes = BitConverter.GetBytes(dt.Ticks);

Array.Resize(ref bytes, 16);

return new Guid(bytes);
}

#endregion
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,15 @@
<PackageReference Include="SecurityService.Client" Version="1.0.8" />
<PackageReference Include="Shared.DomainDrivenDesign" Version="1.1.0" />
<PackageReference Include="MediatR" Version="9.0.0" />
<PackageReference Include="TransactionProcessor.Transaction.DomainEvents" Version="1.0.17-build79" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\EstateManagement.ContractAggregate\EstateManagement.ContractAggregate.csproj" />
<ProjectReference Include="..\EstateManagement.DataTransferObjects\EstateManagement.DataTransferObjects.csproj" />
<ProjectReference Include="..\EstateManagement.EstateAggregate\EstateManagement.EstateAggregate.csproj" />
<ProjectReference Include="..\EstateManagement.MerchantAggregate\EstateManagement.MerchantAggregate.csproj" />
<ProjectReference Include="..\EstateManagement.MerchantStatementAggregate\EstateManagement.MerchantStatementAggregate.csproj" />
<ProjectReference Include="..\EstateManagement.Models\EstateManagement.Models.csproj" />
<ProjectReference Include="..\EstateManagement.Repository\EstateManagement.Repository.csproj" />
</ItemGroup>
Expand Down
Loading