using Elsa.Common; using Elsa.Scheduling.Activities; using Elsa.Scheduling.Bookmarks; using Elsa.Scheduling.Services; using Elsa.Workflows.Helpers; using Elsa.Workflows.Runtime.Entities; using Microsoft.Extensions.Logging; using NSubstitute; namespace Elsa.Scheduling.UnitTests.Services; public class DefaultTriggerSchedulerTests { [Fact] public async Task ScheduleAsync_SchedulesPastDueStartAtTriggerForCatchUp() { var workflowScheduler = Substitute.For(); var systemClock = Substitute.For(); var logger = Substitute.For>(); var scheduler = new DefaultTriggerScheduler(workflowScheduler, systemClock, logger); var now = new DateTimeOffset(2025, 11, 06, 22, 50, 00, TimeSpan.Zero); var executeAt = now.AddMinutes(-5); ScheduleNewWorkflowInstanceRequest? scheduledRequest = null; var trigger = new StoredTrigger { Id = "trigger-1", Name = ActivityTypeNameHelper.GenerateTypeName(), WorkflowDefinitionVersionId = "workflow-version", ActivityId = "activity-1", Payload = new StartAtPayload(executeAt) }; systemClock.UtcNow.Returns(now); workflowScheduler.ScheduleAtAsync(trigger.Id, Arg.Do(x => scheduledRequest = x), executeAt, Arg.Any()).Returns(ValueTask.CompletedTask); await scheduler.ScheduleAsync([trigger], CancellationToken.None); await workflowScheduler.Received(1).ScheduleAtAsync(trigger.Id, Arg.Any(), executeAt, Arg.Any()); Assert.NotNull(scheduledRequest); Assert.Equal(trigger.ActivityId, scheduledRequest.TriggerActivityId); Assert.Equal(trigger.WorkflowDefinitionVersionId, scheduledRequest.WorkflowDefinitionHandle.DefinitionVersionId); } }