Skip to content

Instantly share code, notes, and snippets.

@rezanid
Created May 7, 2023 19:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rezanid/855d85d1b14268d4a6f41ec0def3a4e7 to your computer and use it in GitHub Desktop.
Save rezanid/855d85d1b14268d4a6f41ec0def3a4e7 to your computer and use it in GitHub Desktop.
Json Converters to facilitate unit testing for Power Platform's Custom APIs
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