From a4f0374f29f0547361cc85d284d734522dd83f7c Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Wed, 6 Feb 2019 14:40:26 +0100 Subject: [PATCH] Type name fixes. --- .../Actions/RuleElementRegistry.cs | 34 +++++++++----- .../Rules/Triggers/AssetChangedTriggerV2.cs | 2 - .../Rules/Triggers/ContentChangedTriggerV2.cs | 2 - .../Rules/Triggers/UsageTrigger.cs | 2 - .../Schemas/ArrayFieldProperties.cs | 2 - .../Schemas/AssetsFieldProperties.cs | 2 - .../Schemas/BooleanFieldProperties.cs | 3 -- .../Schemas/DateTimeFieldProperties.cs | 2 - .../Schemas/FieldRegistry.cs | 20 ++++---- .../Schemas/GeolocationFieldProperties.cs | 3 -- .../Schemas/JsonFieldProperties.cs | 2 - .../Schemas/NumberFieldProperties.cs | 2 - .../Schemas/ReferencesFieldProperties.cs | 2 - .../Schemas/StringFieldProperties.cs | 2 - .../Schemas/TagsFieldProperties.cs | 2 - .../HandleRules/RuleRegistry.cs | 46 +++++++++++++++++++ .../Newtonsoft/TypeNameSerializationBinder.cs | 2 +- .../States/DefaultStreamNameResolver.cs | 14 +----- src/Squidex.Infrastructure/TypeNameBuilder.cs | 34 ++++++++++++++ .../Config/Domain/SerializationServices.cs | 18 ++++---- .../Model/Rules/RuleTests.cs | 3 ++ .../TestUtils.cs | 7 ++- 22 files changed, 134 insertions(+), 72 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs create mode 100644 src/Squidex.Infrastructure/TypeNameBuilder.cs diff --git a/extensions/Squidex.Extensions/Actions/RuleElementRegistry.cs b/extensions/Squidex.Extensions/Actions/RuleElementRegistry.cs index 0c2bdd610..de21e0d0f 100644 --- a/extensions/Squidex.Extensions/Actions/RuleElementRegistry.cs +++ b/extensions/Squidex.Extensions/Actions/RuleElementRegistry.cs @@ -17,26 +17,31 @@ namespace Squidex.Extensions.Actions { public static class RuleElementRegistry { - private const string Suffix = "Action"; + private const string ActionSuffix = "Action"; + private const string ActionSuffixV2 = "Action"; + private const string TriggerSuffix = "Trigger"; + private const string TriggerSuffixV2 = "TriggerV2"; + private static readonly HashSet ActionHandlerTypes = new HashSet(); + private static readonly Dictionary ActionTypes = new Dictionary(); private static readonly Dictionary TriggerTypes = new Dictionary { - [ContentChangedTriggerV2.Name] = new RuleElement + [GetTriggerName(typeof(ContentChangedTriggerV2))] = new RuleElement { IconImage = "", IconColor = "#3389ff", Display = "Content changed", Description = "For content changes like created, updated, published, unpublished..." }, - [AssetChangedTriggerV2.Name] = new RuleElement + [GetTriggerName(typeof(AssetChangedTriggerV2))] = new RuleElement { IconImage = "", IconColor = "#3389ff", Display = "Asset changed", Description = "For asset changes like uploaded, updated (reuploaded), renamed, deleted..." }, - [UsageTrigger.Name] = new RuleElement + [GetTriggerName(typeof(UsageTrigger))] = new RuleElement { IconImage = "", IconColor = "#3389ff", @@ -72,12 +77,7 @@ namespace Squidex.Extensions.Actions foreach (var actionType in actionTypes) { - var name = actionType.Name; - - if (name.EndsWith(Suffix, StringComparison.Ordinal)) - { - name = name.Substring(0, name.Length - Suffix.Length); - } + var name = GetActionName(actionType); var metadata = actionType.GetCustomAttribute(); @@ -96,12 +96,24 @@ namespace Squidex.Extensions.Actions } } - public static void RegisterTypes(TypeNameRegistry typeNameRegistry) + public static TypeNameRegistry MapRuleActions(this TypeNameRegistry typeNameRegistry) { foreach (var actionType in ActionTypes.Values) { typeNameRegistry.Map(actionType.Type, actionType.Type.Name); } + + return typeNameRegistry; + } + + private static string GetActionName(Type type) + { + return type.TypeName(false, ActionSuffix, ActionSuffixV2); + } + + private static string GetTriggerName(Type type) + { + return type.TypeName(false, TriggerSuffix, TriggerSuffixV2); } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/AssetChangedTriggerV2.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/AssetChangedTriggerV2.cs index 3d414227b..70c9bc3ad 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/AssetChangedTriggerV2.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/AssetChangedTriggerV2.cs @@ -12,8 +12,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers [TypeName(nameof(AssetChangedTriggerV2))] public sealed class AssetChangedTriggerV2 : RuleTrigger { - public const string Name = "AssetChanged"; - public string Condition { get; set; } public override T Accept(IRuleTriggerVisitor visitor) diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerV2.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerV2.cs index 0228a781b..ed1d9b033 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerV2.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerV2.cs @@ -13,8 +13,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers [TypeName(nameof(ContentChangedTriggerV2))] public sealed class ContentChangedTriggerV2 : RuleTrigger { - public const string Name = "ContentChanged"; - public ReadOnlyCollection Schemas { get; set; } public bool HandleAll { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/UsageTrigger.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/UsageTrigger.cs index 60f266d78..701f6e67d 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/UsageTrigger.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/UsageTrigger.cs @@ -12,8 +12,6 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers [TypeName(nameof(UsageTrigger))] public sealed class UsageTrigger : RuleTrigger { - public const string Name = "Usage"; - public int Limit { get; set; } public int? NumDays { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs index 8a970c2af..27ee0a32f 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/ArrayFieldProperties.cs @@ -6,11 +6,9 @@ // ========================================================================== using System; -using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("ArrayField")] public sealed class ArrayFieldProperties : FieldProperties { public int? MinItems { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs index 0cc74af29..49e4d3c63 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/AssetsFieldProperties.cs @@ -5,12 +5,10 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; using System.Collections.ObjectModel; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("AssetsField")] public sealed class AssetsFieldProperties : FieldProperties { public bool MustBeImage { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs index 435f9c529..abf76f41d 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/BooleanFieldProperties.cs @@ -5,11 +5,8 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; - namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("BooleanField")] public sealed class BooleanFieldProperties : FieldProperties { public bool? DefaultValue { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs index 3e79836f0..ca80bf2f4 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/DateTimeFieldProperties.cs @@ -6,11 +6,9 @@ // ========================================================================== using NodaTime; -using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("DateTimeField")] public sealed class DateTimeFieldProperties : FieldProperties { public Instant? MaxValue { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldRegistry.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldRegistry.cs index 17876b6e7..f4049da06 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldRegistry.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/FieldRegistry.cs @@ -14,24 +14,26 @@ namespace Squidex.Domain.Apps.Core.Schemas { public static class FieldRegistry { - public static void Setup(TypeNameRegistry typeNameRegistry) - { - Guard.NotNull(typeNameRegistry, nameof(typeNameRegistry)); + private const string Suffix = "Properties"; + private const string SuffixOld = "FieldProperties"; - var types = typeof(FieldRegistry).Assembly.GetTypes().Where(x => x.BaseType == typeof(FieldProperties)); + public static TypeNameRegistry MapFields(this TypeNameRegistry typeNameRegistry) + { + var types = typeof(FieldRegistry).Assembly.GetTypes().Where(x => typeof(FieldProperties).IsAssignableFrom(x) && !x.IsAbstract); - var supportedFields = new HashSet(); + var addedTypes = new HashSet(); foreach (var type in types) { - if (supportedFields.Add(type)) + if (addedTypes.Add(type)) { - typeNameRegistry.Map(type); + typeNameRegistry.Map(type, type.TypeName(false, Suffix)); + + typeNameRegistry.MapObsolete(type, type.TypeName(false, SuffixOld)); } } - typeNameRegistry.MapObsolete(typeof(ReferencesFieldProperties), "References"); - typeNameRegistry.MapObsolete(typeof(DateTimeFieldProperties), "DateTime"); + return typeNameRegistry; } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs index fadf558fa..b6f0a9804 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/GeolocationFieldProperties.cs @@ -5,11 +5,8 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; - namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("GeolocationField")] public sealed class GeolocationFieldProperties : FieldProperties { public GeolocationFieldEditor Editor { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs index 87a5adea6..b7dfb78d4 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/JsonFieldProperties.cs @@ -5,11 +5,9 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("JsonField")] public sealed class JsonFieldProperties : FieldProperties { public override T Accept(IFieldPropertiesVisitor visitor) diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs index b97c73409..dedbe213f 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/NumberFieldProperties.cs @@ -5,12 +5,10 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; using System.Collections.ObjectModel; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("NumberField")] public sealed class NumberFieldProperties : FieldProperties { public ReadOnlyCollection AllowedValues { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs index 71cfe0cff..c6af16a90 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/ReferencesFieldProperties.cs @@ -6,11 +6,9 @@ // ========================================================================== using System; -using Squidex.Infrastructure; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("ReferencesField")] public sealed class ReferencesFieldProperties : FieldProperties { public int? MinItems { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs index 909e72b21..1b28964ac 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/StringFieldProperties.cs @@ -5,12 +5,10 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; using System.Collections.ObjectModel; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("StringField")] public sealed class StringFieldProperties : FieldProperties { public ReadOnlyCollection AllowedValues { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs index aeaf2074a..d81043aba 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/TagsFieldProperties.cs @@ -5,12 +5,10 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using Squidex.Infrastructure; using System.Collections.ObjectModel; namespace Squidex.Domain.Apps.Core.Schemas { - [TypeName("TagsField")] public sealed class TagsFieldProperties : FieldProperties { public ReadOnlyCollection AllowedValues { get; set; } diff --git a/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs new file mode 100644 index 000000000..31228cadd --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Operations/HandleRules/RuleRegistry.cs @@ -0,0 +1,46 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using System.Collections.Generic; +using System.Linq; +using Squidex.Domain.Apps.Core.HandleRules.EnrichedEvents; +using Squidex.Domain.Apps.Core.Rules; +using Squidex.Infrastructure; + +namespace Squidex.Domain.Apps.Core.HandleRules +{ + public static class RuleRegistry + { + public static TypeNameRegistry MapRules(this TypeNameRegistry typeNameRegistry) + { + var eventTypes = typeof(EnrichedEvent).Assembly.GetTypes().Where(x => typeof(EnrichedEvent).IsAssignableFrom(x) && !x.IsAbstract); + + var addedTypes = new HashSet(); + + foreach (var type in eventTypes) + { + if (addedTypes.Add(type)) + { + typeNameRegistry.Map(type, type.Name); + } + } + + var triggerTypes = typeof(RuleTrigger).Assembly.GetTypes().Where(x => typeof(RuleTrigger).IsAssignableFrom(x) && !x.IsAbstract); + + foreach (var type in triggerTypes) + { + if (addedTypes.Add(type)) + { + typeNameRegistry.Map(type, type.Name); + } + } + + return typeNameRegistry; + } + } +} diff --git a/src/Squidex.Infrastructure/Json/Newtonsoft/TypeNameSerializationBinder.cs b/src/Squidex.Infrastructure/Json/Newtonsoft/TypeNameSerializationBinder.cs index 326be55e7..4e2196cb9 100644 --- a/src/Squidex.Infrastructure/Json/Newtonsoft/TypeNameSerializationBinder.cs +++ b/src/Squidex.Infrastructure/Json/Newtonsoft/TypeNameSerializationBinder.cs @@ -35,7 +35,7 @@ namespace Squidex.Infrastructure.Json.Newtonsoft if (typeName == null) { - throw new JsonException("Trying to serialize object with type name."); + throw new JsonException($"Trying to serialize object with type name {serializedType}."); } } } diff --git a/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs b/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs index e7b30bca6..b482f42ea 100644 --- a/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs +++ b/src/Squidex.Infrastructure/States/DefaultStreamNameResolver.cs @@ -18,19 +18,7 @@ namespace Squidex.Infrastructure.States Guard.NotNullOrEmpty(id, nameof(id)); Guard.NotNull(aggregateType, nameof(aggregateType)); - var typeName = char.ToLower(aggregateType.Name[0]) + aggregateType.Name.Substring(1); - - foreach (var suffix in Suffixes) - { - if (typeName.EndsWith(suffix, StringComparison.Ordinal)) - { - typeName = typeName.Substring(0, typeName.Length - suffix.Length); - - break; - } - } - - return $"{typeName}-{id}"; + return $"{aggregateType.TypeName(true, Suffixes)}-{id}"; } public string WithNewId(string streamName, Func idGenerator) diff --git a/src/Squidex.Infrastructure/TypeNameBuilder.cs b/src/Squidex.Infrastructure/TypeNameBuilder.cs new file mode 100644 index 000000000..42725d610 --- /dev/null +++ b/src/Squidex.Infrastructure/TypeNameBuilder.cs @@ -0,0 +1,34 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; + +namespace Squidex.Infrastructure +{ + public static class TypeNameBuilder + { + public static string TypeName(this Type type, bool camelCase, params string[] suffixes) + { + var typeName = type.Name; + + if (suffixes != null) + { + foreach (var suffix in suffixes) + { + if (typeName.EndsWith(suffix, StringComparison.Ordinal)) + { + typeName = typeName.Substring(0, typeName.Length - suffix.Length); + + break; + } + } + } + + return camelCase ? typeName.ToCamelCase() : typeName; + } + } +} diff --git a/src/Squidex/Config/Domain/SerializationServices.cs b/src/Squidex/Config/Domain/SerializationServices.cs index 9ec50ed28..04646016c 100644 --- a/src/Squidex/Config/Domain/SerializationServices.cs +++ b/src/Squidex/Config/Domain/SerializationServices.cs @@ -11,6 +11,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Squidex.Domain.Apps.Core; using Squidex.Domain.Apps.Core.Apps.Json; +using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; @@ -25,19 +26,20 @@ namespace Squidex.Config.Domain public static class SerializationServices { private static readonly TypeNameRegistry TypeNameRegistry = - new TypeNameRegistry() - .MapUnmapped(SquidexCoreModel.Assembly) - .MapUnmapped(SquidexEvents.Assembly) - .MapUnmapped(SquidexInfrastructure.Assembly) - .MapUnmapped(SquidexMigrations.Assembly); + new TypeNameRegistry() + .MapFields() + .MapRules() + .MapRuleActions() + .MapUnmapped(SquidexCoreModel.Assembly) + .MapUnmapped(SquidexEvents.Assembly) + .MapUnmapped(SquidexInfrastructure.Assembly) + .MapUnmapped(SquidexMigrations.Assembly); public static readonly JsonSerializerSettings DefaultJsonSettings = new JsonSerializerSettings(); public static readonly JsonSerializer DefaultJsonSerializer; private static void ConfigureJson(JsonSerializerSettings settings, TypeNameHandling typeNameHandling) { - RuleElementRegistry.RegisterTypes(TypeNameRegistry); - settings.SerializationBinder = new TypeNameSerializationBinder(TypeNameRegistry); settings.ContractResolver = new ConverterContractResolver( @@ -69,8 +71,6 @@ namespace Squidex.Config.Domain static SerializationServices() { - FieldRegistry.Setup(TypeNameRegistry); - ConfigureJson(DefaultJsonSettings, TypeNameHandling.Auto); DefaultJsonSerializer = JsonSerializer.Create(DefaultJsonSettings); diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs index 225e4c8d5..e368cca59 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Rules/RuleTests.cs @@ -11,6 +11,7 @@ using System.Linq; using FluentAssertions; using Squidex.Domain.Apps.Core.Rules; using Squidex.Domain.Apps.Core.Rules.Triggers; +using Squidex.Infrastructure; using Xunit; #pragma warning disable SA1310 // Field names must not contain underscore @@ -36,11 +37,13 @@ namespace Squidex.Domain.Apps.Core.Model.Rules } } + [TypeName(nameof(TestAction1))] public sealed class TestAction1 : RuleAction { public string Property { get; set; } } + [TypeName(nameof(TestAction2))] public sealed class TestAction2 : RuleAction { public string Property { get; set; } diff --git a/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs b/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs index ef69a262a..6723ddeb2 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs @@ -11,6 +11,7 @@ using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Squidex.Domain.Apps.Core.Apps.Json; +using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; @@ -28,7 +29,11 @@ namespace Squidex.Domain.Apps.Core public static IJsonSerializer CreateSerializer(TypeNameHandling typeNameHandling = TypeNameHandling.Auto) { - var typeNameRegistry = new TypeNameRegistry(); + var typeNameRegistry = + new TypeNameRegistry() + .MapFields() + .MapRules() + .MapUnmapped(typeof(TestUtils).Assembly); var serializerSettings = new JsonSerializerSettings {