Skip to content

PR: Initial merge as requested by Royal Mail #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
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
53 changes: 53 additions & 0 deletions MailContainerTest.Tests/Builders/MailContainerBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using MailContainerTest.Types;

namespace MailContainerTest.Tests.Builders;

public sealed class MailContainerBuilder
{
private MailContainerNumber _mailContainerNumber;
private MailContainerCapacity _capacity;
private MailContainerStatus _status;
private AllowedMailType _allowedMailType;

public MailContainerBuilder WithMailContainerNumber(MailContainerNumber mailContainerNumber)
{
_mailContainerNumber = mailContainerNumber;

return this;
}

public MailContainerBuilder WithCapacity(MailContainerCapacity capacity)
{
_capacity = capacity;

return this;
}

public MailContainerBuilder WithStatus(MailContainerStatus status)
{
_status = status;

return this;
}

public MailContainerBuilder WithAllowedMailType(AllowedMailType allowedMailType)
{
_allowedMailType = allowedMailType;

return this;
}

public MailContainer Build()
{
var mailContainer = new MailContainer
{
MailContainerNumber = _mailContainerNumber,
Status = _status,
AllowedMailType = _allowedMailType
};

mailContainer.IncreaseCapacity(_capacity);

return mailContainer;
}
}
48 changes: 48 additions & 0 deletions MailContainerTest.Tests/Builders/MakeMailTransferRequestBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using MailContainerTest.Types;

namespace MailContainerTest.Tests.Builders;

public sealed class MakeMailTransferRequestBuilder
{
private MakeMailTransferRequest _makeMailTransferRequest = new();

public MakeMailTransferRequestBuilder WithSourceMailContainerNumber(MailContainerNumber sourceMailContainerNumber)
{
_makeMailTransferRequest = _makeMailTransferRequest with { SourceMailContainerNumber = sourceMailContainerNumber };

return this;
}

public MakeMailTransferRequestBuilder WithDestinationMailContainerNumber(MailContainerNumber destinationMailContainerNumber)
{
_makeMailTransferRequest = _makeMailTransferRequest with { DestinationMailContainerNumber = destinationMailContainerNumber };

return this;
}

public MakeMailTransferRequestBuilder WithNumberOfMailItems(int numberOfMailItems)
{
_makeMailTransferRequest = _makeMailTransferRequest with { NumberOfMailItems = numberOfMailItems };

return this;
}

public MakeMailTransferRequestBuilder WithTransferDate(DateTime transferDate)
{
_makeMailTransferRequest = _makeMailTransferRequest with { TransferDate = transferDate };

return this;
}

public MakeMailTransferRequestBuilder WithMailType(MailType mailType)
{
_makeMailTransferRequest = _makeMailTransferRequest with { MailType = mailType };

return this;
}

public MakeMailTransferRequest Build()
{
return _makeMailTransferRequest;
}
}
164 changes: 164 additions & 0 deletions MailContainerTest.Tests/LargeLetterStrategyTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
using FluentAssertions;
using MailContainerTest.Abstractions;
using MailContainerTest.Strategies;
using MailContainerTest.Tests.Builders;
using MailContainerTest.Types;
using NSubstitute;
using NSubstitute.ReceivedExtensions;
using Xunit;

namespace MailContainerTest.Tests;

