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
68 changes: 58 additions & 10 deletions TransactionProcessor.Aggregates.Tests/OperatorAggregateTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Shouldly;
using SimpleResults;
using TransactionProcessor.Testing;

namespace TransactionProcessor.Aggregates.Tests
Expand All @@ -23,7 +24,8 @@ public void OperatorAggregate_CanBeCreated_IsCreated()
public void OperatorAggregate_Create_IsCreated()
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
aggregate.Create(TestData.EstateId, TestData.OperatorName, TestData.RequireCustomMerchantNumber, TestData.RequireCustomTerminalNumber);
var result = aggregate.Create(TestData.EstateId, TestData.OperatorName, TestData.RequireCustomMerchantNumber, TestData.RequireCustomTerminalNumber);
result.IsSuccess.ShouldBeTrue();

aggregate.AggregateId.ShouldBe(TestData.OperatorId);
aggregate.Name.ShouldBe(TestData.OperatorName);
Expand All @@ -33,33 +35,79 @@ public void OperatorAggregate_Create_IsCreated()
aggregate.RequireCustomMerchantNumber.ShouldBe(TestData.RequireCustomMerchantNumber);
}

[Fact]
public void OperatorAggregate_Create_EstateIdEmpty_ErrorReturned()
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
var result = aggregate.Create(Guid.Empty, TestData.OperatorName, TestData.RequireCustomMerchantNumber, TestData.RequireCustomTerminalNumber);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
result.Message.ShouldBe("Estate Id must not be an empty Guid");
}

[Theory]
[InlineData(null)]
[InlineData("")]
public void OperatorAggregate_Create_NameInvalid_ErrorReturned(String operatorName)
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
var result = aggregate.Create(TestData.EstateId, operatorName, TestData.RequireCustomMerchantNumber, TestData.RequireCustomTerminalNumber);
result.IsFailed.ShouldBeTrue();
result.Status.ShouldBe(ResultStatus.Invalid);
result.Message.ShouldBe("Operator name must not be null or empty");
}

[Fact]
public void OperatorAggregate_GetOperator_OperatorIsReturned()
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
aggregate.Create(TestData.EstateId, TestData.OperatorName, TestData.RequireCustomMerchantNumber, TestData.RequireCustomTerminalNumber);

TransactionProcessor.Models.Operator.Operator @operator = aggregate.GetOperator();
@operator.OperatorId.ShouldBe(TestData.OperatorId);
@operator.Name.ShouldBe(TestData.OperatorName);
@operator.RequireCustomTerminalNumber.ShouldBe(TestData.RequireCustomTerminalNumber);
@operator.RequireCustomMerchantNumber.ShouldBe(TestData.RequireCustomMerchantNumber);
}

[Theory]
[InlineData("Alice", "Bob", "Bob")]
[InlineData("alice", "Alice", "alice")]
[InlineData("Alice", null, "Alice")]
[InlineData("Alice", "", "Alice")]
public void OperatorAggregate_UpdateOperator_OperatorName_IsUpdated(String existingName, String newName, String expectedName)
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
aggregate.Create(TestData.EstateId, existingName, TestData.RequireCustomMerchantNumberTrue, TestData.RequireCustomTerminalNumberTrue);

Result result = aggregate.UpdateOperator(newName, TestData.RequireCustomMerchantNumberTrue, TestData.RequireCustomTerminalNumberTrue);
result.IsSuccess.ShouldBeTrue();

aggregate.Name.ShouldBe(expectedName);
}

[Fact]
public void OperatorAggregate_UpdateOperator_IsUpdated()
public void OperatorAggregate_UpdateOperator_RequireCustomMerchantNumber_IsUpdated()
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
aggregate.Create(TestData.EstateId, TestData.OperatorName, TestData.RequireCustomMerchantNumberFalse, TestData.RequireCustomTerminalNumberFalse);
aggregate.Create(TestData.EstateId, TestData.OperatorName, TestData.RequireCustomMerchantNumberTrue, TestData.RequireCustomTerminalNumberTrue);

aggregate.Name.ShouldBe(TestData.OperatorName);
aggregate.RequireCustomTerminalNumber.ShouldBe(TestData.RequireCustomMerchantNumberFalse);
aggregate.RequireCustomMerchantNumber.ShouldBe(TestData.RequireCustomTerminalNumberFalse);
Result result = aggregate.UpdateOperator(TestData.OperatorName, TestData.RequireCustomMerchantNumberFalse, TestData.RequireCustomTerminalNumberTrue);
result.IsSuccess.ShouldBeTrue();

aggregate.RequireCustomMerchantNumber.ShouldBe(TestData.RequireCustomMerchantNumberFalse);
}

