- 将AI模型相关端点、命令、处理器移动到模块内部统一管理 - 优化数据库迁移脚本,添加对不同环境表状态的兼容处理逻辑 - 为异常处理添加错误码枚举参数,统一错误处理方式 - 重构多处业务逻辑中的异常抛出方式,增强代码一致性 - 移除独立的组件清单分组和项目定义,简化前端物料面板数据结构 - 修复测试代码中实体引用路径错误问题 - 添加新的监控模块测试项目到解决方案文件中
104 lines
4.2 KiB
C#
104 lines
4.2 KiB
C#
using FluentAssertions;
|
|
using Monitoring.Application.Reports.Handlers;
|
|
using Monitoring.Application.Reports.Queries;
|
|
using Monitoring.Domain.Entities.ExternalSystem;
|
|
using Monitoring.Domain.Entities.SyncedRecord;
|
|
using Monitoring.Domain.Enums;
|
|
using Monitoring.Domain.Values;
|
|
|
|
namespace BuildFlow.Monitoring.Tests.Reports;
|
|
|
|
/// <summary>订单同步记录分页查询测试。</summary>
|
|
public class GetOrderRecordsQueryHandlerTests
|
|
{
|
|
[Fact]
|
|
public async Task Handle_ShouldFilterOrdersBySystemAndReturnNewestPage()
|
|
{
|
|
await using var db = MonitoringTestDb.Create();
|
|
var system = CreateSystem("u号租-A");
|
|
var otherSystem = CreateSystem("u号租-B");
|
|
db.ExternalSystems.AddRange(system, otherSystem);
|
|
db.SyncedRecords.AddRange(
|
|
CreateRecord(system.Id, "order-1", "order", new DateTime(2026, 7, 17, 1, 0, 0, DateTimeKind.Utc)),
|
|
CreateRecord(system.Id, "order-2", "order", new DateTime(2026, 7, 18, 1, 0, 0, DateTimeKind.Utc)),
|
|
CreateRecord(system.Id, "order-3", "order", new DateTime(2026, 7, 19, 1, 0, 0, DateTimeKind.Utc)),
|
|
CreateRecord(system.Id, "metric-1", "metric", new DateTime(2026, 7, 20, 1, 0, 0, DateTimeKind.Utc)),
|
|
CreateRecord(otherSystem.Id, "other-order", "order", new DateTime(2026, 7, 21, 1, 0, 0, DateTimeKind.Utc)));
|
|
await db.SaveChangesAsync();
|
|
|
|
var handler = new GetOrderRecordsQueryHandler(db);
|
|
|
|
var result = await handler.Handle(new GetOrderRecordsQuery(system.Id, 1, 2), default);
|
|
|
|
result.Total.Should().Be(3);
|
|
result.PageIndex.Should().Be(1);
|
|
result.PageSize.Should().Be(2);
|
|
result.Items.Select(item => item.ExternalId).Should().Equal("order-3", "order-2");
|
|
result.Items.Should().OnlyContain(item => item.ExternalSystemId == system.Id);
|
|
result.Items[0].Payload["status"].Should().NotBeNull();
|
|
result.Items[0].Payload["status"]!.ToString().Should().Be("running");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_ShouldUseStableIdOrderingWhenOrderTimesMatch()
|
|
{
|
|
await using var db = MonitoringTestDb.Create();
|
|
var system = CreateSystem("u号租-A");
|
|
var occurredAt = new DateTime(2026, 7, 19, 1, 0, 0, DateTimeKind.Utc);
|
|
var lowId = Guid.Parse("00000000-0000-0000-0000-000000000001");
|
|
var middleId = Guid.Parse("00000000-0000-0000-0000-000000000002");
|
|
var highId = Guid.Parse("00000000-0000-0000-0000-000000000003");
|
|
db.ExternalSystems.Add(system);
|
|
db.SyncedRecords.AddRange(
|
|
CreateRecord(system.Id, "order-low", "order", occurredAt, lowId),
|
|
CreateRecord(system.Id, "order-high", "order", occurredAt, highId),
|
|
CreateRecord(system.Id, "order-middle", "order", occurredAt, middleId));
|
|
await db.SaveChangesAsync();
|
|
|
|
var handler = new GetOrderRecordsQueryHandler(db);
|
|
|
|
var firstPage = await handler.Handle(new GetOrderRecordsQuery(system.Id, 1, 2), default);
|
|
var secondPage = await handler.Handle(new GetOrderRecordsQuery(system.Id, 2, 2), default);
|
|
|
|
firstPage.Items.Select(item => item.Id).Should().Equal(highId, middleId);
|
|
secondPage.Items.Select(item => item.Id).Should().Equal(lowId);
|
|
}
|
|
|
|
private static ExternalSystemEntity CreateSystem(string name) => new()
|
|
{
|
|
Data = new SystemData
|
|
{
|
|
Name = name,
|
|
SystemType = ExternalSystemTypeEnum.UHaoZu,
|
|
BaseUrl = "https://b.uhaozu.com",
|
|
IsEnabled = true,
|
|
},
|
|
};
|
|
|
|
private static SyncedRecordEntity CreateRecord(
|
|
Guid systemId,
|
|
string externalId,
|
|
string recordType,
|
|
DateTime occurredAt,
|
|
Guid? id = null) => new()
|
|
{
|
|
Id = id ?? Guid.NewGuid(),
|
|
ExternalSystemId = systemId,
|
|
SyncJobId = Guid.NewGuid(),
|
|
ExternalId = externalId,
|
|
RecordType = recordType,
|
|
OccurredAt = occurredAt,
|
|
UpdatedAt = occurredAt,
|
|
Data = new RecordData
|
|
{
|
|
ExternalId = externalId,
|
|
RecordType = recordType,
|
|
Payload = new Dictionary<string, object?>
|
|
{
|
|
["status"] = "running",
|
|
["actualRent"] = "12.34",
|
|
},
|
|
},
|
|
};
|
|
}
|