mirror of https://github.com/Squidex/squidex.git
26 changed files with 391 additions and 103 deletions
@ -0,0 +1,44 @@ |
|||
// ==========================================================================
|
|||
// ConverterContractResolver.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using Newtonsoft.Json; |
|||
using Newtonsoft.Json.Serialization; |
|||
|
|||
namespace Squidex.Infrastructure.Json |
|||
{ |
|||
public sealed class ConverterContractResolver : CamelCasePropertyNamesContractResolver |
|||
{ |
|||
private readonly JsonConverter[] converters; |
|||
|
|||
public ConverterContractResolver(params JsonConverter[] converters) |
|||
{ |
|||
this.converters = converters; |
|||
} |
|||
|
|||
protected override JsonConverter ResolveContractConverter(Type objectType) |
|||
{ |
|||
var result = base.ResolveContractConverter(objectType); |
|||
|
|||
if (result != null) |
|||
{ |
|||
return result; |
|||
} |
|||
|
|||
foreach (var converter in converters) |
|||
{ |
|||
if (converter.CanConvert(objectType)) |
|||
{ |
|||
return converter; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
// ==========================================================================
|
|||
// SchemaExtensions.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Linq; |
|||
using Microsoft.OData.Core.UriParser; |
|||
using Microsoft.OData.Edm; |
|||
|
|||
namespace Squidex.Read.MongoDb.Contents.Visitors |
|||
{ |
|||
public static class EdmModelExtensions |
|||
{ |
|||
public static ODataUriParser ParseQuery(this IEdmModel model, string query) |
|||
{ |
|||
var path = model.EntityContainer.EntitySets().First().Path.Path.Last().Split('.').Last(); |
|||
|
|||
var parser = new ODataUriParser(model, new Uri($"{path}?{query}", UriKind.Relative)); |
|||
|
|||
return parser; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,84 @@ |
|||
// ==========================================================================
|
|||
// ConverterContractResolverTests.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using Newtonsoft.Json; |
|||
using NodaTime; |
|||
using Squidex.Infrastructure.TestHelpers; |
|||
using Xunit; |
|||
|
|||
namespace Squidex.Infrastructure.Json |
|||
{ |
|||
public class ConverterContractResolverTests |
|||
{ |
|||
public class MyClass |
|||
{ |
|||
[JsonConverter(typeof(TodayConverter))] |
|||
public Instant MyProperty { get; set; } |
|||
} |
|||
|
|||
public sealed class TodayConverter : JsonConverter |
|||
{ |
|||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) |
|||
{ |
|||
writer.WriteValue("TODAY"); |
|||
} |
|||
|
|||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) |
|||
{ |
|||
throw new NotImplementedException(); |
|||
} |
|||
|
|||
public override bool CanConvert(Type objectType) |
|||
{ |
|||
return objectType == typeof(Instant); |
|||
} |
|||
} |
|||
|
|||
[Fact] |
|||
public void Should_respect_property_converter() |
|||
{ |
|||
var value = Instant.FromDateTimeUtc(DateTime.UtcNow.Date); |
|||
|
|||
var serializerSettings = new JsonSerializerSettings |
|||
{ |
|||
ContractResolver = new ConverterContractResolver(new InstantConverter()) |
|||
}; |
|||
|
|||
var json = JsonConvert.SerializeObject(new MyClass { MyProperty = value }, serializerSettings); |
|||
|
|||
Assert.Equal(@"{ ""MyProperty"": ""TODAY"" }", json); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Should_ignore_other_converters() |
|||
{ |
|||
var value = Instant.FromDateTimeUtc(DateTime.UtcNow.Date); |
|||
|
|||
var serializerSettings = new JsonSerializerSettings |
|||
{ |
|||
ContractResolver = new ConverterContractResolver(new InstantConverter()) |
|||
}; |
|||
|
|||
serializerSettings.Converters.Add(new TodayConverter()); |
|||
|
|||
var result = JsonConvert.SerializeObject(Tuple.Create(value), serializerSettings); |
|||
var output = JsonConvert.DeserializeObject<Tuple<Instant>>(result, serializerSettings); |
|||
|
|||
Assert.Equal(value, output.Item1); |
|||
} |
|||
|
|||
[Fact] |
|||
public void Should_serialize_and_deserialize_instant() |
|||
{ |
|||
var value = Instant.FromDateTimeUtc(DateTime.UtcNow.Date); |
|||
|
|||
value.SerializeAndDeserialize(new ConverterContractResolver(new InstantConverter())); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
// ==========================================================================
|
|||
// InstantConverterTests.cs
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex Group
|
|||
// All rights reserved.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using NodaTime; |
|||
using Squidex.Infrastructure.TestHelpers; |
|||
using Xunit; |
|||
|
|||
namespace Squidex.Infrastructure.Json |
|||
{ |
|||
public sealed class InstantConverterTests |
|||
{ |
|||
[Fact] |
|||
public void Should_serialize_and_deserialize() |
|||
{ |
|||
var value = Instant.FromDateTimeUtc(DateTime.UtcNow.Date); |
|||
|
|||
value.SerializeAndDeserialize(new InstantConverter()); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue