This commit is contained in:
Zeeshaun
2026-03-13 09:11:35 -05:00
parent f004c8205a
commit c2d6bda458
197 changed files with 14970 additions and 0 deletions
@@ -0,0 +1,215 @@
using FluentAssertions;
using LCU.API.Internal.DocumentLib.Containers;
using LCU.Library.Internal.DocumentModels.Converter;
using LCU.Library.Internal.DocumentModels.Responses;
using Newtonsoft.Json;
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace LCU.Library.Internal.DocumentModelsTest.Converter;
public class PolymorphicJsonConverterTest
{
public class SystemPolymorphicJsonConverterTest
{
[Test]
public void WriteThenRead_AbstractBaseClassImplementation_DeserializesAsImplementation()
{
AbstractBaseClass original = new ConcreteClass();
var serialized = JsonSerializer.Serialize(original);
var deserialized = JsonSerializer.Deserialize<AbstractBaseClass>(serialized);
Assert.IsInstanceOf<ConcreteClass>(deserialized);
deserialized.Should().BeEquivalentTo(original);
}
[Test]
public void Write_TypeDoesNotSpecifyKnownSubclasses_ThrowsException()
{
DoesNotSpecifyKnownTypes original = new UnknownSubtype();
Assert.Throws<NotSupportedException>(() => JsonSerializer.Serialize(original));
}
}
public class NewtonsoftPolymorphicJsonConverterTest
{
[Test]
public void WriteThenRead_AbstractBaseClassImplementation_DeserializesAsImplementation()
{
AbstractBaseClass original = new ConcreteClass();
var serialized = JsonConvert.SerializeObject(original);
var deserialized = JsonConvert.DeserializeObject<AbstractBaseClass>(serialized);
Assert.IsInstanceOf<ConcreteClass>(deserialized);
deserialized.Should().BeEquivalentTo(original);
}
[Test]
public void Write_TypeDoesNotSpecifyKnownSubclasses_ThrowsException()
{
DoesNotSpecifyKnownTypes original = new UnknownSubtype();
Assert.Throws<NotSupportedException>(() => JsonConvert.SerializeObject(original));
}
}
public class NewtonsoftToSystemPolymorphicJsonConverterTest
{
[Test]
public void WriteThenRead_AbstractBaseClassImplementation_DeserializesAsImplementation()
{
AbstractBaseClass original = new ConcreteClass();
var serialized = JsonConvert.SerializeObject(original);
var deserialized = JsonSerializer.Deserialize<AbstractBaseClass>(serialized);
Assert.IsInstanceOf<ConcreteClass>(deserialized);
deserialized.Should().BeEquivalentTo(original);
}
}
public class SystemToNewtonsoftPolymorphicJsonConverterTest
{
[Test]
public void WriteThenRead_AbstractBaseClassImplementation_DeserializesAsImplementation()
{
AbstractBaseClass original = new ConcreteClass();
var serialized = JsonSerializer.Serialize(original);
var deserialized = JsonConvert.DeserializeObject<AbstractBaseClass>(serialized);
Assert.IsInstanceOf<ConcreteClass>(deserialized);
deserialized.Should().BeEquivalentTo(original);
}
[Test]
[Category("Integration")]
public void WriteThenRead_DocumentFieldAuditWithValues_DeserializesCurrentAndPrevious()
{
DocumentAuditResponse original = new DocumentFieldAuditResponse
{
DocumentId = Guid.NewGuid(),
Source = Guid.NewGuid().ToString(),
Date = DateTime.Now,
UserId = Guid.NewGuid().ToString(),
Field = nameof(DocumentInformation.Attributes),
CurrentValue = new
{
PersonNumber = Guid.NewGuid().ToString(),
AccountNumber = Guid.NewGuid().ToString()
},
PreviousValue = new
{
PersonNumber = Guid.NewGuid().ToString(),
AccountNumber = Guid.NewGuid().ToString()
}
};
var deserialized = JsonConvert.DeserializeObject<DocumentAuditResponse>(JsonSerializer.Serialize(original));
for (var i = 0; i <= 5; i++)
{
deserialized = JsonConvert.DeserializeObject<DocumentAuditResponse>(JsonSerializer.Serialize(deserialized));
}
var originalFieldAudit = original as DocumentFieldAuditResponse;
var deserializedFieldAudit = deserialized as DocumentFieldAuditResponse;
//caution: fluent assertions object comparison does not compare expando objects correctly as of v6.7.0
//it will report the below four properties as missing, despite them having made it through two serializations
Assert.AreEqual(originalFieldAudit.CurrentValue.PersonNumber, deserializedFieldAudit.CurrentValue.PersonNumber);
Assert.AreEqual(originalFieldAudit.CurrentValue.AccountNumber, deserializedFieldAudit.CurrentValue.AccountNumber);
Assert.AreEqual(originalFieldAudit.PreviousValue.PersonNumber, deserializedFieldAudit.PreviousValue.PersonNumber);
Assert.AreEqual(originalFieldAudit.PreviousValue.AccountNumber, deserializedFieldAudit.PreviousValue.AccountNumber);
}
[Test]
[Category("Integration")]
public void WriteThenRead_DocumentFieldAuditWithNullValues_DeserializesCurrentAndPrevious()
{
DocumentAuditResponse original = new DocumentFieldAuditResponse
{
DocumentId = Guid.NewGuid(),
Source = Guid.NewGuid().ToString(),
Date = DateTime.Now,
UserId = Guid.NewGuid().ToString(),
Field = nameof(DocumentInformation.Attributes),
CurrentValue = null,
PreviousValue = null
};
var deserialized = JsonConvert.DeserializeObject<DocumentAuditResponse>(JsonSerializer.Serialize(original));
for (var i = 0; i <= 5; i++)
{
deserialized = JsonConvert.DeserializeObject<DocumentAuditResponse>(JsonSerializer.Serialize(deserialized));
}
var originalFieldAudit = original as DocumentFieldAuditResponse;
var deserializedFieldAudit = deserialized as DocumentFieldAuditResponse;
//caution: fluent assertions object comparison does not compare expando objects correctly as of v6.7.0
//it will report the below four properties as missing, despite them having made it through two serializations
Assert.AreEqual(originalFieldAudit.CurrentValue, deserializedFieldAudit.CurrentValue);
Assert.AreEqual(originalFieldAudit.PreviousValue, deserializedFieldAudit.PreviousValue);
}
[Test]
[Category("Integration")]
public void WriteThenRead_DocumentFieldAuditWithBooleanValues_DeserializesCurrentAndPrevious()
{
DocumentAuditResponse original = new DocumentFieldAuditResponse
{
DocumentId = Guid.NewGuid(),
Source = Guid.NewGuid().ToString(),
Date = DateTime.Now,
UserId = Guid.NewGuid().ToString(),
Field = nameof(DocumentInformation.Attributes),
CurrentValue = true,
PreviousValue = false
};
var deserialized = JsonConvert.DeserializeObject<DocumentAuditResponse>(JsonSerializer.Serialize(original));
for (var i = 0; i <= 5; i++)
{
deserialized = JsonConvert.DeserializeObject<DocumentAuditResponse>(JsonSerializer.Serialize(deserialized));
}
var originalFieldAudit = original as DocumentFieldAuditResponse;
var deserializedFieldAudit = deserialized as DocumentFieldAuditResponse;
//caution: fluent assertions object comparison does not compare expando objects correctly as of v6.7.0
//it will report the below four properties as missing, despite them having made it through two serializations
Assert.AreEqual(originalFieldAudit.CurrentValue, deserializedFieldAudit.CurrentValue);
Assert.AreEqual(originalFieldAudit.PreviousValue, deserializedFieldAudit.PreviousValue);
}
}
[System.Text.Json.Serialization.JsonConverter(typeof(SystemPolymorphicJsonConverter<AbstractBaseClass>))]
[Newtonsoft.Json.JsonConverter(typeof(NewtonsoftPolymorphicJsonConverter<AbstractBaseClass>))]
[JsonKnownTypes(typeof(ConcreteClass))]
private abstract class AbstractBaseClass
{
public Guid AbstractId { get; init; } = Guid.NewGuid();
public NestedType Nested { get; init; } = new();
}
private class ConcreteClass : AbstractBaseClass
{
public Guid ConcreteId { get; init; } = Guid.NewGuid();
}
private class NestedType
{
public Guid NestedId { get; init; } = Guid.NewGuid();
}
[System.Text.Json.Serialization.JsonConverter(typeof(SystemPolymorphicJsonConverter<DoesNotSpecifyKnownTypes>))]
[Newtonsoft.Json.JsonConverter(typeof(NewtonsoftPolymorphicJsonConverter<DoesNotSpecifyKnownTypes>))]
private abstract class DoesNotSpecifyKnownTypes
{
}
private class UnknownSubtype : DoesNotSpecifyKnownTypes
{
}
}
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FluentAssertions" Version="6.7.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.10" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="NUnit.Analyzers" Version="3.3.0" />
<PackageReference Include="coverlet.collector" Version="3.1.2" />
</ItemGroup>
<ItemGroup>
<Folder Include="Converter\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LCU.API.Internal.Document\LCU.API.Internal.Document.csproj" />
<ProjectReference Include="..\LCU.Library.Internal.DocumentModels\LCU.Library.Internal.DocumentModels.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1 @@
global using NUnit.Framework;