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