[Fact]
public void OperatorAggregate_UpdateOperator_RequireCustomTerminalNumber_IsUpdated()
{
OperatorAggregate aggregate = OperatorAggregate.Create(TestData.OperatorId);
aggregate.Create(TestData.EstateId, TestData.OperatorName, TestData.RequireCustomMerchantNumberTrue, TestData.RequireCustomTerminalNumberTrue);

aggregate.UpdateOperator(TestData.OperatorName2, TestData.RequireCustomMerchantNumberTrue, TestData.RequireCustomTerminalNumberTrue);
Result result = aggregate.UpdateOperator(TestData.OperatorName, TestData.RequireCustomMerchantNumberTrue, TestData.RequireCustomTerminalNumberFalse);
result.IsSuccess.ShouldBeTrue();

aggregate.Name.ShouldBe(TestData.OperatorName2);
aggregate.RequireCustomTerminalNumber.ShouldBe(TestData.RequireCustomMerchantNumberTrue);
aggregate.RequireCustomMerchantNumber.ShouldBe(TestData.RequireCustomTerminalNumberTrue);
aggregate.RequireCustomTerminalNumber.ShouldBe(TestData.RequireCustomTerminalNumberFalse);
}
}
}
19 changes: 15 additions & 4 deletions TransactionProcessor.Aggregates/OperatorAggregate.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Diagnostics.Tracing;
using Shared.DomainDrivenDesign.EventSourcing;
using Shared.EventStore.Aggregate;
using Shared.General;
using SimpleResults;
using TransactionProcessor.DomainEvents;

namespace TransactionProcessor.Aggregates
Expand Down Expand Up @@ -37,21 +40,27 @@
aggregate.RequireCustomTerminalNumber = domainEvent.RequireCustomTerminalNumber;
}

public static void Create(this OperatorAggregate aggregate,
[Pure]
public static Result Create(this OperatorAggregate aggregate,
Guid estateId,
String name,
Boolean requireCustomMerchantNumber,
Boolean requireCustomTerminalNumber)
{
Guard.ThrowIfInvalidGuid(estateId, typeof(ArgumentNullException), "Estate Id must not be an empty Guid");
Guard.ThrowIfNullOrEmpty(name, typeof(ArgumentNullException), "Operator name must not be null or empty");
if (estateId == Guid.Empty)

Check notice on line 50 in TransactionProcessor.Aggregates/OperatorAggregate.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

TransactionProcessor.Aggregates/OperatorAggregate.cs#L50

Add curly braces around the nested statement(s) in this 'if' block.
return Result.Invalid("Estate Id must not be an empty Guid");
if (String.IsNullOrEmpty(name))

Check notice on line 52 in TransactionProcessor.Aggregates/OperatorAggregate.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

TransactionProcessor.Aggregates/OperatorAggregate.cs#L52

Add curly braces around the nested statement(s) in this 'if' block.
return Result.Invalid("Operator name must not be null or empty");

OperatorDomainEvents.OperatorCreatedEvent operatorCreatedEvent = new(aggregate.AggregateId, estateId, name, requireCustomMerchantNumber, requireCustomTerminalNumber);

aggregate.ApplyAndAppend(operatorCreatedEvent);

return Result.Success();
}

public static void UpdateOperator(this OperatorAggregate aggregate,
[Pure]
public static Result UpdateOperator(this OperatorAggregate aggregate,
String name,
Boolean requireCustomMerchantNumber,
Boolean requireCustomTerminalNumber)
Expand All @@ -74,6 +83,8 @@
OperatorDomainEvents.OperatorRequireCustomTerminalNumberChangedEvent operatorRequireCustomTerminalNumberChangedEvent = new(aggregate.AggregateId, aggregate.EstateId, requireCustomTerminalNumber);
aggregate.ApplyAndAppend(operatorRequireCustomTerminalNumberChangedEvent);
}

return Result.Success();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,9 @@
return Result.Forbidden($"Operator with Id {command.RequestDto.OperatorId} already created");
}

operatorAggregate.Create(command.EstateId, command.RequestDto.Name, command.RequestDto.RequireCustomMerchantNumber.GetValueOrDefault(), command.RequestDto.RequireCustomTerminalNumber.GetValueOrDefault());
Result stateResult = operatorAggregate.Create(command.EstateId, command.RequestDto.Name, command.RequestDto.RequireCustomMerchantNumber.GetValueOrDefault(), command.RequestDto.RequireCustomTerminalNumber.GetValueOrDefault());
if (stateResult.IsFailed)
return ResultHelpers.CreateFailure(stateResult);

Result saveResult = await this.AggregateService.Save(operatorAggregate, cancellationToken);
if (saveResult.IsFailed)
Expand Down Expand Up @@ -83,9 +85,11 @@
return Result.Forbidden($"Estate with Id {command.EstateId} not created");
}

operatorAggregate.UpdateOperator(command.RequestDto.Name,
Result stateResult = operatorAggregate.UpdateOperator(command.RequestDto.Name,
command.RequestDto.RequireCustomMerchantNumber.GetValueOrDefault(),
command.RequestDto.RequireCustomTerminalNumber.GetValueOrDefault());
if (stateResult.IsFailed)

Check notice on line 91 in TransactionProcessor.BusinessLogic/Services/OperatorDomainService.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

TransactionProcessor.BusinessLogic/Services/OperatorDomainService.cs#L91

Add curly braces around the nested statement(s) in this 'if' block.
return ResultHelpers.CreateFailure(stateResult);

Result saveResult = await this.AggregateService.Save(operatorAggregate, cancellationToken);
if (saveResult.IsFailed)
Expand Down
Loading