using FluentAssertions; using Microsoft.EntityFrameworkCore; using Workflow.Application.Features.WorkflowInstances.DTOs; using Workflow.Application.Features.WorkflowInstances.Handlers; using Workflow.Application.Features.WorkflowInstances.Queries; using Workflow.Domain.Entities; using Workflow.Domain.Enums; using Xunit; using TaskStatus = global::Workflow.Domain.Enums.TaskStatus; namespace BuildFlow.Workflow.Tests.Handlers; public class MonitorWorkflowInstancesQueryHandlerTests { private static WorkflowDbContext CreateDbContext() { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; var db = new WorkflowDbContext(options); db.SavingChanges += AuditStub.OnSave; return db; } [Fact] public async Task MonitorWorkflowInstances_AggregatesCounts() { await using var db = CreateDbContext(); db.WorkflowInstances.Add(new WorkflowInstance { Id = Guid.NewGuid(), DefinitionId = Guid.NewGuid(), Title = "Running", Status = InstanceStatus.Running, InitiatorId = Guid.NewGuid() }); db.WorkflowInstances.Add(new WorkflowInstance { Id = Guid.NewGuid(), DefinitionId = Guid.NewGuid(), Title = "Completed", Status = InstanceStatus.Completed, InitiatorId = Guid.NewGuid() }); db.WorkflowTasks.Add(new WorkflowTask { Id = Guid.NewGuid(), InstanceId = Guid.NewGuid(), TokenId = Guid.NewGuid(), NodeId = Guid.NewGuid(), Title = "Task", AssigneeId = Guid.NewGuid(), Status = TaskStatus.Pending }); await db.SaveChangesAsync(); var handler = new MonitorWorkflowInstancesQueryHandler(db); WorkflowMonitorDto result = await handler.Handle(new MonitorWorkflowInstancesQuery(), CancellationToken.None); result.TotalInstances.Should().Be(2); result.RunningInstances.Should().Be(1); result.CompletedInstances.Should().Be(1); result.PendingTasks.Should().Be(1); result.OverdueTasks.Should().Be(0); } }