Skip to content

Commit

Permalink
Added unit tests for Group Checkout
Browse files Browse the repository at this point in the history
  • Loading branch information
oskardudycz committed Dec 3, 2022
1 parent 1d1d79d commit 77abd9c
Show file tree
Hide file tree
Showing 7 changed files with 374 additions and 16 deletions.
14 changes: 13 additions & 1 deletion Core/Extensions/DictionaryExtensions.cs
Expand Up @@ -2,7 +2,6 @@ namespace Core.Extensions;

public static class DictionaryExtensions
{

public static Dictionary<TKey, TValue> Merge<TKey, TValue>(
Dictionary<TKey, TValue> first,
Dictionary<TKey, TValue> second
Expand All @@ -14,4 +13,17 @@ public static class DictionaryExtensions
IEnumerable<KeyValuePair<TKey, TValue>> second
) where TKey : notnull
=> new(first.Union(second));

public static Dictionary<TKey, TValue> With<TKey, TValue>(
this Dictionary<TKey, TValue> first,
TKey key,
TValue value
) where TKey : notnull
{
var newDictionary = first.ToDictionary(ks => ks.Key, vs => vs.Value);

newDictionary[key] = value;

return newDictionary;
}
}
@@ -0,0 +1,18 @@
using HotelManagement.GroupCheckouts;
using Ogooreck.BusinessLogic;
using Xunit;

namespace HotelManagement.Tests.GroupCheckouts;

public partial class GroupCheckoutTests
{
[Fact]
public void GivenNonExistingGroupCheckout_WhenInitiate_ThenSucceeds()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given()
.When(_ => GroupCheckout.Initiate(groupCheckoutId, clerkId, guestStaysIds, now))
.Then(new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now));
}
}
@@ -0,0 +1,131 @@
using HotelManagement.GroupCheckouts;
using Ogooreck.BusinessLogic;
using Xunit;

namespace HotelManagement.Tests.GroupCheckouts;

public partial class GroupCheckoutTests
{
[Fact]
public void GivenNonExistingGroupCheckout_WhenRecordGuestCheckoutCompletion_ThenIgnores()
{
var guestStaysId = Guid.NewGuid();

Spec.Given()
.When(state => state.RecordGuestCheckoutCompletion(guestStaysId, now).IsPresent)
.Then(false);
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordGuestCheckoutCompletion_ThenSucceeds()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now)
)
.When(state => state.RecordGuestCheckoutCompletion(guestStaysIds[0], now).GetOrThrow())
.Then(new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now));
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordGuestCheckoutCompletionTwice_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now)
)
.When(state => state.RecordGuestCheckoutCompletion(guestStaysIds[0], now).IsPresent)
.Then(false);
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordLastGuestCheckoutCompletion_ThenCompletes()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[1], now)
)
.When(state => state.RecordGuestCheckoutCompletion(guestStaysIds[2], now).GetOrThrow())
.Then(
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutCompleted(groupCheckoutId, guestStaysIds, now)
);
}


[Fact]
public void GivenInitiatedGroupCheckoutWithFailure_WhenRecordLastGuestCheckoutCompletion_ThenCompletesWithFailure()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[1], now)
)
.When(state => state.RecordGuestCheckoutCompletion(guestStaysIds[2], now).GetOrThrow())
.Then(
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
new[] { guestStaysIds[0], guestStaysIds[2] },
new[] { guestStaysIds[1] },
now
)
);
}

[Fact]
public void GivenCompletedGroupCheckoutWithFailure_WhenRecordGuestCheckoutCompletion_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[1], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
new[] { guestStaysIds[0], guestStaysIds[2] },
new[] { guestStaysIds[1] },
now
)
)
.When(state => state.RecordGuestCheckoutCompletion(guestStaysIds[2], now).IsPresent)
.Then(false);
}

[Fact]
public void GivenCompletedGroupCheckout_WhenRecordGuestCheckoutCompletion_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[1], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
new[] { guestStaysIds[0], guestStaysIds[2] },
new[] { guestStaysIds[1] },
now
)
)
.When(state => state.RecordGuestCheckoutCompletion(guestStaysIds[2], now).IsPresent)
.Then(false);
}
}
@@ -0,0 +1,136 @@
using HotelManagement.GroupCheckouts;
using Ogooreck.BusinessLogic;
using Xunit;

namespace HotelManagement.Tests.GroupCheckouts;

