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); } }