节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
1.42 KiB
Stardust
using System.Text.Json;
using Xunit;

namespace Stardust.WebApiTests.Fixtures;

/// <summary>跨测试复用的业务断言。集中在此,避免各域测试复制粘贴同一段字段校验。</summary>
public static class ApiAssert
{
    /// <summary>
    /// 断言 GetFields 的 data 是非空字段数组,且每一项都有非空的 Name。
    /// </summary>
    /// <param name="data">GetFields 的响应 data</param>
    /// <param name="endpoint">仅用于失败信息定位</param>
    public static void FieldList(JsonElement data, String endpoint)
    {
        Assert.Equal(JsonValueKind.Array, data.ValueKind);
        Assert.True(data.GetArrayLength() > 0, $"[{endpoint}] GetFields 返回空字段集合");

        foreach (var field in data.EnumerateArray())
            AssertFieldHasName(field, endpoint);
    }

    // 响应按 Web 约定序列化为小驼峰(name),而 JsonElement 的属性查找大小写敏感,故自行遍历匹配
    private static void AssertFieldHasName(JsonElement field, String endpoint)
    {
        foreach (var prop in field.EnumerateObject())
        {
            if (!String.Equals(prop.Name, "Name", StringComparison.OrdinalIgnoreCase)) continue;

            Assert.False(String.IsNullOrWhiteSpace(prop.Value.GetString()), $"[{endpoint}] 字段项 Name 为空:{field}");
            return;
        }

        Assert.Fail($"[{endpoint}] 字段项缺少 Name:{field}");
    }
}