public partial class GroupCheckoutTests
{
[Fact]
public void GivenNonExistingGroupCheckout_WhenRecordGuestCheckoutFailure_ThenIgnores()
{
var guestStaysId = Guid.NewGuid();

Spec.Given()
.When(state => state.RecordGuestCheckoutFailure(guestStaysId, now).IsPresent)
.Then(false);
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordGuestCheckoutFailure_ThenSucceeds()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now)
)
.When(state => state.RecordGuestCheckoutFailure(guestStaysIds[0], now).GetOrThrow())
.Then(new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[0], now));
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordGuestCheckoutFailureTwice_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[0], now)
)
.When(state => state.RecordGuestCheckoutFailure(guestStaysIds[0], now).IsPresent)
.Then(false);
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordLastGuestCheckoutFailure_ThenCompletesWithFailure()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[1], now)
)
.When(state => state.RecordGuestCheckoutFailure(guestStaysIds[2], now).GetOrThrow())
.Then(
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
Array.Empty<Guid>(),
guestStaysIds,
now
)
);
}


[Fact]
public void GivenInitiatedGroupCheckoutWithFailure_WhenRecordLastGuestCheckoutFailure_ThenCompletesWithFailure()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[1], now)
)
.When(state => state.RecordGuestCheckoutFailure(guestStaysIds[2], now).GetOrThrow())
.Then(
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
new[] { guestStaysIds[0] },
new[] { guestStaysIds[1], guestStaysIds[2] },
now
)
);
}

[Fact]
public void GivenCompletedGroupCheckoutWithFailure_WhenRecordGuestCheckoutFailure_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[1], now),
new GuestCheckoutFailed(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
new[] { guestStaysIds[0], guestStaysIds[1] },
new[] { guestStaysIds[2] },
now
)
)
.When(state => state.RecordGuestCheckoutFailure(guestStaysIds[2], now).IsPresent)
.Then(false);
}

[Fact]
public void GivenCompletedGroupCheckout_WhenRecordGuestCheckoutFailure_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(
new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now),
new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[0], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[1], now),
new GuestCheckoutCompleted(groupCheckoutId, guestStaysIds[2], now),
new GroupCheckoutFailed(
groupCheckoutId,
new[] { guestStaysIds[0], guestStaysIds[2] },
new[] { guestStaysIds[1] },
now
)
)
.When(state => state.RecordGuestCheckoutFailure(guestStaysIds[2], now).IsPresent)
.Then(false);
}
}
@@ -0,0 +1,28 @@
using HotelManagement.GroupCheckouts;
using Ogooreck.BusinessLogic;
using Xunit;

namespace HotelManagement.Tests.GroupCheckouts;

public partial class GroupCheckoutTests
{
[Fact]
public void GivenNonExistingGroupCheckout_WhenRecordGuestCheckoutsInitiation_ThenIgnores()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given()
.When(state => state.RecordGuestCheckoutsInitiation(guestStaysIds, now).IsPresent)
.Then(false);
}

[Fact]
public void GivenInitiatedGroupCheckout_WhenRecordGuestCheckoutsInitiation_ThenSucceeds()
{
var guestStaysIds = new[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };

Spec.Given(new GroupCheckoutInitiated(groupCheckoutId, clerkId, guestStaysIds, now))
.When(state => state.RecordGuestCheckoutsInitiation(guestStaysIds, now).GetOrThrow())
.Then(new GuestCheckoutsInitiated(groupCheckoutId, guestStaysIds, now));
}
}
@@ -0,0 +1,28 @@
using Bogus;
using HotelManagement.GroupCheckouts;
using Ogooreck.BusinessLogic;

namespace HotelManagement.Tests.GroupCheckouts;

public partial class GroupCheckoutTests
{
private readonly HandlerSpecification<GroupCheckout> Spec = Specification.For<GroupCheckout>(Evolve);
private readonly DateTimeOffset now = DateTimeOffset.UtcNow;
private readonly Guid groupCheckoutId = Guid.NewGuid();
private readonly Guid clerkId = Guid.NewGuid();
private readonly Faker faker = new();

private static GroupCheckout Evolve(GroupCheckout groupCheckout, object @event)
{
return @event switch
{
GroupCheckoutInitiated groupCheckoutInitiated => GroupCheckout.Create(groupCheckoutInitiated),
GuestCheckoutsInitiated guestCheckoutsInitiated => groupCheckout.Apply(guestCheckoutsInitiated),
GuestCheckoutCompleted guestCheckoutCompleted => groupCheckout.Apply(guestCheckoutCompleted),
GuestCheckoutFailed guestCheckoutFailed => groupCheckout.Apply(guestCheckoutFailed),
GroupCheckoutCompleted groupCheckoutCompleted => groupCheckout.Apply(groupCheckoutCompleted),
GroupCheckoutFailed groupCheckoutFailed => groupCheckout.Apply(groupCheckoutFailed),
_ => groupCheckout
};
}
}

0 comments on commit 77abd9c

Please sign in to comment.