using Elsa.Common;
using Elsa.Mediator.Contracts;
using Elsa.Scheduling.ScheduledTasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NSubstitute;
namespace Elsa.Scheduling.UnitTests.ScheduledTasks;
///
/// Tests for ScheduledRecurringTask to ensure recurring tasks handle edge cases correctly.
///
public class ScheduledRecurringTaskTests : IDisposable
{
private static readonly DateTimeOffset DefaultNow = new(2025, 11, 06, 22, 50, 00, 0, TimeSpan.Zero);
private static readonly TimeSpan DefaultInterval = TimeSpan.FromMinutes(5);
private readonly ServiceProvider _serviceProvider;
private readonly ISystemClock _systemClock;
private readonly ILogger _logger;
private readonly List _tasksToDispose = new();
public ScheduledRecurringTaskTests()
{
var services = new ServiceCollection();
_systemClock = Substitute.For();
_logger = Substitute.For>();
services.AddSingleton(Substitute.For());
_serviceProvider = services.BuildServiceProvider();
}
private ScheduledRecurringTask CreateScheduledTask(
DateTimeOffset? startAt = null,
TimeSpan? interval = null,
ISystemClock? systemClock = null)
{
var task = Substitute.For();
var scheduledTask = new ScheduledRecurringTask(
task,
startAt ?? DefaultNow.AddMinutes(5),
interval ?? DefaultInterval,
systemClock ?? _systemClock,
_serviceProvider.CreateScope().ServiceProvider.GetRequiredService(),
_logger
);
_tasksToDispose.Add(scheduledTask);
return scheduledTask;
}
private void SetupSystemClock(params DateTimeOffset[] times)
{
_systemClock.UtcNow.Returns(times[0], times.Skip(1).ToArray());
}
private void AssertNoErrorLogged()
{
_logger.DidNotReceive().Log(
LogLevel.Error,
Arg.Any(),
Arg.Any