1
0
mirror of https://github.com/JKorf/CryptoExchange.Net.git synced 2026-08-20 12:53:02 +00:00

Updated RestIntegrationTest to output missing properties in a list so the running test can output them as warning instead of error

This commit is contained in:
Jkorf
2026-07-01 09:42:55 +02:00
parent 936ac6640b
commit 64c1cd5fa8
3 changed files with 47 additions and 3 deletions
@@ -8,6 +8,7 @@ using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using CryptoExchange.Net.Converters; using CryptoExchange.Net.Converters;
using CryptoExchange.Net.Converters.SystemTextJson; using CryptoExchange.Net.Converters.SystemTextJson;
using CryptoExchange.Net.Testing.Exceptions;
#pragma warning disable IL2026 #pragma warning disable IL2026
#pragma warning disable IL2070 #pragma warning disable IL2070
@@ -191,7 +192,7 @@ namespace CryptoExchange.Net.Testing.Comparers
if (property is null) if (property is null)
// Property not found // Property not found
throw new Exception($"{method}: Missing property `{prop.Name}` on `{obj.GetType().Name}`"); throw new MissingPropertyException(method, obj.GetType().Name, prop.Name, prop.Value.ValueKind == JsonValueKind.Null ? "[null]" : prop.Value.ToString());
var getMethod = property.GetGetMethod(); var getMethod = property.GetGetMethod();
if (getMethod is null) if (getMethod is null)
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Text;
namespace CryptoExchange.Net.Testing.Exceptions
{
internal class MissingPropertyException : Exception
{
public MissingPropertyException(string method, string objName, string propName, string value)
: base($"{method}: Missing property `{propName}` on `{objName}`, value: {value.Substring(0, Math.Min(50, value.Length))}")
{
}
}
}
@@ -1,6 +1,7 @@
using CryptoExchange.Net.Interfaces; using CryptoExchange.Net.Interfaces;
using CryptoExchange.Net.Objects; using CryptoExchange.Net.Objects;
using CryptoExchange.Net.Testing.Comparers; using CryptoExchange.Net.Testing.Comparers;
using CryptoExchange.Net.Testing.Exceptions;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -55,6 +56,26 @@ namespace CryptoExchange.Net.Testing
return true; return true;
} }
/// <summary>
/// Execute a REST endpoint call and check for any errors or warnings. Also checks for missing fields in the response mapping
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="warningExceptionsHolder">List for outputting warnings</param>
/// <param name="expression">The call expression</param>
/// <param name="authRequest">Whether this is an authenticated request</param>
/// <param name="compareNestedProperty">Nested property to use for comparing when checking for missing fields</param>
/// <param name="ignoreProperties">Properties to ignore when checking for missing fields</param>
/// <param name="useSingleArrayItem">Whether to use the single array item as compare when checking for missing fields</param>
/// <returns></returns>
public Task RunAndCheckResult<T>(
List<Exception> warningExceptionsHolder,
Expression<Func<TClient, Task<HttpResult<T>>>> expression,
bool authRequest,
string? compareNestedProperty = null,
List<string>? ignoreProperties = null,
bool? useSingleArrayItem = null)
=> RunAndCheckResult(expression, authRequest, true, compareNestedProperty, ignoreProperties, useSingleArrayItem, warningExceptionsHolder);
/// <summary> /// <summary>
/// Execute a REST endpoint call and check for any errors or warnings. /// Execute a REST endpoint call and check for any errors or warnings.
/// </summary> /// </summary>
@@ -65,13 +86,15 @@ namespace CryptoExchange.Net.Testing
/// <param name="compareNestedProperty">Nested property to use for comparing when checking for missing fields</param> /// <param name="compareNestedProperty">Nested property to use for comparing when checking for missing fields</param>
/// <param name="ignoreProperties">Properties to ignore when checking for missing fields</param> /// <param name="ignoreProperties">Properties to ignore when checking for missing fields</param>
/// <param name="useSingleArrayItem">Whether to use the single array item as compare when checking for missing fields</param> /// <param name="useSingleArrayItem">Whether to use the single array item as compare when checking for missing fields</param>
/// <param name="warningExceptionsHolder">List for outputting warnings</param>
public async Task RunAndCheckResult<T>( public async Task RunAndCheckResult<T>(
Expression<Func<TClient, Task<HttpResult<T>>>> expression, Expression<Func<TClient, Task<HttpResult<T>>>> expression,
bool authRequest, bool authRequest,
bool checkMissingFields = false, bool checkMissingFields = false,
string? compareNestedProperty = null, string? compareNestedProperty = null,
List<string>? ignoreProperties = null, List<string>? ignoreProperties = null,
bool? useSingleArrayItem = null) bool? useSingleArrayItem = null,
List<Exception>? warningExceptionsHolder = null)
{ {
if (!ShouldRun()) if (!ShouldRun())
return; return;
@@ -112,9 +135,14 @@ namespace CryptoExchange.Net.Testing
if (originalData == null) if (originalData == null)
throw new Exception($"Original data needs to be enabled in the client options to check for missing fields"); throw new Exception($"Original data needs to be enabled in the client options to check for missing fields");
try { try
{
SystemTextJsonComparer.CompareData(expressionBody.Method.Name, data, originalData, compareNestedProperty, ignoreProperties, useSingleArrayItem ?? false); SystemTextJsonComparer.CompareData(expressionBody.Method.Name, data, originalData, compareNestedProperty, ignoreProperties, useSingleArrayItem ?? false);
} }
catch (MissingPropertyException mpe)
{
warningExceptionsHolder?.Add(mpe);
}
catch (Exception ex) catch (Exception ex)
{ {
throw new Exception($"Compare failed: {ex.Message}; original data: {originalData}", ex); throw new Exception($"Compare failed: {ex.Message}; original data: {originalData}", ex);