From de99ac3579464499a27d190c3df3bd36dbe7227f Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 13 Feb 2018 10:36:14 +0100 Subject: [PATCH] Asset grain tests --- .../Assets/AssetGrain.cs | 11 +- .../Schemas/SchemaGrain.cs | 13 +- .../Assets/AssetCommandMiddlewareTests.cs | 278 ++++---- .../Assets/AssetDomainObjectTests.cs | 220 ------ .../Assets/AssetGrainTests.cs | 182 +++++ .../Rules/RuleGrainTests.cs | 72 +- .../Schemas/SchemaCommandMiddlewareTests.cs | 280 -------- .../Schemas/SchemaDomainObjectTests.cs | 665 ------------------ .../Schemas/SchemaGrainTests.cs | 439 ++++++++++++ .../TestHelpers/AssertHelper.cs | 6 + 10 files changed, 814 insertions(+), 1352 deletions(-) delete mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetDomainObjectTests.cs create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetGrainTests.cs delete mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaCommandMiddlewareTests.cs delete mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaDomainObjectTests.cs create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaGrainTests.cs diff --git a/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs b/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs index 1aa3bfdc3..e790b3842 100644 --- a/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Assets/AssetGrain.cs @@ -7,6 +7,8 @@ using System; using System.Threading.Tasks; +using Orleans.Core; +using Orleans.Runtime; using Squidex.Domain.Apps.Entities.Assets.Commands; using Squidex.Domain.Apps.Entities.Assets.Guards; using Squidex.Domain.Apps.Entities.Assets.State; @@ -20,10 +22,15 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Assets { - public sealed class AssetGrain : DomainObjectGrain, IAssetGrain + public class AssetGrain : DomainObjectGrain, IAssetGrain { public AssetGrain(IStore store) - : base(store) + : this(store, null, null) + { + } + + protected AssetGrain(IStore store, IGrainIdentity identity, IGrainRuntime runtime) + : base(store, identity, runtime) { } diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs index 219c42c42..c09dc825a 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/SchemaGrain.cs @@ -9,6 +9,8 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Orleans.Core; +using Orleans.Runtime; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Entities.Schemas.Commands; using Squidex.Domain.Apps.Entities.Schemas.Guards; @@ -24,13 +26,18 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Schemas { - public sealed class SchemaGrain : DomainObjectGrain, ISchemaGrain + public class SchemaGrain : DomainObjectGrain, ISchemaGrain { private readonly IAppProvider appProvider; private readonly FieldRegistry registry; public SchemaGrain(IStore store, IAppProvider appProvider, FieldRegistry registry) - : base(store) + : this(store, appProvider, registry, null, null) + { + } + + protected SchemaGrain(IStore store, IAppProvider appProvider, FieldRegistry registry, IGrainIdentity identity, IGrainRuntime runtime) + : base(store, identity, runtime) { Guard.NotNull(appProvider, nameof(appProvider)); Guard.NotNull(registry, nameof(registry)); @@ -61,7 +68,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas Add(c); - return EntityCreatedResult.Create(Snapshot.SchemaDef.FieldsById.Values.First(x => x.Name == addField.Name).Id, Version); + return EntityCreatedResult.Create(Snapshot.SchemaDef.FieldsById.Values.First(x => x.Name == addField.Name).Id, NewVersion); }); case DeleteField deleteField: diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs index 44a1a36ca..d785419e6 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetCommandMiddlewareTests.cs @@ -1,145 +1,133 @@ -//// ========================================================================== -//// Squidex Headless CMS -//// ========================================================================== -//// Copyright (c) Squidex UG (haftungsbeschränkt) -//// All rights reserved. Licensed under the MIT license. -//// ========================================================================== - -//using System; -//using System.IO; -//using System.Threading.Tasks; -//using FakeItEasy; -//using Squidex.Domain.Apps.Entities.Assets.Commands; -//using Squidex.Domain.Apps.Entities.TestHelpers; -//using Squidex.Infrastructure.Assets; -//using Squidex.Infrastructure.Commands; -//using Squidex.Infrastructure.Tasks; -//using Xunit; - -//namespace Squidex.Domain.Apps.Entities.Assets -//{ -// public class AssetCommandMiddlewareTests : HandlerTestBase -// { -// private readonly IAssetThumbnailGenerator assetThumbnailGenerator = A.Fake(); -// private readonly IAssetStore assetStore = A.Fake(); -// private readonly Guid assetId = Guid.NewGuid(); -// private readonly Stream stream = new MemoryStream(); -// private readonly ImageInfo image = new ImageInfo(2048, 2048); -// private readonly AssetDomainObject asset = new AssetDomainObject(); -// private readonly AssetFile file; -// private readonly AssetCommandMiddleware sut; - -// protected override Guid Id -// { -// get { return assetId; } -// } - -// public AssetCommandMiddlewareTests() -// { -// file = new AssetFile("my-image.png", "image/png", 1024, () => stream); - -// sut = new AssetCommandMiddleware(Handler, assetStore, assetThumbnailGenerator); -// } - -// [Fact] -// public async Task Create_should_create_domain_object() -// { -// var context = CreateContextForCommand(new CreateAsset { AssetId = assetId, File = file }); - -// SetupStore(0, context.ContextId); -// SetupImageInfo(); - -// await TestCreate(asset, async _ => -// { -// await sut.HandleAsync(context); -// }); - -// Assert.Equal(assetId, context.Result>().IdOrValue); - -// AssertAssetHasBeenUploaded(0, context.ContextId); -// AssertAssetImageChecked(); -// } - -// [Fact] -// public async Task Update_should_update_domain_object() -// { -// var context = CreateContextForCommand(new UpdateAsset { AssetId = assetId, File = file }); - -// SetupStore(1, context.ContextId); -// SetupImageInfo(); - -// CreateAsset(); - -// await TestUpdate(asset, async _ => -// { -// await sut.HandleAsync(context); -// }); - -// AssertAssetHasBeenUploaded(1, context.ContextId); -// AssertAssetImageChecked(); -// } - -// [Fact] -// public async Task Rename_should_update_domain_object() -// { -// CreateAsset(); - -// var context = CreateContextForCommand(new RenameAsset { AssetId = assetId, FileName = "my-new-image.png" }); - -// await TestUpdate(asset, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task Delete_should_update_domain_object() -// { -// CreateAsset(); - -// var command = CreateContextForCommand(new DeleteAsset { AssetId = assetId }); - -// await TestUpdate(asset, async _ => -// { -// await sut.HandleAsync(command); -// }); -// } - -// private void CreateAsset() -// { -// asset.Create(CreateCommand(new CreateAsset { File = file })); -// } - -// private void SetupImageInfo() -// { -// A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream)) -// .Returns(image); -// } - -// private void SetupStore(long version, Guid commitId) -// { -// A.CallTo(() => assetStore.UploadTemporaryAsync(commitId.ToString(), stream)) -// .Returns(TaskHelper.Done); -// A.CallTo(() => assetStore.CopyTemporaryAsync(commitId.ToString(), assetId.ToString(), version, null)) -// .Returns(TaskHelper.Done); -// A.CallTo(() => assetStore.DeleteTemporaryAsync(commitId.ToString())) -// .Returns(TaskHelper.Done); -// } - -// private void AssertAssetImageChecked() -// { -// A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream)) -// .MustHaveHappened(); -// } - -// private void AssertAssetHasBeenUploaded(long version, Guid commitId) -// { -// A.CallTo(() => assetStore.UploadTemporaryAsync(commitId.ToString(), stream)) -// .MustHaveHappened(); -// A.CallTo(() => assetStore.CopyTemporaryAsync(commitId.ToString(), assetId.ToString(), version, null)) -// .MustHaveHappened(); -// A.CallTo(() => assetStore.DeleteTemporaryAsync(commitId.ToString())) -// .MustHaveHappened(); -// } -// } -//} +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.IO; +using System.Threading.Tasks; +using FakeItEasy; +using Orleans; +using Orleans.Core; +using Orleans.Runtime; +using Squidex.Domain.Apps.Entities.Assets.Commands; +using Squidex.Domain.Apps.Entities.Assets.State; +using Squidex.Domain.Apps.Entities.TestHelpers; +using Squidex.Infrastructure.Assets; +using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.States; +using Squidex.Infrastructure.Tasks; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Assets +{ + public class AssetCommandMiddlewareTests : HandlerTestBase + { + private readonly IAssetThumbnailGenerator assetThumbnailGenerator = A.Fake(); + private readonly IAssetStore assetStore = A.Fake(); + private readonly IGrainFactory grainFactory = A.Fake(); + private readonly Guid assetId = Guid.NewGuid(); + private readonly Stream stream = new MemoryStream(); + private readonly ImageInfo image = new ImageInfo(2048, 2048); + private readonly AssetGrain asset; + private readonly AssetFile file; + private readonly AssetCommandMiddleware sut; + + public class MyAssetGrain : AssetGrain + { + public MyAssetGrain(IStore store, IGrainIdentity identity, IGrainRuntime runtime) + : base(store, identity, runtime) + { + } + } + + protected override Guid Id + { + get { return assetId; } + } + + public AssetCommandMiddlewareTests() + { + file = new AssetFile("my-image.png", "image/png", 1024, () => stream); + + asset = new MyAssetGrain(Store, Identity, Runtime); + asset.OnActivateAsync(); + + A.CallTo(() => grainFactory.GetGrain(Id, null)) + .Returns(asset); + + sut = new AssetCommandMiddleware(grainFactory, assetStore, assetThumbnailGenerator); + } + + [Fact] + public async Task Create_should_create_domain_object() + { + var context = CreateContextForCommand(new CreateAsset { AssetId = assetId, File = file }); + + SetupStore(0, context.ContextId); + SetupImageInfo(); + + await sut.HandleAsync(context); + + Assert.Equal(assetId, context.Result>().IdOrValue); + + AssertAssetHasBeenUploaded(0, context.ContextId); + AssertAssetImageChecked(); + } + + [Fact] + public async Task Update_should_update_domain_object() + { + var context = CreateContextForCommand(new UpdateAsset { AssetId = assetId, File = file }); + + SetupStore(1, context.ContextId); + SetupImageInfo(); + + await ExecuteCreateAsync(); + + await sut.HandleAsync(context); + + AssertAssetHasBeenUploaded(1, context.ContextId); + AssertAssetImageChecked(); + } + + private Task ExecuteCreateAsync() + { + return asset.ExecuteAsync(J(CreateCommand(new CreateAsset { AssetId = Id, File = file }))); + } + + private void SetupStore(long version, Guid commitId) + { + A.CallTo(() => assetStore.UploadTemporaryAsync(commitId.ToString(), stream)) + .Returns(TaskHelper.Done); + A.CallTo(() => assetStore.CopyTemporaryAsync(commitId.ToString(), assetId.ToString(), version, null)) + .Returns(TaskHelper.Done); + A.CallTo(() => assetStore.DeleteTemporaryAsync(commitId.ToString())) + .Returns(TaskHelper.Done); + } + + private void AssertAssetHasBeenUploaded(long version, Guid commitId) + { + A.CallTo(() => assetStore.UploadTemporaryAsync(commitId.ToString(), stream)) + .MustHaveHappened(); + A.CallTo(() => assetStore.CopyTemporaryAsync(commitId.ToString(), assetId.ToString(), version, null)) + .MustHaveHappened(); + A.CallTo(() => assetStore.DeleteTemporaryAsync(commitId.ToString())) + .MustHaveHappened(); + } + + private void SetupImageInfo() + { + A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream)) + .Returns(image); + } + + private void AssertAssetImageChecked() + { + A.CallTo(() => assetThumbnailGenerator.GetImageInfoAsync(stream)) + .MustHaveHappened(); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetDomainObjectTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetDomainObjectTests.cs deleted file mode 100644 index d1c8aeae4..000000000 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetDomainObjectTests.cs +++ /dev/null @@ -1,220 +0,0 @@ -//// ========================================================================== -//// Squidex Headless CMS -//// ========================================================================== -//// Copyright (c) Squidex UG (haftungsbeschränkt) -//// All rights reserved. Licensed under the MIT license. -//// ========================================================================== - -//using System; -//using System.IO; -//using FakeItEasy; -//using Squidex.Domain.Apps.Entities.Assets.Commands; -//using Squidex.Domain.Apps.Entities.TestHelpers; -//using Squidex.Domain.Apps.Events.Assets; -//using Squidex.Infrastructure; -//using Squidex.Infrastructure.Assets; -//using Squidex.Infrastructure.States; -//using Xunit; - -//namespace Squidex.Domain.Apps.Entities.Assets -//{ -// public class AssetDomainObjectTests : HandlerTestBase -// { -// private readonly ImageInfo image = new ImageInfo(2048, 2048); -// private readonly Guid assetId = Guid.NewGuid(); -// private readonly AssetFile file = new AssetFile("my-image.png", "image/png", 1024, () => new MemoryStream()); -// private readonly AssetDomainObject sut = new AssetDomainObject(); - -// protected override Guid Id -// { -// get { return assetId; } -// } - -// public AssetDomainObjectTests() -// { -// sut.ActivateAsync(Id, A.Fake>()); -// } - -// [Fact] -// public void Create_should_throw_exception_if_created() -// { -// CreateAsset(); - -// Assert.Throws(() => -// { -// sut.Create(CreateAssetCommand(new CreateAsset { File = file })); -// }); -// } - -// [Fact] -// public void Create_should_create_events() -// { -// sut.Create(CreateAssetCommand(new CreateAsset { File = file, ImageInfo = image })); - -// Assert.Equal(0, sut.Snapshot.FileVersion); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateAssetEvent(new AssetCreated -// { -// IsImage = true, -// FileName = file.FileName, -// FileSize = file.FileSize, -// FileVersion = 0, -// MimeType = file.MimeType, -// PixelWidth = image.PixelWidth, -// PixelHeight = image.PixelHeight -// }) -// ); -// } - -// [Fact] -// public void Update_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Update(CreateAssetCommand(new UpdateAsset { File = file })); -// }); -// } - -// [Fact] -// public void Update_should_throw_exception_if_asset_is_deleted() -// { -// CreateAsset(); -// DeleteAsset(); - -// Assert.Throws(() => -// { -// sut.Update(CreateAssetCommand(new UpdateAsset())); -// }); -// } - -// [Fact] -// public void Update_should_create_events() -// { -// CreateAsset(); - -// sut.Update(CreateAssetCommand(new UpdateAsset { File = file, ImageInfo = image })); - -// Assert.Equal(1, sut.Snapshot.FileVersion); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateAssetEvent(new AssetUpdated -// { -// IsImage = true, -// FileSize = file.FileSize, -// FileVersion = 1, -// MimeType = file.MimeType, -// PixelWidth = image.PixelWidth, -// PixelHeight = image.PixelHeight -// }) -// ); -// } - -// [Fact] -// public void Rename_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Rename(CreateAssetCommand(new RenameAsset { FileName = "new-file.png" })); -// }); -// } - -// [Fact] -// public void Rename_should_throw_exception_if_asset_is_deleted() -// { -// CreateAsset(); -// DeleteAsset(); - -// Assert.Throws(() => -// { -// sut.Update(CreateAssetCommand(new UpdateAsset())); -// }); -// } - -// [Fact] -// public void Rename_should_create_events() -// { -// CreateAsset(); - -// sut.Rename(CreateAssetCommand(new RenameAsset { FileName = "my-new-image.png" })); - -// Assert.Equal("my-new-image.png", sut.Snapshot.FileName); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateAssetEvent(new AssetRenamed { FileName = "my-new-image.png" }) -// ); -// } - -// [Fact] -// public void Delete_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Delete(CreateAssetCommand(new DeleteAsset())); -// }); -// } - -// [Fact] -// public void Delete_should_throw_exception_if_already_deleted() -// { -// CreateAsset(); -// DeleteAsset(); - -// Assert.Throws(() => -// { -// sut.Delete(CreateAssetCommand(new DeleteAsset())); -// }); -// } - -// [Fact] -// public void Delete_should_create_events_with_total_file_size() -// { -// CreateAsset(); -// UpdateAsset(); - -// sut.Delete(CreateAssetCommand(new DeleteAsset())); - -// Assert.True(sut.Snapshot.IsDeleted); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateAssetEvent(new AssetDeleted { DeletedSize = 2048 }) -// ); -// } - -// private void CreateAsset() -// { -// sut.Create(CreateAssetCommand(new CreateAsset { File = file })); -// sut.ClearUncommittedEvents(); -// } - -// private void UpdateAsset() -// { -// sut.Update(CreateAssetCommand(new UpdateAsset { File = file })); -// sut.ClearUncommittedEvents(); -// } - -// private void DeleteAsset() -// { -// sut.Delete(CreateAssetCommand(new DeleteAsset())); -// sut.ClearUncommittedEvents(); -// } - -// protected T CreateAssetEvent(T @event) where T : AssetEvent -// { -// @event.AssetId = assetId; - -// return CreateEvent(@event); -// } - -// protected T CreateAssetCommand(T command) where T : AssetCommand -// { -// command.AssetId = assetId; - -// return CreateCommand(command); -// } -// } -//} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetGrainTests.cs new file mode 100644 index 000000000..972af5527 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Assets/AssetGrainTests.cs @@ -0,0 +1,182 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.IO; +using System.Threading.Tasks; +using FakeItEasy; +using Orleans.Core; +using Orleans.Runtime; +using Squidex.Domain.Apps.Entities.Assets.Commands; +using Squidex.Domain.Apps.Entities.Assets.State; +using Squidex.Domain.Apps.Entities.TestHelpers; +using Squidex.Domain.Apps.Events.Assets; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Assets; +using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.States; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Assets +{ + public class AssetGrainTests : HandlerTestBase + { + private readonly ImageInfo image = new ImageInfo(2048, 2048); + private readonly Guid assetId = Guid.NewGuid(); + private readonly AssetFile file = new AssetFile("my-image.png", "image/png", 1024, () => new MemoryStream()); + private readonly AssetGrain sut; + + public class MyAssetGrain : AssetGrain + { + public MyAssetGrain(IStore store, IGrainIdentity identity, IGrainRuntime runtime) + : base(store, identity, runtime) + { + } + } + + protected override Guid Id + { + get { return assetId; } + } + + public AssetGrainTests() + { + sut = new MyAssetGrain(Store, Identity, Runtime); + sut.OnActivateAsync(); + } + + [Fact] + public async Task Command_should_throw_exception_if_rule_is_deleted() + { + await ExecuteCreateAsync(); + await ExecuteDeleteAsync(); + + await Assert.ThrowsAsync(ExecuteUpdateAsync); + } + + [Fact] + public async Task Create_should_create_events() + { + var command = new CreateAsset { File = file, ImageInfo = image }; + + var result = await sut.ExecuteAsync(J(CreateAssetCommand(command))); + + result.ShouldBeEquaivalent(new AssetSavedResult(0, 0)); + + Assert.Equal(0, sut.Snapshot.FileVersion); + + LastEvents + .ShouldHaveSameEvents( + CreateAssetEvent(new AssetCreated + { + IsImage = true, + FileName = file.FileName, + FileSize = file.FileSize, + FileVersion = 0, + MimeType = file.MimeType, + PixelWidth = image.PixelWidth, + PixelHeight = image.PixelHeight + }) + ); + } + + [Fact] + public async Task Update_should_create_events() + { + var command = new UpdateAsset { File = file, ImageInfo = image }; + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateAssetCommand(command))); + + result.ShouldBeEquaivalent(new AssetSavedResult(1, 1)); + + Assert.Equal(1, sut.Snapshot.FileVersion); + + LastEvents + .ShouldHaveSameEvents( + CreateAssetEvent(new AssetUpdated + { + IsImage = true, + FileSize = file.FileSize, + FileVersion = 1, + MimeType = file.MimeType, + PixelWidth = image.PixelWidth, + PixelHeight = image.PixelHeight + }) + ); + } + + [Fact] + public async Task Rename_should_create_events() + { + var command = new RenameAsset { FileName = "my-new-image.png" }; + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateAssetCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); + + Assert.Equal("my-new-image.png", sut.Snapshot.FileName); + + LastEvents + .ShouldHaveSameEvents( + CreateAssetEvent(new AssetRenamed { FileName = "my-new-image.png" }) + ); + } + + [Fact] + public async Task Delete_should_create_events_with_total_file_size() + { + var command = new DeleteAsset(); + + await ExecuteCreateAsync(); + await ExecuteUpdateAsync(); + + var result = await sut.ExecuteAsync(J(CreateAssetCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.True(sut.Snapshot.IsDeleted); + + LastEvents + .ShouldHaveSameEvents( + CreateAssetEvent(new AssetDeleted { DeletedSize = 2048 }) + ); + } + + private Task ExecuteCreateAsync() + { + return sut.ExecuteAsync(J(CreateAssetCommand(new CreateAsset { File = file }))); + } + + private Task ExecuteUpdateAsync() + { + return sut.ExecuteAsync(J(CreateAssetCommand(new UpdateAsset { File = file }))); + } + + private Task ExecuteDeleteAsync() + { + return sut.ExecuteAsync(J(CreateAssetCommand(new DeleteAsset()))); + } + + protected T CreateAssetEvent(T @event) where T : AssetEvent + { + @event.AssetId = assetId; + + return CreateEvent(@event); + } + + protected T CreateAssetCommand(T command) where T : AssetCommand + { + command.AssetId = assetId; + + return CreateCommand(command); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleGrainTests.cs index aa1c9be31..71dd84b95 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleGrainTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/RuleGrainTests.cs @@ -24,7 +24,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Rules { - public class RuleDomainObjectTests : HandlerTestBase + public class RuleGrainTests : HandlerTestBase { private readonly IAppProvider appProvider = A.Fake(); private readonly Guid ruleId = Guid.NewGuid(); @@ -43,7 +43,7 @@ namespace Squidex.Domain.Apps.Entities.Rules get { return ruleId; } } - public RuleDomainObjectTests() + public RuleGrainTests() { sut = new MyRuleGrain(Store, appProvider, Identity, Runtime); sut.OnActivateAsync().Wait(); @@ -52,23 +52,20 @@ namespace Squidex.Domain.Apps.Entities.Rules [Fact] public async Task Command_should_throw_exception_if_rule_is_deleted() { - await CreateAsync(); - await DeleteAsync(); + await ExecuteCreateAsync(); + await ExecuteDeleteAsync(); - await Assert.ThrowsAsync(() => - { - return sut.ExecuteAsync(J(CreateRuleCommand(MakeUpdateCommand()))); - }); + await Assert.ThrowsAsync(ExecuteDisableAsync); } [Fact] - public async Task Create_should_create_events() + public async Task Create_should_create_events_and_update_state() { var command = MakeCreateCommand(); var result = await sut.ExecuteAsync(J(CreateRuleCommand(command))); - Assert.True(result.Value is EntityCreatedResult); + result.ShouldBeEquaivalent(EntityCreatedResult.Create(Id, 0)); Assert.Equal(AppId, sut.Snapshot.AppId.Id); @@ -82,25 +79,15 @@ namespace Squidex.Domain.Apps.Entities.Rules } [Fact] - public async Task Update_should_handle_command() - { - await sut.ExecuteAsync(J(CreateRuleCommand(MakeCreateCommand()))); - - var result = await sut.ExecuteAsync(J(CreateRuleCommand(MakeUpdateCommand()))); - - Assert.True(result.Value is EntitySavedResult); - } - - [Fact] - public async Task Update_should_create_events() + public async Task Update_should_create_events_and_update_state() { var command = MakeUpdateCommand(); - await CreateAsync(); + await ExecuteCreateAsync(); var result = await sut.ExecuteAsync(J(CreateRuleCommand(command))); - Assert.True(result.Value is EntitySavedResult); + result.ShouldBeEquaivalent(new EntitySavedResult(1)); Assert.Same(command.Trigger, sut.Snapshot.RuleDef.Trigger); Assert.Same(command.Action, sut.Snapshot.RuleDef.Action); @@ -119,14 +106,16 @@ namespace Squidex.Domain.Apps.Entities.Rules } [Fact] - public async Task Enable_should_create_events() + public async Task Enable_should_create_events_and_update_state() { - await CreateAsync(); - await sut.ExecuteAsync(J(CreateRuleCommand(new DisableRule()))); + var command = new EnableRule(); - var result = await sut.ExecuteAsync(J(CreateRuleCommand(new EnableRule()))); + await ExecuteCreateAsync(); + await ExecuteDisableAsync(); - Assert.True(result.Value is EntitySavedResult); + var result = await sut.ExecuteAsync(J(CreateRuleCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); Assert.True(sut.Snapshot.RuleDef.IsEnabled); @@ -137,13 +126,15 @@ namespace Squidex.Domain.Apps.Entities.Rules } [Fact] - public async Task Disable_should_create_events() + public async Task Disable_should_create_events_and_update_state() { - await CreateAsync(); + var command = new DisableRule(); - var result = await sut.ExecuteAsync(J(CreateRuleCommand(new DisableRule()))); + await ExecuteCreateAsync(); - Assert.True(result.Value is EntitySavedResult); + var result = await sut.ExecuteAsync(J(CreateRuleCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); Assert.False(sut.Snapshot.RuleDef.IsEnabled); @@ -156,11 +147,13 @@ namespace Squidex.Domain.Apps.Entities.Rules [Fact] public async Task Delete_should_update_create_events() { - await CreateAsync(); + var command = new DeleteRule(); - var result = await sut.ExecuteAsync(J(CreateRuleCommand(new DeleteRule()))); + await ExecuteCreateAsync(); - Assert.True(result.Value is EntitySavedResult); + var result = await sut.ExecuteAsync(J(CreateRuleCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); Assert.True(sut.Snapshot.IsDeleted); @@ -170,12 +163,17 @@ namespace Squidex.Domain.Apps.Entities.Rules ); } - private Task CreateAsync() + private Task ExecuteCreateAsync() { return sut.ExecuteAsync(J(CreateRuleCommand(MakeCreateCommand()))); } - private Task DeleteAsync() + private Task ExecuteDisableAsync() + { + return sut.ExecuteAsync(J(CreateRuleCommand(new DisableRule()))); + } + + private Task ExecuteDeleteAsync() { return sut.ExecuteAsync(J(CreateRuleCommand(new DeleteRule()))); } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaCommandMiddlewareTests.cs deleted file mode 100644 index 54a4dfcb5..000000000 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaCommandMiddlewareTests.cs +++ /dev/null @@ -1,280 +0,0 @@ -//// ========================================================================== -//// Squidex Headless CMS -//// ========================================================================== -//// Copyright (c) Squidex UG (haftungsbeschränkt) -//// All rights reserved. Licensed under the MIT license. -//// ========================================================================== - -//using System; -//using System.Collections.Generic; -//using System.Threading.Tasks; -//using FakeItEasy; -//using Squidex.Domain.Apps.Core.Schemas; -//using Squidex.Domain.Apps.Entities.Schemas.Commands; -//using Squidex.Domain.Apps.Entities.TestHelpers; -//using Squidex.Infrastructure; -//using Squidex.Infrastructure.Commands; -//using Xunit; - -//namespace Squidex.Domain.Apps.Entities.Schemas -//{ -// public class SchemaCommandMiddlewareTests : HandlerTestBase -// { -// private readonly IAppProvider appProvider = A.Fake(); -// private readonly SchemaCommandMiddleware sut; -// private readonly SchemaDomainObject schema; -// private readonly FieldRegistry registry = new FieldRegistry(new TypeNameRegistry()); -// private readonly string fieldName = "age"; - -// protected override Guid Id -// { -// get { return SchemaId; } -// } - -// public SchemaCommandMiddlewareTests() -// { -// schema = new SchemaDomainObject(registry); - -// sut = new SchemaCommandMiddleware(Handler, appProvider); - -// A.CallTo(() => appProvider.GetSchemaAsync(AppId, SchemaName)) -// .Returns((ISchemaEntity)null); -// } - -// [Fact] -// public async Task Create_should_create_schema_domain_object() -// { -// var context = CreateContextForCommand(new CreateSchema { Name = SchemaName, SchemaId = SchemaId }); - -// await TestCreate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); - -// Assert.Equal(SchemaId, context.Result>().IdOrValue); - -// A.CallTo(() => appProvider.GetSchemaAsync(AppId, SchemaName)).MustHaveHappened(); -// } - -// [Fact] -// public async Task UpdateSchema_should_update_domain_object() -// { -// CreateSchema(); - -// var context = CreateContextForCommand(new UpdateSchema { Properties = new SchemaProperties() }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task ReorderSchema_should_update_domain_object() -// { -// CreateSchema(); - -// var context = CreateContextForCommand(new ReorderFields { FieldIds = new List() }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task PublishSchema_should_update_domain_object() -// { -// CreateSchema(); - -// var context = CreateContextForCommand(new PublishSchema()); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task UnpublishSchema_should_update_domain_object() -// { -// CreateSchema(); -// PublishSchema(); - -// var context = CreateContextForCommand(new UnpublishSchema()); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task ConfigureScripts_should_update_domain_object() -// { -// CreateSchema(); - -// var context = CreateContextForCommand(new ConfigureScripts()); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task DeleteSchema_should_update_domain_object() -// { -// CreateSchema(); - -// var context = CreateContextForCommand(new DeleteSchema()); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task Add_should_update_domain_object() -// { -// CreateSchema(); - -// var context = CreateContextForCommand(new AddField { Name = fieldName, Properties = new NumberFieldProperties() }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); - -// Assert.Equal(1, context.Result>().IdOrValue); -// } - -// [Fact] -// public async Task UpdateField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// var context = CreateContextForCommand(new UpdateField { FieldId = 1, Properties = new NumberFieldProperties() }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task LockField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// var context = CreateContextForCommand(new LockField { FieldId = 1 }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task HideField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// var context = CreateContextForCommand(new HideField { FieldId = 1 }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task ShowField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// HideField(); - -// var context = CreateContextForCommand(new ShowField { FieldId = 1 }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task DisableField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// var context = CreateContextForCommand(new DisableField { FieldId = 1 }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task EnableField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// DisableField(); - -// var context = CreateContextForCommand(new EnableField { FieldId = 1 }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// [Fact] -// public async Task DeleteField_should_update_domain_object() -// { -// CreateSchema(); -// CreateField(); - -// var context = CreateContextForCommand(new DeleteField { FieldId = 1 }); - -// await TestUpdate(schema, async _ => -// { -// await sut.HandleAsync(context); -// }); -// } - -// private void CreateSchema() -// { -// schema.Create(CreateCommand(new CreateSchema { Name = SchemaName })); -// } - -// private void PublishSchema() -// { -// schema.Publish(CreateCommand(new PublishSchema())); -// } - -// private void CreateField() -// { -// schema.Add(CreateCommand(new AddField { Name = fieldName, Properties = new NumberFieldProperties() })); -// } - -// private void HideField() -// { -// schema.HideField(CreateCommand(new HideField { FieldId = 1 })); -// } - -// private void DisableField() -// { -// schema.DisableField(CreateCommand(new DisableField { FieldId = 1 })); -// } -// } -//} \ No newline at end of file diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaDomainObjectTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaDomainObjectTests.cs deleted file mode 100644 index d4ffa9186..000000000 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaDomainObjectTests.cs +++ /dev/null @@ -1,665 +0,0 @@ -//// ========================================================================== -//// Squidex Headless CMS -//// ========================================================================== -//// Copyright (c) Squidex UG (haftungsbeschränkt) -//// All rights reserved. Licensed under the MIT license. -//// ========================================================================== - -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using FakeItEasy; -//using Squidex.Domain.Apps.Core.Schemas; -//using Squidex.Domain.Apps.Entities.Schemas.Commands; -//using Squidex.Domain.Apps.Entities.TestHelpers; -//using Squidex.Domain.Apps.Events.Schemas; -//using Squidex.Infrastructure; -//using Squidex.Infrastructure.States; -//using Xunit; - -//namespace Squidex.Domain.Apps.Entities.Schemas -//{ -// public class SchemaDomainObjectTests : HandlerTestBase -// { -// private readonly string fieldName = "age"; -// private readonly NamedId fieldId; -// private readonly SchemaDomainObject sut; - -// protected override Guid Id -// { -// get { return SchemaId; } -// } - -// public SchemaDomainObjectTests() -// { -// fieldId = new NamedId(1, fieldName); - -// var fieldRegistry = new FieldRegistry(new TypeNameRegistry()); - -// sut = new SchemaDomainObject(fieldRegistry); -// sut.ActivateAsync(Id, A.Fake>()); -// } - -// [Fact] -// public void Create_should_throw_exception_if_created() -// { -// sut.Create(CreateCommand(new CreateSchema { Name = SchemaName })); - -// Assert.Throws(() => -// { -// sut.Create(CreateCommand(new CreateSchema { Name = SchemaName })); -// }); -// } - -// [Fact] -// public void Create_should_create_schema_and_create_events() -// { -// var properties = new SchemaProperties(); - -// sut.Create(CreateCommand(new CreateSchema { Name = SchemaName, SchemaId = SchemaId, Properties = properties })); - -// Assert.Equal(AppId, sut.Snapshot.AppId.Id); - -// Assert.Equal(SchemaName, sut.Snapshot.Name); -// Assert.Equal(SchemaName, sut.Snapshot.SchemaDef.Name); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new SchemaCreated { Name = SchemaName, Properties = properties }) -// ); -// } - -// [Fact] -// public void Create_should_create_schema_with_initial_fields() -// { -// var properties = new SchemaProperties(); - -// var fields = new List -// { -// new CreateSchemaField { Name = "field1", Properties = ValidProperties() }, -// new CreateSchemaField { Name = "field2", Properties = ValidProperties() } -// }; - -// sut.Create(CreateCommand(new CreateSchema { Name = SchemaName, Properties = properties, Fields = fields })); - -// var @event = (SchemaCreated)sut.GetUncomittedEvents().Single().Payload; - -// Assert.Equal(AppId, sut.Snapshot.AppId.Id); -// Assert.Equal(SchemaName, sut.Snapshot.Name); -// Assert.Equal(SchemaName, sut.Snapshot.SchemaDef.Name); - -// Assert.Equal(2, @event.Fields.Count); -// } - -// [Fact] -// public void Update_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Update(CreateCommand(new UpdateSchema { Properties = new SchemaProperties() })); -// }); -// } - -// [Fact] -// public void Update_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.Update(CreateCommand(new UpdateSchema { Properties = new SchemaProperties() })); -// }); -// } - -// [Fact] -// public void Update_should_refresh_properties_and_create_events() -// { -// var properties = new SchemaProperties(); - -// CreateSchema(); - -// sut.Update(CreateCommand(new UpdateSchema { Properties = properties })); - -// Assert.Equal(properties, sut.Snapshot.SchemaDef.Properties); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new SchemaUpdated { Properties = properties }) -// ); -// } - -// [Fact] -// public void ConfigureScripts_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.ConfigureScripts(CreateCommand(new ConfigureScripts())); -// }); -// } - -// [Fact] -// public void ConfigureScripts_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.ConfigureScripts(CreateCommand(new ConfigureScripts())); -// }); -// } - -// [Fact] -// public void ConfigureScripts_should_create_events() -// { -// CreateSchema(); - -// sut.ConfigureScripts(CreateCommand(new ConfigureScripts -// { -// ScriptQuery = "", -// ScriptCreate = "", -// ScriptUpdate = "", -// ScriptDelete = "", -// ScriptChange = "" -// })); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new ScriptsConfigured -// { -// ScriptQuery = "", -// ScriptCreate = "", -// ScriptUpdate = "", -// ScriptDelete = "", -// ScriptChange = "" -// }) -// ); -// } - -// [Fact] -// public void Reorder_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Reorder(CreateCommand(new ReorderFields { FieldIds = new List() })); -// }); -// } - -// [Fact] -// public void Reorder_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.Reorder(CreateCommand(new ReorderFields { FieldIds = new List() })); -// }); -// } - -// [Fact] -// public void Reorder_should_refresh_properties_and_create_events() -// { -// var fieldIds = new List { 1, 2 }; - -// CreateSchema(); - -// sut.Add(CreateCommand(new AddField { Name = "field1", Properties = ValidProperties() })); -// sut.Add(CreateCommand(new AddField { Name = "field2", Properties = ValidProperties() })); - -// sut.ClearUncommittedEvents(); - -// sut.Reorder(CreateCommand(new ReorderFields { FieldIds = fieldIds })); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new SchemaFieldsReordered { FieldIds = fieldIds }) -// ); -// } - -// [Fact] -// public void Publish_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Publish(CreateCommand(new PublishSchema())); -// }); -// } - -// [Fact] -// public void Publish_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.Publish(CreateCommand(new PublishSchema())); -// }); -// } - -// [Fact] -// public void Publish_should_refresh_properties_and_create_events() -// { -// CreateSchema(); - -// sut.Publish(CreateCommand(new PublishSchema())); - -// Assert.True(sut.Snapshot.SchemaDef.IsPublished); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new SchemaPublished()) -// ); -// } - -// [Fact] -// public void Unpublish_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Unpublish(CreateCommand(new UnpublishSchema())); -// }); -// } - -// [Fact] -// public void Unpublish_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.Unpublish(CreateCommand(new UnpublishSchema())); -// }); -// } - -// [Fact] -// public void Unpublish_should_refresh_properties_and_create_events() -// { -// CreateSchema(); -// PublishSchema(); - -// sut.Unpublish(CreateCommand(new UnpublishSchema())); - -// Assert.False(sut.Snapshot.SchemaDef.IsPublished); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new SchemaUnpublished()) -// ); -// } - -// [Fact] -// public void Delete_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Delete(CreateCommand(new DeleteSchema())); -// }); -// } - -// [Fact] -// public void Delete_should_throw_exception_if_already_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.Delete(CreateCommand(new DeleteSchema())); -// }); -// } - -// [Fact] -// public void Delete_should_refresh_properties_and_create_events() -// { -// CreateSchema(); - -// sut.Delete(CreateCommand(new DeleteSchema())); - -// Assert.True(sut.Snapshot.IsDeleted); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new SchemaDeleted()) -// ); -// } - -// [Fact] -// public void AddField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.Add(CreateCommand(new AddField { Name = fieldName, Properties = ValidProperties() })); -// }); -// } - -// [Fact] -// public void AddField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.Add(CreateCommand(new AddField { Name = fieldName, Properties = new NumberFieldProperties() })); -// }); -// } - -// [Fact] -// public void Add_should_update_schema_and_create_events() -// { -// var properties = new NumberFieldProperties(); - -// CreateSchema(); - -// sut.Add(CreateCommand(new AddField { Name = fieldName, Properties = properties })); - -// Assert.Equal(properties, sut.Snapshot.SchemaDef.FieldsById[1].RawProperties); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new FieldAdded { Name = fieldName, FieldId = fieldId, Properties = properties }) -// ); -// } - -// [Fact] -// public void UpdateField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.UpdateField(CreateCommand(new UpdateField { FieldId = 1, Properties = new NumberFieldProperties() })); -// }); -// } - -// [Fact] -// public void UpdateField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.UpdateField(CreateCommand(new UpdateField { FieldId = 1, Properties = new NumberFieldProperties() })); -// }); -// } - -// [Fact] -// public void UpdateField_should_update_schema_and_create_events() -// { -// var properties = new NumberFieldProperties(); - -// CreateSchema(); -// CreateField(); - -// sut.UpdateField(CreateCommand(new UpdateField { FieldId = 1, Properties = properties })); - -// Assert.Equal(properties, sut.Snapshot.SchemaDef.FieldsById[1].RawProperties); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new FieldUpdated { FieldId = fieldId, Properties = properties }) -// ); -// } - -// [Fact] -// public void LockField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.LockField(CreateCommand(new LockField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void LockField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.LockField(CreateCommand(new LockField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void LockField_should_update_schema_and_create_events() -// { -// CreateSchema(); -// CreateField(); - -// sut.LockField(CreateCommand(new LockField { FieldId = 1 })); - -// Assert.False(sut.Snapshot.SchemaDef.FieldsById[1].IsDisabled); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new FieldLocked { FieldId = fieldId }) -// ); -// } - -// [Fact] -// public void HideField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.HideField(CreateCommand(new HideField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void HideField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.HideField(CreateCommand(new HideField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void HideField_should_update_schema_and_create_events() -// { -// CreateSchema(); -// CreateField(); - -// sut.HideField(CreateCommand(new HideField { FieldId = 1 })); - -// Assert.True(sut.Snapshot.SchemaDef.FieldsById[1].IsHidden); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new FieldHidden { FieldId = fieldId }) -// ); -// } - -// [Fact] -// public void ShowField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.ShowField(CreateCommand(new ShowField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void ShowField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.ShowField(CreateCommand(new ShowField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void ShowField_should_update_schema_and_create_events() -// { -// CreateSchema(); -// CreateField(); - -// sut.HideField(CreateCommand(new HideField { FieldId = 1 })); -// sut.ShowField(CreateCommand(new ShowField { FieldId = 1 })); - -// Assert.False(sut.Snapshot.SchemaDef.FieldsById[1].IsHidden); - -// sut.GetUncomittedEvents().Skip(1) -// .ShouldHaveSameEvents( -// CreateEvent(new FieldShown { FieldId = fieldId }) -// ); -// } - -// [Fact] -// public void DisableField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.DisableField(CreateCommand(new DisableField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void DisableField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.DisableField(CreateCommand(new DisableField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void DisableField_should_update_schema_and_create_events() -// { -// CreateSchema(); -// CreateField(); - -// sut.DisableField(CreateCommand(new DisableField { FieldId = 1 })); - -// Assert.True(sut.Snapshot.SchemaDef.FieldsById[1].IsDisabled); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new FieldDisabled { FieldId = fieldId }) -// ); -// } - -// [Fact] -// public void EnableField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.EnableField(CreateCommand(new EnableField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void EnableField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.EnableField(CreateCommand(new EnableField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void EnableField_should_update_schema_and_create_events() -// { -// CreateSchema(); -// CreateField(); - -// sut.DisableField(CreateCommand(new DisableField { FieldId = 1 })); -// sut.EnableField(CreateCommand(new EnableField { FieldId = 1 })); - -// Assert.False(sut.Snapshot.SchemaDef.FieldsById[1].IsDisabled); - -// sut.GetUncomittedEvents().Skip(1) -// .ShouldHaveSameEvents( -// CreateEvent(new FieldEnabled { FieldId = fieldId }) -// ); -// } - -// [Fact] -// public void DeleteField_should_throw_exception_if_not_created() -// { -// Assert.Throws(() => -// { -// sut.DeleteField(CreateCommand(new DeleteField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void DeleteField_should_throw_exception_if_schema_is_deleted() -// { -// CreateSchema(); -// DeleteSchema(); - -// Assert.Throws(() => -// { -// sut.DeleteField(CreateCommand(new DeleteField { FieldId = 1 })); -// }); -// } - -// [Fact] -// public void DeleteField_should_update_schema_and_create_events() -// { -// CreateSchema(); -// CreateField(); - -// sut.DeleteField(CreateCommand(new DeleteField { FieldId = 1 })); - -// Assert.False(sut.Snapshot.SchemaDef.FieldsById.ContainsKey(1)); - -// sut.GetUncomittedEvents() -// .ShouldHaveSameEvents( -// CreateEvent(new FieldDeleted { FieldId = fieldId }) -// ); -// } - -// private void CreateField() -// { -// sut.Add(CreateCommand(new AddField { Name = fieldName, Properties = new NumberFieldProperties() })); -// sut.ClearUncommittedEvents(); -// } - -// private void CreateSchema() -// { -// sut.Create(CreateCommand(new CreateSchema { Name = SchemaName })); -// sut.ClearUncommittedEvents(); -// } - -// private void PublishSchema() -// { -// sut.Publish(CreateCommand(new PublishSchema())); -// sut.ClearUncommittedEvents(); -// } - -// private void DeleteSchema() -// { -// sut.Delete(CreateCommand(new DeleteSchema())); -// sut.ClearUncommittedEvents(); -// } - -// private static StringFieldProperties ValidProperties() -// { -// return new StringFieldProperties { MinLength = 10, MaxLength = 20 }; -// } - -// private static StringFieldProperties InvalidProperties() -// { -// return new StringFieldProperties { MinLength = 20, MaxLength = 10 }; -// } -// } -//} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaGrainTests.cs new file mode 100644 index 000000000..6ccc86c71 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/SchemaGrainTests.cs @@ -0,0 +1,439 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using FakeItEasy; +using Orleans.Core; +using Orleans.Runtime; +using Squidex.Domain.Apps.Core.Schemas; +using Squidex.Domain.Apps.Entities.Schemas.Commands; +using Squidex.Domain.Apps.Entities.Schemas.State; +using Squidex.Domain.Apps.Entities.TestHelpers; +using Squidex.Domain.Apps.Events.Schemas; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Commands; +using Squidex.Infrastructure.States; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Schemas +{ + public class SchemaGrainTests : HandlerTestBase + { + private readonly IAppProvider appProvider = A.Fake(); + private readonly FieldRegistry registry = new FieldRegistry(new TypeNameRegistry()); + private readonly string fieldName = "age"; + private readonly NamedId fieldId; + private readonly SchemaGrain sut; + + public sealed class MySchemaGrain : SchemaGrain + { + public MySchemaGrain(IStore store, IAppProvider appProvider, FieldRegistry registry, IGrainIdentity identity, IGrainRuntime runtime) + : base(store, appProvider, registry, identity, runtime) + { + } + } + + protected override Guid Id + { + get { return SchemaId; } + } + + public SchemaGrainTests() + { + A.CallTo(() => appProvider.GetSchemaAsync(AppId, SchemaName)) + .Returns((ISchemaEntity)null); + + fieldId = new NamedId(1, fieldName); + + sut = new MySchemaGrain(Store, appProvider, registry, Identity, Runtime); + sut.OnActivateAsync().Wait(); + } + + [Fact] + public async Task Command_should_throw_exception_if_rule_is_deleted() + { + await ExecuteCreateAsync(); + await ExecuteDeleteAsync(); + + await Assert.ThrowsAsync(ExecutePublishAsync); + } + + [Fact] + public async Task Create_should_create_schema_and_create_events() + { + var properties = new SchemaProperties(); + + var command = new CreateSchema { Name = SchemaName, SchemaId = SchemaId, Properties = properties }; + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(EntityCreatedResult.Create(Id, 0)); + + Assert.Equal(AppId, sut.Snapshot.AppId.Id); + + Assert.Equal(SchemaName, sut.Snapshot.Name); + Assert.Equal(SchemaName, sut.Snapshot.SchemaDef.Name); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new SchemaCreated { Name = SchemaName, Properties = properties }) + ); + } + + [Fact] + public async Task Create_should_create_schema_with_initial_fields() + { + var properties = new SchemaProperties(); + + var fields = new List + { + new CreateSchemaField { Name = "field1", Properties = ValidProperties() }, + new CreateSchemaField { Name = "field2", Properties = ValidProperties() } + }; + + var command = new CreateSchema { Name = SchemaName, SchemaId = SchemaId, Properties = properties, Fields = fields }; + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(EntityCreatedResult.Create(Id, 0)); + + var @event = (SchemaCreated)LastEvents.Single().Payload; + + Assert.Equal(AppId, sut.Snapshot.AppId.Id); + Assert.Equal(SchemaName, sut.Snapshot.Name); + Assert.Equal(SchemaName, sut.Snapshot.SchemaDef.Name); + + Assert.Equal(2, @event.Fields.Count); + } + + [Fact] + public async Task Update_should_create_events_and_update_state() + { + var command = new UpdateSchema { Properties = new SchemaProperties() }; + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); + + Assert.Equal(command.Properties, sut.Snapshot.SchemaDef.Properties); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new SchemaUpdated { Properties = command.Properties }) + ); + } + + [Fact] + public async Task ConfigureScripts_should_create_events() + { + var command = new ConfigureScripts + { + ScriptQuery = "", + ScriptCreate = "", + ScriptUpdate = "", + ScriptDelete = "", + ScriptChange = "" + }; + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new ScriptsConfigured + { + ScriptQuery = "", + ScriptCreate = "", + ScriptUpdate = "", + ScriptDelete = "", + ScriptChange = "" + }) + ); + } + + [Fact] + public async Task Reorder_should_create_events_and_update_state() + { + var command = new ReorderFields { FieldIds = new List { 1, 2 } }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync("field1"); + await ExecuteAddFieldAsync("field2"); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(3)); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new SchemaFieldsReordered { FieldIds = command.FieldIds }) + ); + } + + [Fact] + public async Task Publish_should_create_events_and_update_state() + { + var command = new PublishSchema(); + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); + + Assert.True(sut.Snapshot.SchemaDef.IsPublished); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new SchemaPublished()) + ); + } + + [Fact] + public async Task Unpublish_should_create_events_and_update_state() + { + var command = new UnpublishSchema(); + + await ExecuteCreateAsync(); + await ExecutePublishAsync(); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.False(sut.Snapshot.SchemaDef.IsPublished); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new SchemaUnpublished()) + ); + } + + [Fact] + public async Task Delete_should_create_events_and_update_state() + { + var command = new DeleteSchema(); + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(1)); + + Assert.True(sut.Snapshot.IsDeleted); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new SchemaDeleted()) + ); + } + + [Fact] + public async Task Add_should_create_events_and_update_state() + { + var command = new AddField { Name = fieldName, Properties = ValidProperties() }; + + await ExecuteCreateAsync(); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(EntityCreatedResult.Create(1, 1)); + + Assert.Equal(command.Properties, sut.Snapshot.SchemaDef.FieldsById[1].RawProperties); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldAdded { Name = fieldName, FieldId = fieldId, Properties = command.Properties }) + ); + } + + [Fact] + public async Task UpdateField_should_create_events_and_update_state() + { + var command = new UpdateField { FieldId = 1, Properties = new StringFieldProperties() }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.Equal(command.Properties, sut.Snapshot.SchemaDef.FieldsById[1].RawProperties); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldUpdated { FieldId = fieldId, Properties = command.Properties }) + ); + } + + [Fact] + public async Task LockField_should_create_events_and_update_state() + { + var command = new LockField { FieldId = 1 }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.False(sut.Snapshot.SchemaDef.FieldsById[1].IsDisabled); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldLocked { FieldId = fieldId }) + ); + } + + [Fact] + public async Task HideField_should_create_events_and_update_state() + { + var command = new HideField { FieldId = 1 }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.True(sut.Snapshot.SchemaDef.FieldsById[1].IsHidden); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldHidden { FieldId = fieldId }) + ); + } + + [Fact] + public async Task ShowField_should_create_events_and_update_state() + { + var command = new ShowField { FieldId = 1 }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + await ExecuteHideFieldAsync(1); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(3)); + + Assert.False(sut.Snapshot.SchemaDef.FieldsById[1].IsHidden); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldShown { FieldId = fieldId }) + ); + } + + [Fact] + public async Task DisableField_should_create_events_and_update_state() + { + var command = new DisableField { FieldId = 1 }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.True(sut.Snapshot.SchemaDef.FieldsById[1].IsDisabled); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldDisabled { FieldId = fieldId }) + ); + } + + [Fact] + public async Task EnableField_should_create_events_and_update_state() + { + var command = new EnableField { FieldId = 1 }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + await ExecuteDisableFieldAsync(1); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(3)); + + Assert.False(sut.Snapshot.SchemaDef.FieldsById[1].IsDisabled); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldEnabled { FieldId = fieldId }) + ); + } + + [Fact] + public async Task DeleteField_should_create_events_and_update_state() + { + var command = new DeleteField { FieldId = 1 }; + + await ExecuteCreateAsync(); + await ExecuteAddFieldAsync(fieldName); + + var result = await sut.ExecuteAsync(J(CreateCommand(command))); + + result.ShouldBeEquaivalent(new EntitySavedResult(2)); + + Assert.False(sut.Snapshot.SchemaDef.FieldsById.ContainsKey(1)); + + LastEvents + .ShouldHaveSameEvents( + CreateEvent(new FieldDeleted { FieldId = fieldId }) + ); + } + + private Task ExecuteCreateAsync() + { + return sut.ExecuteAsync(J(CreateCommand(new CreateSchema { Name = SchemaName }))); + } + + private Task ExecuteAddFieldAsync(string name) + { + return sut.ExecuteAsync(J(CreateCommand(new AddField { Properties = ValidProperties(), Name = name }))); + } + + private Task ExecuteHideFieldAsync(long id) + { + return sut.ExecuteAsync(J(CreateCommand(new HideField { FieldId = id }))); + } + + private Task ExecuteDisableFieldAsync(long id) + { + return sut.ExecuteAsync(J(CreateCommand(new DisableField { FieldId = id }))); + } + + private Task ExecutePublishAsync() + { + return sut.ExecuteAsync(J(CreateCommand(new PublishSchema()))); + } + + private Task ExecuteDeleteAsync() + { + return sut.ExecuteAsync(J(CreateCommand(new DeleteSchema()))); + } + + private static StringFieldProperties ValidProperties() + { + return new StringFieldProperties { MinLength = 10, MaxLength = 20 }; + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AssertHelper.cs b/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AssertHelper.cs index f3251657d..c573d693a 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AssertHelper.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/TestHelpers/AssertHelper.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using FluentAssertions; using Squidex.Infrastructure.EventSourcing; +using Squidex.Infrastructure.Orleans; namespace Squidex.Domain.Apps.Entities.TestHelpers { @@ -40,5 +41,10 @@ namespace Squidex.Domain.Apps.Entities.TestHelpers { lhs.Should().BeOfType(rhs.GetType()); } + + public static void ShouldBeEquaivalent(this J result, object value) + { + result.Value.ShouldBeEquivalentTo(value, o => o.IncludingAllDeclaredProperties()); + } } }