diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppClientsConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppClientsConverter.cs index 908f78c08..16570c87b 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppClientsConverter.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppClientsConverter.cs @@ -6,21 +6,19 @@ // All rights reserved. // ========================================================================== -using System; using System.Collections.Generic; using Newtonsoft.Json; +using Squidex.Infrastructure.Json; namespace Squidex.Domain.Apps.Core.Apps.Json { - public sealed class AppClientsConverter : JsonConverter + public sealed class AppClientsConverter : JsonClassConverter { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, AppClients value, JsonSerializer serializer) { - var clients = (AppClients)value; + var json = new Dictionary(value.Count); - var json = new Dictionary(clients.Count); - - foreach (var client in clients) + foreach (var client in value) { json.Add(client.Key, new JsonAppClient(client.Value)); } @@ -28,7 +26,7 @@ namespace Squidex.Domain.Apps.Core.Apps.Json serializer.Serialize(writer, json); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override AppClients ReadValue(JsonReader reader, JsonSerializer serializer) { var json = serializer.Deserialize>(reader); @@ -41,10 +39,5 @@ namespace Squidex.Domain.Apps.Core.Apps.Json return clients; } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(AppClients); - } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppContributorsConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppContributorsConverter.cs index 98c45ad6e..efa326377 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppContributorsConverter.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/AppContributorsConverter.cs @@ -6,21 +6,19 @@ // All rights reserved. // ========================================================================== -using System; using System.Collections.Generic; using Newtonsoft.Json; +using Squidex.Infrastructure.Json; namespace Squidex.Domain.Apps.Core.Apps.Json { - public sealed class AppContributorsConverter : JsonConverter + public sealed class AppContributorsConverter : JsonClassConverter { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, AppContributors value, JsonSerializer serializer) { - var contributors = (AppContributors)value; + var json = new Dictionary(value.Count); - var json = new Dictionary(contributors.Count); - - foreach (var contributor in contributors) + foreach (var contributor in value) { json.Add(contributor.Key, contributor.Value); } @@ -28,7 +26,7 @@ namespace Squidex.Domain.Apps.Core.Apps.Json serializer.Serialize(writer, json); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override AppContributors ReadValue(JsonReader reader, JsonSerializer serializer) { var json = serializer.Deserialize>(reader); @@ -41,10 +39,5 @@ namespace Squidex.Domain.Apps.Core.Apps.Json return contributors; } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(AppContributors); - } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs index d1f5d6485..af52f34a9 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/Json/LanguagesConfigConverter.cs @@ -6,21 +6,19 @@ // All rights reserved. // ========================================================================== -using System; using System.Collections.Generic; using Newtonsoft.Json; +using Squidex.Infrastructure.Json; namespace Squidex.Domain.Apps.Core.Apps.Json { - public sealed class LanguagesConfigConverter : JsonConverter + public sealed class LanguagesConfigConverter : JsonClassConverter { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, LanguagesConfig value, JsonSerializer serializer) { - var languagesConfig = (LanguagesConfig)value; + var json = new Dictionary(value.Count); - var json = new Dictionary(languagesConfig.Count); - - foreach (var config in languagesConfig.Configs) + foreach (LanguageConfig config in value) { json.Add(config.Language, new JsonLanguageConfig(config)); } @@ -28,7 +26,7 @@ namespace Squidex.Domain.Apps.Core.Apps.Json serializer.Serialize(writer, json); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override LanguagesConfig ReadValue(JsonReader reader, JsonSerializer serializer) { var json = serializer.Deserialize>(reader); @@ -43,10 +41,5 @@ namespace Squidex.Domain.Apps.Core.Apps.Json return LanguagesConfig.Build(languagesConfig); } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(LanguagesConfig); - } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs b/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs index 55d9101f7..57f857877 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs @@ -41,11 +41,6 @@ namespace Squidex.Domain.Apps.Core.Apps return state.Languages.Values.GetEnumerator(); } - public IEnumerable Configs - { - get { return state.Languages.Values; } - } - public int Count { get { return state.Languages.Count; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Schemas/Json/SchemaConverter.cs b/src/Squidex.Domain.Apps.Core.Model/Schemas/Json/SchemaConverter.cs index 5502fd3f9..317afa717 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Schemas/Json/SchemaConverter.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Schemas/Json/SchemaConverter.cs @@ -6,13 +6,13 @@ // All rights reserved. // ========================================================================== -using System; using Newtonsoft.Json; using Squidex.Infrastructure; +using Squidex.Infrastructure.Json; namespace Squidex.Domain.Apps.Core.Schemas.Json { - public sealed class SchemaConverter : JsonConverter + public sealed class SchemaConverter : JsonClassConverter { private readonly FieldRegistry fieldRegistry; @@ -23,19 +23,14 @@ namespace Squidex.Domain.Apps.Core.Schemas.Json this.fieldRegistry = fieldRegistry; } - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, Schema value, JsonSerializer serializer) { - serializer.Serialize(writer, new JsonSchemaModel((Schema)value)); + serializer.Serialize(writer, new JsonSchemaModel(value)); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override Schema ReadValue(JsonReader reader, JsonSerializer serializer) { return serializer.Deserialize(reader).ToSchema(fieldRegistry); } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(Schema); - } } } \ No newline at end of file diff --git a/src/Squidex.Infrastructure/Json/ClaimsPrincipalConverter.cs b/src/Squidex.Infrastructure/Json/ClaimsPrincipalConverter.cs new file mode 100644 index 000000000..aca3cdf7f --- /dev/null +++ b/src/Squidex.Infrastructure/Json/ClaimsPrincipalConverter.cs @@ -0,0 +1,62 @@ +// ========================================================================== +// ClaimsPrincipalConverter.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Linq; +using System.Security.Claims; +using Newtonsoft.Json; + +namespace Squidex.Infrastructure.Json +{ + public sealed class ClaimsPrincipalConverter : JsonClassConverter + { + private sealed class JsonIdentity + { + [JsonProperty] + public string AuthenticationType { get; set; } + + [JsonProperty] + public JsonClaim[] Claims { get; set; } + } + + private sealed class JsonClaim + { + [JsonProperty] + public string Type { get; set; } + + [JsonProperty] + public string Value { get; set; } + } + + protected override void WriteValue(JsonWriter writer, ClaimsPrincipal value, JsonSerializer serializer) + { + var jsonIdentities = + value.Identities.Select(identity => + new JsonIdentity + { + Claims = identity.Claims.Select(c => + { + return new JsonClaim { Type = c.Type, Value = c.Value }; + }).ToArray(), + AuthenticationType = identity.AuthenticationType + }).ToArray(); + + serializer.Serialize(writer, jsonIdentities); + } + + protected override ClaimsPrincipal ReadValue(JsonReader reader, JsonSerializer serializer) + { + var jsonIdentities = serializer.Deserialize(reader); + + return new ClaimsPrincipal( + jsonIdentities.Select(identity => + new ClaimsIdentity( + identity.Claims.Select(c => new Claim(c.Type, c.Value)), + identity.AuthenticationType))); + } + } +} diff --git a/src/Squidex.Infrastructure/Json/JsonClassConverter.cs b/src/Squidex.Infrastructure/Json/JsonClassConverter.cs new file mode 100644 index 000000000..a784d6397 --- /dev/null +++ b/src/Squidex.Infrastructure/Json/JsonClassConverter.cs @@ -0,0 +1,46 @@ +// ========================================================================== +// JsonClassConverter.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System; +using Newtonsoft.Json; + +namespace Squidex.Infrastructure.Json +{ + public abstract class JsonClassConverter : JsonConverter where T : class + { + public sealed override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + + return ReadValue(reader, serializer); + } + + public sealed override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + return; + } + + WriteValue(writer, (T)value, serializer); + } + + public override bool CanConvert(Type objectType) + { + return objectType == typeof(T); + } + + protected abstract void WriteValue(JsonWriter writer, T value, JsonSerializer serializer); + + protected abstract T ReadValue(JsonReader reader, JsonSerializer serializer); + } +} diff --git a/src/Squidex.Infrastructure/Json/LanguageConverter.cs b/src/Squidex.Infrastructure/Json/LanguageConverter.cs index 38cacbba3..25d2fa296 100644 --- a/src/Squidex.Infrastructure/Json/LanguageConverter.cs +++ b/src/Squidex.Infrastructure/Json/LanguageConverter.cs @@ -6,26 +6,25 @@ // All rights reserved. // ========================================================================== -using System; using Newtonsoft.Json; namespace Squidex.Infrastructure.Json { - public sealed class LanguageConverter : JsonConverter + public sealed class LanguageConverter : JsonClassConverter { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, Language value, JsonSerializer serializer) { - writer.WriteValue(((Language)value).Iso2Code); + writer.WriteValue(value.Iso2Code); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override Language ReadValue(JsonReader reader, JsonSerializer serializer) { - return reader.TokenType == JsonToken.Null ? null : Language.GetLanguage((string)reader.Value); - } + if (reader.TokenType != JsonToken.String) + { + throw new JsonException($"Expected String, but got {reader.TokenType}."); + } - public override bool CanConvert(Type objectType) - { - return objectType == typeof(Language); + return Language.GetLanguage(reader.Value.ToString()); } } } diff --git a/src/Squidex.Infrastructure/Json/NamedGuidIdConverter.cs b/src/Squidex.Infrastructure/Json/NamedGuidIdConverter.cs index a594d773e..9e572d2c3 100644 --- a/src/Squidex.Infrastructure/Json/NamedGuidIdConverter.cs +++ b/src/Squidex.Infrastructure/Json/NamedGuidIdConverter.cs @@ -12,23 +12,21 @@ using Newtonsoft.Json; namespace Squidex.Infrastructure.Json { - public sealed class NamedGuidIdConverter : JsonConverter + public sealed class NamedGuidIdConverter : JsonClassConverter> { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, NamedId value, JsonSerializer serializer) { - var namedId = (NamedId)value; - - writer.WriteValue($"{namedId.Id},{namedId.Name}"); + writer.WriteValue($"{value.Id},{value.Name}"); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override NamedId ReadValue(JsonReader reader, JsonSerializer serializer) { - if (reader.TokenType == JsonToken.Null) + if (reader.TokenType != JsonToken.String) { - return null; + throw new JsonException($"Expected String, but got {reader.TokenType}."); } - var parts = ((string)reader.Value).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + var parts = reader.Value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length < 2) { @@ -42,10 +40,5 @@ namespace Squidex.Infrastructure.Json return new NamedId(id, string.Join(",", parts.Skip(1))); } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(NamedId); - } } } diff --git a/src/Squidex.Infrastructure/Json/NamedLongIdConverter.cs b/src/Squidex.Infrastructure/Json/NamedLongIdConverter.cs index 1993fd1f2..f81b62650 100644 --- a/src/Squidex.Infrastructure/Json/NamedLongIdConverter.cs +++ b/src/Squidex.Infrastructure/Json/NamedLongIdConverter.cs @@ -12,23 +12,21 @@ using Newtonsoft.Json; namespace Squidex.Infrastructure.Json { - public sealed class NamedLongIdConverter : JsonConverter + public sealed class NamedLongIdConverter : JsonClassConverter> { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, NamedId value, JsonSerializer serializer) { - var namedId = (NamedId)value; - - writer.WriteValue($"{namedId.Id},{namedId.Name}"); + writer.WriteValue($"{value.Id},{value.Name}"); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override NamedId ReadValue(JsonReader reader, JsonSerializer serializer) { - if (reader.TokenType == JsonToken.Null) + if (reader.TokenType != JsonToken.String) { - return null; + throw new JsonException($"Expected String, but got {reader.TokenType}."); } - var parts = ((string)reader.Value).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + var parts = reader.Value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length < 2) { @@ -42,10 +40,5 @@ namespace Squidex.Infrastructure.Json return new NamedId(id, string.Join(",", parts.Skip(1))); } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(NamedId); - } } } diff --git a/src/Squidex.Infrastructure/Json/NamedStringIdConverter.cs b/src/Squidex.Infrastructure/Json/NamedStringIdConverter.cs index ddc81b39c..4fb5a379e 100644 --- a/src/Squidex.Infrastructure/Json/NamedStringIdConverter.cs +++ b/src/Squidex.Infrastructure/Json/NamedStringIdConverter.cs @@ -12,23 +12,21 @@ using Newtonsoft.Json; namespace Squidex.Infrastructure.Json { - public sealed class NamedStringIdConverter : JsonConverter + public sealed class NamedStringIdConverter : JsonClassConverter> { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, NamedId value, JsonSerializer serializer) { - var namedId = (NamedId)value; - - writer.WriteValue($"{namedId.Id},{namedId.Name}"); + writer.WriteValue($"{value.Id},{value.Name}"); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override NamedId ReadValue(JsonReader reader, JsonSerializer serializer) { - if (reader.TokenType == JsonToken.Null) + if (reader.TokenType != JsonToken.String) { - return null; + throw new JsonException($"Expected String, but got {reader.TokenType}."); } - var parts = ((string)reader.Value).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + var parts = reader.Value.ToString().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length < 2) { @@ -37,10 +35,5 @@ namespace Squidex.Infrastructure.Json return new NamedId(parts[0], string.Join(",", parts.Skip(1))); } - - public override bool CanConvert(Type objectType) - { - return objectType == typeof(NamedId); - } } } diff --git a/src/Squidex.Infrastructure/Json/PropertiesBagConverter.cs b/src/Squidex.Infrastructure/Json/PropertiesBagConverter.cs index f75bf6578..fad3d3243 100644 --- a/src/Squidex.Infrastructure/Json/PropertiesBagConverter.cs +++ b/src/Squidex.Infrastructure/Json/PropertiesBagConverter.cs @@ -13,15 +13,36 @@ using NodaTime.Extensions; namespace Squidex.Infrastructure.Json { - public sealed class PropertiesBagConverter : JsonConverter + public sealed class PropertiesBagConverter : JsonClassConverter { - public override bool CanConvert(Type objectType) + protected override void WriteValue(JsonWriter writer, PropertiesBag value, JsonSerializer serializer) { - return typeof(PropertiesBag).IsAssignableFrom(objectType); + writer.WriteStartObject(); + + foreach (var kvp in value.Properties) + { + writer.WritePropertyName(kvp.Key); + + if (kvp.Value.RawValue is Instant) + { + writer.WriteValue(kvp.Value.ToString()); + } + else + { + writer.WriteValue(kvp.Value.RawValue); + } + } + + writer.WriteEndObject(); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override PropertiesBag ReadValue(JsonReader reader, JsonSerializer serializer) { + if (reader.TokenType != JsonToken.StartObject) + { + throw new JsonException($"Expected Object, but got {reader.TokenType}."); + } + var properties = new PropertiesBag(); while (reader.Read()) @@ -50,27 +71,9 @@ namespace Squidex.Infrastructure.Json return properties; } - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override bool CanConvert(Type objectType) { - var properties = (PropertiesBag)value; - - writer.WriteStartObject(); - - foreach (var kvp in properties.Properties) - { - writer.WritePropertyName(kvp.Key); - - if (kvp.Value.RawValue is Instant) - { - writer.WriteValue(kvp.Value.ToString()); - } - else - { - writer.WriteValue(kvp.Value.RawValue); - } - } - - writer.WriteEndObject(); + return typeof(PropertiesBag).IsAssignableFrom(objectType); } } } diff --git a/src/Squidex.Infrastructure/Json/RefTokenConverter.cs b/src/Squidex.Infrastructure/Json/RefTokenConverter.cs index 7dcb1d3db..9964c7f3a 100644 --- a/src/Squidex.Infrastructure/Json/RefTokenConverter.cs +++ b/src/Squidex.Infrastructure/Json/RefTokenConverter.cs @@ -6,26 +6,25 @@ // All rights reserved. // ========================================================================== -using System; using Newtonsoft.Json; namespace Squidex.Infrastructure.Json { - public sealed class RefTokenConverter : JsonConverter + public sealed class RefTokenConverter : JsonClassConverter { - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + protected override void WriteValue(JsonWriter writer, RefToken value, JsonSerializer serializer) { writer.WriteValue(value.ToString()); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + protected override RefToken ReadValue(JsonReader reader, JsonSerializer serializer) { - return reader.TokenType == JsonToken.Null ? null : RefToken.Parse((string)reader.Value); - } + if (reader.TokenType != JsonToken.String) + { + throw new JsonException($"Expected String, but got {reader.TokenType}."); + } - public override bool CanConvert(Type objectType) - { - return objectType == typeof(RefToken); + return RefToken.Parse(reader.Value.ToString()); } } } \ No newline at end of file diff --git a/src/Squidex/Config/Domain/Serializers.cs b/src/Squidex/Config/Domain/Serializers.cs index dd1495265..400333d51 100644 --- a/src/Squidex/Config/Domain/Serializers.cs +++ b/src/Squidex/Config/Domain/Serializers.cs @@ -36,6 +36,7 @@ namespace Squidex.Config.Domain settings.ContractResolver = new ConverterContractResolver( new AppClientsConverter(), new AppContributorsConverter(), + new ClaimsPrincipalConverter(), new InstantConverter(), new LanguageConverter(), new LanguagesConfigConverter(), diff --git a/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs b/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs index 1614dc8ef..a3fb1aafa 100644 --- a/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs +++ b/tests/Squidex.Domain.Apps.Core.Tests/Model/Apps/LanguagesConfigTests.cs @@ -172,14 +172,6 @@ namespace Squidex.Domain.Apps.Core.Model.Apps config.Remove(Language.EN); } - [Fact] - public void Should_throw_exception_if_language_to_remove_is_master_language() - { - var config = LanguagesConfig.Build(Language.DE); - - Assert.Throws(() => config.Remove(Language.DE)); - } - [Fact] public void Should_update_language() { diff --git a/tests/Squidex.Infrastructure.Tests/Json/ClaimsPrincipalConverterTests.cs b/tests/Squidex.Infrastructure.Tests/Json/ClaimsPrincipalConverterTests.cs new file mode 100644 index 000000000..727c7e2c6 --- /dev/null +++ b/tests/Squidex.Infrastructure.Tests/Json/ClaimsPrincipalConverterTests.cs @@ -0,0 +1,54 @@ +// ========================================================================== +// ClaimsPrincipalConverterTests.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using System.Linq; +using System.Security.Claims; +using Squidex.Infrastructure.TestHelpers; +using Xunit; + +namespace Squidex.Infrastructure.Json +{ + public class ClaimsPrincipalConverterTests + { + [Fact] + public void Should_serialize_and_deserialize() + { + var value = new ClaimsPrincipal( + new[] + { + new ClaimsIdentity( + new[] + { + new Claim("email", "me@email.de"), + new Claim("username", "me@email.de"), + }, + "Cookie"), + new ClaimsIdentity( + new[] + { + new Claim("user_id", "12345"), + new Claim("login", "me"), + }, + "Google") + }); + + var result = value.SerializeAndDeserializeAndReturn(new ClaimsPrincipalConverter()); + + Assert.Equal(value.Identities.ElementAt(0).AuthenticationType, result.Identities.ElementAt(0).AuthenticationType); + Assert.Equal(value.Identities.ElementAt(1).AuthenticationType, result.Identities.ElementAt(1).AuthenticationType); + } + + [Fact] + public void Should_serialize_and_deserialize_null_principal() + { + ClaimsPrincipal value = null; + + value.SerializeAndDeserialize(new ClaimsPrincipalConverter()); + } + } +} diff --git a/tests/Squidex.Infrastructure.Tests/Json/InstantConverterTests.cs b/tests/Squidex.Infrastructure.Tests/Json/InstantConverterTests.cs index 59d9492be..5db717293 100644 --- a/tests/Squidex.Infrastructure.Tests/Json/InstantConverterTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Json/InstantConverterTests.cs @@ -22,5 +22,21 @@ namespace Squidex.Infrastructure.Json value.SerializeAndDeserialize(new InstantConverter()); } + + [Fact] + public void Should_serialize_and_deserialize_nullable_with_value() + { + Instant? value = Instant.FromDateTimeUtc(DateTime.UtcNow.Date); + + value.SerializeAndDeserialize(new InstantConverter()); + } + + [Fact] + public void Should_serialize_and_deserialize_nullable_with_null() + { + Instant? value = null; + + value.SerializeAndDeserialize(new InstantConverter()); + } } } diff --git a/tests/Squidex.Infrastructure.Tests/LanguageTests.cs b/tests/Squidex.Infrastructure.Tests/LanguageTests.cs index feab2ba46..c4b900f36 100644 --- a/tests/Squidex.Infrastructure.Tests/LanguageTests.cs +++ b/tests/Squidex.Infrastructure.Tests/LanguageTests.cs @@ -42,18 +42,6 @@ namespace Squidex.Infrastructure Assert.True(Language.AllLanguages.Count() > 100); } - [Fact] - public void Should_serialize_and_deserialize_null_language() - { - JsonHelper.SerializeAndDeserialize(null, new LanguageConverter()); - } - - [Fact] - public void Should_serialize_and_deserialize_valid_language() - { - Language.DE.SerializeAndDeserialize(new LanguageConverter()); - } - [Fact] public void Should_return_true_for_valid_language() { @@ -120,5 +108,21 @@ namespace Squidex.Infrastructure Assert.Null(language); } + + [Fact] + public void Should_serialize_and_deserialize_null_language() + { + Language value = null; + + value.SerializeAndDeserialize(new LanguageConverter()); + } + + [Fact] + public void Should_serialize_and_deserialize_valid_language() + { + var value = Language.DE; + + value.SerializeAndDeserialize(new LanguageConverter()); + } } } diff --git a/tests/Squidex.Infrastructure.Tests/NamedIdTests.cs b/tests/Squidex.Infrastructure.Tests/NamedIdTests.cs index 04ca98112..5da1c9701 100644 --- a/tests/Squidex.Infrastructure.Tests/NamedIdTests.cs +++ b/tests/Squidex.Infrastructure.Tests/NamedIdTests.cs @@ -90,37 +90,49 @@ namespace Squidex.Infrastructure [Fact] public void Should_serialize_and_deserialize_null_guid_token() { - JsonHelper.SerializeAndDeserialize>(null, new NamedGuidIdConverter()); + NamedId value = null; + + value.SerializeAndDeserialize(new NamedGuidIdConverter()); } [Fact] public void Should_serialize_and_deserialize_valid_guid_token() { - new NamedId(Guid.NewGuid(), "my-name").SerializeAndDeserialize(new NamedGuidIdConverter()); + var value = new NamedId(Guid.NewGuid(), "my-name"); + + value.SerializeAndDeserialize(new NamedGuidIdConverter()); } [Fact] public void Should_serialize_and_deserialize_null_long_token() { - JsonHelper.SerializeAndDeserialize>(null, new NamedLongIdConverter()); + NamedId value = null; + + value.SerializeAndDeserialize(new NamedLongIdConverter()); } [Fact] public void Should_serialize_and_deserialize_valid_long_token() { - new NamedId(123, "my-name").SerializeAndDeserialize(new NamedLongIdConverter()); + var value = new NamedId(123, "my-name"); + + value.SerializeAndDeserialize(new NamedLongIdConverter()); } [Fact] public void Should_serialize_and_deserialize_null_string_token() { - JsonHelper.SerializeAndDeserialize>(null, new NamedStringIdConverter()); + NamedId value = null; + + value.SerializeAndDeserialize(new NamedStringIdConverter()); } [Fact] public void Should_serialize_and_deserialize_valid_string_token() { - new NamedId(Guid.NewGuid().ToString(), "my-name").SerializeAndDeserialize(new NamedStringIdConverter()); + var value = new NamedId(Guid.NewGuid().ToString(), "my-name"); + + value.SerializeAndDeserialize(new NamedStringIdConverter()); } [Fact] diff --git a/tests/Squidex.Infrastructure.Tests/RefTokenTests.cs b/tests/Squidex.Infrastructure.Tests/RefTokenTests.cs index 96dfd765e..3fea6b2c4 100644 --- a/tests/Squidex.Infrastructure.Tests/RefTokenTests.cs +++ b/tests/Squidex.Infrastructure.Tests/RefTokenTests.cs @@ -108,13 +108,17 @@ namespace Squidex.Infrastructure [Fact] public void Should_serialize_and_deserialize_null_token() { - JsonHelper.SerializeAndDeserialize(null, new RefTokenConverter()); + RefToken value = null; + + value.SerializeAndDeserialize(new RefTokenConverter()); } [Fact] public void Should_serialize_and_deserialize_valid_token() { - RefToken.Parse("client:client1").SerializeAndDeserialize(new RefTokenConverter()); + var value = RefToken.Parse("client:client1"); + + value.SerializeAndDeserialize(new RefTokenConverter()); } } } diff --git a/tests/Squidex.Infrastructure.Tests/TestHelpers/JsonHelper.cs b/tests/Squidex.Infrastructure.Tests/TestHelpers/JsonHelper.cs index d1585a0dc..394475828 100644 --- a/tests/Squidex.Infrastructure.Tests/TestHelpers/JsonHelper.cs +++ b/tests/Squidex.Infrastructure.Tests/TestHelpers/JsonHelper.cs @@ -30,6 +30,13 @@ namespace Squidex.Infrastructure.TestHelpers } public static void SerializeAndDeserialize(this T value, JsonConverter converter) + { + var output = SerializeAndDeserializeAndReturn(value, converter); + + Assert.Equal(value, output); + } + + public static T SerializeAndDeserializeAndReturn(this T value, JsonConverter converter) { var serializerSettings = new JsonSerializerSettings(); @@ -39,7 +46,7 @@ namespace Squidex.Infrastructure.TestHelpers var result = JsonConvert.SerializeObject(Tuple.Create(value), serializerSettings); var output = JsonConvert.DeserializeObject>(result, serializerSettings); - Assert.Equal(value, output.Item1); + return output.Item1; } public static void DoesNotDeserialize(string value, JsonConverter converter)