public sealed class LargeLetterStrategyTests
{
private readonly IAllowedMailTypeBehaviour _allowedMailTypeBehaviour = Substitute.For<IAllowedMailTypeBehaviour>();
private readonly IOperationalStatusBehaviour _operationalStatusBehaviour = Substitute.For<IOperationalStatusBehaviour>();
private readonly ICapacityBehaviour _capacityBehaviour = Substitute.For<ICapacityBehaviour>();

private readonly LargeLetterStrategy _sut;

public LargeLetterStrategyTests()
{
_sut = new LargeLetterStrategy(_allowedMailTypeBehaviour, _operationalStatusBehaviour, _capacityBehaviour);
}

[Fact]
public void IsSuccess_ShouldReturnTrue_WhenAllowedMailTypeIsEqualAndOperationalAndWithinCapacity()
{
// Arrange
var sourceContainer = new MailContainerBuilder()
.WithAllowedMailType(AllowedMailType.LargeLetter)
.Build();

var destContainer = new MailContainerBuilder()
.WithAllowedMailType(AllowedMailType.SmallParcel)
.Build();

var request = new MakeMailTransferRequestBuilder()
.WithMailType(MailType.LargeLetter)
.Build();

_allowedMailTypeBehaviour.IsAllowedMailType(Arg.Any<MailContainer>(), Arg.Any<MailContainer>()).Returns(true);
_operationalStatusBehaviour.IsOperationalStatus(Arg.Any<MailContainer>(), Arg.Any<MailContainer>()).Returns(true);
_capacityBehaviour.IsWithinCapacity(Arg.Any<MailContainer>(), Arg.Any<MakeMailTransferRequest>()).Returns(true);

// Act
var result = _sut.IsSuccess(sourceContainer, destContainer, request);

// Assert
result.Should().BeTrue();
}

[Fact]
public void IsSuccess_ShouldReturnFalse_WhenAllowedMailTypeNotEqual()
{
// Arrange
var sourceContainer = new MailContainerBuilder()
.WithAllowedMailType(AllowedMailType.LargeLetter)
.Build();

var destContainer = new MailContainerBuilder()
.WithAllowedMailType(AllowedMailType.SmallParcel)
.Build();

var request = new MakeMailTransferRequestBuilder()
.WithMailType(MailType.LargeLetter)
.Build();

// Act
var result = _sut.IsSuccess(sourceContainer, destContainer, request);

// Assert
result.Should().BeFalse();
}

[Fact]
public void IsSuccess_ShouldReturnFalse_WhenOneOfMailContainerStatusIsNotOperational()
{
// Arrange
var sourceContainer = new MailContainerBuilder()
.WithAllowedMailType(AllowedMailType.LargeLetter)
.WithStatus(MailContainerStatus.Operational)
.Build();

var destContainer = new MailContainerBuilder()
.WithAllowedMailType(AllowedMailType.LargeLetter)
.WithStatus(MailContainerStatus.OutOfService)
.Build();

var request = new MakeMailTransferRequestBuilder()
.WithMailType(MailType.LargeLetter)
.Build();

// Act
var result = _sut.IsSuccess(sourceContainer, destContainer, request);

// Assert
result.Should().BeFalse();
}

// [Theory]
// [MemberData(nameof(FailingTestData))]
// public void IsSuccess_ShouldReturnFalse_WhenAllowedMailTypeIsNotEqualAndNotOperationalAndNotWithinCapacity(
// MailContainer sourceContainer,
// MailContainer destContainer,
// MakeMailTransferRequest request)
// {
// // Arrange
//
//
// // Act
// var result = _sut.IsSuccess(sourceContainer, destContainer, request);
//
// // Assert
// result.Should().BeFalse();
// }
//
// public static IEnumerable<object[]> FailingTestData =>
// new List<object[]>
// {
// new object[]
// {
// new MailContainerBuilder()
// .WithAllowedMailType(AllowedMailType.LargeLetter)
// .Build(),
// new MailContainerBuilder()
// .WithAllowedMailType(AllowedMailType.SmallParcel)
// .Build(),
// new MakeMailTransferRequestBuilder()
// .WithMailType(MailType.LargeLetter)
// .Build()
// },
// new object[]
// {
// new MailContainerBuilder()
// .WithAllowedMailType(AllowedMailType.LargeLetter)
// .WithStatus(MailContainerStatus.Operational)
// .Build(),
// new MailContainerBuilder()
// .WithAllowedMailType(AllowedMailType.LargeLetter)
// .WithStatus(MailContainerStatus.OutOfService)
// .Build(),
// new MakeMailTransferRequestBuilder()
// .WithMailType(MailType.LargeLetter)
// .Build()
// },
// new object[]
// {
// new MailContainerBuilder()
// .WithAllowedMailType(AllowedMailType.LargeLetter)
// .WithStatus(MailContainerStatus.Operational)
// .WithCapacity(100)
// .Build(),
// new MailContainerBuilder()
// .WithAllowedMailType(AllowedMailType.LargeLetter)
// .WithStatus(MailContainerStatus.Operational)
// .WithCapacity(100)
// .Build(),
// new MakeMailTransferRequestBuilder()
// .WithMailType(MailType.LargeLetter)
// .WithNumberOfMailItems(200)
// .Build()
// }
// };
}
21 changes: 21 additions & 0 deletions MailContainerTest.Tests/MailContainerTest.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,25 @@
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />

<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="3.2.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>

<PackageReference Include="NSubstitute" Version="5.0.0" />
<PackageReference Include="FluentAssertions" Version="6.10.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\MailContainerTest\MailContainerTest.csproj" />
</ItemGroup>

</Project>
Loading