You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/tests/CncService.Tests/AlertServiceTests.cs

150 lines
5.0 KiB
C#

using System;
using System.Collections.Generic;
using CncModels.Constants;
using CncModels.Dto;
using CncModels.Dto.Alert;
using CncService;
using CncService.Impl;
using Xunit;
namespace CncService.Tests
{
/// <summary>
/// AlertService 告警管理测试
/// 测试场景:查询、解决告警、批量解决、统计、参数校验
/// </summary>
[Collection("Database")]
public class AlertServiceTests : IDisposable
{
private readonly AlertService _service;
public AlertServiceTests()
{
TestDb.TruncateAll();
_service = ServiceFactory.CreateAlertService();
}
public void Dispose()
{
TestDb.TruncateAll();
}
/// <summary>辅助方法:插入测试告警(每次用唯一编码避免重复)</summary>
private long InsertTestAlert(string alertType = "offline", int isResolved = 0)
{
// 只插入一次机床
var machineCount = TestDb.QuerySingle<int>("SELECT COUNT(*) FROM cnc_machine");
if (machineCount == 0)
{
TestDb.Execute(@"INSERT INTO cnc_collect_address (name, url, brand_id, collect_interval, is_enabled, created_at, updated_at)
VALUES ('测试地址', 'http://test', 1, 30, 1, NOW(), NOW())");
TestDb.Execute(@"INSERT INTO cnc_machine (device_code, name, workshop_id, collect_address_id, ip_address, brand_id, is_enabled, is_online, created_at, updated_at)
VALUES ('M001', '机床1', 1, 1, '0.0.0.0', 1, 1, 0, NOW(), NOW())");
}
TestDb.Execute(@"INSERT INTO cnc_alert (alert_type, machine_id, title, is_resolved, created_at)
VALUES (@alertType, 1, '测试告警', @isResolved, NOW())",
new { alertType, isResolved });
return TestDb.QuerySingle<long>("SELECT MAX(id) FROM cnc_alert");
}
// ======== GetList ========
[Fact]
public void GetList__()
{
var result = _service.GetList(new AlertQuery { Page = 1, PageSize = 20 });
Assert.NotNull(result);
Assert.Equal(0, result.Total);
}
[Fact]
public void GetList_null_BadRequest()
{
var ex = Assert.Throws<BusinessException>(() => _service.GetList(null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
[Fact]
public void GetList__()
{
InsertTestAlert();
InsertTestAlert("overload");
var result = _service.GetList(new AlertQuery { Page = 1, PageSize = 20 });
Assert.Equal(2, result.Total);
}
// ======== Resolve ========
[Fact]
public void Resolve_ID_true()
{
var id = InsertTestAlert();
var result = _service.Resolve(id);
Assert.True(result);
}
[Fact]
public void Resolve_ID_BadRequest()
{
var ex = Assert.Throws<BusinessException>(() => _service.Resolve(0));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
[Fact]
public void Resolve_ID_BadRequest()
{
var ex = Assert.Throws<BusinessException>(() => _service.Resolve(-1));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
// ======== BatchResolve ========
[Fact]
public void BatchResolve__()
{
var id1 = InsertTestAlert();
var id2 = InsertTestAlert("overload");
var count = _service.BatchResolve(new List<long> { id1, id2 });
Assert.Equal(2, count);
}
[Fact]
public void BatchResolve_null_BadRequest()
{
var ex = Assert.Throws<BusinessException>(() => _service.BatchResolve(null));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
[Fact]
public void BatchResolve__BadRequest()
{
var ex = Assert.Throws<BusinessException>(() => _service.BatchResolve(new List<long>()));
Assert.Equal(ErrorCode.BadRequest, ex.Code);
}
// ======== GetStatistics ========
[Fact]
public void GetStatistics__0()
{
var stats = _service.GetStatistics();
Assert.NotNull(stats);
Assert.Equal(0, stats.UnresolvedCount);
Assert.NotNull(stats.UnresolvedByType);
}
[Fact]
public void GetStatistics__()
{
InsertTestAlert("offline", 0);
InsertTestAlert("overload", 0);
InsertTestAlert("offline", 1); // 已解决
var stats = _service.GetStatistics();
Assert.True(stats.UnresolvedCount >= 2);
}
}
}