From de881c88a311e5e435598b16e30c8e6811c02b20 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 16:14:04 +0200 Subject: [PATCH] Finalize status. --- .../Contents/Json/StatusConverter.cs | 42 +++++++++++++ .../Contents/Status2.cs | 2 +- .../Config/Domain/SerializationServices.cs | 2 + .../Model/Contents/StatusTests.cs | 60 +++++++++++++++++++ .../TestUtils.cs | 2 + 5 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/Squidex.Domain.Apps.Core.Model/Contents/Json/StatusConverter.cs create mode 100644 tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/StatusTests.cs diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/Json/StatusConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/Json/StatusConverter.cs new file mode 100644 index 000000000..6c4266e08 --- /dev/null +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/Json/StatusConverter.cs @@ -0,0 +1,42 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Newtonsoft.Json; +using Squidex.Infrastructure.Json.Newtonsoft; +using System; +using System.Collections.Generic; + +namespace Squidex.Domain.Apps.Core.Contents.Json +{ + public sealed class StatusConverter : JsonConverter, ISupportedTypes + { + public IEnumerable SupportedTypes + { + get { yield return typeof(Status2); } + } + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + writer.WriteValue(value.ToString()); + } + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType != JsonToken.String) + { + throw new JsonException($"Expected String, but got {reader.TokenType}."); + } + + return new Status2(reader.Value.ToString()); + } + + public override bool CanConvert(Type objectType) + { + return objectType == typeof(Status2); + } + } +} diff --git a/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs b/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs index 3e684bbe7..7ce6e830c 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Contents/Status2.cs @@ -35,7 +35,7 @@ namespace Squidex.Domain.Apps.Core.Contents public override int GetHashCode() { - return base.GetHashCode(); + return Name.GetHashCode(); } public override string ToString() diff --git a/src/Squidex/Config/Domain/SerializationServices.cs b/src/Squidex/Config/Domain/SerializationServices.cs index 0b1f7cfce..44aadc738 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.Contents.Json; using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas.Json; @@ -44,6 +45,7 @@ namespace Squidex.Config.Domain new RolesConverter(), new RuleConverter(), new SchemaConverter(), + new StatusConverter(), new StringEnumConverter()); settings.NullValueHandling = NullValueHandling.Ignore; diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/StatusTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/StatusTests.cs new file mode 100644 index 000000000..5abdd5f2d --- /dev/null +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Contents/StatusTests.cs @@ -0,0 +1,60 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Squidex.Domain.Apps.Core.Contents; +using Xunit; + +namespace Squidex.Domain.Apps.Core.Model.Contents +{ + public class StatusTests + { + [Fact] + public void Should_initialize_status_from_string() + { + var result = new Status2("Draft"); + + Assert.Equal("Draft", result.Name); + Assert.Equal("Draft", result.ToString()); + } + + [Fact] + public void Should_provide_published_status() + { + var result = Status2.Published; + + Assert.Equal("Published", result.Name); + Assert.Equal("Published", result.ToString()); + } + + [Fact] + public void Should_make_correct_equal_comparisons() + { + var status_1_a = new Status2("Draft"); + var status_1_b = new Status2("Draft"); + + var status2_a = new Status2("Published"); + + Assert.Equal(status_1_a, status_1_b); + Assert.Equal(status_1_a.GetHashCode(), status_1_b.GetHashCode()); + Assert.True(status_1_a.Equals((object)status_1_b)); + + Assert.NotEqual(status_1_a, status2_a); + Assert.NotEqual(status_1_a.GetHashCode(), status2_a.GetHashCode()); + Assert.False(status_1_a.Equals((object)status2_a)); + } + + [Fact] + public void Should_serialize_and_deserialize() + { + var status = new Status2("Draft"); + + var serialized = status.SerializeAndDeserialize(); + + Assert.Equal(status, serialized); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs b/tests/Squidex.Domain.Apps.Core.Tests/TestUtils.cs index e3e34b385..58692226c 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.Contents.Json; using Squidex.Domain.Apps.Core.HandleRules; using Squidex.Domain.Apps.Core.Rules.Json; using Squidex.Domain.Apps.Core.Schemas; @@ -56,6 +57,7 @@ namespace Squidex.Domain.Apps.Core new RolesConverter(), new RuleConverter(), new SchemaConverter(), + new StatusConverter(), new StringEnumConverter()), TypeNameHandling = typeNameHandling