using FluentAssertions;
using Microsoft.EntityFrameworkCore;
using Workflow.Domain.Entities;
using Xunit;
namespace BuildFlow.Workflow.Tests.Reliability;
///
/// 工作流持久化任务的 EF 模型约束测试。
///
public class WorkflowJobModelTests
{
[Fact]
public void WorkflowTimerJobShouldHaveUniqueTokenAndLeaseIndexes()
{
using var db = CreateDb();
var entity = db.Model.FindEntityType(typeof(WorkflowTimerJob));
entity.Should().NotBeNull();
var modelEntity = entity!;
modelEntity.GetTableName().Should().Be("b_workflow_timer_jobs");
modelEntity.GetIndexes().Single(x => x.Properties.Select(p => p.Name)
.SequenceEqual(new[] { nameof(WorkflowTimerJob.TokenId) })).IsUnique.Should().BeTrue();
modelEntity.GetIndexes().Should().Contain(x => x.Properties.Select(p => p.Name)
.SequenceEqual(new[] { nameof(WorkflowTimerJob.Status), nameof(WorkflowTimerJob.DueAt) }));
modelEntity.GetIndexes().Should().Contain(x => x.Properties.Select(p => p.Name)
.SequenceEqual(new[]
{
nameof(WorkflowTimerJob.Status),
nameof(WorkflowTimerJob.LeaseExpiresAt),
}));
}
[Fact]
public void ImportJobShouldHaveLeaseFieldsAndCompositeIndexes()
{
using var db = CreateDb();
var entity = db.Model.FindEntityType(typeof(BuildFlowImportJob))!;
entity.FindProperty(nameof(BuildFlowImportJob.LeaseOwner)).Should().NotBeNull();
entity.FindProperty(nameof(BuildFlowImportJob.LeaseExpiresAt)).Should().NotBeNull();
entity.FindProperty(nameof(BuildFlowImportJob.AttemptCount)).Should().NotBeNull();
entity.FindProperty(nameof(BuildFlowImportJob.LastHeartbeatAt)).Should().NotBeNull();
entity.GetIndexes().Should().Contain(x => x.Properties.Select(p => p.Name)
.SequenceEqual(new[]
{
nameof(BuildFlowImportJob.Status),
nameof(BuildFlowImportJob.CreatedAt),
}));
entity.GetIndexes().Should().Contain(x => x.Properties.Select(p => p.Name)
.SequenceEqual(new[]
{
nameof(BuildFlowImportJob.Status),
nameof(BuildFlowImportJob.LeaseExpiresAt),
}));
}
private static WorkflowDbContext CreateDb()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase($"workflow-job-model-{Guid.NewGuid():N}")
.Options;
return new WorkflowDbContext(options);
}
}