66 lines
2.5 KiB
C#
66 lines
2.5 KiB
C#
using FluentAssertions;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Workflow.Domain.Entities;
|
|
using Xunit;
|
|
|
|
namespace BuildFlow.Workflow.Tests.Reliability;
|
|
|
|
/// <summary>
|
|
/// 工作流持久化任务的 EF 模型约束测试。
|
|
/// </summary>
|
|
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<WorkflowDbContext>()
|
|
.UseInMemoryDatabase($"workflow-job-model-{Guid.NewGuid():N}")
|
|
.Options;
|
|
return new WorkflowDbContext(options);
|
|
}
|
|
}
|