build-flow.api/tests/BuildFlow.Monitoring.Tests/Reports/GetOrderRecordsQueryHandlerTests.cs
xiangning 51eea796e2 refactor(rag): 重构AI模型相关代码结构和数据库迁移逻辑
- 将AI模型相关端点、命令、处理器移动到模块内部统一管理
- 优化数据库迁移脚本,添加对不同环境表状态的兼容处理逻辑
- 为异常处理添加错误码枚举参数,统一错误处理方式
- 重构多处业务逻辑中的异常抛出方式,增强代码一致性
- 移除独立的组件清单分组和项目定义,简化前端物料面板数据结构
- 修复测试代码中实体引用路径错误问题
- 添加新的监控模块测试项目到解决方案文件中
2026-07-20 08:25:18 +08:00

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",
},
},
};
}