// ========================================================================== // AggregateHandlerTests.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group // All rights reserved. // ========================================================================== using System; using System.Threading.Tasks; using FakeItEasy; using Squidex.Infrastructure.Commands.TestHelpers; using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.States; using Squidex.Infrastructure.Tasks; using Xunit; namespace Squidex.Infrastructure.Commands { public class AggregateHandlerTests { private readonly IServiceProvider serviceProvider = A.Fake(); private readonly IStore store = A.Fake(); private readonly IStateFactory stateFactory = A.Fake(); private readonly IPersistence persistence = A.Fake>(); private readonly Envelope event1 = new Envelope(new MyEvent()); private readonly Envelope event2 = new Envelope(new MyEvent()); private readonly DomainObjectFactoryFunction factory; private readonly CommandContext context; private readonly AggregateHandler sut; private readonly DomainObjectWrapper domainObjectWrapper = new DomainObjectWrapper(); private readonly Guid domainObjectId = Guid.NewGuid(); private readonly MyDomainObject domainObject; public AggregateHandlerTests() { factory = new DomainObjectFactoryFunction(id => domainObject); domainObject = new MyDomainObject(domainObjectId, 1) .RaiseNewEvent(event1) .RaiseNewEvent(event2); context = new CommandContext(new MyCommand { AggregateId = domainObject.Id }); A.CallTo(() => store.WithEventSourcing(domainObjectId.ToString(), A, Task>>.Ignored)) .Returns(persistence); A.CallTo(() => serviceProvider.GetService(factory.GetType())) .Returns(factory); A.CallTo(() => stateFactory.GetDetachedAsync>(domainObject.Id.ToString())) .Returns(Task.FromResult(domainObjectWrapper)); sut = new AggregateHandler(stateFactory, serviceProvider); domainObjectWrapper.ActivateAsync(domainObjectId.ToString(), store).Wait(); } [Fact] public Task Create_async_should_throw_exception_if_not_aggregate_command() { return Assert.ThrowsAnyAsync(() => sut.CreateAsync(new CommandContext(A.Dummy()), x => TaskHelper.False)); } [Fact] public async Task Create_async_should_create_domain_object_and_save() { MyDomainObject passedDomainObject = null; await sut.CreateAsync(context, async x => { await Task.Yield(); passedDomainObject = x; }); Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result>()); A.CallTo(() => persistence.ReadAsync(-1)) .MustHaveHappened(); A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) .MustHaveHappened(); } [Fact] public async Task Create_sync_should_create_domain_object_and_save() { MyDomainObject passedDomainObject = null; await sut.CreateAsync(context, x => { passedDomainObject = x; }); Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result>()); A.CallTo(() => persistence.ReadAsync(-1)) .MustHaveHappened(); A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) .MustHaveHappened(); } [Fact] public Task Update_async_should_throw_exception_if_not_aggregate_command() { return Assert.ThrowsAnyAsync(() => sut.UpdateAsync(new CommandContext(A.Dummy()), x => TaskHelper.False)); } [Fact] public async Task Update_async_should_create_domain_object_and_save() { MyDomainObject passedDomainObject = null; await sut.UpdateAsync(context, async x => { await Task.Yield(); passedDomainObject = x; }); Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result()); A.CallTo(() => persistence.ReadAsync(null)) .MustHaveHappened(); A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) .MustHaveHappened(); } [Fact] public async Task Update_sync_should_create_domain_object_and_save() { MyDomainObject passedDomainObject = null; await sut.UpdateAsync(context, x => { passedDomainObject = x; }); Assert.Equal(domainObject, passedDomainObject); Assert.NotNull(context.Result()); A.CallTo(() => persistence.ReadAsync(null)) .MustHaveHappened(); A.CallTo(() => persistence.WriteEventsAsync(A[]>.Ignored)) .MustHaveHappened(); } } }