Created
May 7, 2023 19:05
-
-
Save rezanid/855d85d1b14268d4a6f41ec0def3a4e7 to your computer and use it in GitHub Desktop.
Json Converters to facilitate unit testing for Power Platform's Custom APIs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.Xrm.Sdk; | |
using Newtonsoft.Json; | |
using Newtonsoft.Json.Linq; | |
using System; | |
namespace MyFancyPlugins.Tests.JsonConverters; | |
/// <summary> | |
/// Allows serialization / deserialization of <see cref="Microsoft.Xrm.Sdk.EntityCollection". This type is | |
/// intended for unit-testing only./> | |
/// </summary> | |
public class EntityCollectionJsonConverter : JsonConverter | |
{ | |
public override bool CanConvert(Type objectType) => objectType == typeof(EntityCollection); | |
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |
{ | |
var entityCollection = value as EntityCollection; | |
var jarray = new JArray(); | |
foreach (var entity in entityCollection.Entities) | |
{ | |
jarray.Add(JToken.FromObject(entity, serializer)); | |
} | |
jarray.WriteTo(writer); | |
} | |
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |
{ | |
var jarray = JArray.Load(reader); | |
var entityCollection = new EntityCollection(); | |
foreach (var item in jarray) | |
{ | |
entityCollection.Entities.Add(item.ToObject<Entity>(serializer)); | |
} | |
return entityCollection; | |
} | |
} | |
/// <summary> | |
/// Allows serialization / deserialization of <see cref="Microsoft.Xrm.Sdk.Entity". This type is | |
/// intended for unit-testing only./> | |
/// </summary> | |
public class EntityJsonConverter : JsonConverter | |
{ | |
public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Entity); | |
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |
{ | |
var jobject = JObject.Load(reader); | |
var entity = new Entity(); | |
foreach (var property in jobject.Properties()) | |
{ | |
if (property.Value.Type == JTokenType.Array) | |
{ | |
entity.SetAttribute(property.Name, property.Value.ToObject<EntityCollection>(serializer)); | |
} | |
else if (property.Value.Type == JTokenType.Object && property.Value.HasValues) | |
{ | |
entity.SetAttribute(property.Name, property.Value.ToObject<Entity>(serializer)); | |
} | |
else if (property.Value.Type == JTokenType.Integer) | |
{ | |
entity.SetAttribute(property.Name, property.Value.ToObject<int>(serializer)); | |
} | |
else | |
{ | |
entity.SetAttribute(property.Name, property.Value.ToObject<object>()); | |
} | |
} | |
return entity; | |
} | |
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |
{ | |
var entity = value as Entity; | |
var jobject = new JObject(); | |
foreach (var attribute in entity.Attributes) | |
{ | |
if (attribute.Value is Entity || attribute.Value is EntityCollection) | |
{ | |
jobject.Add(attribute.Key, JToken.FromObject(attribute.Value, serializer)); | |
} | |
else | |
{ | |
jobject.Add(attribute.Key, JToken.FromObject(attribute.Value)); | |
} | |
} | |
jobject.WriteTo(writer); | |
} | |
} | |
/// <summary> | |
/// Allows serialization / deserialization of <see cref="Microsoft.Xrm.Sdk.ParameterCollection". This type is | |
/// intended for unit-testing only./> | |
/// </summary> | |
public class ParameterCollectionJsonConverter : JsonConverter | |
{ | |
public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(ParameterCollection); | |
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |
{ | |
var jobject = JObject.Load(reader); | |
var collection = new ParameterCollection(); | |
foreach (var property in jobject.Properties()) | |
{ | |
if (property.Value.Type == JTokenType.Array) | |
{ | |
collection[property.Name] = property.Value.ToObject<EntityCollection>(serializer); | |
} | |
else if (property.Value.Type == JTokenType.Object && property.Value.HasValues) | |
{ | |
collection[property.Name] = property.Value.ToObject<Entity>(serializer); | |
} | |
else if (property.Value.Type == JTokenType.Integer) | |
{ | |
collection[property.Name] = property.Value.ToObject<int>(serializer); | |
} | |
else | |
{ | |
collection[property.Name] = property.Value.ToObject<object>(); | |
} | |
} | |
return collection; | |
} | |
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |
{ | |
var collection = value as ParameterCollection; | |
var jobject = new JObject(); | |
foreach (var attribute in collection) | |
{ | |
if (attribute.Value is Entity || attribute.Value is EntityCollection) | |
{ | |
jobject.Add(attribute.Key, JToken.FromObject(attribute.Value, serializer)); | |
} | |
else | |
{ | |
jobject.Add(attribute.Key, JToken.FromObject(attribute.Value)); | |
} | |
} | |
jobject.WriteTo(writer); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment