节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
2.03 KiB
Stardust
extern alias web;

using System;
using System.ComponentModel;
using Stardust.Data.Monitors;
using Xunit;
using web::Stardust.Web.Models.Dashboard;
using web::Stardust.Web.Services;

namespace ServerTest.Web;

/// <summary>看板数据服务测试</summary>
/// <remarks>
/// 站点根路径直接呈现系统级看板,其报警与事件查询按雪花主键(时间片)取最近数据。
/// 历史版本按没有索引的 StartTime/CreateTime 排序,数据量大时首页会超时,本用例锁定该行为。
/// </remarks>
public class DashboardServiceTests
{
    private static String NewName() => "dash-" + Guid.NewGuid().ToString("n")[..8];

    [Fact(DisplayName = "系统看板取到最近报警并计入实时事件")]
    public void BuildSystem_ContainsRecentAlarm()
    {
        var category = NewName();
        var record = new AlarmRecord
        {
            Name = category,
            Category = category,
            Action = NewName(),
            Status = AlarmStatuses.Alarming,
            StartTime = DateTime.Now,
        };

        try
        {
            record.Insert();

            var scope = new ScopeInfo
            {
                IsAdmin = true,
                Mode = "full",
                TotalProjects = 1,
                VisibleProjects = 1,
                ProjectIds = [1],
                Projects = [new ProjectOption { Id = 1, Name = "测试项目" }],
            };

            var model = new DashboardService().BuildSystem(scope, "24h");

            Assert.NotNull(model);
            Assert.Contains(model.Events, e => e.AlarmId == record.Id);
        }
        finally
        {
            record.Delete();
        }
    }

    [Fact(DisplayName = "无可见项目时看板返回空模型而不访问数据库")]
    public void BuildSystem_NoneScope_ReturnsEmpty()
    {
        var scope = new ScopeInfo { Mode = "none" };

        var model = new DashboardService().BuildSystem(scope, "24h");

        Assert.NotNull(model);
        Assert.Empty(model.Events);
        Assert.Empty(model.Kpis);
    }
}