From cb9a8ddb357ce6d681085bfb317ad4a4a2e22e3a Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sat, 21 Jul 2018 19:53:27 +0200 Subject: [PATCH] Added some cleaners including tests. --- .../Backup/CleanerGrain.cs | 13 ++++-- .../Rules/Indexes/RuleIndexCleaner.cs | 31 ++++++++++++++ .../Rules/Indexes/RulesByAppIndexGrain.cs | 2 + .../Schemas/Indexes/SchemaIndexCleaner.cs | 31 ++++++++++++++ .../Schemas/Indexes/SchemasByAppIndexGrain.cs | 2 + .../AppsByNameIndexCommandMiddlewareTests.cs | 2 +- .../Apps/Indexes/AppsByNameIndexGrainTests.cs | 2 +- .../AppsByUserIndexCommandMiddlewareTests.cs | 2 +- .../Apps/Indexes/AppsByUserIndexGrainTests.cs | 2 +- .../SingletonCommandMiddlewareTests.cs | 2 +- .../Rules/Indexes/RuleIndexCleanerTests.cs | 40 +++++++++++++++++++ .../RulesByAppIndexCommandMiddlewareTests.cs | 11 +++-- .../Indexes/RulesByAppIndexGrainTests.cs | 17 +++++++- .../Indexes/SchemaIndexCleanerTests.cs | 40 +++++++++++++++++++ ...SchemasByAppIndexCommandMiddlewareTests.cs | 11 +++-- .../Indexes/SchemasByAppIndexGrainTests.cs | 16 +++++++- 16 files changed, 207 insertions(+), 17 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs create mode 100644 src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs create mode 100644 tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs diff --git a/src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs b/src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs index a0db8d3fd..8eb19922f 100644 --- a/src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs @@ -25,7 +25,7 @@ using Squidex.Infrastructure.States; namespace Squidex.Domain.Apps.Entities.Backup { [Reentrant] - public sealed class CleanerGrain : GrainOfGuid, IRemindable + public sealed class CleanerGrain : GrainOfString, IRemindable, IBackgroundGrain { private readonly IGrainFactory grainFactory; private readonly IStore store; @@ -58,11 +58,11 @@ namespace Squidex.Domain.Apps.Entities.Backup this.eventStore = eventStore; } - public async override Task OnActivateAsync(Guid key) + public async override Task OnActivateAsync(string key) { await RegisterOrUpdateReminder("Default", TimeSpan.Zero, TimeSpan.FromMinutes(10)); - persistence = store.WithSnapshots(key, s => + persistence = store.WithSnapshots(Guid.Empty, s => { state = s; }); @@ -72,6 +72,11 @@ namespace Squidex.Domain.Apps.Entities.Backup await CleanAsync(); } + public Task ActivateAsync() + { + return CleanAsync(); + } + public Task ReceiveReminder(string reminderName, TickStatus status) { return CleanAsync(); @@ -136,7 +141,7 @@ namespace Squidex.Domain.Apps.Entities.Backup await storage.ClearAsync(appId); } - await store.ClearSnapshotAsync(appId; + await store.ClearSnapshotAsync(appId); } private async Task DeleteAsync(Guid id) diff --git a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs new file mode 100644 index 000000000..04af08f23 --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs @@ -0,0 +1,31 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using Orleans; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Entities.Rules.Indexes +{ + public sealed class RuleIndexCleaner : IAppStorage + { + private readonly IGrainFactory grainFactory; + + public RuleIndexCleaner(IGrainFactory grainFactory) + { + Guard.NotNull(grainFactory, nameof(grainFactory)); + + this.grainFactory = grainFactory; + } + + public Task ClearAsync(Guid appId) + { + return grainFactory.GetGrain(appId).ClearAsync(); + } + } +} diff --git a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RulesByAppIndexGrain.cs b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RulesByAppIndexGrain.cs index b3b87943d..6d72c92d2 100644 --- a/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RulesByAppIndexGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Rules/Indexes/RulesByAppIndexGrain.cs @@ -72,6 +72,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes public Task ClearAsync() { + state = new State(); + return persistence.DeleteAsync(); } } diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs new file mode 100644 index 000000000..3945e7d1c --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs @@ -0,0 +1,31 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using Orleans; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Entities.Schemas.Indexes +{ + public sealed class SchemaIndexCleaner : IAppStorage + { + private readonly IGrainFactory grainFactory; + + public SchemaIndexCleaner(IGrainFactory grainFactory) + { + Guard.NotNull(grainFactory, nameof(grainFactory)); + + this.grainFactory = grainFactory; + } + + public Task ClearAsync(Guid appId) + { + return grainFactory.GetGrain(appId).ClearAsync(); + } + } +} diff --git a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasByAppIndexGrain.cs b/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasByAppIndexGrain.cs index cbec766f3..57b743957 100644 --- a/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasByAppIndexGrain.cs +++ b/src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemasByAppIndexGrain.cs @@ -79,6 +79,8 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes public Task ClearAsync() { + state = new State(); + return persistence.DeleteAsync(); } } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexCommandMiddlewareTests.cs index 8d67c852f..d01b8e2c9 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexCommandMiddlewareTests.cs @@ -16,7 +16,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Apps.Indexes { - public sealed class AppsByNameIndexCommandMiddlewareTests + public class AppsByNameIndexCommandMiddlewareTests { private readonly IGrainFactory grainFactory = A.Fake(); private readonly ICommandBus commandBus = A.Fake(); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexGrainTests.cs index 5db614a21..7667f15a8 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexGrainTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByNameIndexGrainTests.cs @@ -15,7 +15,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Apps.Indexes { - public sealed class AppsByNameIndexGrainTests + public class AppsByNameIndexGrainTests { private readonly IStore store = A.Fake>(); private readonly IPersistence persistence = A.Fake>(); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexCommandMiddlewareTests.cs index afa3851b2..1f581b135 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexCommandMiddlewareTests.cs @@ -18,7 +18,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Apps.Indexes { - public sealed class AppsByUserIndexCommandMiddlewareTests + public class AppsByUserIndexCommandMiddlewareTests { private readonly IGrainFactory grainFactory = A.Fake(); private readonly ICommandBus commandBus = A.Fake(); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexGrainTests.cs index f640a8831..ee8d91359 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexGrainTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Apps/Indexes/AppsByUserIndexGrainTests.cs @@ -15,7 +15,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Apps.Indexes { - public sealed class AppsByUserIndexGrainTests + public class AppsByUserIndexGrainTests { private readonly IStore store = A.Fake>(); private readonly IPersistence persistence = A.Fake>(); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/SingletonCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/SingletonCommandMiddlewareTests.cs index 27587abd7..466c880c3 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/SingletonCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/SingletonCommandMiddlewareTests.cs @@ -14,7 +14,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Contents { - public sealed class SingletonCommandMiddlewareTests + public class SingletonCommandMiddlewareTests { private readonly ICommandBus commandBus = A.Fake(); private readonly SingletonCommandMiddleware sut = new SingletonCommandMiddleware(); diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs new file mode 100644 index 000000000..8d60f0d60 --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs @@ -0,0 +1,40 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using FakeItEasy; +using Orleans; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Rules.Indexes +{ + public class RuleIndexCleanerTests + { + private readonly IGrainFactory grainFactory = A.Fake(); + private readonly IRulesByAppIndex index = A.Fake(); + private readonly Guid appId = Guid.NewGuid(); + private readonly RuleIndexCleaner sut; + + public RuleIndexCleanerTests() + { + A.CallTo(() => grainFactory.GetGrain(appId, null)) + .Returns(index); + + sut = new RuleIndexCleaner(grainFactory); + } + + [Fact] + public async Task Should_forward_to_index() + { + await sut.ClearAsync(appId); + + A.CallTo(() => index.ClearAsync()) + .MustHaveHappened(); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexCommandMiddlewareTests.cs index cb4fd2a23..c90cc54a7 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexCommandMiddlewareTests.cs @@ -17,7 +17,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Rules.Indexes { - public sealed class RulesByAppIndexCommandMiddlewareTests + public class RulesByAppIndexCommandMiddlewareTests { private readonly IGrainFactory grainFactory = A.Fake(); private readonly ICommandBus commandBus = A.Fake(); @@ -38,7 +38,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes public async Task Should_add_rule_to_index_on_create() { var context = - new CommandContext(new CreateRule { RuleId = appId, AppId = NamedId.Of(appId, "my-app") }, commandBus) + new CommandContext(new CreateRule { RuleId = appId, AppId = BuildAppId() }, commandBus) .Complete(); await sut.HandleAsync(context); @@ -60,7 +60,7 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes .Returns(J.AsTask(ruleState)); A.CallTo(() => ruleState.AppId) - .Returns(NamedId.Of(appId, "my-app")); + .Returns(BuildAppId()); var context = new CommandContext(new DeleteRule { RuleId = appId }, commandBus) @@ -71,5 +71,10 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes A.CallTo(() => index.RemoveRuleAsync(appId)) .MustHaveHappened(); } + + private NamedId BuildAppId() + { + return NamedId.Of(appId, "my-app"); + } } } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexGrainTests.cs index be15f041f..98140a3e2 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexGrainTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RulesByAppIndexGrainTests.cs @@ -14,7 +14,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Rules.Indexes { - public sealed class RulesByAppIndexGrainTests + public class RulesByAppIndexGrainTests { private readonly IStore store = A.Fake>(); private readonly IPersistence persistence = A.Fake>(); @@ -45,6 +45,21 @@ namespace Squidex.Domain.Apps.Entities.Rules.Indexes .MustHaveHappenedTwiceExactly(); } + [Fact] + public async Task Should_delete_and_reset_state_when_cleaning() + { + await sut.AddRuleAsync(ruleId1); + await sut.AddRuleAsync(ruleId2); + await sut.ClearAsync(); + + var ids = await sut.GetRuleIdsAsync(); + + Assert.Empty(ids); + + A.CallTo(() => persistence.DeleteAsync()) + .MustHaveHappened(); + } + [Fact] public async Task Should_remove_rule_id_from_index() { diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs new file mode 100644 index 000000000..721a5c21a --- /dev/null +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs @@ -0,0 +1,40 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Threading.Tasks; +using FakeItEasy; +using Orleans; +using Xunit; + +namespace Squidex.Domain.Apps.Entities.Schemas.Indexes +{ + public class SchemaIndexCleanerTests + { + private readonly IGrainFactory grainFactory = A.Fake(); + private readonly ISchemasByAppIndex index = A.Fake(); + private readonly Guid appId = Guid.NewGuid(); + private readonly SchemaIndexCleaner sut; + + public SchemaIndexCleanerTests() + { + A.CallTo(() => grainFactory.GetGrain(appId, null)) + .Returns(index); + + sut = new SchemaIndexCleaner(grainFactory); + } + + [Fact] + public async Task Should_forward_to_index() + { + await sut.ClearAsync(appId); + + A.CallTo(() => index.ClearAsync()) + .MustHaveHappened(); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexCommandMiddlewareTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexCommandMiddlewareTests.cs index 15091edd8..d42b7e63d 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexCommandMiddlewareTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexCommandMiddlewareTests.cs @@ -17,7 +17,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Schemas.Indexes { - public sealed class SchemasByAppIndexCommandMiddlewareTests + public class SchemasByAppIndexCommandMiddlewareTests { private readonly IGrainFactory grainFactory = A.Fake(); private readonly ICommandBus commandBus = A.Fake(); @@ -38,7 +38,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes public async Task Should_add_schema_to_index_on_create() { var context = - new CommandContext(new CreateSchema { SchemaId = appId, Name = "my-schema", AppId = NamedId.Of(appId, "my-app") }, commandBus) + new CommandContext(new CreateSchema { SchemaId = appId, Name = "my-schema", AppId = BuildAppId() }, commandBus) .Complete(); await sut.HandleAsync(context); @@ -60,7 +60,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes .Returns(J.AsTask(schemaState)); A.CallTo(() => schemaState.AppId) - .Returns(NamedId.Of(appId, "my-app")); + .Returns(BuildAppId()); var context = new CommandContext(new DeleteSchema { SchemaId = appId }, commandBus) @@ -71,5 +71,10 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes A.CallTo(() => index.RemoveSchemaAsync(appId)) .MustHaveHappened(); } + + private NamedId BuildAppId() + { + return NamedId.Of(appId, "my-app"); + } } } diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexGrainTests.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexGrainTests.cs index 5da814102..b52491a3a 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexGrainTests.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemasByAppIndexGrainTests.cs @@ -14,7 +14,7 @@ using Xunit; namespace Squidex.Domain.Apps.Entities.Schemas.Indexes { - public sealed class SchemasByAppIndexGrainTests + public class SchemasByAppIndexGrainTests { private readonly IStore store = A.Fake>(); private readonly IPersistence persistence = A.Fake>(); @@ -46,6 +46,20 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes .MustHaveHappened(); } + [Fact] + public async Task Should_delete_and_reset_state_when_cleaning() + { + await sut.AddSchemaAsync(schemaId1, schemaName1); + await sut.ClearAsync(); + + var id = await sut.GetSchemaIdAsync(schemaName1); + + Assert.Equal(id, Guid.Empty); + + A.CallTo(() => persistence.DeleteAsync()) + .MustHaveHappened(); + } + [Fact] public async Task Should_remove_schema_id_from_index() {