From 1f5e4a319a7c4ba19f83d960be33e68713963355 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:18:25 -0600 Subject: [PATCH] fix(api.tests): use a serializable dictionary for xunit test case data --- .../Common/SerializableDictionary.cs | 41 +++++++++++++++++++ .../Integration/LoginTests.cs | 16 ++++---- 2 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 tests/FiscalOS.API.Tests/Common/SerializableDictionary.cs diff --git a/tests/FiscalOS.API.Tests/Common/SerializableDictionary.cs b/tests/FiscalOS.API.Tests/Common/SerializableDictionary.cs new file mode 100644 index 0000000..767a59a --- /dev/null +++ b/tests/FiscalOS.API.Tests/Common/SerializableDictionary.cs @@ -0,0 +1,41 @@ +namespace FiscalOS.API.Tests.Common; + +public interface ISerializableDictionary : IDictionary, IXunitSerializable +{ +} + +public class SerializableDictionary + : Dictionary, ISerializableDictionary where TKey : notnull +{ + public SerializableDictionary() { } + + public SerializableDictionary(IDictionary dictionary) : base(dictionary) + { + } + + public void Deserialize(IXunitSerializationInfo info) + { + Clear(); + + var keysJson = info.GetValue("_DictKeys") ?? "[]"; + var valuesJson = info.GetValue("_DictValues") ?? "[]"; + var keys = JsonSerializer.Deserialize>(keysJson); + var values = JsonSerializer.Deserialize>(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)); + } +} \ No newline at end of file diff --git a/tests/FiscalOS.API.Tests/Integration/LoginTests.cs b/tests/FiscalOS.API.Tests/Integration/LoginTests.cs index bbae1cb..eaed4af 100644 --- a/tests/FiscalOS.API.Tests/Integration/LoginTests.cs +++ b/tests/FiscalOS.API.Tests/Integration/LoginTests.cs @@ -1,3 +1,5 @@ +using FiscalOS.API.Tests.Common; + namespace FiscalOS.API.Tests.Integration; public class LoginTests(TestApi testApi) : IntegrationTest(testApi) @@ -94,7 +96,7 @@ public class LoginValidationTestCases : TheoryData "No username or password", string.Empty, string.Empty, - new Dictionary() + new SerializableDictionary() { ["Username"] = ["The Username field is required."], ["Password"] = ["The Password field is required."] @@ -105,7 +107,7 @@ public class LoginValidationTestCases : TheoryData "No username", string.Empty, "@Password1", - new Dictionary() + new SerializableDictionary() { ["Username"] = ["The Username field is required."], } @@ -115,7 +117,7 @@ public class LoginValidationTestCases : TheoryData "No password", "Stevan", string.Empty, - new Dictionary() + new SerializableDictionary() { ["Password"] = ["The Password field is required."] } @@ -128,7 +130,7 @@ public record LoginValidationTestCase : IXunitSerializable public string Name { get; private set; } = string.Empty; public string Username { get; private set; } = string.Empty; public string Password { get; private set; } = string.Empty; - public Dictionary ExpectedErrors { get; private set; } = []; + public SerializableDictionary ExpectedErrors { get; private set; } = []; public override string ToString() { @@ -143,7 +145,7 @@ public record LoginValidationTestCase : IXunitSerializable string name, string username, string password, - Dictionary expectedErrors + SerializableDictionary expectedErrors ) { Name = name; @@ -157,7 +159,7 @@ public record LoginValidationTestCase : IXunitSerializable Name = info.GetValue(nameof(Name)) ?? string.Empty; Username = info.GetValue(nameof(Username)) ?? string.Empty; Password = info.GetValue(nameof(Password)) ?? string.Empty; - ExpectedErrors = info.GetValue>(nameof(ExpectedErrors)) ?? []; + ExpectedErrors = info.GetValue>(nameof(ExpectedErrors)) ?? []; } public void Serialize(IXunitSerializationInfo info) @@ -167,4 +169,4 @@ public record LoginValidationTestCase : IXunitSerializable info.AddValue(nameof(Password), Password); info.AddValue(nameof(ExpectedErrors), ExpectedErrors); } -} \ No newline at end of file +}