fix(api.tests): use a serializable dictionary for xunit test case data

This commit is contained in:
Stevan Freeborn
2026-02-13 04:37:47 -06:00
parent 683ca3fac4
commit 1f5e4a319a
2 changed files with 50 additions and 7 deletions
@@ -0,0 +1,41 @@
namespace FiscalOS.API.Tests.Common;
public interface ISerializableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IXunitSerializable
{
}
public class SerializableDictionary<TKey, TValue>
: Dictionary<TKey, TValue>, ISerializableDictionary<TKey, TValue> where TKey : notnull
{
public SerializableDictionary() { }
public SerializableDictionary(IDictionary<TKey, TValue> dictionary) : base(dictionary)
{
}
public void Deserialize(IXunitSerializationInfo info)
{
Clear();
var keysJson = info.GetValue<string>("_DictKeys") ?? "[]";
var valuesJson = info.GetValue<string>("_DictValues") ?? "[]";
var keys = JsonSerializer.Deserialize<List<TKey>>(keysJson);
var values = JsonSerializer.Deserialize<List<TValue>>(valuesJson);
if (keys is null || values is null || keys.Count != values.Count)
{
return;
}
for (var i = 0; i < keys.Count; i++)
{
Add(keys[i], values[i]);
}
}
public void Serialize(IXunitSerializationInfo info)
{
info.AddValue("_DictKeys", JsonSerializer.Serialize(Keys));
info.AddValue("_DictValues", JsonSerializer.Serialize(Values));
}
}
@@ -1,3 +1,5 @@
using FiscalOS.API.Tests.Common;
namespace FiscalOS.API.Tests.Integration; namespace FiscalOS.API.Tests.Integration;
public class LoginTests(TestApi testApi) : IntegrationTest(testApi) public class LoginTests(TestApi testApi) : IntegrationTest(testApi)
@@ -94,7 +96,7 @@ public class LoginValidationTestCases : TheoryData<LoginValidationTestCase>
"No username or password", "No username or password",
string.Empty, string.Empty,
string.Empty, string.Empty,
new Dictionary<string, string[]>() new SerializableDictionary<string, string[]>()
{ {
["Username"] = ["The Username field is required."], ["Username"] = ["The Username field is required."],
["Password"] = ["The Password field is required."] ["Password"] = ["The Password field is required."]
@@ -105,7 +107,7 @@ public class LoginValidationTestCases : TheoryData<LoginValidationTestCase>
"No username", "No username",
string.Empty, string.Empty,
"@Password1", "@Password1",
new Dictionary<string, string[]>() new SerializableDictionary<string, string[]>()
{ {
["Username"] = ["The Username field is required."], ["Username"] = ["The Username field is required."],
} }
@@ -115,7 +117,7 @@ public class LoginValidationTestCases : TheoryData<LoginValidationTestCase>
"No password", "No password",
"Stevan", "Stevan",
string.Empty, string.Empty,
new Dictionary<string, string[]>() new SerializableDictionary<string, string[]>()
{ {
["Password"] = ["The Password field is required."] ["Password"] = ["The Password field is required."]
} }
@@ -128,7 +130,7 @@ public record LoginValidationTestCase : IXunitSerializable
public string Name { get; private set; } = string.Empty; public string Name { get; private set; } = string.Empty;
public string Username { get; private set; } = string.Empty; public string Username { get; private set; } = string.Empty;
public string Password { get; private set; } = string.Empty; public string Password { get; private set; } = string.Empty;
public Dictionary<string, string[]> ExpectedErrors { get; private set; } = []; public SerializableDictionary<string, string[]> ExpectedErrors { get; private set; } = [];
public override string ToString() public override string ToString()
{ {
@@ -143,7 +145,7 @@ public record LoginValidationTestCase : IXunitSerializable
string name, string name,
string username, string username,
string password, string password,
Dictionary<string, string[]> expectedErrors SerializableDictionary<string, string[]> expectedErrors
) )
{ {
Name = name; Name = name;
@@ -157,7 +159,7 @@ public record LoginValidationTestCase : IXunitSerializable
Name = info.GetValue<string>(nameof(Name)) ?? string.Empty; Name = info.GetValue<string>(nameof(Name)) ?? string.Empty;
Username = info.GetValue<string>(nameof(Username)) ?? string.Empty; Username = info.GetValue<string>(nameof(Username)) ?? string.Empty;
Password = info.GetValue<string>(nameof(Password)) ?? string.Empty; Password = info.GetValue<string>(nameof(Password)) ?? string.Empty;
ExpectedErrors = info.GetValue<Dictionary<string, string[]>>(nameof(ExpectedErrors)) ?? []; ExpectedErrors = info.GetValue<SerializableDictionary<string, string[]>>(nameof(ExpectedErrors)) ?? [];
} }
public void Serialize(IXunitSerializationInfo info) public void Serialize(IXunitSerializationInfo info)
@@ -167,4 +169,4 @@ public record LoginValidationTestCase : IXunitSerializable
info.AddValue(nameof(Password), Password); info.AddValue(nameof(Password), Password);
info.AddValue(nameof(ExpectedErrors), ExpectedErrors); info.AddValue(nameof(ExpectedErrors), ExpectedErrors);
} }
} }